Skip to content

Latest commit

 

History

History
197 lines (154 loc) · 8.09 KB

虎课网视频分析.md

File metadata and controls

197 lines (154 loc) · 8.09 KB

虎课网加密视频分析

分析

首先没有 Vip 的可以扫码领个 7天Vip,便于分析

虎课7天Vip

以此视频为例 : https://huke88.com/course/51856.html

视频播放时首先产生的 post 请求

Request URL: https://asyn.huke88.com/video/video-play
Request Method: POST

headers 需要有 User-Agent 和 Cookie

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4144.2 Safari/537.36
Cookie:Cookie

data 要包括 id 和 _csrf-frontend(一下简称 csrf)

id: 51856 (在网址中提取)
_csrf-frontend: LUhGQjlwX3lUPA5vbyIeCGcCDm9hIWg3YgEfEkM6ZhEULn84UjIIKQ==  (携带Cookie刷新网页即可获取)

看下返回信息

{code: 1, msg: "可以播放,因为你是全站VIP啊!", give_gold: 1, tx_file_id: "5285890808741709557", can_play: true,…}
app_id: 1256517420
auth_type: 4
can_play: true
catalog: [{id: "7250", courseTitle: "认识Figma(1)", parent_id: "7249", courseId: "51855",…},…]
catalogHeaderTitle: "Figma-认识Figma(2)"
code: 1
courseId: "51856"
expire_at: 1606229437
give_gold: 1
msg: "可以播放,因为你是全站VIP啊!"
nextCourse: {id: "7253", courseTitle: "工具介绍和属性控制", parent_id: "7252", courseId: "51857",…}
playerEndedRecommend: {type: 3, video: [{courseTitle: "CAD-利用多段线绘制门的花纹-练习",…}, {courseTitle: "PS-转换夜景技巧-小技巧",…}]}
recommend: [{courseTitle: "5.2020UI必备的深色模式设计",…}, {courseTitle: "6.不同界面的适配方法",…}, {courseTitle: "7.完整的项目实例展示",…},…]
recommendTeacherName: "酸梅干超人"
remindMessage: "学习路上有虎课陪伴,开始第3个教程的学习吧!获得虎课币+10"
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6MTI1NjUxNzQyMCwiZmlsZUlkIjoiNTI4NTg5MDgwODc0MTcwOTU1NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MDYyMTg2MzcsImV4cGlyZVRpbWVTdGFtcCI6MTYwNjIyOTQzNywicGNmZyI6ImJhc2ljRHJtUHJlc2V0IiwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiNWZiZDFkYmQiLCJybGltaXQiOjMsInVzIjoiMTYwNjIxODYzNyJ9fQ.c1XGanmcmUBDNwBbiS_Z6PwYWZmrW5nrHxgdtSd46Fo"
tx_file_id: "5285890808741709557"
web_vvt_url: ""

这里要得到几个参数,用于实现下面的 get 请求

app_id: 1256517420
tx_file_id: "5285890808741709557"
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBJZCI6MTI1NjUxNzQyMCwiZmlsZUlkIjoiNTI4NTg5MDgwODc0MTcwOTU1NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MDYyMTg2MzcsImV4cGlyZVRpbWVTdGFtcCI6MTYwNjIyOTQzNywicGNmZyI6ImJhc2ljRHJtUHJlc2V0IiwidXJsQWNjZXNzSW5mbyI6eyJ0IjoiNWZiZDFkYmQiLCJybGltaXQiOjMsInVzIjoiMTYwNjIxODYzNyJ9fQ.c1XGanmcmUBDNwBbiS_Z6PwYWZmrW5nrHxgdtSd46Fo"

get 请求获取视频 m3u8 链接

Request URL: https://playvideo.qcloud.com/getplayinfo/v4/{app_id}/{tx_file_id}?psign={token}&overlayKey=f8d5b22aa9bebb92418dd11363ceb9dc&overlayIv=bc8af0cbd767b39fd404705ecd277c10

Request Method: GET

