央视频移动网页版 ckey

CCTV 的直播各种平台都有,不过目前大部分直播源都已经加密了,这个央视频是其中之一,移动网页版域名即 https://m.yangshipin.cn/,今天尝试找到加密过程。

以 CCTV-1 为例:https://m.yangshipin.cn/video?type=1&vid=2000210103&pid=600001859

首先,需要登陆。登陆后点击播放按钮,找到请求地址和参数如下,刷新几次,发现变化的只有 fnticktmcKeyflowid。很明显 fnticktm 都是十位时间戳。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

央视频ckey加密方法

待加密的字符串 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 不知怎么生成的,需要反编译。

央视频移动网页版 ckey》上有 6 条评论

  1. 疯子

    defn : auto / hd / shd / fhd
    app版的ckey看上去有点形似9.1版本的。虽然提交的是4.2..
    在libckeygenerator.so里实现.脑壳疼

    回复
  2. 游客12138

    web接口从不用登陆被撸到需要登陆,再到限制,呵呵哒~
    ‘defn’=> ‘fhd’ 曾经还能玩耍,现在好像也限制了

    回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注