|
|
本帖最后由 Reg007 于 2025-11-13 19:02 编辑
研究了好几天 终于转换成功了。就是现在发现解析出来的地址会播放4分钟就断开了。
烦请大佬出面解决问题。
管理员更新了PHP,已经搞定,感谢各位大佬赐教
转换好的代码如下:
- //********ku9 js使用示例(适合1.3.4及以上版本使用)********//
- const CryptoJS = require("crypto");
- function main(item) {
- var id = item.id || 'cctv4k';
- var channelMap = {
- 'cctv1': '11200132825562653886',
- 'cctv2': '12030532124776958103',
- 'cctv4': '10620168294224708952',
- 'cctv7': '8516529981177953694',
- 'cctv9': '7252237247689203957',
- 'cctv10': '14589146016461298119',
- 'cctv12': '13180385922471124325',
- 'cctv13': '16265686808730585228',
- 'cctv17': '4496917190172866934',
- 'cctv4k': '2127841942201075403'
- };
- var articleId = channelMap[id] || channelMap['cctv4k'];
-
- // 尝试使用gateway2接口
- var playUrl = getCCTVNEWSPlayUrlGateway(articleId);
- if (playUrl && playUrl.indexOf('http') === 0) {
- // 将https替换为http
- playUrl = playUrl.replace(/^https:/i, 'http:');
- console.log("获取到直播地址: " + playUrl);
- return { url: playUrl };
- }
-
- console.log("获取直播地址失败");
- return { url: '' };
- }
- // 使用gateway2接口,参考PHP代码
- function getCCTVNEWSPlayUrlGateway(articleId) {
- var url = "https://gateway2.cctvnews.cctv.com/1.0.0/feed/article/live/detail?articleId=" + articleId + "&scene_type=6";
- var t = Date.now();
- var x_req_ts = t - 1;
-
- // 生成签名 - 参考PHP代码
- 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";
- var es = 'etyEuNdA7GvQU7iPZHqnrBpSFfRyKQTD';
-
- // 使用CryptoJS实现HMAC-SHA256
- var sign;
- try {
- var hash = CryptoJS.HmacSHA256(signString, es);
- sign = CryptoJS.enc.Base64.stringify(hash);
- console.log("HMAC-SHA256签名成功");
- } catch (e) {
- console.log("HMAC-SHA256失败: " + e);
- // 备用方法 - 使用简单的SHA256
- sign = ku9.sha256(signString + es);
- }
-
- var client_id = createUUID();
-
- var headers = {
- 'Accept': 'application/json',
- 'Cookieuid': client_id,
- 'From-Client': 'h5',
- 'Userid': client_id,
- 'X-Ca-Key': '204133710',
- 'X-Ca-Stage': 'RELEASE',
- 'X-Ca-Signature': sign,
- 'X-Ca-Signature-Headers': 'x-ca-key,x-ca-stage,x-ca-timestamp',
- 'X-Ca-Timestamp': t.toString(),
- 'X-Req-Ts': x_req_ts.toString(),
- 'X-Request-Id': client_id,
- 'Referer': 'https://m-live.cctvnews.cctv.com/',
- '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'
- };
-
- console.log("发送API请求: " + url);
- console.log("签名: " + sign);
-
- try {
- var res = ku9.request(url, 'GET', headers, null, true);
-
- console.log("响应状态码: " + res.code);
-
- if (res.code !== 200) {
- console.log("API请求失败,状态码: " + res.code);
- if (res.body) {
- console.log("响应内容: " + res.body);
- }
- return null;
- }
-
- console.log("响应内容: " + res.body);
-
- var data = JSON.parse(res.body);
- var response;
-
- // 检查是否有response字段
- if (data.response) {
- try {
- response = JSON.parse(ku9.decodeBase64(data.response));
- } catch (e) {
- console.log("Base64解码失败: " + e);
- response = data;
- }
- } else {
- response = data;
- }
-
- if (!response || !response.data) {
- console.log("响应数据格式异常");
- return null;
- }
-
- var liveData = response.data;
- var authUrl = null;
- var dk = liveData.dk;
-
- // 安全地访问嵌套属性
- if (liveData.live_room &&
- liveData.live_room.liveCameraList &&
- liveData.live_room.liveCameraList.length > 0 &&
- liveData.live_room.liveCameraList[0].pullUrlList &&
- liveData.live_room.liveCameraList[0].pullUrlList.length > 0 &&
- liveData.live_room.liveCameraList[0].pullUrlList[0].authResultUrl &&
- liveData.live_room.liveCameraList[0].pullUrlList[0].authResultUrl.length > 0) {
-
- authUrl = liveData.live_room.liveCameraList[0].pullUrlList[0].authResultUrl[0].authUrl;
- }
-
- if (!authUrl) {
- console.log("无法获取authUrl");
- return null;
- }
-
- var liveUrl;
- if (authUrl.toLowerCase().startsWith('http')) {
- liveUrl = authUrl;
- } else {
- if (!dk) {
- console.log("需要解密但缺少dk参数");
- return null;
- }
- liveUrl = decryptAuthUrl(authUrl, dk, x_req_ts);
- }
-
- console.log("找到直播地址: " + liveUrl);
- return liveUrl;
-
- } catch (e) {
- console.log("获取播放地址异常: " + e);
- return null;
- }
- }
- // 解密函数 - 参考PHP代码
- function decryptAuthUrl(authUrl, dk, x_req_ts) {
- try {
- var key = getKey(dk, x_req_ts);
- var iv = getIv(dk, x_req_ts);
-
- console.log("解密authUrl, key: " + key + ", iv: " + iv);
-
- // 使用酷9的openssl解密功能
- var decrypted = ku9.opensslDecrypt(authUrl, "AES-128-CBC", key, 0, iv);
-
- return decrypted;
- } catch (error) {
- console.log("解密失败: " + error);
- return null;
- }
- }
- function getKey(dk, x_req_ts) {
- var eo = String(x_req_ts).slice(0, -3);
- return dk.substring(0, 8) + eo.substring(eo.length - 8);
- }
- function getIv(dk, x_req_ts) {
- var eo = String(x_req_ts).slice(0, -3);
- return dk.substring(dk.length - 8) + eo.substring(0, 8);
- }
- // 创建UUID
- function createUUID() {
- var template = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx';
- return template.replace(/[xy]/g, function(c) {
- var r = Math.random() * 16 | 0;
- var v = c === 'x' ? r : (r & 0x3 | 0x8);
- return v.toString(16);
- });
- }
复制代码 |
|