注1:本程序只对长沙理工大学做了适配,其它大学需要自行抓包改代码哦~
注2:对于首次打卡十几天后易班对校本化的授权可能会失效,这次重新加上判断授权失败重新授权的代码。已于2020-04-11测试无误。
😎前沿
项目地址:https://github.com/looyeagee/yiban_auto_submit
学校需要每天打卡,而健康的我打卡内容每天也是一样的。所以我就想实现一个自动打卡的程序。
🚀准备工具
HttpCanary - 安卓手机抓包大师
HttpCanary是一款功能强大的HTTP/HTTPS/HTTP2网络包抓取和分析工具,你可以把他看成是移动端的Fiddler或者Charles,但是HttpCanary使用起来更加地简单容易,因为它是专门为移动端设计的!
🌐重要包文
我是安卓手机,使用的软件是HttpCanary,非常好用,可以买个高级版支持作者。由于我安卓手机已经Root,直接信任了假的根证书。若是非Root用户,请使用平行空间处理(根据软件引导即可)开启抓包后,依次进行登录系统,易班校本化,每日健康打卡,选择今日打卡任务,填写反馈,提交操作。
1、[重要]登录包
(已于20201119更新)感谢B站用户破损的鞘翅提供的好用并且简洁的接口。
| 类别 | 说明 |
|---|---|
| 路径 | https://mobile.yiban.cn/api/v3/passport/login |
| 方式 | GET |
| URL参数 | mobile:手机号 |
| URL参数 | password:明文密码 |
| URL参数 | imei:设备识别号,可以乱填 |
若登录成功,返回的是个人信息和access_token(重要)。
2、首页信息包(程序可以不访问写死iapp就好)
| 类别 | 说明 |
|---|---|
| 路径 | https://mobile.yiban.cn/api/v3/home |
| 方式 | GET |
| URL参数 | access_token:登录包下发的access_token |
在返回的data的hotApps里有个这样的信息记录着打卡入口的地址
1 | { |
3、[重要]二次请求码获取包
上面的包的url数据比较重要,访问后会重定向到http://f.yiban.cn/iapp/index?act=iapp7463&v={token},再访问这个重定向,又会被重定向到https://c.uyiban.com/#/?verify_request={verify_request}&yb_uid=13192120,其中verify_request很重要,用来二次认证作请求码。
4、[重要]二次认证包
| 类别 | 说明 |
|---|---|
| 路径 | https://api.uyiban.com/base/c/auth/yiban |
| 方式 | GET |
| URL参数 | verifyRequest:认证请求码,也就是刚刚的verify_request |
| URL参数 | CSRF:Cross-site request forgery,防跨站请求伪造的token。本来应该是服务端下发,经检测,这里是客户端随机生成的字符串,可以随便填东西。服务端会记住这个东西,所以以后的请求也要提交一样的字符串 |
| Cookies | csrf_token:刚刚客户端生成的字符串 |
若请求成功,会返回个人的信息,下发了2个Cookies,以后的请求都要带上,其中一个是PHPSESSID,一个是cpi。其中cpi可以base64解码:信息为
1 | { |
好像也没啥用,主要是是PHPSESSID记录了会话信息。
5、未完成打卡清单
| 类别 | 说明 |
|---|---|
| 路径 | https://api.uyiban.com/officeTask/client/index/uncompletedList |
| 方式 | GET |
| URL参数 | CSRF:刚刚的随机字符串 |
| Cookies | csrf_token:刚刚生成的随机值;还有刚刚下发的2个Cookies |
返回如下:
1 | { |
其中重要的是TaskId任务Id等下要提交的。其他的不怎么用得到,TimeoutState是是否超时的一个状态码,Type不清楚,此外还有开始时间和截止时间等信息。
6、任务详细
| 类别 | 说明 |
|---|---|
| 路径 | https://api.uyiban.com/officeTask/client/index/detail |
| 方式 | GET |
| URL参数 | CSRF:刚刚的随机字符串 |
| URL参数 | TaskId:具体打卡任务的Id |
| Cookies | csrf_token:刚刚生成的随机值;还有刚刚下发的2个Cookies |
返回如下JSON:
1 | { |
其中最重要的是WFId,经研究,这个是固定的表单Id,也就是说只要我们要填的表单内容不变,这个值永远不变,经发现从试运行到现在一直是同一份表单。记录下固定的WFId就好。其中的Title、PubOrgName和PubPersonName提交打卡表单的时候要用到。
7、表单详细(程序不需访问)
| 类别 | 说明 |
|---|---|
| 路径 | https://api.uyiban.com/workFlow/c/my/form/{WFId} |
| 方式 | GET |
| 路径占位符参数 | WFId:固定的疫情表单Id |
| URL参数 | CSRF:刚刚的随机字符串 |
| Cookies | csrf_token:刚刚生成的随机值;还有刚刚下发的2个Cookies |
这个对程序来说更不重要了,就是获取表单里面要填的东西。对返回的东西进行二次解析后结果是:
1 | [ |
其中id就是具体要填写的内容的id,required是这项是否必填。
8、[重点]表单提交
| 类别 | 说明 |
|---|---|
| 路径 | https://api.uyiban.com/workFlow/c/my/apply/{WFId} |
| 方式 | POST |
| 路径占位符参数 | WFId:固定的疫情表单Id |
| URL参数 | CSRF:刚刚的随机字符串 |
| URL参数 | TaskId:具体打卡任务的Id |
| Cookies | csrf_token:刚刚生成的随机值;还有刚刚下发的所有Cookies |
POST BODY有两个:data:表单具体内容,如下:
1 | { |
若你要使用,直接修改上方的一些数据即可。extend,是传一些自定义信息,经检测,应该是固定的三个信息:任务名称、发布机构、发布人。这三个信息可以在第4个包里找到。
1 | { |
正确的话,请求返回的code是整数0,并且会返回initiateId用于转发表单。
9、获取转发表单URL
| 类别 | 说明 |
|---|---|
| 路径 | https://api.uyiban.com/workFlow/c/work/share?InitiateId=%s&CSRF=%s |
| 方式 | GET |
| URL参数 | CSRF:刚刚的随机字符串 |
| URL参数 | InitiateId:刚刚打卡返回的 |
| Cookies | csrf_token:刚刚生成的随机值;还有刚刚下发的所有Cookies |
可以得到人人可以访问的表单浏览URL
😍源码
20201117更新,请打开https://github.com/looyeagee/yiban_auto_submit 查看详情
main.py
1 | import json |
yiban.py
1 | import re |
😇如何自动?
买个服务器,使用Linux的crontab就好啦,加上如下规则:
1 | 1 0 * * * python3 /root/yiban/main.py |
这样就会每天的0点1分运行这个脚本啦。每天看看结果就行了,还想折腾的,可以搞个自动发邮件通知自己即可。
运行截图(老版本留个纪念)

