溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼

發(fā)布時(shí)間:2020-10-19 21:21:05 來源:腳本之家 閱讀:236 作者:Alliot 欄目:開發(fā)技術(shù)

我司使用的打卡軟件是 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

Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼 

再次打開該選項(xiàng)卡,點(diǎn)擊 Action 生成證書到桌面(文件名 FiddlerRoot.cer)

Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼 

將該證書文件上傳到模擬器即可。

模擬器配置

記錄 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,保存后重啟模擬器即可。

Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼 

開始抓包

配置過濾器

打開 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)前所有流量信息。

Python實(shí)現(xiàn)i人事自動(dòng)打卡的示例代碼

模擬器簽到

將模擬器的模擬定位定位到需要打卡的位置,打開 i 人事,點(diǎn)擊考勤打卡,打卡簽到,這時(shí)候在 Fiddler 中會(huì)出現(xiàn)一條監(jiān)聽到的請(qǐng)求,雙擊打開,如圖所示,

Python實(shí)現(xiàn)i人事自動(dò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í)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(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)容。

AI