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