长○大学晚签到自动化打卡脚本——我在长大
前言
由于学校的要求在校学生每天晚上都要使用“我在长大”进行定位打卡进行签到,而打卡小程序的通知推送却经常出现不推送、推送晚之类的BUG,一旦忘记打卡便会面临着要面签、扣德育分的风险,为此笔者很是苦恼。有没有什么办法能每天完成打卡自动化呢?当然有啦,我们接着往下看,如何分析并制作我在长大签到打卡脚本。
准备工作
1.你需要一台能够24小时开机运行的服务器,并且能够运行Docker。
2.你需要基本的计算机网络知识才能看懂相关操作的意义。
3.你需要学会简单的抓包操作以获取你的登录态Cookie,推荐使用reqable或者fiddler工具(在这里面我们要用到的是Cookie中的JWSESSION字段)。
旧版我在校园打卡自动化方式
由于长○大学在2023年更换了新版的签到打卡方式“我在长大”,原来“我在校园”的打卡方式已经不再适用,如果你是其他学校的同学,并且也在寻找“我在校园”类的自动化打卡方式的话,请查看这个Repo获得更多帮助:zhacha222/wozaixiaoyuan: 我在校园 青龙面板 (健康打卡、日检日报、签到、账号检测、报备自动确认返校)理论适用于所有大学 (github.com) 。新版打卡与旧版打卡之间最大的变化是打卡服务器转为了学校私有,而不再由“我在校园”进行服务托管,签到指向的域名也转为了edu.cn结尾的校园域名,而不是wozaixiaoyuan.com 。此次升级还是有一些优点的,那就是打卡的流程更为简单,不再有时间戳校验以及其他防重放攻击的验证,所以要进行自动化签到的话,我们直接抓包然后稍作修改就可以无脑重放了。
抓取并分析打卡过程中发生的网络活动
获取打卡列表
在抓包的记录中,我们需要找到“https://gwwzxy.***.edu.cn/sign/mobile/receive/getMySignLogs?page=1&size=10”这条记录,他返回的数据中包含了我们每一条打卡的详细信息,例如打卡ID,签到日期,学生班级等等,具体响应体即对应含义如下所示。
{
"code": 0,
"data": [
{
"area": "***", #此处为校区名称,例如“小寨校区”或者“长安校区”,一般不会变动
"areaId": "1", #区域ID,或许不同校区有不同ID
"city": "西安市", #签到所在城市,一般不会变动
"classes": "0101", #你所在的班级,一般不会变动
"classesId": "1234567890", #你所在班级的班级ID,由系统分配,一般不会变动
"college": "**学院", #你所在的学院,一般不会变动
"country": "中国", #国家,一般不会变动
"createCollege": "**学院", #创建此签到的学院名称
"createHead": "https://wx.qlogo.cn/mmopen/vi_32/1234", #创建头,暂时不知道有什么用
"createName": "王小明", #创建签到的人的名字
"date": 1234567890, #创建签到的时间,为UNIX时间格式
"degree": "本科", #学历
"district": "碑林区", #区域范围
"end": 1234567890, #签到结束时间,为UNIX时间格式
"head": "https://thirdwx.qlogo.cn/mmopen/vi_32", #签到头,不知道有什么用
"id": "1234567890", #签到ID,每天签到ID都是不一样的,我们需要提取这个字符串作为变量用于签到
"isRead": 0, #是否已读
"latitude": "34", #签到点的纬度
"leaderSign": 0, #不知道有什么用
"longitude": "108", #签到点的经度
"mode": 2, #签到模式,定位签到还是校区签到
"name": "王小红", #你的名字
"number": "12345678", #你的学号
"phone": "123456789", #你的手机号
"province": "陕西省", #省份
"qrCode": 0, #二维码签到
"readDate": 1234567890, #你打开签到消息并阅读的时间点
"schoolId": "0", #学校ID,这个可能需要根据每个人的情况提取
"signContext": "各位同学记得按时签到", #签到人给你留的消息
"signDay": "20991202", #签到日期,这是以人类能读懂的方式写的日期,比如2099年12月02日
"signId": "1234567890", #签到ID,每天的都不一样,需要提取
"signMode": 2, #签到模式
"signStatus": 2, #签到状态
"signTitle": "定位签到", #签到方式的标题
"signUserId": "0", #签到用户ID
"signUserName": "", #签到用户名
"signUserNumber": "", #签到用户号码
"signUserType": "", #签到用户的类型
"start": 123456780000, #签到开始时间,UNIX格式
"street": "求是路", #街道名称
"targetId": "1234567890", #目标ID
"targetName": "0101", #目标班级名字
"targetType": 0, #目标类型
"teacher": "王小花", #老师名字
"teacherId": "1234567890", #老师的ID号
"township": "文艺路街道", #街道名字
"type": 1, #类型
"userArea": "校本部", #用户所在区域
"userId": "1234567890", #用户ID
"userType": "在校学生", #用户类型
"year": "2099" #你的入学年份
}
]
}
签到时发出的签到请求
通过抓包可以发现,在签到时发出的签到请求头目标URL为:“https://gwwzxy.***.edu.cn/sign/mobile/receive/doSignByArea?id={{id|urlencode}}&schoolId={{schoolId|urlencode}}&signId={{signid|urlencode}}“其中主要用到了“id”,“schoolId”,“signid”三个变量参数,我们需要使用正则表达式来提取相关的参数。对于“signId”正则表达式如下所示
"signId":"(\d+)"
对于“id”,正则表达式如下所示:
","id":"(\d+)"
而“schoolId”基本不会变化,直接填入对应的数字即可,需不需要使用变量存储该值可由读者自行决定。
签到发出的请求体如下所示:
{
"latitude": 34, #签到时所处的纬度,抓一次正常签到的包就可以获取,需要到小数点后14位
"longitude": 108, #签到时所处的纬度,抓一次正常签到的包就可以获取,需要到小数点后14位
"nationcode": "000", #国家代码
"country": "中国", #国家
"province": "陕西省", #省份
"citycode": "12345678", #城市代码
"city": "西安市", #城市
"adcode": "123456", #区号代码(?)
"district": "碑林区", #区划
"towncode": "12345678", #镇代号
"township": "文艺路街道", #街道名称
"streetcode": "123456789012345678", #街道代号
"street": "求是路", #具体街区名称
"inArea": 1, #是否在签到区域内,1是在,0是不在。
"areaJSON": "{\"type\":0,\"circle\":{\"latitude\":\"34\",\"longitude\":\"108\",\"radius\":700},\"id\":\"1\",\"name\":\"校本部\"}" #这里是系统内设定的签到有效区域范围,即在经度34度,纬度108度,辐射半径700内可以正常签上到,出了这个区域便无法签到。
}
签到脚本制作
推荐使用qd-today/qd: QD [v20230821] —— HTTP请求定时任务自动执行框架 base on HAR Editor and Tornado Server (github.com)项目进行签到,可以极大方便推送和正则提取的设置,读者可以使用Docker方式搭建自己的签到站,具体方式详见:a76yyyy/qiandao – Docker Image | Docker Hub 。签到脚本正在准备中,感兴趣的小伙伴可以留言交流。