脚本刷课思路-2
类似前言的PI话
上一篇是基础篇,内容是关于爬虫的时候注意的动态页面和静态页面的区别,其实也没啥实质性的内容,这一篇才是刷课的一个思路
现在论坛或者其他地方肯定都有分享浏览器刷课的脚本,但是这类脚本通常都是需要你开着浏览器,然后脚本自动给你调1.5倍速、静音、自动切换下一个视频这样,我个人而言,不是很喜欢这类的脚本,我更偏向于,运行一下,所有的视频就全都看完了,所以实际的思路上,和那类脚本是完全不一样的
我这种脚本的做法,是直接告诉服务器,我看了这个视频,你给我记上,所以我是没有“看”这个步骤的
正文
最最最最最重要的前提就是,你要刷课的网站,没有WAF,也就是网站防火墙,如果有的话,他会把你发送的请求当成黑客攻击给拦截掉的,至于WAF做啥我就不解释了
首先,按流程来,我们得先需要解决登录的问题,前一篇说的,你需要登录,才有“权限”来获取对应你的课程,登录窗口一般很好找,在开始前,我们先按 F12
打开开发者工具,准备查看登录过程中,调用了哪些接口
一般来说,为了方便查看、管理,接口的名字直接翻译就能知道是啥了,所以在上图中,可以看到一个 loginSystem
点进去后发现,发送的Http数据包中,包含了自己的用户名密码
所以你只需要请求
这个Url,然后通过post的方式传入那三个参数,就可以完成登录了,当然绕过验证码这篇不讲,我前面有一篇小记了一个方法,Google百度一查也有一大堆例子的
在成功登录后,我们就可以直接打开课程链接
实际上,我为了图方便,课程ID这部分的内容,我一般是不会通过首页来获取的,而是直接当成一个固定值写进程序里面的,一来比较省事,二来要是网站更新了,我还可以直接进行修改,唯一的缺点就是,他只能刷这一门课了,但是这个缺点我还挺喜欢的(笑)
从上面的url可以看到,用Get型传入了两个参数,为courseOpenId和OpenClassId,我们把这两个值先记录下来
这种网课的资源,肯定都是需要一级一级获取下去,换成人话就是
需要先获取章节的id,然后再获取章节中小节的id,然后在通过小节的id获取某个章节中的小节中的视频、ppt的资源
举一个获取小节id的操作,我先刷新一下页面,获取所有的章节id
可以看到,网页调用了一个接口,我们点击 Preview
查看返回的数据是否是我们想要的
发现name和页面中章节的名字对应上了,说明这确实是章节的id,所以接下来我们需要关注的就是,他往这个接口发送了什么数据,回到headers,往下拖就可以看到, FromData
是不是很熟悉,这就是课程链接中带的两个参数,也就是说,我们用这两个参数,请求这个接口后,就会返回所有的章节id回来了
接着我随意点开一个章节
这时 Network
中发现网站调用了一个接口
往下继续看,看post发送了什么数据
courseOpenId,我们在url中已经看到了,这个是课程的id,而下面的那个moduleId,则是这个章节的id,而章节的id我们在上面获取了,所以这样一步一步的推导下去,就可以获取到最后的资源id了
用文字说就是,看接口,看返回的内容是不是需要的,接口没错的话,看他是传入了什么参数才返回的内容
当你获取到了最后一步的视频的id后,这个时候考虑的就是,这个网站是怎么知道你学习了,我目前遇到的有两种
- 你只需要访问了一下这个资源,他就默认你看完了
- 你需要通过接口发送数据,"告诉"服务器你看完了
我们随意打开一个视频,发现这个网站,每10秒就发送一个数据,记录当前的视频位置
所以最后获取了所有的id后,直接拿这个接口疯狂发送数据,告诉他你看完了就好了,至于时长,自己把握,别刷了上百个小时
PS:昨天发现服务器上的一个服务有点问题,凌晨2点钟了还没睡,所有写这篇的时候,可能稍微逻辑有点不清,要是有不理解的可以后台留个言啥的
- Python时间与时间戳转换
- linux配置ssh互信实现免密登陆
- uva--1339 - Ancient Cipher(模拟水体系列)
- Python获得13位unix时间戳
- Centos7下LVM对文件系统进行在线扩容
- centos7编译安装Redis
- hdu----(5023)A Corrupt Mayor's Performance Art(线段树区间更新以及区间查询)
- Redis单线程架构
- hdu----(4521)小明系列问题——小明序列
- Redis数据结构和内部编码
- Redis全局命令
- nginx使用GeoIP限制国家访问
- shell获取每月最后一天
- 定向转发和重定向实现 <select >下拉表单数据传送
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 编写一个简单的JQuery插件
- Spring AOP异常:Error creating bean with name ‘org.springframework.aop.aspectj.
- Tomcat7 Redis Session 共享
- CodeIgniter (CI) 框架学习 -- load_class
- Laravel框架学习 -- php artisan down/up
- Spring中基于注解@AspectJ的AOP实现
- python提高--running-python-code-contained-in-a-strin
- linux shell 监控脚本 及 邮件发送
- Laravel框架学习 -- 安装
- Redis 键管理与小功能
- redis 数据持久化
- 不蒜子 | 给网站、博客文章添加阅读次数统计,我用两行代码 搞定计数
- redis 主从复制
- Spring 当一个接口多个实现时,怎么注入
- redis主从同步,显示master_link_status:down的解决思路