自动刷课脚本

最近学驾照, 理论部分需要刷满14个小时的视频才能预约考试(http://hz.5u5u5u5u.com), 于是做了一个自动刷课的脚本.

问题

网站通过以下两种方式验证学习者是否在观看视频:

  • 在视频播放过程中, 网站会随机弹出验证码, 以验证观看者是否观看.
  • 视频网站会检测用户鼠标, 键盘的操作, 如果长时间未操作, 视频播放会自动停止.
    为了实现视频播放的自动化, 脚本主要实现了两个功能, 一是验证码识别, 二是鼠标, 键盘操作模拟.

功能

验证码识别

视频网站用的验证码如下, 需要在图片上顺序点击文字才能通过验证.
验证码图片示例

验证码识别有两种方法, 一是自己使用图像识别相关技术自己训练模型识别; 二是利用现成的打码平台识别. 由于本人比较懒, 自然选择了第二种方式. 如果读者想要自己训练模型识别此类验证码, 可参考文章使用深度学习破解点击验证码.

我用的打码平台是超级鹰, 类似的还有打码兔, 答题吧等应该都可以实现我们需要的功能. 平台使用较为简单, 只需要将图片按照固定格式上传, 平台即可返回识别结果. 具体流程参见平台的相关介绍. 对于上述验证码, 平台返回的结果为需要点击的四个点的坐标, 格式如下图所示.
平台返回数据示例

得到验证码识别结果后, 我们需要模拟鼠标点击操作, 创建Event, 将点击的坐标作为Event的参数传入. 另外, 得到的验证码点击坐标仅仅是针对验证码图片的, 我们需要对打码平台返回的坐标进行处理, 得到真实应该点击的坐标. 创建Event的代码如下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (var count = 0; count < pic_array.length; count++)
{
var position_array = pic_array[count].split(",");
var clientX = parseInt(position_array[0]);
var clientY = parseInt(position_array[1]);
var clickPos = CPos.$getMousePos(clientX, clientY);
var absPos = CPos.$getAbsPos(document.getElementById('validateImg'));

ev.clientX = clickPos.x + absPos.x;
ev.clientY = clickPos.y + absPos.y;

ev.initEvent('click', false, true);
document.getElementById('validateImg').dispatchEvent(ev);
}

鼠标+键盘操作模拟

验证码识别搞定后, 发现平台还会检测用户的鼠标键盘操作. 如果用户长时间未操作鼠标键盘, 平台会自动停止视频播放. 网上找了一下, 发现jQuery提供了鼠标点击, 键盘按键的触发函数, 使用示例如下代码所示, 具体信息可参考 https://www.jquery123.com/mouseup/.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button id="fuck">fuck</button>
<img id="id_img"></img>
<p>Press mouse and release here.</p>
</body>
<script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
<script>
// jQuery插件。一个jQuery对象,而不是直接调用。
jQuery.fn.simulateKeyPress = function(character) {
// 内部调用jQuery.event.trigger
// 参数有 (Event, data, elem). 最后一个参数是非常重要的的!
jQuery(this).trigger({ type: 'keypress', which: character.charCodeAt(0) });
};

//页面调用
jQuery(document).ready( function($) {
// 绑定事件处理程序
$( 'body' ).keypress( function(e) {
alert( String.fromCharCode( e.which ) );
console.log(e);
});
// 模拟按键了 x
$( 'body' ).simulateKeyPress('x');
});

$("p").mouseup(function() {
$( this ).append( "<span style='color:#f00;'>Mouse up.</span>" );
})
$("p").mousedown(function() {
$( this ).append( "<span style='color:#00f;'>Mouse down.</span>" );
});
$("body").mousemove(function() {
$("p").append( "<span style='color:#00f;'>Mouse move.</span>" )
});
document.body.onmousedown = function(){alert("test");};

</script>
</html>

基于上述两个功能的实现, 可以完成一个简单的自动刷课脚本. 代码运行的流程图如下所示. 完整的代码请见github: https://github.com/zjd0112/BrowseVideo.
脚本运行流程.

参考文章:
https://www.cnblogs.com/CyLee/p/7513342.html
https://www.jquery123.com/mouseup/
https://zhuanlan.zhihu.com/p/34186397