这里 overlayKey 和 overlayIv 是不确定的,我也没找到,但是我发现他是不校验的,可用以下方法替代

key 设为16个0,然后16进制编码正好为32位

key = '0000000000000000'
overlayKey = key.encode().hex()
overlayIv = key.encode().hex()

所以请求链接为

https://playvideo.qcloud.com/getplayinfo/v4/{app_id}/{tx_file_id}?psign={token}&overlayKey={overlayKey}&overlayIv={overlayIv}

得到信息

{
"code": 0,
"message": "",
"requestId": "f2100ff001234398b47fdf45fe6953b0",
"version": 4,
"context": "",
"warning": "",
"media": {
"basicInfo": {
"name": "Figma-认识Figma(2)",
"size": 34429261,
"duration": 625,
"coverUrl": "",
"description": ""
},
"streamingInfo": {
"drmOutput": [
{
"type": "SimpleAES",
"url": "https://video-tx.huke88.com/cb3d3408vodtransgzp1256517420/9f4465375285890808741709557/adp.12.m3u8?t=5fbd1dbd&rlimit=3&us=1606218637&sign=e4296b4113303532b66031657e2d7cdb",
"subStreams": [
{
"type": "video",
"width": 426,
"height": 240,
"resolutionName": "流畅"
},
{
"type": "video",
"width": 852,
"height": 480,
"resolutionName": "标清"
},
{
"type": "video",
"width": 1280,
"height": 720,
"resolutionName": "高清"
},
{
"type": "video",
"width": 1920,
"height": 1080,
"resolutionName": "全高清"
}
]
}
],
"drmToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9~eyJ0eXBlIjoiRHJtVG9rZW4iLCJhcHBJZCI6MTI1NjUxNzQyMCwiZmlsZUlkIjoiNTI4NTg5MDgwODc0MTcwOTU1NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MDYyMjAyMjUsImV4cGlyZVRpbWVTdGFtcCI6MjE0NzQ4MzY0NywicmFuZG9tIjoxNjgxNjYwMjgxLCJvdmVybGF5S2V5IjoiZjhkNWIyMmFhOWJlYmI5MjQxOGRkMTEzNjNjZWI5ZGMiLCJvdmVybGF5SXYiOiJiYzhhZjBjYmQ3NjdiMzlmZDQwNDcwNWVjZDI3N2MxMCIsImNpcGhlcmVkT3ZlcmxheUtleSI6IiIsImNpcGhlcmVkT3ZlcmxheUl2IjoiIiwia2V5SWQiOjAsInN0cmljdE1vZGUiOjB9~vR2kir1-niaCFbI8S03KlS5RtiEwnQfZIeQFYdYMzpM"
},
"imageSpriteInfo": {
"webVttUrl": "",
"imageUrls": null
}
}
}

这里可以获取几个参数:

title = "Figma-认识Figma(2)"

m3u8url = "https://video-tx.huke88.com/cb3d3408vodtransgzp1256517420/9f4465375285890808741709557/adp.12.m3u8?t=5fbd1dbd&rlimit=3&us=1606218637&sign=e4296b4113303532b66031657e2d7cdb"
(很明显不是可以直接下载的链接,但是可以后面拼凑)
drmToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9~eyJ0eXBlIjoiRHJtVG9rZW4iLCJhcHBJZCI6MTI1NjUxNzQyMCwiZmlsZUlkIjoiNTI4NTg5MDgwODc0MTcwOTU1NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MDYyMjAyMjUsImV4cGlyZVRpbWVTdGFtcCI6MjE0NzQ4MzY0NywicmFuZG9tIjoxNjgxNjYwMjgxLCJvdmVybGF5S2V5IjoiZjhkNWIyMmFhOWJlYmI5MjQxOGRkMTEzNjNjZWI5ZGMiLCJvdmVybGF5SXYiOiJiYzhhZjBjYmQ3NjdiMzlmZDQwNDcwNWVjZDI3N2MxMCIsImNpcGhlcmVkT3ZlcmxheUtleSI6IiIsImNpcGhlcmVkT3ZlcmxheUl2IjoiIiwia2V5SWQiOjAsInN0cmljdE1vZGUiOjB9~vR2kir1-niaCFbI8S03KlS5RtiEwnQfZIeQFYdYMzpM"

