Contents

基友选了mooc的课,然后问我有木有啥办法快速看完里面的视频。

拿来研究了一下,发现在看视频的时候,每秒会向服务器发一个请求,比如:https://mooc1-1.chaoxing.com/multimedia/log/836ded1fb7ae2f213ffad6432d9727c4?duration=779&otherInfo=nodeId_88240978&userid=XXX&rt=0.9&clipTime=0_779&dtype=Video&objectId=49380ee765563cc0d56c74f2a8d24eea&clazzId=1050949&jobid=1467602883583&view=pc&playingTime=776&isdrag=3&enc=d7c883e970e7ed57654df21167b34962

服务端会返回一个结果,{isPassed:true/false}。
所以,视频有没有看完就是通过这个链接来判断的。

很容易发现,playingTime是播放时间,duration是视频时长。所以只要playingTime=duration就是视频放完了。
实际测试的时候发现playingTime<=duration,也是可以通过的,只要playingTime大于最后一道题的时间点即可。

enc是一个用来校验合法性的参数。由于每次都会变化,且请求里没有获取到这个参数,猜想加密算法在本地。
然而搜遍了所有js都没有找到enc的生成方式。

就在要放弃之际。。。发现禁用了js以后视频还能检测到鼠标不在播放器区域。。。突然想到应该是在flash里检测的,那加密算法是不是也在里面。
于是下载了player_4.0.11.swf文件,反编译之后…果然找到了答案。

下面是生成链接的代码

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
import hashlib
import json

url = "https://mooc1-1.chaoxing.com/multimedia/log/836ded1fb7ae2f213ffad6432d9727c4?duration=779&otherInfo=nodeId_88240978&userid=XXX&rt=0.9&clipTime=0_779&dtype=Video&objectId=49380ee765563cc0d56c74f2a8d24eea&clazzId=1050949&jobid=1467602883583&view=pc&playingTime=776&isdrag=3&enc=d7c883e970e7ed57654df21167b34962"
temp = url.split('?')
jsonStr = '{"' + temp[1].replace('=','":"').replace('&','", "') +'"}'
js = json.loads(jsonStr)
time = js["duration"] //可以减去一个随机数
clazzId = js["clazzId"]
userid = js["userid"]
jobid = js["jobid"]
objectId = js["objectId"]
n = time * 1000
duration = int(js["duration"]) * 1000
clipTime = js["clipTime"]
pwdStr = "[%s][%s][%s][%s][%s][d_yHJ!$pdA~5][%s][%s]" % (clazzId, userid, jobid, objectId, n , duration, clipTime)
print pwsStr
m2 = hashlib.md5()
m2.update(pwdStr)
js["playingTime"] = time
js["enc"] = m2.hexdigest()
param = "?"
for j in js:
param += "%s=%s&" % (j, js[j])
url_new = temp[0] + param
print url_new

Contents