自动打卡
Zane Lv4

引言


由于我们学校的健康日报已经填了两年我都没有养成积极的习惯,我觉得某个角度来讲这也许不是我的问题;
因此便产生了写一个程序自动填写健康日报并且部署到服务器每天定点帮我打卡的想法;

正文


网络篇

不难想到我们与服务器任何的交互都是离不开数据的传输的,因此我们可以通过检测手机的网络数据进行抓包来确定我们具体是与哪个域名做怎么样的数据交互;

Charles

这里使用的抓包工具是 Charles ,与 iPhone 绑定需要添加 SSL Proxy 并且需要手机端下载认证,具体参照这篇文档

按照上述步骤配置好环境以后,使用手机正常进行打卡,会看到如图所示;

观察到的数据交互是往https://xg.nyist.vip/v1/trace/Student/dailyreportadd

发送了一个请求,其内容是 pcc gps 等;

于是我们就可以通过 Python 的 requests 库模拟一次该操作;

代码篇

因为程序很容易理解,直接放出成品好了;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import json 
import requests
url = "https://xg.nyist.vip/v1/trace/Student/dailyreportadd"

information = {
'location' : '1',
'pcc' : '410000,411000,411002',
'gps' : 'xxx,xxx'
}

files = [

]

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat',
'guest': 'b2w4YlB2X3osNzMzOCxUNjVHNTBKTCwxNjMwMjkwMzU5LjUxMjMsRWRLVm9CVlpYeHdBLDMyOGIzOWI3ZTMzYjlmOTRlZjk2MGM5NDFjOTA0YmNi',
'Referer': 'xxx',
'token': 'xxx',
'content-type': 'application/x-www-form-urlencoded',
'appid': '1',
'Accept': 'application/json, text/plain, */*',
'Cookie': 'xxx'
}

response = requests.request("POST", url, headers=headers, data=information, files=files)

res=json.loads(response.text)
if res["code"] == 0:
print("AutoClockIn Success!!!")
elif( res["code"] == 1 ):
print("Local Error!!!")
else:
print("AutoClockIn Fail!!!")

注意: 代码是无法直接使用的,headers 部分需要根据自己手机情况进行更正,包括 information 部分也最后更正一下;

部署

自动打卡嘛,于是打算部署在服务器中,只需要每天定点让服务器执行一遍这个.py文件就可以;

crontab

该命令可以用于周期性的被调用,将命令存储在crontab文件中,后期可以调用并执行;

crontab -e 打开编辑文件,末尾添加

1
10 8 * * * python3 ~/AutoClockIn/AutoClockIn.py

表示每天 8:10 执行一下python3 ~/AutoClockIn/AutoClockIn.py

ps -ax|grep cron 查看服务是否开启,也可以使用/usr/sbin/service cron start开启;

总结


总体难度不高,但是很简单东西能明白客户端与服务端的交互方式,以及数据传输的原理;

参考文档

Linux服务器定时任务 - 简书

nyist定时健康日报_rmxob的博客-CSDN博客

轻松搞定Charles的HTTPS抓包(iOS13可用)_全菜工程师小辉的博客-CSDN博客_charles抓包ios


由 Hexo 驱动 & 主题 Keep