找回密码
 立即注册
搜索
查看: 295|回复: 11

央视新闻JS断流问题-已解决

[复制链接]

2

主题

65

回帖

93

积分

彩电迷

积分
93
发表于 6 天前 | 显示全部楼层 |阅读模式
本帖最后由 Reg007 于 2025-11-13 19:02 编辑

研究了好几天  终于转换成功了。就是现在发现解析出来的地址会播放4分钟就断开了。
烦请大佬出面解决问题。
管理员更新了PHP,已经搞定,感谢各位大佬赐教

转换好的代码如下:
  1. //********ku9 js使用示例(适合1.3.4及以上版本使用)********//

  2. const CryptoJS = require("crypto");

  3. function main(item) {
  4.     var id = item.id || 'cctv4k';
  5.     var channelMap = {
  6.         'cctv1': '11200132825562653886',
  7.         'cctv2': '12030532124776958103',
  8.         'cctv4': '10620168294224708952',
  9.         'cctv7': '8516529981177953694',
  10.         'cctv9': '7252237247689203957',
  11.         'cctv10': '14589146016461298119',
  12.         'cctv12': '13180385922471124325',
  13.         'cctv13': '16265686808730585228',
  14.         'cctv17': '4496917190172866934',
  15.         'cctv4k': '2127841942201075403'
  16.     };
  17.     var articleId = channelMap[id] || channelMap['cctv4k'];
  18.    
  19.     // 尝试使用gateway2接口
  20.     var playUrl = getCCTVNEWSPlayUrlGateway(articleId);
  21.     if (playUrl && playUrl.indexOf('http') === 0) {
  22.         // 将https替换为http
  23.         playUrl = playUrl.replace(/^https:/i, 'http:');
  24.         console.log("获取到直播地址: " + playUrl);
  25.         return { url: playUrl };
  26.     }
  27.    
  28.     console.log("获取直播地址失败");
  29.     return { url: '' };
  30. }

  31. // 使用gateway2接口,参考PHP代码
  32. function getCCTVNEWSPlayUrlGateway(articleId) {
  33.     var url = "https://gateway2.cctvnews.cctv.com/1.0.0/feed/article/live/detail?articleId=" + articleId + "&scene_type=6";
  34.     var t = Date.now();
  35.     var x_req_ts = t - 1;
  36.    
  37.     // 生成签名 - 参考PHP代码
  38.     var signString = "GET\napplication/json\n\n\n\nx-ca-key:204133710\nx-ca-stage:RELEASE\nx-ca-timestamp:" + t + "\n/1.0.0/feed/article/live/detail?articleId=" + articleId + "&scene_type=6";
  39.     var es = 'etyEuNdA7GvQU7iPZHqnrBpSFfRyKQTD';
  40.    
  41.     // 使用CryptoJS实现HMAC-SHA256
  42.     var sign;
  43.     try {
  44.         var hash = CryptoJS.HmacSHA256(signString, es);
  45.         sign = CryptoJS.enc.Base64.stringify(hash);
  46.         console.log("HMAC-SHA256签名成功");
  47.     } catch (e) {
  48.         console.log("HMAC-SHA256失败: " + e);
  49.         // 备用方法 - 使用简单的SHA256
  50.         sign = ku9.sha256(signString + es);
  51.     }
  52.    
  53.     var client_id = createUUID();
  54.    
  55.     var headers = {
  56.         'Accept': 'application/json',
  57.         'Cookieuid': client_id,
  58.         'From-Client': 'h5',
  59.         'Userid': client_id,
  60.         'X-Ca-Key': '204133710',
  61.         'X-Ca-Stage': 'RELEASE',
  62.         'X-Ca-Signature': sign,
  63.         'X-Ca-Signature-Headers': 'x-ca-key,x-ca-stage,x-ca-timestamp',
  64.         'X-Ca-Timestamp': t.toString(),
  65.         'X-Req-Ts': x_req_ts.toString(),
  66.         'X-Request-Id': client_id,
  67.         'Referer': 'https://m-live.cctvnews.cctv.com/',
  68.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36'
  69.     };
  70.    
  71.     console.log("发送API请求: " + url);
  72.     console.log("签名: " + sign);
  73.    
  74.     try {
  75.         var res = ku9.request(url, 'GET', headers, null, true);
  76.         
  77.         console.log("响应状态码: " + res.code);
  78.         
  79.         if (res.code !== 200) {
  80.             console.log("API请求失败,状态码: " + res.code);
  81.             if (res.body) {
  82.                 console.log("响应内容: " + res.body);
  83.             }
  84.             return null;
  85.         }
  86.         
  87.         console.log("响应内容: " + res.body);
  88.         
  89.         var data = JSON.parse(res.body);
  90.         var response;
  91.         
  92.         // 检查是否有response字段
  93.         if (data.response) {
  94.             try {
  95.                 response = JSON.parse(ku9.decodeBase64(data.response));
  96.             } catch (e) {
  97.                 console.log("Base64解码失败: " + e);
  98.                 response = data;
  99.             }
  100.         } else {
  101.             response = data;
  102.         }
  103.         
  104.         if (!response || !response.data) {
  105.             console.log("响应数据格式异常");
  106.             return null;
  107.         }
  108.         
  109.         var liveData = response.data;
  110.         var authUrl = null;
  111.         var dk = liveData.dk;
  112.         
  113.         // 安全地访问嵌套属性
  114.         if (liveData.live_room &&
  115.             liveData.live_room.liveCameraList &&
  116.             liveData.live_room.liveCameraList.length > 0 &&
  117.             liveData.live_room.liveCameraList[0].pullUrlList &&
  118.             liveData.live_room.liveCameraList[0].pullUrlList.length > 0 &&
  119.             liveData.live_room.liveCameraList[0].pullUrlList[0].authResultUrl &&
  120.             liveData.live_room.liveCameraList[0].pullUrlList[0].authResultUrl.length > 0) {
  121.             
  122.             authUrl = liveData.live_room.liveCameraList[0].pullUrlList[0].authResultUrl[0].authUrl;
  123.         }
  124.         
  125.         if (!authUrl) {
  126.             console.log("无法获取authUrl");
  127.             return null;
  128.         }
  129.         
  130.         var liveUrl;
  131.         if (authUrl.toLowerCase().startsWith('http')) {
  132.             liveUrl = authUrl;
  133.         } else {
  134.             if (!dk) {
  135.                 console.log("需要解密但缺少dk参数");
  136.                 return null;
  137.             }
  138.             liveUrl = decryptAuthUrl(authUrl, dk, x_req_ts);
  139.         }
  140.         
  141.         console.log("找到直播地址: " + liveUrl);
  142.         return liveUrl;
  143.         
  144.     } catch (e) {
  145.         console.log("获取播放地址异常: " + e);
  146.         return null;
  147.     }
  148. }

  149. // 解密函数 - 参考PHP代码
  150. function decryptAuthUrl(authUrl, dk, x_req_ts) {
  151.     try {
  152.         var key = getKey(dk, x_req_ts);
  153.         var iv = getIv(dk, x_req_ts);
  154.         
  155.         console.log("解密authUrl, key: " + key + ", iv: " + iv);
  156.         
  157.         // 使用酷9的openssl解密功能
  158.         var decrypted = ku9.opensslDecrypt(authUrl, "AES-128-CBC", key, 0, iv);
  159.         
  160.         return decrypted;
  161.     } catch (error) {
  162.         console.log("解密失败: " + error);
  163.         return null;
  164.     }
  165. }

  166. function getKey(dk, x_req_ts) {
  167.     var eo = String(x_req_ts).slice(0, -3);
  168.     return dk.substring(0, 8) + eo.substring(eo.length - 8);
  169. }

  170. function getIv(dk, x_req_ts) {
  171.     var eo = String(x_req_ts).slice(0, -3);
  172.     return dk.substring(dk.length - 8) + eo.substring(0, 8);
  173. }

  174. // 创建UUID
  175. function createUUID() {
  176.     var template = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx';
  177.     return template.replace(/[xy]/g, function(c) {
  178.         var r = Math.random() * 16 | 0;
  179.         var v = c === 'x' ? r : (r & 0x3 | 0x8);
  180.         return v.toString(16);
  181.     });
  182. }
