利用Python实现每日健康打卡

利用Python实现每日健康打卡

疫情期间学校要求在健康系统中每日打卡,奈何我又老是忘记打卡,就有了做一个自动打卡的脚本来帮助我每日自动打卡想法。于是在没事的时候研究了一下学校的疫情打卡系统,用Python编写了一个自动打卡的小程序。

1.登录系统

系统的登录界面做的还是很简单的,也没有验证码等验证机制,使用 学号(Account)密码(Password) 就可以登录系统。做一次错误的登录,使用抓包工具抓包分析,很容易的就找到了登录接口,观察到登录是向登录接口发起一个Post请求
登录请求
继续分析发现Post请求所携带的信息有:user_account—学号user_password—密码,数据为json格式。
Post请求携带数据

代码实现
# 登录系统
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))

2.获取未打卡日期

回顾以前打卡过程:成功进入到健康打卡系统之后,找到当天的打卡日期,进行打卡。接下来就是要做的就是获取这个打卡日期,分析发现也是一个Post请求,请求未携带任何信息。
获取打卡日期
发送Post请求后返回的是一个json格式的数据,分析json数据发现,打卡日期位于 datas—hunch_list 中,其中编号为0的就是我们需要打卡的日期信息,其中 date1 为当前打卡日期、 state 为当前日期打卡状态,0为未打卡,1为未打卡。程序中还对打卡状态进行了判断,如未打卡,返回打卡日期,如已打卡,不返回数据。
利用Python实现每日健康打卡_第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']

3.提交信息

接下来的就是要提交信息了,对打卡提交的请求头所包含的Data进行编写就行了,请求头包含的信息如下:

  1. mqszd: 目前所在地? 沈阳市/辽宁省非沈阳市/其他地区(非辽宁省)

  2. sfybh: 前一日填报到目前为止,目前所在地(第1题)是否存在变化? 否/是

  3. mqstzk: 目前身体状况? 良好/干咳乏力、发热、呼吸困难等病症/医学观察隔离/疑似病例/确诊病例

  4. jcryqk: 近14日接触人员情况 未接触下述五类人员/确诊病例/疑似人员/医学观察人员/中高风险地区出入人员

  5. glqk: 隔离情况 自行做好防护/医学隔离观察/按要求定点隔离

  6. jrcltw: 今日测量体温(℃)

  7. sjhm: 请填写目前个人手机号码

  8. jrlxfs: 请填写家人联系方式

  9. xcsj: 如目前所在地(第1题)较前一日填写数据有变化,请填写行程出发时间(例:18时10分)、使用的交通工具及车次/航班号(例:火车G8001)、外出原因(例:实习)(针对第2题选择“是”的情况)

  10. gldd: 如医学隔离观察或按要求定点隔离,请填写隔离起始时间、隔离地点(针对第6题未选择“自行做好防护”的情况)

  11. zddw: 我的位置(需要开启手机定位功能) 中国,**省,**市,**县<@>**

放入我们的信息,再Post请求中提交就可以了。
利用Python实现每日健康打卡_第2张图片

填写示例

{"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'])

4.整体分析

回顾整个程序,利用request.session保持登录状态,login登录函数编写,getHomeDate获取未打卡日期函数编写,punchForm打卡信息提交函数编写。最重要的还是对网页请求的分析,然后编写python代码进行打卡行为模拟。

你可能感兴趣的:(笔记,python,爬虫)