Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼
我司使用的打卡軟件是 i 人事,不過(guò)我這記性,經(jīng)常漏了打卡簽退,定了鬧鐘都會(huì)忘,今天又被老大屌了。于是準(zhǔn)備抓一下簽到接口,利用 crontab 來(lái)實(shí)現(xiàn)自動(dòng)簽到簽退。
環(huán)境配置
這里使用的是 Fiddler 進(jìn)行抓包,F(xiàn)iddler 是一個(gè) HTTP 調(diào)試代理工具,以代理服務(wù)器的形式實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)流的監(jiān)聽(tīng)。之所以沒(méi)有用 Wireshark,一是因?yàn)槲也皇呛苁煜?wireshark 的篩選器,二是因?yàn)楸疚氖褂媚M器(手機(jī)應(yīng)用后臺(tái)流量多,不便于分析)來(lái)抓包,代理服務(wù)器方式更方便。
安裝Fiddler
先安裝 Fiddler( 官網(wǎng)地址 ),安裝完成之后需要安裝 fiddlercertmaker 證書(shū)生成工具( 官網(wǎng)地址 )
Fiddler配置
如圖,打開(kāi)Fiddler,Tools 選擇 Fiddler Options,將圖中所標(biāo)識(shí)地方勾選,配置后點(diǎn)擊 OK 保存并重啟 Fiddler
再次打開(kāi)該選項(xiàng)卡,點(diǎn)擊 Action 生成證書(shū)到桌面(文件名 FiddlerRoot.cer)
將該證書(shū)文件上傳到模擬器即可。
模擬器配置
記錄 Windows 當(dāng)前網(wǎng)卡的 IP 備用。
打開(kāi)模擬器,在模擬器內(nèi)的系統(tǒng)設(shè)置中選擇 “安全”,選擇 “從 SD 卡安裝”,選擇前面上傳的證書(shū),安裝即可。(過(guò)程中會(huì)要求設(shè)置屏保密碼,設(shè)置即可)
選擇模擬器內(nèi)的 WiFi 連接,長(zhǎng)按當(dāng)前的 WiFi,選擇修改網(wǎng)絡(luò),選擇手動(dòng)配置代理,地址填前面記錄的 Windows 本地 IP,端口為 8888,保存后重啟模擬器即可。
開(kāi)始抓包
配置過(guò)濾器
打開(kāi) Fiddler 后,打開(kāi)模擬器,這時(shí)候在 Fiddler 會(huì)監(jiān)聽(tīng)到大量的流量信息,便于查找,我們需要使用過(guò)濾器,如圖,在 Fiddler 界面右側(cè),選擇 “Filters”并勾選,選擇 “Use Filters”,在 “Hosts” 項(xiàng)目中,選擇 “Show only the following Hosts”,并填入 “www.ihr360.com” 這樣能過(guò)濾掉除 i 人事以外的域名流量信息,同時(shí),在 “Request Headers” 中,勾選 “Show only if URL contains”,填入 “gateway/attendance/aggregate/attendance/api/sign/doSign” ,點(diǎn)擊右上角的 Actions,選擇 “Run Filterset now” 以生效過(guò)濾器。在 Fiddler 左側(cè)的流量信息欄中,使用 Ctrl + X 清除當(dāng)前所有流量信息。

