使用Github Action自动填写疫情通
使用Github Action自动填写疫情通
西电晨午晚检一天三次,通过企业号功能进行填写。实际上,西电企业号大部分功能是以网页模式工作的,通过构造connection发送合适的request,设置计划按时间自动运行,即可完成自动填写。
1、原理分析
打开晨午晚检页面,复制链接,得到实际的网页地址:https://xxcapp.xidian.edu.cn/site/ncov/xidiandailyup
在浏览器打开后发现会重定向到登录页面:https://xxcapp.xidian.edu.cn/uc/wap/login
一般来说,登录一次之后,会保留一段时间的cookies,我们要做的就是模拟一次登录,获得相应的connection,随后再次向晨午晚检网页发送request
2、登录过程
[TODO]
3、使用Python
- 准备
Python中有很多与网络相关的库,例如scapy。在这里我们直接使用requests库模拟http的request请求。
首先下载requests库:pip install requests
随后导入:import requests
由于填写的信息是以json形式post的,因此要用到json库格式化信息:import json
- 数据处理
提前编辑好各个字段:是否在校(sfzx),体温(列表形式,对应数字),区域(高德地图API)等
{
"sfzx": "1",
"tw": "1",
"area": 根据实际情况填写,Unicode编码,
"city": 同上,
"province": 同上,
"address": 同上,
"geo_api_info": 高德地图API,Unicode编码,
"sfcyglq": "0",
"sfyzz": "0",
"qtqk": "",
"askforleave": "0"
}
可以将其保存为单独的json文件,再使用json.load导入
- 登录
首先新建一个requests.Session,使用登录接口,post用户名和密码,获得登陆结果
conn = requests.Session()
result = conn.post(
url="https://xxcapp.xidian.edu.cn/uc/wap/login/check",
data={'username': uname, 'password': upswd}
)
if result.status_code != 200:
print('Failed to login.', result.status_code)
exit()
- 提交数据
使用上面新建的conn,再次向晨午晚检接口post数据,并保存新的respond
result = conn.post(
url="https://xxcapp.xidian.edu.cn/xisuncov/wap/open-report/save",
data=data
)
if result.status_code != 200:
print("Error.", result.status_code)
exit()
- 验证结果
查看respond传回的消息,判断是否成功
rjson = json.loads(result.text)
print(rjson['m'])
Github Action
新建仓库上传配置好的数据和代码,就可以使用Github Action帮我们自动完成任务了。在repository页面上点击Action,选择set up a workflow yourself
来自定义任务
Github Action每次执行时,实际上是使用了一台新的虚拟机执行任务,因此需要在yml文件内完整地写出从一个新系统到代码启动所需要执行的全部步骤
name: Daily Check In
on:
schedule:
- cron: '0,30 0,5,11 * * *'
# UTC时间,分别对应了北京时间的8点、13点、19点的整点和30分
jobs:
sign_in:
runs-on: ubuntu-latest
# 定义系统类型,这里选择Ubuntu
steps:
- name: '[Prepare] Code Check'
uses: actions/checkout@v2
# 从该仓库clone代码到虚拟机
- name: '[Prepare] Set python'
uses: actions/setup-python@v1
# 安装python
with:
python-version: '3.x'
- name: '[Prepare] Install Dependencies'
run: |
python -m pip install --upgrade pip
python -m pip install --upgrade requests
# 安装需要的python库
- name: '[Final Main] Check In'
run: |
python submit.py
# 执行代码
有关详细的Github Action yml文件格式,可以在官方文档中找到解释:https://docs.github.com/cn/actions