Python实现i人事自动打卡的示例代码
我司使用的打卡软件是i人事,不过我这记性,经常漏了打卡签退,定了闹钟都会忘,今天又被老大屌了。于是准备抓一下签到接口,利用crontab来实现自动签到签退。
环境配置
这里使用的是Fiddler进行抓包,Fiddler是一个HTTP调试代理工具,以代理服务器的形式实现对网络数据流的监听。之所以没有用Wireshark,一是因为我不是很熟悉wireshark的筛选器,二是因为本文使用模拟器(手机应用后台流量多,不便于分析)来抓包,代理服务器方式更方便。
安装Fiddler
先安装Fiddler(官网地址),安装完成之后需要安装fiddlercertmaker证书生成工具(官网地址)
Fiddler配置
如图,打开Fiddler,Tools选择FiddlerOptions,将图中所标识地方勾选,配置后点击OK保存并重启Fiddler
再次打开该选项卡,点击Action生成证书到桌面(文件名FiddlerRoot.cer)
将该证书文件上传到模拟器即可。
模拟器配置
记录Windows当前网卡的IP备用。
打开模拟器,在模拟器内的系统设置中选择“安全”,选择“从SD卡安装”,选择前面上传的证书,安装即可。(过程中会要求设置屏保密码,设置即可)
选择模拟器内的WiFi连接,长按当前的WiFi,选择修改网络,选择手动配置代理,地址填前面记录的Windows本地IP,端口为8888,保存后重启模拟器即可。
开始抓包
配置过滤器
打开Fiddler后,打开模拟器,这时候在Fiddler会监听到大量的流量信息,便于查找,我们需要使用过滤器,如图,在Fiddler界面右侧,选择“Filters”并勾选,选择“UseFilters”,在“Hosts”项目中,选择“ShowonlythefollowingHosts”,并填入“www.ihr360.com”这样能过滤掉除i人事以外的域名流量信息,同时,在“RequestHeaders”中,勾选“ShowonlyifURLcontains”,填入“gateway/attendance/aggregate/attendance/api/sign/doSign”,点击右上角的Actions,选择“RunFiltersetnow”以生效过滤器。在Fiddler左侧的流量信息栏中,使用Ctrl+X清除当前所有流量信息。
模拟器签到
将模拟器的模拟定位定位到需要打卡的位置,打开i人事,点击考勤打卡,打卡签到,这时候在Fiddler中会出现一条监听到的请求,双击打开,如图所示,
可以看到,实际上打卡签到动作就是一条POST请求。我们了解了这条POST请求的基本内容后就可以利用Python的requests模块来模拟提交了。
模拟请求
模拟POST请求很简单,这里就不多说,直接贴代码(很烂=.=!,能用就行啦…勿喷…):
#!/usr/bin/envpython3 #www.iots.vip #Alliot #2020-1-8 importrequests importjson importsmtplib fromemail.mime.textimportMIMEText fromemail.utilsimportformataddr fromtimeimportstrftime,localtime #忽略requests请求认证警告 requests.packages.urllib3.disable_warnings() #邮件设置 server='smtp.163.com' port='25' sender='发件人邮箱' passwd='密码(授权码)' receiver='收件人' #i人事签到接口地址 url="https://www.ihr360.com/gateway/attendance/aggregate/attendance/api/sign/doSign" #抓包签到请求头 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', } #抓包请求json jsonValue={ "deviceToken":"", "deviceType":"NORMAL", "latitude":XXX, "locationName":"XXX", "longitude":XXX, "phoneName":"MI6", "signSource":"APP", "wifiMac":"XXX", "wifiName":"Alliot", } #签到方法 defdoSign(url,jsonValue,headersValue): r=requests.post(url,json=jsonValue,headers=headersValue,verify=False) globalresults results=json.loads(r.text) print(strftime("%Y-%m-%d%H:%M:%S",localtime())) returnresults #邮件提醒方法 defsendMail(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('邮件发送成功emailhassendout!') defnewMail(status): msg=MIMEText(str(results),'plain','utf-8') msg['From']=formataddr(["AlliotSigner",sender]) msg['To']=formataddr(["Alliot",receiver]) ifstatus==None: msg['Subject']='打卡失败-_-!' print("打卡失败") else: msg['Subject']='自动打卡成功' print("打卡成功") sendMail(server,port,sender,passwd,msg) #签到并邮件通知结果,不用通知则改为doSign(url,jsonValue,headersValue)即可 newMail(doSign(url,jsonValue,headersValue)["data"]) #doSign(url,jsonValue,headersValue)
修改其中的配置为上文抓到的数据即可(这里注意,headersValue请求头为字典格式,jsonValue则为Json格式,执行报错的时候检查一下是否是格式错误。)
上传到服务器中,执行:
python3ihr.py#你的文件名
执行后,打开i人事查看是否成功产生一次签到记录,成功即可添加进计划任务。
定时执行
利用crontab来实现自动执行。关于crontab的具体使用,可见Linux下crontab的使用与注意事项|Alliot'sblog
我是定义每周工作日的8点18点打卡,crontab配置为:
08,18**mon,tue,wed,thu,fri,sat/usr/bin/python3/alliot/ihr.py>>/alliot/ihr_log.txt
后记
整个流程很简单粗暴,其实一般后台都是能看出来的,因为每次的签到位置都是一样,所以如果想要逼真一点,可以在请求中经纬度、位置名里使用范围的随机数等等…不过,还是那句话:可以,但没必要。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。