模擬器簽到
將模擬器的模擬定位定位到需要打卡的位置,打開(kāi) i 人事,點(diǎn)擊考勤打卡,打卡簽到,這時(shí)候在 Fiddler 中會(huì)出現(xiàn)一條監(jiān)聽(tīng)到的請(qǐng)求,雙擊打開(kāi),如圖所示,
可以看到,實(shí)際上打卡簽到動(dòng)作就是一條 POST 請(qǐng)求。我們了解了這條 POST 請(qǐng)求的基本內(nèi)容后就可以利用 Python 的 requests 模塊來(lái)模擬提交了。
模擬請(qǐng)求
模擬 POST 請(qǐng)求很簡(jiǎn)單,這里就不多說(shuō),直接貼代碼(很爛=.=! ,能用就行啦…勿噴…):
#!/usr/bin/env python3
# www.iots.vip
# Alliot
# 2020-1-8
import requests
import json
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from time import strftime, localtime
# 忽略 requests 請(qǐng)求認(rèn)證警告
requests.packages.urllib3.disable_warnings()
# 郵件設(shè)置
server = 'smtp.163.com'
port = '25'
sender = '發(fā)件人郵箱'
passwd = '密碼(授權(quán)碼)'
receiver = '收件人'
# i 人事簽到接口地址
url = "https://www.ihr360.com/gateway/attendance/aggregate/attendance/api/sign/doSign"
# 抓包簽到請(qǐng)求頭
headersValue = {
'Cookie': 'SESSION=XXXXXXXXXXXXXX; Path=/; HttpOnly',
'accept': 'application/json;charset=UTF-8',
'appKey': 'com.irenshi.personneltreasure',
'appVersion': 'XXXX',
'osVersion': 'XXXX',
'udid': 'XXXXXX',
'user-agent': 'IRENSHI_APP_AGENT',
'os': 'Android',
'irenshilocale': 'zh_CN',
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': '272',
'Host': 'www.ihr360.com',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
}
# 抓包請(qǐng)求 json
jsonValue = {
"deviceToken": " ",
"deviceType": "NORMAL",
"latitude": XXX,
"locationName": "XXX",
"longitude": XXX,
"phoneName": "MI6",
"signSource": "APP",
"wifiMac": "XXX",
"wifiName": "Alliot",
}
# 簽到方法
def doSign(url, jsonValue, headersValue):
r = requests.post(url, json=jsonValue, headers=headersValue, verify=False)
global results
results = json.loads(r.text)
print(strftime("%Y-%m-%d %H:%M:%S", localtime()))
return results
# 郵件提醒方法
def sendMail(server, port, sender, passwd, msg):
smtp = smtplib.SMTP()
smtp.connect(server, port)
smtp.login(sender, passwd)
smtp.sendmail(msg['From'], msg['To'], msg.as_string())
smtp.quit()
print('郵件發(fā)送成功email has send out !')
def newMail(status):
msg = MIMEText(str(results), 'plain', 'utf-8')
msg['From'] = formataddr(["AlliotSigner", sender])
msg['To'] = formataddr(["Alliot", receiver])
if status == None:
msg['Subject'] = '打卡失敗-_-!'
print("打卡失敗")
else:
msg['Subject'] = '自動(dòng)打卡成功'
print("打卡成功")
sendMail(server, port, sender, passwd, msg)
# 簽到并郵件通知結(jié)果,不用通知?jiǎng)t改為 doSign(url, jsonValue, headersValue) 即可
newMail(doSign(url, jsonValue, headersValue)["data"])
# doSign(url, jsonValue, headersValue)
修改其中的配置為上文抓到的數(shù)據(jù)即可(這里注意, headersValue 請(qǐng)求頭為字典格式, jsonValue 則為 Json 格式,執(zhí)行報(bào)錯(cuò)的時(shí)候檢查一下是否是格式錯(cuò)誤。)
上傳到服務(wù)器中,執(zhí)行:
python3 ihr.py # 你的文件名
執(zhí)行后,打開(kāi) i 人事查看是否成功產(chǎn)生一次簽到記錄,成功即可添加進(jìn)計(jì)劃任務(wù)。
定時(shí)執(zhí)行
利用 crontab 來(lái)實(shí)現(xiàn)自動(dòng)執(zhí)行。關(guān)于 crontab 的具體使用,可見(jiàn) Linux下crontab的使用與注意事項(xiàng) | Alliot's blog
我是定義每周工作日的 8 點(diǎn) 18 點(diǎn)打卡,crontab 配置為:
0 8,18 * * mon,tue,wed,thu,fri,sat /usr/bin/python3 /alliot/ihr.py>>/alliot/ihr_log.txt
后記
整個(gè)流程很簡(jiǎn)單粗暴,其實(shí)一般后臺(tái)都是能看出來(lái)的,因?yàn)槊看蔚暮灥轿恢枚际且粯樱匀绻胍普嬉稽c(diǎn),可以在請(qǐng)求中經(jīng)緯度、位置名里使用范圍的隨機(jī)數(shù)等等… 不過(guò),還是那句話: 可以,但沒(méi)必要。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)自動(dòng)打卡小程序
- Python實(shí)現(xiàn)釘釘/企業(yè)微信自動(dòng)打卡的示例代碼
- 基于python+selenium自動(dòng)健康打卡的實(shí)現(xiàn)代碼
- python實(shí)現(xiàn)自動(dòng)打卡的示例代碼
- python+selenium 簡(jiǎn)易地疫情信息自動(dòng)打卡簽到功能的實(shí)現(xiàn)代碼
- Python + selenium + crontab實(shí)現(xiàn)每日定時(shí)自動(dòng)打卡功能
- Python 實(shí)現(xiàn)網(wǎng)課實(shí)時(shí)監(jiān)控自動(dòng)簽到、打卡功能
- python獲取微信企業(yè)號(hào)打卡數(shù)據(jù)并生成windows計(jì)劃任務(wù)
- 使用Python實(shí)現(xiàn)企業(yè)微信的自動(dòng)打卡功能
- Python實(shí)戰(zhàn)之單詞打卡統(tǒng)計(jì)
相關(guān)文章
Python實(shí)現(xiàn)將Excel某范圍單元格內(nèi)容截圖
Openpyxl是一個(gè)強(qiáng)大的Python庫(kù),主要用于讀取、寫入和操作Excel文件,本文將使用Openpyxl實(shí)現(xiàn)將Excel某范圍單元格內(nèi)容截圖,感興趣的可以了解下2024-11-11
python實(shí)現(xiàn)寫數(shù)字文件名的遞增保存文件方法
今天小編就為大家分享一篇python實(shí)現(xiàn)寫數(shù)字文件名的遞增保存文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Python實(shí)現(xiàn) 版本號(hào)對(duì)比功能的實(shí)例代碼
這篇文章主要介紹了 Python實(shí)現(xiàn) 版本號(hào)對(duì)比功能的實(shí)例代碼,文末給大家補(bǔ)充介紹了python 比較兩個(gè)版本號(hào)大小 ,需要的朋友可以參考下2019-04-04
python數(shù)據(jù)分析基礎(chǔ)之pandas中l(wèi)oc()與iloc()的介紹與區(qū)別介紹
我們經(jīng)常在尋找數(shù)據(jù)的某行或者某列的時(shí)常用到Pandas中的兩種方法iloc和loc,兩種方法都接收兩個(gè)參數(shù),第一個(gè)參數(shù)是行的范圍,第二個(gè)參數(shù)是列的范圍,這篇文章主要介紹了python數(shù)據(jù)分析基礎(chǔ)之pandas中l(wèi)oc()與iloc()的介紹與區(qū)別,需要的朋友可以參考下2024-07-07
python繪制散點(diǎn)圖詳細(xì)步驟(從0到1必會(huì))
這篇文章主要介紹了如何使用Python繪制散點(diǎn)圖,包括導(dǎo)入包、準(zhǔn)備數(shù)據(jù)、繪制圖像、修飾圖像(添加標(biāo)題、坐標(biāo)軸標(biāo)簽、顏色圖例)以及整合所有代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
pycharm中使用request和Pytest進(jìn)行接口測(cè)試的方法
這篇文章主要介紹了pycharm中使用request和Pytest進(jìn)行接口測(cè)試的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
pandas dataframe的合并實(shí)現(xiàn)(append, merge, concat)
這篇文章主要介紹了pandas dataframe的合并實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
wxPython中l(wèi)istbox用法實(shí)例詳解
這篇文章主要介紹了wxPython中l(wèi)istbox用法,以實(shí)例形式較為詳細(xì)的分析了Python使用wxPython中l(wèi)istbox的相關(guān)技巧,需要的朋友可以參考下2015-06-06

