疫情在家上慕课,逼出了最强的我(分析如何写一个自动化刷课软件)
前言
又到了在家刷慕课的时候了,哎,渴望学习的我却耐不住性子看今天布置的任务。在刷qq的时候,无意中看到有人在群里叫卖代刷网课,4元一科,就单单这个价格,已经很诱人了,真的很低。其实也能想象,反正是软件刷,自己不费任何力气,便宜走量呗。
不过,这并不吸引我,吸引我的是刷课软件的原理,话不多说,我们开始分析!
准备工具
- 谷歌浏览器
- postman 接口测试软件
重头戏
视频资源分析
我们首先打开一节课,点击进入到课程,让视频处于播放中,我们此时按住f12 进入谷歌浏览器的开发者模式,点击network 并选择XHR(xmlHttpRequest)
在视频的播放中,我们会不断接收这样的消息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SySGCwAs-1585215618811)(C:\Users\86151\Desktop\刷客软件分析过程\2.png)]
也许有人知道这是什么了,我也不卖关子了,这个就是视频的缓存数据。(后来补充:经过百度搜索,发现慕课使用的m3u8网络传输协议来做在线视频的播放。)
先通过请求获取视频流加载信息表:
扩展链接:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjfGEz0w-1585215618816)(C:\Users\86151\Desktop\刷客软件分析过程\3.png)]
整个缓存请求是这样的一个URL形式,std0.ts 开始,每次请求数字都加1.这里默认是标清播放,如果是高清播放,结尾是hdx.ts.
然后我们等待视频走完,看看有没有新的请求发出。
视频刚播放完毕,立马发出了一个请求
完整的请求是这样:
从链接英文的意思来讲,应该是保存慕课学习状态,也就是咱们这个视频看完了,总得给咱们记录一下,至于记录哪些消息呢,我们看看发送的数据。对了,地址后面跟了一个csrfkey 这个值,这个应该就是身份标识。
-
先看cookie
除了一些个人信息之外,我发现了另外三条
-
hasVolume=true;
-
videoRate=1.5;
-
videoVolume=0.93;
这三个分别表示 是否有声音、视频播放速度、视频播放音量
乖乖,咱们平常喜欢静音刷网课的同学注意了,这些行为都会被记录,至于在教师端显示不显示我就不知道了。以后刷课记得开声音(博主还是提倡大家好好听课的,以后肯定用得上)
-
-
Form Data
- unitid 单元id
- finished 是否完成本课程
- index 索引号 (至于什么作用,目前不知)
- duration 持续时间,这个值是个固定值,很多视频都是300000
- courseid 课程id
- lessionid 章节id
- videoid 视频id
- termid 团体id 我猜测是学校id
- userid 用户id
- contenType 内容类型 这里指1 指视频 不同的数字指为不同资源
- action 动作 学习时间统计
- videotime 视频时长 单位是s
- learnedVideoTimeCount 视频学习时间统计
在多次观察后,我发现:这个保存视频学习状态的请求每五分钟请求一次,并不是最终看完视频后,提交一次请求
第一次请求
第二次请求
视频观看完毕后请求
本次课程视频时长为12分26秒,换算成秒应该是746s 但视频是从0开始计算时间的 所以视频长度应该加1 为 747s。
此时有个疑问,这三次请求的学习时长加起来为754s ,比原视频要多6s,这是怎么回事呢。我观看了另外一个视频,发现学习时长加起来要比原视频多5s。我猜测这里,只要学习时长大于视频时长即可,具体多几秒 应该没事,只要别多太多,咱们就默认5s左右。
至于videotime 第一次为296 第二次为592 第三次为747 ,可以这样解释,因为用户需要在观看时,每5分钟进行状态提交,只要此时视频时间点小于学习时长即可,咱们也默认5s。
插一句:每节课程前面都有一个⭕,当你完成该节课程的全部内容后,这个圆圈会变成实心的,如果你仅仅完成一部分,比如只是看完了视频,这个圆圈会变成半实心。
文档资源分析
咱们接下来看看这个课程的其他资源:
我们点开中间的文档
每次我们点击下一页时,我们会发现,发送了一个请求,请求地址与视频请求地址一样,但是参数有了很大的变化,我们一起来看看
-
cookie
- hasVolume=true;
- videoRate=1;
- videoVolume=0.
这里我们可以看到,视频声音为0.这个我们很容易理解,文档是没有声音的。虽然不知道后台有没有对这个地方做判定,不过也是给我们提个醒,如果要做工具的话,要注意这个点。(后续补充:在后面的观察中,我发现这些值与前面视频播放状态保持一致,这里的猜测纯属多余)
-
Form data
- unitid 单元id
- pagenum 当前查看页数
- finished 是否完成
- contentType 类型
我们快速点击文档翻页,当我们点到最后一页的时候,finished=true pagenum=22.这个部分并没有做时间限制,我们只需要获取文档页数,即可发送完成请求,相对比较简单。
讨论部分分析
讨论部分
讨论部分就比较简单了,请求地址与前面一样,请求参数除了类型那一块不一致外,其余都一样。
测试题分析
有的课会有测试题
我们先去正常答题,看看提交后的请求信息:
点击提交后,会先发送一个请求检验你的答案,这个我们不去考虑,紧接着,还是会发送一个saveMocContentLearn的请求,地址与前面的一样,参数与讨论部分基本一致,只有contentType处这里值为5.
总结
-
各类学习资源的状态提交请求地址一致,参数方面contenTpye=1 表示视频资源 、contenTpye=3 表示文档资源 、contenTpye=6 表示讨论资源 、contenTpye=5 表示测试资源
-
我们可以根据上面分析使用postman工具进行测试,我这里测试没什么问题
-
目前只是做了比较初级的分析,离后面实现自动刷课还有很长的路要走。
-
这些仅仅作为编程爱好者之间的分享,博主建议大家平常还是要老老实实上课听课,知识会给你带来巨大改变的。
欢迎大家跟我一起交流,有兴趣的可以博客底下留言。