您好,登錄后才能下訂單哦!
我司使用的打卡軟件是 i 人事,不過我這記性,經(jīng)常漏了打卡簽退,定了鬧鐘都會(huì)忘,今天又被老大屌了。于是準(zhǔn)備抓一下簽到接口,利用 crontab 來實(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)聽。之所以沒有用 Wireshark,一是因?yàn)槲也皇呛苁煜?wireshark 的篩選器,二是因?yàn)楸疚氖褂媚M器(手機(jī)應(yīng)用后臺(tái)流量多,不便于分析)來抓包,代理服務(wù)器方式更方便。
安裝Fiddler
先安裝 Fiddler( 官網(wǎng)地址 ),安裝完成之后需要安裝 fiddlercertmaker 證書生成工具( 官網(wǎng)地址 )
Fiddler配置
如圖,打開Fiddler,Tools 選擇 Fiddler Options,將圖中所標(biāo)識(shí)地方勾選,配置后點(diǎn)擊 OK 保存并重啟 Fiddler
再次打開該選項(xiàng)卡,點(diǎn)擊 Action 生成證書到桌面(文件名 FiddlerRoot.cer)
將該證書文件上傳到模擬器即可。
模擬器配置
記錄 Windows 當(dāng)前網(wǎng)卡的 IP 備用。
打開模擬器,在模擬器內(nèi)的系統(tǒng)設(shè)置中選擇 “安全”,選擇 “從 SD 卡安裝”,選擇前面上傳的證書,安裝即可。(過程中會(huì)要求設(shè)置屏保密碼,設(shè)置即可)
選擇模擬器內(nèi)的 WiFi 連接,長(zhǎng)按當(dāng)前的 WiFi,選擇修改網(wǎng)絡(luò),選擇手動(dòng)配置代理,地址填前面記錄的 Windows 本地 IP,端口為 8888,保存后重啟模擬器即可。
開始抓包
配置過濾器
打開 Fiddler 后,打開模擬器,這時(shí)候在 Fiddler 會(huì)監(jiān)聽到大量的流量信息,便于查找,我們需要使用過濾器,如圖,在 Fiddler 界面右側(cè),選擇 “Filters”并勾選,選擇 “Use Filters”,在 “Hosts” 項(xiàng)目中,選擇 “Show only the following Hosts”,并填入 “www.ihr360.com” 這樣能過濾掉除 i 人事以外的域名流量信息,同時(shí),在 “Request Headers” 中,勾選 “Show only if URL contains”,填入 “gateway/attendance/aggregate/attendance/api/sign/doSign” ,點(diǎn)擊右上角的 Actions,選擇 “Run Filterset now” 以生效過濾器。在 Fiddler 左側(cè)的流量信息欄中,使用 Ctrl + X 清除當(dāng)前所有流量信息。
模擬器簽到
將模擬器的模擬定位定位到需要打卡的位置,打開 i 人事,點(diǎn)擊考勤打卡,打卡簽到,這時(shí)候在 Fiddler 中會(huì)出現(xiàn)一條監(jiān)聽到的請(qǐng)求,雙擊打開,如圖所示,
可以看到,實(shí)際上打卡簽到動(dòng)作就是一條 POST 請(qǐng)求。我們了解了這條 POST 請(qǐng)求的基本內(nèi)容后就可以利用 Python 的 requests 模塊來模擬提交了。
模擬請(qǐng)求
模擬 POST 請(qǐng)求很簡(jiǎn)單,這里就不多說,直接貼代碼(很爛=.=! ,能用就行啦…勿噴…):
#!/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í)行后,打開 i 人事查看是否成功產(chǎn)生一次簽到記錄,成功即可添加進(jìn)計(jì)劃任務(wù)。
定時(shí)執(zhí)行
利用 crontab 來實(shí)現(xiàn)自動(dòng)執(zhí)行。關(guān)于 crontab 的具體使用,可見 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)都是能看出來的,因?yàn)槊看蔚暮灥轿恢枚际且粯?,所以如果想要逼真一點(diǎn),可以在請(qǐng)求中經(jīng)緯度、位置名里使用范圍的隨機(jī)數(shù)等等… 不過,還是那句話: 可以,但沒必要。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。