使用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

posted @ 2020-08-09 03:09  soowin  阅读(1742)  评论(5编辑  收藏  举报