关于助教培训视频计时的破解

这确实不是光彩的事情,因为学校助教培训的这种机制是非常有用的。

不过为了稍微证明一下自己在Web开发的能力,也为了考察一下在线教育平台的质量,决定搞一搞。

通过观察,网页还是做了一定的防护。一是视频不能通过图形化的方式来调整播放速度和进度,二是就是调整了播放速度和进度也不会对观看时间和进度造成影响,三是通过定时往后端发送POST来告诉自己看了多少秒。

如果是后端专门开个会话来为前端计时,也就是计时权不在前端上,那肯定是破解不了的,只是老实挂了。

不过经过仔细观察,发现计时权极大可能是在前端而非后端。

1727512197926

每个三十秒,player.js的ajaxOrder函数会发起一个和计时有关的POST请求。

其中会有一个如下的表单,其中:fsresourceid和time应该是比较关键的参数,前者应是课程id,后者是这次请求告诉后端看了几秒:

1
[{"index":0,"methodname":"mod_fsresource_set_time","args":{"fsresourceid":7826,"time":2,"finish":0,"progress":53.25}}]

打开开发者工具-源代码,点进player.js,发现非常友好,代码是真源代码,没有经过压缩和打乱,而且还有详细的注释。通过一番分析,其实只要把time变量改了,发送请求给后端,响应的进度和观看时间就会更改。

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
function ajaxOrder() {
// 误差情况分析:1 网络请求失败引起的误差,比较严重,因为每次请求后都会马上清空viewTotalTime,
// 故如果视频仍在播放中,缺少的时间为:失败的次数*viewTotalTime
// 解决方法是在ajax失败的时候把请求的time累加到当前时间
//浏览时长为小于等于0时不上传
if (viewTotalTime <= 0) return
var nowpoint = Math.floor(player.getCurrentTime() * 1000)
var videoTotalDuration = videoDuration * 1000
var finish = progress = 0;
// console.log('nowpoint', nowpoint);
// console.log('videoDuration', videoTotalDuration);
// 当前时间大于等于总时间,说明已经播放完成,这里多加250毫秒是为了避免播放到最后一秒时,视频结束了,进度没有为100%
if (nowpoint + 250 >= videoTotalDuration) {
finish = 1;
progress = 100;
} else if (nowpoint < videoTotalDuration) {
progress = Number((nowpoint / videoTotalDuration) * 100).toFixed(2);
}
var data = Array();
var time = Math.round(viewTotalTime / 1000)
// console.log('showMessage', showMessage);
// console.log('player status', player.getStatus());
data[0] = {
'index': 0,
'methodname': 'mod_fsresource_set_time',
'args': {
'fsresourceid': playerdata.fsresourceid,
'time': time, // 浏览视频时长
'finish': finish, // 是否是否结束
'progress': progress, // 当前播放进度
},
};
console.log('finish--', finish, '::progress--', progress, '::time--', time);
$.ajax({
url: playerdata.siteUrl + "/lib/ajax/service.php?timestamp=" + getCurrentTimeStamp() + "&sesskey=" + playerdata.sesskey,
method: 'POST',
data: JSON.stringify(data),
success: function (response) {
// 请求失败,把请求失败的时长累加到当前浏览时长
if (response[0] && response[0].data) {
showMessage = false
updateTableData(response[0].data)
} else {
viewTotalTime += data[0].args.time * 1000
showMessage = true
player.pause()
alert('更新进度失败:', response[0] && response[0].exception ? response[0].exception : '请检查网络是否异常')
}
},
error: function (xhr, status, error) {
// 请求失败,把请求失败的时长累加到当前浏览时长
viewTotalTime += data[0].args.time * 1000
console.log('请求失败', viewTotalTime);
showMessage = true
player.pause()
alert('网络异常,请检查网络并刷新网页重新加载尝试')
}
})
viewTotalTime = 0;
}

具体来说就是更改一下time,比如下图就是把time改为500,即对应500秒:

1727512215436

点击播放视频后会自动调用ajaxOrder,不过想自己调用也行,可以把这个函数第一行的if (viewTotalTime <= 0) return

这行注释掉,

1727512228393

然后再终端直接调用:ajaxOrder()

1727512240511

不出意外的话,观看时长就会增加500秒,相应进度也会自动增加。


关于助教培训视频计时的破解
http://thinkerhui.site/2024/08/23/自学研究/关于助教培训视频计时的破解/
作者
thinkerhui
发布于
2024年8月23日
许可协议