|
|
AI转出来的,默认只能播放CCTV1,烦请有技术的大佬修改。
管理员的PHP我部署在路由上,用的PHP8,结果不能使用。其他的PHP都没问题。不知道啥原因
根据管理员的PHP转出来的,如有不合适,烦请管理员删帖
- function main(item) {
- var id = item.id || 'cctv1';
-
- // 频道映射配置
- var channelMap = {
- 'cctv1': '11200132825562653886',
- 'cctv2': '12030532124776958103',
- 'cctv4': '10620168294224708952',
- 'cctv7': '8516529981177953694',
- 'cctv9': '7252237247689203957',
- 'cctv10': '14589146016461298119',
- 'cctv12': '13180385922471124325',
- 'cctv13': '16265686808730585228',
- 'cctv17': '4496917190172866934',
- 'cctv4k': '2127841942201075403'
- };
-
- // 缓存设置
- let cacheKey = "ysxw_cache_" + id;
- const cacheExpiry = 60 * 1000; // 60秒缓存
-
- // 尝试从缓存获取数据
- const cachedData = ku9.getCache(cacheKey);
- if (cachedData) {
- return {
- url: cachedData,
- headers: {
- 'Referer': 'https://m-live.cctvnews.cctv.com/',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
- }
- };
- }
-
- // 获取播放地址
- var room = channelMap[id] || channelMap['cctv1'];
- var playUrl = getPlayUrlFromWeb(room);
-
- // 缓存结果
- if (playUrl) {
- ku9.setCache(cacheKey, playUrl, cacheExpiry);
- }
-
- // 返回播放地址和头信息
- return {
- url: playUrl || "",
- headers: {
- 'Referer': 'https://m-live.cctvnews.cctv.com/',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
- }
- };
- }
- // 从网络获取播放地址
- function getPlayUrlFromWeb(room) {
- try {
- var url = "https://gateway2.cctvnews.cctv.com/1.0.0/feed/article/live/detail?articleId=" + room + "&scene_type=6";
- var t = Math.round(Date.now());
- var clientId = createUuid();
- var xReqTs = t - 1;
-
- // 生成签名
- var signStr = "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=" + room + "&scene_type=6";
- var secret = 'etyEuNdA7GvQU7iPZHqnrBpSFfRyKQTD';
-
- // 使用HMAC-SHA256生成签名
- var sign = generateHmacSha256(signStr, secret);
-
- // 构建请求头
- var headers = {
- 'accept': 'application/json',
- 'cookieuid': clientId,
- 'from-client': 'h5',
- 'userid': clientId,
- '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': xReqTs.toString(),
- 'x-request-id': clientId,
- 'Referer': 'https://m-live.cctvnews.cctv.com/',
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
- };
-
- // 发送API请求
- var res = ku9.request(url, "GET", headers);
-
- if (!res || !res.body) {
- console.error("API请求失败");
- return null;
- }
-
- // 解析响应
- var jsonData = JSON.parse(res.body);
-
- if (!jsonData.response) {
- console.error("响应中没有response字段");
- return null;
- }
-
- // 解码base64响应
- var decodedResponse = ku9.decodeBase64(jsonData.response);
- var responseData = JSON.parse(decodedResponse);
-
- if (!responseData.data || !responseData.data.live_room) {
- console.error("响应中没有live_room数据");
- return null;
- }
-
- var data = responseData.data;
- var liveRoom = data.live_room;
-
- // 安全检查数组访问
- if (!liveRoom.liveCameraList || liveRoom.liveCameraList.length === 0) {
- console.error("liveCameraList为空");
- return null;
- }
-
- var firstCamera = liveRoom.liveCameraList[0];
-
- if (!firstCamera.pullUrlList || firstCamera.pullUrlList.length === 0) {
- console.error("pullUrlList为空");
- return null;
- }
-
- var firstPullUrl = firstCamera.pullUrlList[0];
-
- if (!firstPullUrl.authResultUrl || firstPullUrl.authResultUrl.length === 0) {
- console.error("authResultUrl为空");
- return null;
- }
-
- var authUrl = firstPullUrl.authResultUrl[0].authUrl;
-
- if (!authUrl) {
- console.error("authUrl为空");
- return null;
- }
-
- var liveUrl;
- if (authUrl.toLowerCase().indexOf('http') === 0) {
- liveUrl = authUrl;
- } else {
- var dk = data.dk;
- if (!dk) {
- console.error("dk为空,无法解密");
- return null;
- }
- liveUrl = decryptUrl(authUrl, dk, xReqTs);
- }
-
- // 将https替换为http
- if (liveUrl) {
- liveUrl = liveUrl.replace(/https:/i, 'http:');
- }
-
- return liveUrl;
-
- } catch (e) {
- console.error('获取播放URL过程中出错:', e);
- return null;
- }
- }
- // 生成HMAC-SHA256签名
- function generateHmacSha256(message, secret) {
- try {
- // 如果环境支持CryptoJS,使用CryptoJS
- const CryptoJS = require("crypto");
- var hash = CryptoJS.HmacSHA256(message, secret);
- return CryptoJS.enc.Base64.stringify(hash);
- } catch (e) {
- // 如果CryptoJS不可用,使用备选方法
- console.warn('CryptoJS不可用,使用MD5作为备选签名');
- return ku9.md5(message + secret).substring(0, 16);
- }
- }
- // 生成UUID(参考PHP的create_uuid函数)
- function createUuid() {
- var parts = [];
- for (var i = 0; i < 8; i++) {
- if (i === 3) {
- // 第13位固定为4
- var part = '4' + Math.floor(Math.random() * 0x1000).toString(16).substring(1, 4);
- parts.push(part);
- } else if (i === 4) {
- // 第17位固定为8/9/a/b
- var part = (0x8000 | Math.floor(Math.random() * 0x4000)).toString(16).substring(1, 5);
- parts.push(part);
- } else {
- var part = Math.floor(Math.random() * 0x10000).toString(16).substring(1, 5);
- parts.push(part);
- }
- }
- return parts.join('');
- }
- // 解密URL
- function decryptUrl(encryptedData, dk, xReqTs) {
- try {
- // 如果已经是URL,直接返回
- if (encryptedData.indexOf('http') === 0) {
- return encryptedData;
- }
-
- // 生成密钥和IV
- var key = generateKey(dk, xReqTs);
- var iv = generateIv(dk, xReqTs);
-
- // 尝试使用AES解密
- var decrypted = ku9.opensslDecrypt(encryptedData, 'AES-128-CBC', key, 0, iv);
-
- if (decrypted && decrypted.indexOf('http') === 0) {
- return decrypted;
- }
-
- // 如果AES解密失败,尝试Base64解码
- try {
- var base64Decoded = ku9.decodeBase64(encryptedData);
- if (base64Decoded && base64Decoded.indexOf('http') === 0) {
- return base64Decoded;
- }
- } catch (e) {
- console.log("Base64解码失败:", e);
- }
-
- // 如果所有解密方法都失败,返回原始数据
- return encryptedData;
-
- } catch (e) {
- console.error('解密过程中出错:', e);
- return encryptedData;
- }
- }
- // 生成密钥
- function generateKey(dk, xReqTs) {
- var tsStr = Math.floor(xReqTs / 1000).toString();
- return dk.substring(0, 8) + tsStr.substring(tsStr.length - 8);
- }
- // 生成IV
- function generateIv(dk, xReqTs) {
- var tsStr = Math.floor(xReqTs / 1000).toString();
- return dk.substring(dk.length - 8) + tsStr.substring(0, 8);
- }
复制代码 |
|