Python完成i人事主动打卡的示例代码

发布时间:2020-01-14 20:28 来源:互联网 以后栏目:网站办事器

我司应用的打卡软件是 i 人事,不过我这忘性,常常漏了打卡签退,定了闹钟都邑忘,明天又被老大年夜屌了。因而预备抓一下签到接口,应用 crontab 来完成主动签到签退。

情况设备

这里应用的是 Fiddler 停止抓包,Fiddler 是一个 HTTP 调试代理对象,以代理办事器的情势完成对搜集数据流的监听。之所以没有效 Wireshark,一是由于我不是很熟悉 wireshark 的挑选器,二是由于本文应用模仿器(手机应用后台流量多,不便于分析)来抓包,代理办事器方法更便利。

装置Fiddler

先装置 Fiddler( 官网地址 ),装置完成以后须要装置 fiddlercertmaker 证墨客成对象( 官网地址 )

Fiddler设备

如图,翻开Fiddler,Tools 选择 Fiddler Options,将图中所标识处所勾选,设备后点击 OK 保存偏重启 Fiddler

 

再次翻开该选项卡,点击 Action 生成证书到桌面(文件名 FiddlerRoot.cer)

 

将该证书文件上传到模仿器便可。

模仿器设备

记录 Windows 以后网卡的 IP 备用。

翻开模仿器,在模仿器内的体系设置当选择 “安然”,选择 “从 SD 卡装置”,选择前面上传的证书,装置便可。(过程当中会请求设置屏保暗码,设置便可)

选择模仿器内的 WiFi 连接,长按以后的 WiFi,选择修改搜集,选择手动设备代理,地址填前面记录的 Windows 本地 IP,端口为 8888,保存后重启模仿器便可。

 

开端抓包

设备过滤器

翻开 Fiddler 后,翻开模仿器,这时候辰在 Fiddler 会监听到大年夜量的流量信息,便于查找,我们须要应用过滤器,如图,在 Fiddler 界面右边,选择 “Filters”并勾选,选择 “Use Filters”,在 “Hosts” 项目中,选择 “Show only the following Hosts”,并填入 “www.ihr360.com” 如许能过滤掉落除 i 人事以外的域名流量信息,同时,在 “Request Headers” 中,勾选 “Show only if URL contains”,填入 “gateway/attendance/aggregate/attendance/api/sign/doSign” ,点击右上角的 Actions,选择 “Run Filterset now” 以失效过滤器。在 Fiddler 左边的流量信息栏中,应用 Ctrl + X 清除以后一切流量信息。

模仿器签到

将模仿器的模仿定位定位到须要打卡的地位,翻开 i 人事,点击考勤打卡,打卡签到,这时候辰在 Fiddler 中会出现一条监听到的请求,双击翻开,如图所示,

 

可以看到,实际上打卡签到举措就是一条 POST 请求。我们懂得了这条 POST 请求的根本内容后便可以应用 Python 的 requests 模块来模仿提交了。

模仿请求

模仿 POST 请求很简单,这里就不多说,直接贴代码(很烂=.=! ,能用就行啦…勿喷…):

#!/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 请求认证正告
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",
}
# 签到办法
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('邮件发送成功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'] = '主动打卡成功'
    print("打卡成功")
  sendMail(server, port, sender, passwd, msg)
# 签到并邮件告诉成果,不消告诉则改成 doSign(url, jsonValue, headersValue) 便可
newMail(doSign(url, jsonValue, headersValue)["data"])
# doSign(url, jsonValue, headersValue)
        
 
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、
  • 1、
  • 2、
  • 3、
  • 4、
  • 5、
  • 6、
  • 7、
  • 8、
  • 9、
  • 10、
  • 11、
  • 12、
  • 13、
  • 14、
  • 15、
  • 16、
  • 17、
  • 18、
  • 19、
  • 20、
  • 21、
  • 22、
  • 23、
  • 24、
  • 25、