闲来玩玩

每周一到周五都需要签到,分别在 8:3210:2614:0015:53 根据以往老师发布签到时间最晚的签到时间为基准。
为了方便,直接复制 Cookie,方法:进入学习通,登陆,F12 ,找到 Network,寻找左边 name 栏,如果为空,点左上角刷新一下页面,一般情况找到第一个请求,右边点击 Headers,寻找 Request Headers 中的 Cookie 复制,将其放入爬虫 headers 中。

同样的道理,我们接着进入一门科目,点击右边 任务,跳转到签到页面。

点击多个签到获取请求 URL,分析参数

发现在所有 URL 中只有参数 activeId 在变化,再对比一下可知,这个就是这一列签到任务的 Key 关键码,这个码如何获取?

在签到页面 F12 定位到某一个签到上。

我打码位置便是要查找值,其他三个签到 URL 属性值也在此 HTML 中找的,直接 re.findall() 就可以省事了
某一科签到可以这样解决,如果切换科目呢?

我们不用比较切换科目的参数变化,我们直接比较切换科目以后每一科的 任务 页面请求参数的变化,一共两个参数且都不相同,F12 定位每一科,可以找到参数值,右键 查看源代码 我们发现之前 F12 找到的属性值这里没有了,说明这些东西是 JavaScript 加载出来的,由于科目不多我们就不去处理,直接打表,创建一个 Class_data 字典,将几门课参数全部列出来。

还有一个问题,不同时间上不同的课。于是我们创建一个辅助文件,由 datatime 类获取本地完整时间,在由weekday转化星期,顺便提取其中的 hour and minute。之后,就 if...elif...else... 判断,当前时间上的哪一科,就返回哪一科的参数。几次 get 就完成签到。

当然了,有时侯不放心是否签到成功,我们可以判断 签到成功 字样是否出现在签到结果页面的 HTML 中,并将当前科目以及签到处理结果,以及处理时间发送到微信!

运行脚本就交给服务器去执行,
使用服务器 crontab 创建定时命令

#第一节课
32 8 * * 1,2,3,4,5 python3 main.py

#第二节课
26 10 * * 1,2,3,4,5 python3 main.py

#第三节课
0 14 * * 1,2,3,4,5 python3 main.py

#第四节课
3 15 * * 1,2,3,4,5 python3 main.py

设置特定时间执行代码,每周一到周五早上 8:3210:26。下午 14:0015:53
超过特定时间发布签到,那么收到消息时间就不对,我们就需要手动签到了。
发生倒课调课,那也就需要自己签到喽

补充:2020/4/26 16:33

修改节假日周六周天补课而错过签到,由于原网页中签到栏包含进行中的,,并且课程不多。循环对所有科目进行扫描进行中的签到,并且访问。服务器上crontab更改为每天执行,这样就不会错过签到。

修改:2020/5/7 15:39

老师喜欢花里胡哨签到,上课过程中签到,不定时签到,脚本效率大大减低。所以这里改动,不过增加了服务器一点点压力
每天上课不可能上两节相同的课,如果出现这这种,那就必须且只能自己去签!!!
服务器每 20 或 30 分钟执行一次脚本,由于重复签到手机收到消息很烦
本地放一个 json 文件,key 为课程码,value 为布尔类型。每天零点设置所有课程为 False ,执行脚本判断键值真假。为真则不执行,说明今天此刻之前已经签到过此门课程。反之为假,说明今天没有执行这一科的签到任务,那么就执行脚本签到,随后手机接收通知。成功率效率大大提升~~~
crontab 命令修改:
*/20 7-23 * * * python3 main.py
0 0 * * * python3 /home/bobo/py/sign/delete.py
delete.py 文件为设置所有 valueFalse

注:本脚本只做学习使用
代码过放在GitHub