根据网页中已经显示的 m3u8 链接: https://video-tx.huke88.com/cb3d3408vodtransgzp1256517420/9f4465375285890808741709557/voddrm.token.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9~eyJ0eXBlIjoiRHJtVG9rZW4iLCJhcHBJZCI6MTI1NjUxNzQyMCwiZmlsZUlkIjoiNTI4NTg5MDgwODc0MTcwOTU1NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MDYyMTg2MzcsImV4cGlyZVRpbWVTdGFtcCI6MjE0NzQ4MzY0NywicmFuZG9tIjozNTU1MjU3NTE3LCJvdmVybGF5S2V5IjoiZjhkNWIyMmFhOWJlYmI5MjQxOGRkMTEzNjNjZWI5ZGMiLCJvdmVybGF5SXYiOiJiYzhhZjBjYmQ3NjdiMzlmZDQwNDcwNWVjZDI3N2MxMCIsImNpcGhlcmVkT3ZlcmxheUtleSI6IiIsImNpcGhlcmVkT3ZlcmxheUl2IjoiIiwia2V5SWQiOjAsInN0cmljdE1vZGUiOjB9~5oJIxYMzFJjdQwKyb0IBcIKChUxiMSykgqXZaWVrN14.video_12_3.m3u8?rlimit=3&us=1606218637&t=5fbd1dbd&sign=e4296b4113303532b66031657e2d7cdb

可以看出我们上面得到的 m3u8url 经过简单的变换就已经可以得到正确的链接

key 解密

得到的m3u8url 中 keyurl:https://drm.vod2.myqcloud.com/getlicense/v1?drmType=SimpleAES&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9~eyJ0eXBlIjoiRHJtVG9rZW4iLCJhcHBJZCI6MTI1NjUxNzQyMCwiZmlsZUlkIjoiNTI4NTg5MDgwODc0MTcwOTU1NyIsImN1cnJlbnRUaW1lU3RhbXAiOjE2MDYyMTg2MzcsImV4cGlyZVRpbWVTdGFtcCI6MjE0NzQ4MzY0NywicmFuZG9tIjozNTU1MjU3NTE3LCJvdmVybGF5S2V5IjoiZjhkNWIyMmFhOWJlYmI5MjQxOGRkMTEzNjNjZWI5ZGMiLCJvdmVybGF5SXYiOiJiYzhhZjBjYmQ3NjdiMzlmZDQwNDcwNWVjZDI3N2MxMCIsImNpcGhlcmVkT3ZlcmxheUtleSI6IiIsImNpcGhlcmVkT3ZlcmxheUl2IjoiIiwia2V5SWQiOjAsInN0cmljdE1vZGUiOjB9~5oJIxYMzFJjdQwKyb0IBcIKChUxiMSykgqXZaWVrN14

下载得到一个16字节的key 文件,经2进制编码后进行AES CBC解密(key为16个0的16进制编码,Iv和key一样),再经 Base64 解码得到2进制的key,最后 utf-8 输出

代码实现:

encryptkey = requests.get(keyurl).content
cryptor = AES.new(key=key.encode(), mode=AES.MODE_CBC, iv=key.encode())
# 二进制的解密key
decryptkey = cryptor.decrypt(encryptkey)
# base64编码的解密key
decryptkey = base64.b64encode(decryptkey).decode()

得到 m3u8的key!!!

最终源码 2020.11.24

本套源码因为几乎涵盖了虎课网所有视频规则,所以看起来很多,其实原理就在上面

……………………
暂不分享原理已经很明白了

下载地址

更新链接: lanzous: https://aohua.lanzoui.com/b00u073yf

github: https://github.com/nchujx/huke

B站视频地址:https://www.bilibili.com/video/BV1Ty4y1879F