由于学校每天都要体温打卡,填体温还限制时间段,0|==|_,所以整点py配合linux的crontab,实现自动打卡;
1,抓包分析
发现自动打卡需要登录,输入账号密码即可;
抓登录页面的包分析发现是以post方式提交数据,并且cookie字段携带账号,JSESSIONID等信息:
登录成功后发现三个体温填写栏,并且对体温填写做了时间校验:
点击提交按钮,再次抓包分析:
发现数据包中含有和登录数据包中一样的cookie信息,并且以post方式提交json格式的数据,数据中含三个最主要的体温数据morTem,noonTem,eveTem 和 报告的提交时间 reporttime;
如果数据包无误,提交成功后返回200,并提示修改成功:
代码实现逻辑:
1,只要登录数据包中的cookie值和登录后的数据包中cookie值一致,就可以在py代码上省去登录步骤;
2,三个体温变量对应三个时间段去填写,使用linux的crontab设置三个定时任务实现即可;
3,reporttime为当天填写体温日期,年-月-日,使用py的时间函数即可;
实现代码如下(仅供参考学习py使用):
#coding=utf-8
import requests
import json
import random
import time
# ==== cookie原始数据;全局变量====
cookie = [
"studentCode=11111(账号); IDNo=1(密码)",
"studentCode=22222; IDNo=3",
"studentCode=33333; IDNo=2"
]
studentCode = ''
IDNo = ''
JSESSIONID = 'djfasjfoijaoifjisajfirs'
# ==== 简单处理数据;提取账号,密码 ====
def get_data(cookie):
global studentCode,IDNo
cookie = cookie.split(';')
studentCode = cookie[0].split('=')[1]
IDNo = cookie[1].split('=')[1]
#JSESSIONID = cookie[2].split('=')[1]
#print(studentCode,IDNo,JSESSIONID)
#===测试登录:此模块可以省略===
def login():
url = "登陆URL"
headers = {
"Host": "www.xxx.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0",
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "40",
"Origin": "https://www.xxx.com",
"Connection": "close",
"Referer": "https://www.xxx.com/xxx/xxx",
"cookie": "studentCode=1111; IDNo=1; JSESSIONID=adljasijfdoijasfoi"
}
data = "studentCode=111&IDNo=1"
response = requests.post(url,data=data,headers=headers)
print(response.text)
#login()
#=== 体温填写====
def inp(studentCode,IDNo,JSESSIONID):
# 体温填写URL
url2 = "https://www.xxx.com/xxx"
# http数据包头部信息,含cookie免登陆步骤
headers = {
"Host": "www.xxx.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0",
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Content-Type": "application/json",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "499",
"Origin": "https://www.xxx.com",
"Connection": "close",
"Referer": "https://www.xxx.com/xxx",
"cookie": "studentCode={0}; IDNo={1}; JSESSIONID={2}".format(studentCode,IDNo,JSESSIONID)
}
# === 随机生成体温 ====
e = 36
d = int(random.uniform(0.4,0.7) * 10) /10
#print(a,b,c)
# === 获取当天时间 ====
times = time.strftime("%Y-%m-%d",time.localtime())
print(times)
# http数据包请求体,体温填写
data = {
"studentCode":"{}".format(studentCode),
"classNo":"xxx",
"departmentCode":"02",
"depName":"xxx",
"acaID":"1",
"bodystatus":"正常",
"animalHeat": None,
"address":"xxx学校",
"isContactHubeiBack":"0",
"isContactPatient":"0",
"othercase":"",
"reporttime":"{}".format(times),
"noonTem":"%s"%str(e+d),
"illsymptom": None,
"quarantine": None,
"quarantinePlace": None,
"outStartTime": None,
"outEndTime": None,
"vehicle": None,
"trainNumAndseatNum": None
}
# 发送post请求,请求体为json格式数据
response = requests.post(url2,headers=headers,json=data)
# 返回数据内容编码自适应
response.encoding = response.apparent_encoding
# 打印输出结果
print(response.text)
# 批量打卡
for i in cookie:
get_data(i)
#print(studentCode,IDNo,JSESSIONID)
inp(studentCode,IDNo,JSESSIONID)
linux crontab设置定时任务:
crontab -l -u root【或用户名】 #列出指定用户的定时任务
crontab -e #设置当前用户的定时任务
记得每次设置完定时任务需要重启crontab
systemctl restart cron
#各个参数对应的含义
# .---------------- 分(0 - 59)
# | .------------- 时(0 - 23)
# | | .---------- 天 (1 - 31)
# | | | .------- 月(1-12)
# | | | | .---- 周 1-7
# | | | | |
* * * * * 执行任务的命令/command
将py代码复制三份,变动三个体温变量名,设置三个定时任务,使用py3运行即可(注意linux时区问题 ,date查看时区,一般时区为CST);