复制代码

3

主题

72

回帖

134

积分

彩电迷

积分
134
发表于 6 天前 | 显示全部楼层
眼睛一看 密钥部分就错了

2

主题

65

回帖

93

积分

彩电迷

积分
93
 楼主| 发表于 6 天前 | 显示全部楼层
ybs110 发表于 2025-11-12 16:25
眼睛一看 密钥部分就错了

JS没错 正常播放。现在就是测试管理员的PHP也是播放4分钟就不行了。不知道那里的问题

点评

已更新php  发表于 6 天前

3

主题

48

回帖

69

积分

彩电迷

积分
69
发表于 6 天前 | 显示全部楼层
刚测了一下,确实3-4分钟断流。

0

主题

76

回帖

157

积分

彩电迷

积分
157
发表于 5 天前 | 显示全部楼层
确实3-4分钟断流~~~

0

主题

17

回帖

37

积分

黑白电视迷

积分
37
发表于 5 天前 | 显示全部楼层
我这里有个不会断流

2

主题

114

回帖

270

积分

等离子电视迷

积分
270
发表于 4 天前 | 显示全部楼层
fig 发表于 2025-11-13 14:59
我这里有个不会断流

能发一下吗?

0

主题

76

回帖

157

积分

彩电迷

积分
157
发表于 4 天前 | 显示全部楼层
刚用用手机和模拟器都测试了新的js,还是断流,播放3、4分钟就断流,然后播放下一个频道,再断流......

点评

楼主的js是旧版。已解决是指php修复了。  发表于 4 天前

0

主题

76

回帖

157

积分

彩电迷

积分
157
发表于 昨天 14:36 | 显示全部楼层
能发个最新的js文件吗,谢谢大佬~~~

0

主题

76

回帖

157

积分

彩电迷

积分
157
发表于 昨天 14:36 | 显示全部楼层
能发个最新的js文件吗,谢谢大佬~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋

创办于 2025 年 5 月 5 日

快速回复 返回顶部 返回列表