CCTV 的直播各种平台都有,不过目前大部分直播源都已经加密了,这个央视频是其中之一,移动网页版域名即 https://m.yangshipin.cn/,今天尝试找到加密过程。
以 CCTV-1 为例:https://m.yangshipin.cn/video?type=1&vid=2000210103&pid=600001859
首先,需要登陆。登陆后点击播放按钮,找到请求地址和参数如下,刷新几次,发现变化的只有 fntick、tm、cKey、flowid。很明显 fntick 和 tm 都是十位时间戳。flowid 类似 md5,找到 flowid 由函数 createGUID 生成,是随机 32 位字符串。cKey 不明。
Request URL: https://liveinfo.yangshipin.cn/ Parameters: cmd: 2 cnlid: 2000210103 pla: 0 stream: 2 system: 1 appVer: 3.0.37 encryptVer: 8.1 qq: 0 device: PC guid: ko8kj04y_icl8j8a2feo defn: auto host: yangshipin.cn livepid: 600001859 logintype: 1 vip_status: 1 livequeue: 1 fntick: 1620044931 tm: 1620044931 sdtfrom: 113 platform: 4330701 cKey: --012D0DFAFF8DE025EE57A91F386CFB0EE42BA857B80ED2EF7A38F51048B1BF740B2E85759CF091A6153093B345BB1D1B1FE02E0878BACF2D8C7CC21CF29F97562166DCF12737C5A7DD3A00B81FE447E0A6BDB2BB6E580EAECEF347696CEE2BD6D2304FA94C9683B1024866394EA3C4DDDA9A9F06F011C62626FED2F982F83DBD327C100A38EA3BEF5DA41F925911FC343E62D3D532F86C05CCDEF9DE05152C615CFFB580B5B6400121EC8096346E9B68721F52A4BDD2BF05CC5E7E1BBA0D70895E queueStatus: 0 uhd_flag: 4 flowid: 7cad376441f5f0f7a8c41a34265e3e07 sphttps: 1 callback: txvlive_videoinfoget_1044130832
全局搜索 `cKey`,在 `txvlive.js` 中找到相关代码,往函数 `o` 中传入 5 个参数,其中 f 即链接中的 vid,p 是时间戳,其他三个参数都是可以固定的:`TxvLive.pubConfig.version = "3.0.37" ,t.guid= "ko8kj04y_icl8j8a2feo" ,u= 4330701`。
{
key: "getLiveVideoUrl",
value: function (t, e, n, i, r) {
var u = t.platform,
f = t.vid,
d = t.defn || "",
h = l(u),
p = a.getTimeStampStr({
time: this.svrtick
}),
v = "";
try {
v = o(f, p, TxvLive.pubConfig.version, t.guid, u)
} catch (g) {}
var m = this;
!function () {
var o = {
// ...
sdtfrom: h,
platform: u,
cKey: v,
queueStatus: 0,
uhd_flag: t.uhdFlag || 4,
flowid: t.flowid
};
单步进入函数,看见函数中有很多代码混肴,直接找到 return 处下断点,再执行,最后拼接出一个 AES 加密函数,CBC 模式, Pkcs7 填充,key 是 Su 值为固定的4E2918885FD98109869D14E0231A0BF4,偏移 iv 同样固定 16B17E519DDD0CE5B79D7A63A4DD801C。

待加密的字符串 xu = sc + bu + yu,sc 是个分隔符,yu 由前面提到的各种参数拼接,类似 "|2000210103|1620045667|mg3c3b04ba|3.0.37|ko8kj04y_icl8j8a2feo|4330701|https://m.yangshipin.cn/|mozilla/5.0 (iphone; cpu|https://m.yangshipin.cn/|Mozilla|Netscape|Win32|",除了时间戳也都是固定的。
bu 每次都变化,在上面被赋值 _u,再次下断点可以看到 _u 初始为 0,之后循环依次取 yu 每个字符进行两次位运算即可。
其实这个央视频 cKey 用的是腾讯视频某一个版本的加密方法,比较简单。Python 版本就不贴这里了,放在 Github,其中有几点要注意的是:
1、AES 加密返回值没有进行 base64,直接是十六进制字符串,同时 key 和 vi 也一样,不能直接 encode,需 a2b_hex 转换。
2、_u 进行位运算最后是字符串拿去拼接,不管有无符号。在 JavaScript 中可能出现负数,而 Python 整数不分类型,上面在位运算时不会溢出,也不会出现形式上的负数了,得用 ctypes 模块来处理下。
最后,虽然算出 cKey,能成功获取到央视频的直播源,但感觉用处不大:
1、央视频移动网页版的直播需要登陆,且播放链接有效期很短,可能为引导用户到 app 上观看。
2、每个 IP 每天有试看次数限制,超出后无返回。
3、央视频 app 抓到的链接有效期很长,且请求时无需带 cookie,但 cKey 不知怎么生成的,需要反编译。
可否搞一个php版的~
博主对PHP不太熟哦,建议在GitHub或者52pojie上搜搜,应该已经有人重写过的。
有没有大佬转成php版的~
大佬 央视频APP版本 ckey 有时间更新一下。
defn : auto / hd / shd / fhd
app版的ckey看上去有点形似9.1版本的。虽然提交的是4.2..
在libckeygenerator.so里实现.脑壳疼
web接口从不用登陆被撸到需要登陆,再到限制,呵呵哒~
‘defn’=> ‘fhd’ 曾经还能玩耍,现在好像也限制了