疫情期间学校要求在健康系统中每日打卡,奈何我又老是忘记打卡,就有了做一个自动打卡的脚本来帮助我每日自动打卡想法。于是在没事的时候研究了一下学校的疫情打卡系统,用Python编写了一个自动打卡的小程序。
系统的登录界面做的还是很简单的,也没有验证码等验证机制,使用 学号(Account)、密码(Password) 就可以登录系统。做一次错误的登录,使用抓包工具抓包分析,很容易的就找到了登录接口,观察到登录是向登录接口发起一个Post请求。
继续分析发现Post请求所携带的信息有:user_account—学号 、user_password—密码,数据为json格式。
# 登录系统
def login(account, password):
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; V1914A Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045438 Mobile Safari/537.36 wxwork/3.1.1 MicroMessenger/7.0.1 NetType/WIFI Language/zh Lang/zh'
}
data = {
'user_account': account,
'user_password': password
}
login_url = parse.urljoin(url, 'login')
res = session.post(login_url, headers=headers, data=json.dumps(data))
res = res.json()
status = res['code']
if status == 200:
print('{}登录成功'.format(account))
else:
print(res['msg'])
print('{}登录失败'.format(account))
回顾以前打卡过程:成功进入到健康打卡系统之后,找到当天的打卡日期,进行打卡。接下来就是要做的就是获取这个打卡日期,分析发现也是一个Post请求,请求未携带任何信息。
发送Post请求后返回的是一个json格式的数据,分析json数据发现,打卡日期位于 datas—hunch_list 中,其中编号为0的就是我们需要打卡的日期信息,其中 date1 为当前打卡日期、 state 为当前日期打卡状态,0为未打卡,1为未打卡。程序中还对打卡状态进行了判断,如未打卡,返回打卡日期,如已打卡,不返回数据。
# 获取打卡日期
def getHomeDate():
data = {
}
getHomeDate_url = parse.urljoin(url, 'getHomeDate')
res = session.post(getHomeDate_url,data=json.dumps(data))
res = res.json()
if res['datas']['hunch_list'][0]['state'] == 1:
print('{},您{}已打卡'.format(res['datas']['user_info']['user_name'], res['datas']['hunch_list'][0]['date1']))
else:
print('{},您{}未打卡'.format(res['datas']['user_info']['user_name'], res['datas']['hunch_list'][0]['date1']))
return res['datas']['hunch_list'][0]['date1']
接下来的就是要提交信息了,对打卡提交的请求头所包含的Data进行编写就行了,请求头包含的信息如下:
mqszd
: 目前所在地? 沈阳市/辽宁省非沈阳市/其他地区(非辽宁省)
sfybh
: 前一日填报到目前为止,目前所在地(第1题)是否存在变化? 否/是
mqstzk
: 目前身体状况? 良好/干咳乏力、发热、呼吸困难等病症/医学观察隔离/疑似病例/确诊病例
jcryqk
: 近14日接触人员情况 未接触下述五类人员/确诊病例/疑似人员/医学观察人员/中高风险地区出入人员
glqk
: 隔离情况 自行做好防护/医学隔离观察/按要求定点隔离
jrcltw
: 今日测量体温(℃)
sjhm
: 请填写目前个人手机号码
jrlxfs
: 请填写家人联系方式
xcsj
: 如目前所在地(第1题)较前一日填写数据有变化,请填写行程出发时间(例:18时10分)、使用的交通工具及车次/航班号(例:火车G8001)、外出原因(例:实习)(针对第2题选择“是”的情况)
gldd
: 如医学隔离观察或按要求定点隔离,请填写隔离起始时间、隔离地点(针对第6题未选择“自行做好防护”的情况)
zddw
: 我的位置(需要开启手机定位功能) 中国,**省,**市,**县<@>**
{"mqszd":"其他地区(非辽宁省)","sfybh":"否","mqstzk":"良好","jcryqk":"未接触下述五类人员","glqk":"自行做好防护","jrcltw":"36.5","sjhm":"","jrlxfs":"","xcsj":"","gldd":"","zddw":"中国,**省,**市,**县(区)<@>**"}
#提交表单
def punchForm(date):
data = {
'punch_form': '{"mqszd":"","sfybh":"","mqstzk":"","jcryqk":"","glqk":"","jrcltw":"","sjhm":"","jrlxfs":"","xcsj":"","gldd":"","zddw":"中国,**省,**市,**县(区)<@>**"}',
'date': date
}
punchForm_url = parse.urljoin(url, 'punchForm')
res = session.post(punchForm_url, data=json.dumps(data))
res = res.json()
if res['code'] == 200:
print('恭喜,打卡成功')
else:
print('糟糕,打卡失败')
print('错误信息:\n{}'.format(res['msg'])
回顾整个程序,利用request.session保持登录状态,login登录函数编写,getHomeDate获取未打卡日期函数编写,punchForm打卡信息提交函数编写。最重要的还是对网页请求的分析,然后编写python代码进行打卡行为模拟。