注意:本文只从技术上讨论自动签到的可行性,并不鼓励大家使用,且自行承担使用的后果。
本文代码较多,建议电脑观看
1.1 抓包
抓包需要注意几点:
- Android7.0以上需要root权限,在 ≥7.0的机器中默认不再信任用户证书。
- 今日校园使用了ssl pinning(固定证书)
- Android版本 <9.0可以使用Xposed + JustTrustMe 来绕过第二条
- Android版本 ≥9.0需要使用EdXposed + TrustMeAlready 来绕过第二条
但是因为无论是Magisk还是Xposed或者EdXposed都有手机变砖的风险,不建议没有经验的同学尝试。但还有一个更简单的方法,随便下载一个主流Android模拟器,添加一个Android 5.0的模拟器就可以愉快的抓包了。
1.2 接口
抛去比较多且无趣的数据包的分析等操作,最终抓到了以下几个接口:
1. 查询今日待填表单
1 | /wec-counselor-collector-apps/stu/collector/queryCollectorProcessingList |
Post请求格式
1 | {"pageSize":10,"pageNumber":1} |
返回的Json数据
1 | { |
2. 查询表单的基本信息
1 | /wec-counselor-collector-apps/stu/collector/detailCollector |
Post请求格式
1 | {"collectorWid": collectorWid} |
collectorWid就是接口1中的wid
返回的json数据
1 | { |
3. 查询表单选项等详细信息
1 | /wec-counselor-collector-apps/stu/collector/getFormFields |
Post请求格式
1 | {"formWid":formWid, "collectorWid":collectorWid} |
返回的Json数据
1 | { |
rows中的数据即问卷题目,fieldItems中就是选项信息,isSelected的值决定了该选项默认是否选中,因为默认选中的表单是学生没有感染的情况,所以这给了我们自动构造返回数据的可能性。
4. 提交表单
1 | /wec-counselor-collector-apps/stu/collector/submitForm |
Post请求格式
1 | { |
可以看的到,提交数据所必须的formWid collectWid可以从接口一中获取,通过接口二获取schoolTaskWid,最后再根据接口三获取from详细的选项信息,构造出form部分(其实就是把没有选中的选项remove)需要注意的是请求头中必须要有Cpdaily-Extension,这是一串密文,我也没搞懂是什么,也不知道加密方式。但可以确定是,服务器只验证是否能解密,不验证数据正确性。所以一串密文,可以通用所有人。
以上接口都需要登录才能使用,且登录后有一条关键cookie它的有效期非常非常非常短,基本上断了手动写入cookie的想法,后来我在查找资料的途中,发现了别人造好的轮子(登录功能是我从该项目上二次开发),思路也是解析html获取必要信息,发送请求获取cookie。but!作者实现了ocr识别验证码,这是个危险的功能。但我用了人家的代码还是应该将项目链接放在这:链接
技术有罪,切记,切记!登录接口就不放出来了
1.2 代码实现
这种需求python显然更具优势,整个过程是:
配置文件读取用户信息 -> 尝试登陆获取cookie -> 携带cookie获取待填表单信息并构造待提交信息 -> 提交
代码我就放在这吧,有兴趣的同学可以讨论一下😸😸
开发环境:Python 3.8
1.3 使用方法
1) 创建阿里云账号
阿里云官网:链接
打开网页进入阿里云官网,阿里云可以使用支付宝或淘宝账号登录,如果提示实名认证就按照提示来。

在进入登录跳转界面后,点击控制台

进入控制台后单击侧边栏

产品与服务 -> 函数计算
单击函数计算后会提示你开通,开通就好了,如果只是挂签到,只能用的到免费额度的万分之一。

新手教程可以跳过,进入函数计算的控制台界面后点击:
服务/函数 -> 新建函数 -> 下一步
函数名称填写SignIn运行环境选择Python3函数入口改为SignIn.main其他默认,点击完成
跳转后进入函数编辑状态,选择代码包上传 代码包链接
下载该代码包,注意这个代码和1.2中的代码不同
选择代码包上传 -> 选择文件 选择刚刚下载的zip文件

点击保存按钮

进入在线编辑后选择config.ini分别修改user_num password address为你的学号,密码和地址。

编辑完成后可以单击
按钮保存并执行,如果今天没有填表,可以去今日校园查看一下是不是已经填好了。
随后点击触发器选项卡 -> 创建触发器 -> 服务类型选择定时触发器
触发器名称随便填,,我用的everyDay。时间配置选择Cron表达式
填写内容需要注意一下
1 | x y z * * * |
x y z 分别代表秒,分,时,因为Cron使用的是UTC时间(UTC时间+8个小时为北京时间)所以:
0 0 0 * * * 代表早上8:00
0 20 0 * * * 代表早上8:20
0 32 20 * * * 代表早上4:32
注意!不要照抄我这个时间,需要自己修改一下,时间也尽量不要选择比较多的8:00这种整时,整分的时间,尽量使用诸如
0 31 0 * * *
0 52 0 * * *之类的时间来避免并发,点击确定就全部配置好了,该脚本会自动在你设定的时间尝试填表。
本文结束