抓包、脱壳、反编译、Hook都是摸清App运行逻辑与加解密的前奏
逆向App之运行逻辑与加解密
上几篇介绍了如何抓包App的网络请求,以及脱壳和反编译App,以及如何Hook App的代码,但是请求返回响应的是加密的、有些代码也是加密的,基于之前的技术,我们来将该App的运行逻辑、网络请求、加密代码进行一一解密,理清App的调用顺序和逻辑,为后续篡改App功能奠定基础。

界面初始化
从com.dsdqjx.tvhd.activity.StartActivity类的onCreate方法出发。

存储配置
设置默认配置,该配置保存在本地/data/data/com.xytv.tvhd/shared_prefs/share_date.xml文件。
SharedPreferencesUtils.setParam(this, "startStr", "{\"servTime\":1747729767,\"updateData\":{\"apkVersion\":100,\"apkUrl\":\"\",\"updateTitle\":\"\\u7248\\u672c\\u66f4\\u65b0\",\"updateDesc\":\"\\u65b0\\u7248\\u672c1.0.2\\u66f4\\u65b0\\u4e86\\n1.\\u66f4\\u65b0\\u5185\\u5bb9\\n\\n\\u662f\\u5426\\u4e0b\\u8f7d\\uff1f\",\"forceToUpdate\":false},\"sourceData\":{\"sourceVersion\":20250430,\"jsVersion\":96,\"jsUrl\":\"http:\\/\\/file.91kds.cn\\/js\\/js2024-20250426.zip\",\"commonUrl\":\"http:\\/\\/file.91kds.cn\\/tvlist\\/zipkds202504221630\\/zipkds\\/kds_all_common_666926e00707664c88e82d01fd59032e.zip\",\"provIsp\":\"lunbo,tvad1,web\",\"isp\":\"qt\"},\"adData\":{\"adVersion\":0,\"adUrl\":\"http:\\/\\/kgq.youtu8.cn\\/\",\"adTitle\":\"APP\",\"adImg\":\"http:\\/\\/tvapi.52kukan.net\\/img\\/utu202411.png\",\"adDesc\":\"\\u624b\\u673a\\u770b\\u7535\\u89c6\\uff0c\\u5c31\\u7528\\u60a0\\u5154\",\"zjAd\":false,\"kkAd\":false},\"startAd\":{\"img\":\"\",\"time\":5,\"skipTime\":3,\"link\":\"\",\"startAd\":false},\"userConfigData\":{\"loginUrl\":\"http:\\/\\/tvapi.yxtv.cc\\/api\\/html\\/index.php?loginId=139a180a187a102_\",\"loginDesc\":\"\\u626b\\u7801\\u767b\\u5f55\\uff0c\\u4e2a\\u6027\\u5316\\u8bbe\\u7f6e\\u4f53\\u9a8c\\u66f4\\u4f73\",\"loginRefreshUrl\":\"http:\\/\\/tvapi.yxtv.cc\\/api\\/tv_login.php?loginId=139a180a187a102_\",\"cloudControl\":false,\"cloudControlTime\":120000,\"zdy\":false,\"zdyType\":\"local\",\"zdyOnlineUrl\":\"\",\"token\":\"\"},\"banChannels\":\"\\u5c4f\\u853d\\u9891\\u90531,\\u5c4f\\u853d\\u9891\\u90532\",\"govMsg\":\"\",\"apk\":\"org.2251.tvlive\",\"adImg\":\"\",\"lastEname\":\"tvad1\",\"desc\":\"\\u65b0\\u52a0\\u5761 Choopa\\u6570\\u636e\\u4e2d\\u5fc3\"}");

去除转义,Unicode转中文后内容如下,包含了广告二维码,直播源下载地址,最后看的频道等。
{
"servTime": 1747729767,
"updateData": {
"apkVersion": 100,
"apkUrl": "",
"updateTitle": "版本更新",
"updateDesc": "新版本1.0.2更新了n1.更新内容nn是否下载?",
"forceToUpdate": false
},
"sourceData": {
"sourceVersion": 20250430,
"jsVersion": 96,
"jsUrl": "http: //file.91kds.cn/js/js2024-20250426.zip",
"commonUrl": "http: //file.91kds.cn/tvlist/zipkds202504221630/zipkds/kds_all_common_666926e00707664c88e82d01fd59032e.zip",
"provIsp": "lunbo,tvad1,web",
"isp": "qt"
},
"adData": {
"adVersion": 0,
"adUrl": "http: //kgq.youtu8.cn/",
"adTitle": "APP",
"adImg": "http: //tvapi.52kukan.net/img/utu202411.png",
"adDesc": "手机看电视,就用悠兔",
"zjAd": false,
"kkAd": false
},
"startAd": {
"img": "",
"time": 5,
"skipTime": 3,
"link": "",
"startAd": false
},
"userConfigData": {
"loginUrl": "http: //tvapi.yxtv.cc/api/html/index.php?loginId=139a180a187a102_",
"loginDesc": "扫码登录,个性化设置体验更佳",
"loginRefreshUrl": "http: //tvapi.yxtv.cc/api/tv_login.php?loginId=139a180a187a102_",
"cloudControl": false,
"cloudControlTime": 120000,
"zdy": false,
"zdyType": "local",
"zdyOnlineUrl": "",
"token": ""
},
"banChannels": "屏蔽频道1,屏蔽频道2",
"govMsg": "",
"apk": "org.2251.tvlive",
"adImg": "",
"lastEname": "tvad1",
"desc": "新加坡Choopa数据中心"
}

测试Ipv6
```java
private void testIpv6() {
new Thread() { // from class: com.dsdqjx.tvhd.activity.StartActivity.1
@Override // java.lang.Thread, java.lang.Runnable
public void run() {
try {
String string = new OkHttpClient.Builder().retryOnConnectionFailure(true).connectTimeout(2L, TimeUnit.SECONDS).readTimeout(2L, TimeUnit.SECONDS).writeTimeout(2L, TimeUnit.SECONDS).build().newCall(new Request.Builder().url("http://ipv6.lookup.test-ipv6.com/ip/?callback=_jqjsp&asn=1&testdomain=test-ipv6.com&testname=test_asn6").build()).execute().body().string();
SharedPreferencesUtils.setParam(StartActivity.this, "ipv6Support", "yes");
Logger.d("支持ipv6" + string);
} catch (IOException e) {
e.printStackTrace();
SharedPreferencesUtils.setParam(StartActivity.this, "ipv6Support", "no");
Logger.e("不支持ipv6" + e.toString());
}
}
}.start();
}
获取配置参数
通过代码得知这些App都是一套源码开发的,多个渠道分发只是换了个包名和皮肤,请求了三个url地址。
public void initConfig() {
String string = getString(R.string.base_domain);
final ArrayList arrayList = new ArrayList();
String packageName = APPUtils.getPackageName(this);
packageName.hashCode();
char c = 65535;
switch (packageName.hashCode()) {
case -1750049726:
if (packageName.equals("com.dsdq2025.tvhd")) {
c = 0;
break;
}
break;
case -1716605858:
if (packageName.equals("com.lktv.tvhd")) {
c = 1;
break;
}
break;
case -1501741301:
if (packageName.equals("com.pddd.tvhd")) {
c = 2;
break;
}
break;
case -1189164292:
if (packageName.equals("com.jdiptv.tvhd")) {
c = 3;
break;
}
break;
case -193583772:
if (packageName.equals("com.zstv.tvhd")) {
c = 4;
break;
}
break;
case 353870622:
if (packageName.equals("com.jsbtv.tvhd")) {
c = 5;
break;
}
break;
case 840787186:
if (packageName.equals("com.feicui.tvhd")) {
c = 6;
break;
}
break;
case 993285276:
if (packageName.equals("com.xytv.tvhd")) {
c = 7;
break;
}
break;
case 1877618376:
if (packageName.equals("com.shtv.tvhd")) {
c = '\b';
break;
}
break;
}
switch (c) {
case 0:
arrayList.add("dsdq." + string);
arrayList.add("dsdqsg." + string);
arrayList.add("dsdqus." + string);
break;
case 1:
arrayList.add("lktv." + string);
arrayList.add("lktvsg." + string);
arrayList.add("lktvus." + string);
break;
case 2:
case 3:
case 5:
arrayList.add("tvapi1." + string);
arrayList.add("tvapisg1." + string);
arrayList.add("tvapius1." + string);
break;
case 4:
arrayList.add("zstv." + string);
arrayList.add("zstvsg." + string);
arrayList.add("zstvus." + string);
break;
case 6:
arrayList.add("fctv." + string);
arrayList.add("fctvsg." + string);
arrayList.add("fctvus." + string);
break;
case 7:
arrayList.add("xytv." + string);
arrayList.add("xytvsg." + string);
arrayList.add("xytvus." + string);
break;
case '\b':
arrayList.add("shtv." + string);
arrayList.add("shtvsg." + string);
arrayList.add("shtvus." + string);
break;
default:
arrayList.add("tvapi." + string);
arrayList.add("tvapisg." + string);
arrayList.add("tvapius." + string);
break;
}
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { // from class: com.dsdqjx.tvhd.activity.StartActivity$$ExternalSyntheticLambda2
@Override // java.lang.Runnable
public final void run() {
StartActivity.this.m252lambda$initConfig$3$comdsdqjxtvhdactivityStartActivity(arrayList);
}
}, 500L);
}

通过Fiddler拿出请求的三个地址,只有请求域名不一样,返回响应是加密的。
http://xytv.yxtv.cc/api/get_status2024.php?listtype=bq&jiagu=baidu&apkinstall=no&app=com.xytv.tvhd&netType=wifi&channel=baidu&ipv6Support=no&version=1.0.4&deviceId=ffffffff-bd2d-1171-ffff-ffffef05ac4a&mac=00:db:2e:f8:4c:2a&userToken=&isHaveFile=no&nettype=wifi&imei=&tm=1780471939&sdkVersion=28&key=c13bec287bde567a531d3f32553da720&desc=%E5%8C%97%E7%BE%8E%E5%9C%B0%E5%8C%BA
http://xytvus.yxtv.cc/api/get_status2024.php?listtype=bq&jiagu=baidu&apkinstall=no&app=com.xytv.tvhd&netType=wifi&channel=baidu&ipv6Support=no&version=1.0.4&deviceId=ffffffff-bd2d-1171-ffff-ffffef05ac4a&mac=00:db:2e:f8:4c:2a&userToken=&isHaveFile=no&nettype=wifi&imei=&tm=1780471939&sdkVersion=28&key=c13bec287bde567a531d3f32553da720&desc=%E5%8C%97%E7%BE%8E%E5%9C%B0%E5%8C%BA
http://xytvsg.yxtv.cc/api/get_status2024.php?listtype=bq&jiagu=baidu&apkinstall=no&app=com.xytv.tvhd&netType=wifi&channel=baidu&ipv6Support=no&version=1.0.4&deviceId=ffffffff-bd2d-1171-ffff-ffffef05ac4a&mac=00:db:2e:f8:4c:2a&userToken=&isHaveFile=no&nettype=wifi&imei=&tm=1780471939&sdkVersion=28&key=c13bec287bde567a531d3f32553da720&desc=%E5%8C%97%E7%BE%8E%E5%9C%B0%E5%8C%BA
先分析请求,咋一看好像都是几个固定相同的参数,自行构造参数后才发现key是加密的,采用md5的加密方式,与时间戳关联,MD5("ahdKHFKAHFhywhsgksharkh#@" + nwTime + "@3kfafhaljgkhaljkhafljf");。

再分析响应加密内容,通过AesUtil.decrypt2024(str, NativeEncrypt.getSalt());得知响应加密的方式为Aes加密,且上篇内容通过Hook,已经获取密钥为f8e9d9e9f5b6f8fce7427f4e1a2e9aaf,偏移量我手动填充为16个0。


将加密内容放入在线Aes解密网站进行解密,解密内容如下。
{
"servTime": 1780471942,
"updateData": {
"apkVersion": 100,
"apkUrl": "http://xytvfile.xytv.win/apk/xytv-1.0.5.apk",
"updateTitle": "版本更新",
"updateDesc": "因服务器故障导致旧版本可能无法正常使用\n现在我们紧急更新v1.0.5\n\n是否下载?",
"forceToUpdate": false
},
"sourceData": {
"sourceVersion": 20260105,
"jsVersion": 104,
"jsUrl": "http://xytv.yxtv.cc/api/zip/js/js-20260212.zip",
"commonUrl": "http://xytv.yxtv.cc/api/zip/zipkdsall/202606031123/kds_all_common_666926e00707664c88e82d01fd59032e.zip",
"provIsp": "common,lunbo,tvad1",
"isp": "qt"
},
"adData": {
"adVersion": 480061,
"adUrl": "http://kgq.youtu8.cn/",
"adTitle": "APP",
"adImg": "http://tvapi.52kukan.net/img/utu202411.png",
"adDesc": "手机看电视,就用悠兔",
"zjAd": false,
"kkAd": false
},
"startAd": {
"img": "",
"time": 5,
"skipTime": 3,
"link": "",
"startAd": false
},
"userConfigData": {
"loginUrl": "http://xytv.yxtv.cc/api/html/index.php?loginId=104a245a47a153_",
"loginDesc": "扫码登录,个性化设置体验更佳",
"loginRefreshUrl": "http://xytv.yxtv.cc/api/tv_login.php?loginId=104a245a47a153_",
"cloudControl": false,
"cloudControlTime": 120000,
"zdy": false,
"zdyType": "local",
"zdyOnlineUrl": "",
"token": ""
},
"banChannels": "屏蔽频道1,屏蔽频道2",
"govMsg": "",
"apk": "org.2251.tvlive",
"adImg": "",
"lastEname": "tvad1",
"desc": "北美地区 "
}

仔细观察我们发现在线解密这里会有乱码,细看原来它这个Aes加解密又多加了一道措施,难怪很多在线Aes解密都提示无法解密,它这里偏移量,是通过Base64解码后,将前16位字节码当作了动态的偏移量,16位之后的才是真正的响应内容,通过代码解密后无乱码显示。

下载直播源文件
我们通过代码分析它的下载流程,请求地址是拿的上一步响应内容解密后sourceData里面有一个js下载地址和直播源的下载地址,同时我们看到Fiddler抓包里面也是有这两个请求记录,但是打开App的数据存储目录却只发现一个压缩包。



先将js.zip从模拟器拷贝到电脑本机上,解压后发现有几个js文件,其中几个是正常的js内容,另外几个encrypt开头的js文件显示一堆奇怪的数字,需要进一步分析。


然后手动请求http://xytvsg.yxtv.cc/api/zip/zipkdsall/202606031123/kds_all_common_666926e00707664c88e82d01fd59032e.zip下载另一个压缩包,通过查看代码得知kds_all_hndx_4b3a12512cf6ec204d28dc706070a9a3.zip的压缩密码为Kds@listDb#321,解压发现里面的内容为频道内容、直播源地址、回看地址,但是有些地址又有些奇怪,而且与抓包的地址不太一样,直接将地址放入Potplayer也无法播放,下面将进行深入研究。


直播文件入库
从文本读取数据比较慢,为了更快速度,App将直播内容存入了本地SQlite数据库,我们将db文件复制到电脑本机后,通过Navicat打开数据库内容,发现与文本内容几乎一致。



最后,入库完毕之后,发现原来在这里,将直播相关的压缩包和文件都进行了删除操作,难怪之前在模拟器上没有找到kds_all_hndx_4b3a12512cf6ec204d28dc706070a9a3.zip。

图片广告
第一次启动会展示一个广告图片,该图片地址也是从获取配置参数请求响应中来的,取的adData字段。


视频广告
启动后会直接展示广告台,通过分析抓包请求和代码逻辑,该广告台也是从获取配置参数请求响应中来的,取的lastEname字段值为tvad1,播放的默认为广告频道。

直播源解析原理
我们从播放器GovIjkPlayerActivity类的源码出发,找到了监听遥控器按键相关的代码,按上下按钮即可换台。

继续追踪代码,上下键切换,发现依次进入了以下方法,最后是进入到openVideo方法分别对http、https、htmlplay、kdsvod、tvbus等直播源协议进行解析。
- gotochid
- gotoChId
- updateLiveUrlsAndReplayUrls
- reSetSourceData
- openVideo
先从简单的http、https协议开始,比如https://liveplay-zx.rednet.cn/live/zixing_Tv2026.m3u8@@Referer=https://wap.zixingxinwen.com/@@,通过分割@@字符,前面url为直播地址,后面则为请求头参数,比如Referer参数限制了请求来源,不添加该请求头的话有些直播源是无法播放的。

下面分析htmlplay协议,在parseHtmlPlay方法,实际上该类型的源是直接播放网页上的直播源,使用webView播放器去播放的,比如htmlplay://https://app.hfbtc.cn/shows/2/6.html@@action=play@@,替换掉htmlplay://即为实际播放地址,再通过分割@@字符,将后面action的值作为执行为网页video标签的播放还是暂停方法。


然后分析tvbus协议和kdsvod协议,这两种协议都是在openVideo方法中调了HtmlContentParser类的needSecondParse(this.url)方法中去解析的。
tvbus是一种专为电视直播和视频传输设计的私有流媒体与p2p(点对点)协议,通过 tvbus:// 标识符调用,旨在通过节点共享大幅节省服务器带宽成本,并支持数十万并发用户。大部分播放器不支持该协议,需要专门的播放器播放。通过查看HtmlContentParser类的parseTVBUSHtmlContent方法的代码,发现走到HtmlContentParser.mTVCore.start(str);方法,而该方法是一个调用本地native的方法,对应libtvcore.so文件,通过第三方SDK实现播放的。

kdsvod协议是最复杂的一种解析方式,该App设置了诸多障碍加高了门槛,我们从HtmlContentParser类的parseKDSVODContent方法开始分析,依次调用了以下方法,注释是大致逻辑解释。
-
```java // 解析直播源url Parser.parse(str, new JsCallback() {});
-
```java // 解密encrypt_root.js文件,调用js的getParser方法 JsLayer.evaluate(getDecryptJs(“encrypt_root.js”) + (“getParser(‘” + str + “’);”), new JsCallback() {});
-
```java // 先加载native_layer.js文件,再执行上一部方法 JsEvaluator.evaluate(assetFileToString(MyApplication.dir + “/native_layer.js”) + str, new JsCallback() {});
-
// 执行js getWebViewWrapper().loadJavaScript(jsForEval); -
// 将获取到的数组,一个js文件名,一个js解析直播源的方法,再次进行js调用 JsLayer.evaluate(Parser.getDecryptJs("encrypt_" + jSONArray.getString(0)) + ";getParseResult('" + jSONArray.getString(1) + "','" + str + "');", JsCallback.this);



这里碰到的第一个问题是,encrypt开头的js文件是显示一堆奇怪的数字,需要先解密还原为真正的js代码,我们查看Parser类的getDecryptJs的方法是解密js文件的逻辑,它加载了本地native方法进行解密,不太好通过代码进行还原。
public static String getDecryptJs(String str) {
String assetFileToString = JsLayer.assetFileToString(MyApplication.dir + InternalZipConstants.ZIP_FILE_SEPARATOR + str);
NativeEncrypt nativeEncrypt = new NativeEncrypt();
nativeEncrypt.signatureVerify(ctx);
return nativeEncrypt.decrypt(assetFileToString);
}

我们通过Hook技术来还原js文件内容,下面是Hook代码。
if (Java.available) {
Java.perform(function () {
console.log("✅ 启动加固兼容模式");
// 循环查找(每 1 秒查一次,直到找到类)
var timer = setInterval(function () {
try {
// ============== 1. Hook NativeEncrypt.getSalt 本地方法 ==============
var NativeEncrypt = Java.use("com.dsdqjx.tvhd.utils.NativeEncrypt");
NativeEncrypt.getSalt.implementation = function () {
// 获取原始返回值(可选)
var originalSalt = this.getSalt();
console.log("🔐 原始 salt: " + originalSalt);
// 返回你自定义的 salt
//var yourSalt = "abcdefg1234567"; // 你想要的盐值
//console.log("✅ 返回修改后的 salt: " + yourSalt);
return originalSalt;
};
// ============== 2. Hook Parser.getDecryptJs 静态方法 ==============
var Parser = Java.use("com.dsdqjx.tvhd.jsparse.Parser");
// public static String getDecryptJs(String str)
Parser.getDecryptJs.overload("java.lang.String").implementation = function (str) {
console.log("🎯 Hook getDecryptJs 成功,传入参数:" + str);
// 调用原始方法(可选),还原encrypt_root.js文件
var originalResult = this.getDecryptJs(str);
console.log("原始返回值:" + originalResult);
console.log("------------------------------------");
originalResult = this.getDecryptJs("encrypt_other_live.js");
console.log("原始返回值:" + originalResult);
console.log("------------------------------------");
originalResult = this.getDecryptJs("encrypt_migu_live.js");
console.log("原始返回值:" + originalResult);
// 修改返回值
return "你想要的自定义解密字符串";
};
console.log("🎯 所有方法 Hook 成功!");
clearInterval(timer); // 找到就停止
} catch (e) {}
}, 1000);
});
}

encrypt_root.js文件Hook打印结果如下所示。
function RootFunction(url) {
var arr = new Array();
if ( - 1 != url.indexOf('&pwd=jsdecode')) {
arr.push("other_live.js");
arr.push("kdsLiveParsePlay");
} else if( - 1 != url.indexOf('jshtml://')){
arr.push("other_live.js");
arr.push("jshtmlLiveParsePlay");
} else if ( - 1 != url.indexOf('ahcztv://')) {
arr.push("other_live.js");
arr.push("ahcztvLiveParsePlay");
} else if ( - 1 != url.indexOf('ahhftv://')) {
arr.push("other_live.js");
arr.push("ahhftvLiveParsePlay");
}else if ( - 1 != url.indexOf('tiao://')) {
arr.push("other_live.js");
arr.push("toutiaoVodParsePlay");
} else if ( - 1 != url.indexOf('hntv://')) {
arr.push("other_live.js");
arr.push("hntvLiveParsePlay");
} else if ( - 1 != url.indexOf('hbtv://')) {
arr.push("other_live.js");
arr.push("hbtvLiveParsePlay");
} else if ( - 1 != url.indexOf('sdxw://')) {
arr.push("other_live.js");
arr.push("sdxwLiveParsePlay");
} else if ( - 1 != url.indexOf('sdtv://')) {
arr.push("other_live.js");
arr.push("sdtvLiveParsePlay");
} else if ( - 1 != url.indexOf('sdtv1://')) {
arr.push("other_live.js");
arr.push("sdtvLiveParsePlay1");
} else if ( - 1 != url.indexOf('iqilu://')) {
arr.push("other_live.js");
arr.push("sdqlwLiveParsePlay");
} else if ( - 1 != url.indexOf('sntv://')) {
arr.push("other_live.js");
arr.push("sntvLiveParsePlay");
} else if ( - 1 != url.indexOf('ysptp://')) {
arr.push("other_live.js");
arr.push("ysptpLiveParsePlay");
} else if ( - 1 != url.indexOf('migu://')) {
arr.push("migu_live.js");
arr.push("miguLiveParsePlay");
} else if ( - 1 != url.indexOf('bstv://')) {
arr.push("migu_live.js");
arr.push("bstvLiveParsePlay");
} else if ( - 1 != url.indexOf('nxtv://')) {
arr.push("migu_live.js");
arr.push("nxtvLiveParsePlay");
} else if ( - 1 != url.indexOf('cntv://')) {
arr.push("migu_live.js");
arr.push("cntvVodParsePlay");
} else if ( - 1 != url.indexOf('cntv1://')) {
arr.push("migu_live.js");
arr.push("cntvVodParsePlay1");
} else if ( - 1 != url.indexOf('www.1905.com/vod/play/')) {
arr.push("migu_live.js");
arr.push("m1905VodParsePlay");
} else if ( - 1 != url.indexOf('www.ixigua.com/')) {
arr.push("migu_live.js");
arr.push("xiguaVodParsePlay");
} else if ( - 1 != url.indexOf('baitv://')) {
arr.push("migu_live.js");
arr.push("baitvVodParsePlay");
} else if ( - 1 != url.indexOf('nxtvlbk://')) {
arr.push("migu_live.js");
arr.push("nxtvLbkParsePlay");
} else if ( - 1 != url.indexOf('jsyztv://')) {
arr.push("migu_live.js");
arr.push("jsyztvLiveParsePlay");
} else if ( - 1 != url.indexOf('jsyztv1://')) {
arr.push("migu_live.js");
arr.push("jsyztv1LiveParsePlay");
} else if ( - 1 != url.indexOf('mgiplbk://')) {
arr.push("migu_live.js");
arr.push("mgipLbkParsePlay");
} else if ( - 1 != url.indexOf('yndx://')) {
arr.push("migu_live.js");
arr.push("yndxLiveParsePlay");
} else if ( - 1 != url.indexOf('jxtvlbk://')) {
arr.push("migu_live.js");
arr.push("jxtvLbkParsePlay");
} else if ( - 1 != url.indexOf('kdslbk://')) {
arr.push("migu_live.js");
arr.push("kdsLbkParsePlay");
} else if ( - 1 != url.indexOf('iptvlbk://')) {
arr.push("migu_live.js");
arr.push("iptvLbkParsePlay");
} else if ( - 1 != url.indexOf('iptvlbk1://')) {
arr.push("migu_live.js");
arr.push("iptvLbkParsePlay1");
} else if ( - 1 != url.indexOf('iptvdllbk://')) {
arr.push("migu_live.js");
arr.push("iptvdlLbkParsePlay");
} else if ( - 1 != url.indexOf('sdyxlbk://')) {
arr.push("migu_live.js");
arr.push("sdyxLbkParsePlay");
} else if ( - 1 != url.indexOf('gitvlbk://')) {
arr.push("migu_live.js");
arr.push("gitvLbkParsePlay");
} else if ( - 1 != url.indexOf('ztelbk://')) {
arr.push("migu_live.js");
arr.push("zteLbkParsePlay");
} else if ( - 1 != url.indexOf('ztelbk1://')) {
arr.push("migu_live.js");
arr.push("zteLbkParsePlay1");
} else if ( - 1 != url.indexOf('sumalbk://')) {
arr.push("migu_live.js");
arr.push("sumaLbkParsePlay");
} else if ( - 1 != url.indexOf('hogelbk://')) {
arr.push("migu_live.js");
arr.push("hogeLbkParsePlay");
} else if ( - 1 != url.indexOf('htmllbk://')) {
arr.push("migu_live.js");
arr.push("htmlLbkParsePlay");
} else if ( - 1 != url.indexOf('htmllive://')) {
arr.push("other_live.js");
arr.push("htmlLiveParsePlay");
} else if ( - 1 != url.indexOf('sccdtv://')) {
arr.push("migu_live.js");
arr.push("sccdtvLiveParsePlay");
} else if ( - 1 != url.indexOf('hoge1://')) {
arr.push("other_live.js");
arr.push("hoge1LiveParsePlay");
} else if ( - 1 != url.indexOf('hoge2://')) {
arr.push("other_live.js");
arr.push("hoge2LiveParsePlay");
} else if ( - 1 != url.indexOf('hoge3://')) {
arr.push("other_live.js");
arr.push("hoge3LiveParsePlay");
} else if ( - 1 != url.indexOf('hoge4://')) {
arr.push("other_live.js");
arr.push("hoge4LiveParsePlay");
} else if ( - 1 != url.indexOf('ahtv2://')) {
arr.push("other_live.js");
arr.push("ahtv2LiveParsePlay");
} else if ( - 1 != url.indexOf('sobey://')) {
arr.push("other_live.js");
arr.push("sobeyLiveParsePlay");
} else if ( - 1 != url.indexOf('sobey1://')) {
arr.push("other_live.js");
arr.push("sobey1LiveParsePlay");
} else if ( - 1 != url.indexOf('tide://')) {
arr.push("other_live.js");
arr.push("tideLiveParsePlay");
} else if ( - 1 != url.indexOf('tidelbk://')) {
arr.push("other_live.js");
arr.push("tideLbkParsePlay");
} else if ( - 1 != url.indexOf('tianma://')) {
arr.push("other_live.js");
arr.push("tianmaLiveParsePlay");
} else if ( - 1 != url.indexOf('gitvgdlt://')) {
arr.push("other_live.js");
arr.push("gitvgdltLiveParsePlay");
} else if ( - 1 != url.indexOf('gitvjslt://')) {
arr.push("other_live.js");
arr.push("gitvjsltLiveParsePlay");
} else {
}
return arr;
}
encrypt_other_live.js文件Hook打印结果如下所示。
function kdsLiveParsePlay(originUrl){
var header = "";
if(originUrl.indexOf("@@")!=-1){
header = getStringBtween(originUrl,"@@","@@");
originUrl = originUrl.replace("@@"+header+"@@","");
if(header.indexOf("User-Agent")!=-1){
header = "@@"+header+"@@";
}else{
header = "@@"+header+"@User-Agent=AppleCoreMedia/1.0.0.16F79 (iPhone; U; CPU OS 11_6 like Mac OS X; zh_cn)@@";
}
}else if(originUrl.indexOf("rtmphtml://")!=-1){
}else{
header = "@@User-Agent=AppleCoreMedia/1.0.0.16F79 (iPhone; U; CPU OS 11_6 like Mac OS X; zh_cn)@@";
}
playUrl = addSign(originUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+header+"#91专线");
}else{
urlarr.push(playUrl+header);
}
return urlarr;
}
function addSign(originUrl){
if(originUrl.indexOf("&id=")!=-1){
var id = getStringBtween(originUrl,"&id=","&");
}else{
var id = getStringBtween(originUrl,"?id=","&");
}
var lurl = originUrl.replace('&pwd=jsdecode', '');
var host = getHost();
console.log("host=====>11111"+host);
lurl = lurl.replace("v.91kds.com/b7",host+"/live1");
lurl = lurl.replace("v.91kds.com/c7",host+"/live2");
lurl = lurl.replace("utuxx.91kds.cn/live1",host+"/live1");
lurl = lurl.replace("utuxx.91kds.cn/live2",host+"/live2");
var app = getPkgName();
var version = getAppVersion();
var mac = "l1:1l:l1:1l:l1:1l";
var nwtime = getNwtime();
var ev = "20260214";
//var utk = getUserToken();
//var tmk = getTmKey();
var srcKey = id+app+"ahkajfkahlajjaflfakhfakfbuyaozaigaolefuquqikangbuzhu"+version+mac+nwtime+ev;
var sign = getMD5(srcKey);
//var enTmk = encodeURIComponent(tmk);
var playUrl = lurl + "&app="+app+"&version="+version+"&mac="+mac+"&nwtime="+nwtime+"&sign="+sign+"&ev="+ev;
return playUrl;
}
//kdsvod://tianma://https://kmjy.tianma3600.com/&1
//kdsvod://tianma://https://kanqi.tianma3600.com/&11
function tianmaLiveParsePlay(originUrl){
var originUrl = originUrl.replace('tianma://', '');
var arr = originUrl.split("&");
var host = arr[0];
var vid = arr[1];
var apiUrl = host+"/tvradio/Tv/tvList?index=1&page_size=99999&status=2";
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.3";
var apiCont = urlRequestWithHeader(apiUrl,headers);
console.log("tianma=====>11111"+apiCont);
var apiJson = eval('(' + apiCont + ')');
var list = apiJson.data.list;
var url="";
var h5_url="";
for(var i=0;i<list.length;i++){
var tvid=list[i].tv_id;
if(tvid==vid){
url=list[i].url;
h5_url=list[i].h5_url;
break;
}
}
var playUrl = url + "@@Referer="+h5_url+"@@";
console.log("tianma=====>22222"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://ysptp://http://live-tpgq.cctv.cn/live/bsJ1Db.m3u8
function ysptpLiveParsePlay(originUrl){
var vid = originUrl.replace('ysptp://', '');
var postUrl = "https://ytpvdn.cctv.cn/cctvmobileinf/rest/cctv/videoliveUrl/getstream";
var postData = 'appcommon={"ap":"cctv_app_tv","an":"央视投屏助手","adid":"1234123122","av":"1.1.7"}&url='+vid;
var postHeader = "User-Agent:cctv_app_tv@Referer:api.cctv.cn@UID:1234123122";
var apiCont = getPostContent1(postUrl,postData,postHeader,"application/json");
var playUrl = getStringBtween(apiCont,"url\":\"","\"");
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@User-Agent=cctv_app_tv@Referer=api.cctv.cn@UID=1234123122@@#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://gitvgdlt://G_GANSU-HQ
function gitvgdltLiveParsePlay(originUrl){
var vid = originUrl.replace('gitvgdlt://', '');
var apiUrl = "http://gdcucc-livod.dispatcher.gitv.tv/gitv_live/"+vid+"/"+vid+".m3u8?p=GITV&area=GD_CUCC&gMac=unknown";
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36";
var apiCont = urlRequestWithHeader(apiUrl,headers);
var playUrl = getStringBtween(apiCont,"url\":\"","\"");
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@Referer="+apiUrl+"@@#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://gitvjslt://G_CCTV-1-CQ
function gitvjsltLiveParsePlay(originUrl){
var vid = originUrl.replace('gitvjslt://', '');
var apiUrl = "http://jscucc-livod.dispatcher.gitv.tv/gitv_live/"+vid+"/"+vid+".m3u8?p=GITV&area=JS_CUCC&gMac=unknown";
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36";
var apiCont = urlRequestWithHeader(apiUrl,headers);
var apiJson = eval('(' + apiCont + ')');
var playUrl = apiJson.u;
console.log("江苏联通--->"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@Referer="+apiUrl+"@@#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://ahhftv://1
function ahhftvLiveParsePlay(originUrl){
var vid = originUrl.replace('ahhftv://', '');
var apiUrl = "https://app.hfbtc.cn/shows/2/"+vid+".html";
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36";
var apiCont = urlRequestWithHeader(apiUrl,headers);
console.log("合肥电视台--->"+apiCont);
var playUrl = getStringBtween(apiCont,"<source src=\"","\"");
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@Referer="+apiUrl+"@@#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function jshtmlLiveParsePlay(originUrl){
var playUrl = originUrl.replace('jshtml://', '');
if ( - 1 != playUrl.indexOf('aodianyun.com') && - 1 == playUrl.indexOf('Referer=')){
var vid = getStringBtween(playUrl,"tv_channel_",".m3u8");
playUrl = playUrl + "@@Referer=https://web.guangdianyun.tv/tv/?id="+vid+"@@";
}
if ( - 1 != playUrl.indexOf('ddCalcu=')){
var arr = playUrl.split("@@");
var headers1 = "Host:h5live.gslb.cmvideo.cn@Origin:http://m.miguvideo.com@Referer:http://m.miguvideo.com/@User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";
console.log("migu获取=====>"+arr[0]);
playUrl = urlRequestWithHeader(arr[0],headers1);
console.log("migu获取=====>结果"+playUrl);
playUrl = playUrl.replace("\n","");
playUrl = playUrl+"@@User-Agent=AppleCoreMedia/1.0.0.15F79 (iPhone; U; CPU OS 11_4 like Mac OS X; zh_cn)@@";
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function htmlLiveParsePlay(originUrl){
var url = originUrl.replace('htmllive://', '');
url = addSign(url);
var playUrl = getUrlContent(url);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#91专线");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function tidePath(e){
for (var n, i, o = (i = n ? new Date(n) : new Date,
new Date(i.getFullYear(),i.getMonth(),i.getDate()).getTime()), a = 0, r = 0, d = -1, l = 0; a < e.length; a++) {
var p = e.charCodeAt(a);
r += p,
-1 != d && (l += d - p),
d = p
}
var s = (r += l).toString(36), c = o.toString(36), u = 0;
for (a = 0; a < c.length; a++)
u += c.charCodeAt(a);
c = c.substr(5) + c.substr(0, 5);
var h, v, f = Math.abs(u - r), g = (c = s.split("").reverse().join("") + c).substr(0, 4), w = c.substr(4), m = new Array, b = new Date(o).getDay() % 2;
for (a = 0; a < e.length; a++) {
a % 2 == b ? m.push(c.charAt(a % c.length)) : (h = e.charAt(a - 1)) ? -1 == (v = g.indexOf(h)) ? m.push(h) : m.push(w.charAt(v)) : m.push(g.charAt(a))
}
return ((f.toString(36).split("").reverse().join("")) + m.join("")).substr(0, e.length);
};
//tide://http://rmt102.ljgdwl.cn/lsdream/sikQfzJ/1024/&sikQfzJ
//tide://http://live.0359tv.com/ss4Lj11/&ss4Lj11
function tideLiveParsePlay(originUrl){
var url = originUrl.replace('tide://', '');
var urlArr = url.split("&");
var host = urlArr[0];
var vid = urlArr[1];
var tvid = tidePath(vid);
var playUrl = host + tvid + ".m3u8";
if(- 1 != url.indexOf('sxrtv.com')){
playUrl = playUrl + "@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.3.306@@";
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//tidelbk://http://vod.center.hljtv.com/lsdream/gS7S5pS/&gS7S5pS@1630036800@1630040400
function tideLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('tidelbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var arr1 = url.split("&");
var host = arr1[0];
var vid = arr1[1];
var st =arr[1];
var et =arr[2];
var tvid = tidePath(vid);
host = host.replace(vid,tvid);
var playUrl = host+st+"000,"+et+"000.m3u8";
if(- 1 != url.indexOf('sxrtv.com')){
playUrl = playUrl + "@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.3.306@@";
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#咪咕直播");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//sntv://1
function sntvLiveParsePlay(originUrl){
var vid = originUrl.replace('sntv://', '');
var apiUrl = "http://toutiao.cnwest.com/static/v1/stream.js";
var headers = "User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1@Referer:http://m.snrtv.com/snrtv_tv/index.html";
var apiCont = urlRequestWithHeader(apiUrl,headers);
var sTV = getStringBtween(apiCont,'var sTV="','"');
var sRadio = getStringBtween(apiCont,'var sRadio="','"');
var decode = Undress(sTV.substring(0,16),sRadio.substring(0,16),sTV.substring(16));
console.log("陕西解密后===>"+decode);
var apiJson = eval('(' + decode + ')');
var playUrl = apiJson[vid].m3u8;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function Dressing(a, b, c) {
return CryptoJS.AES.encrypt(c, CryptoJS.enc.Utf8.parse(a), {
iv: CryptoJS.enc.Utf8.parse(b),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
}).toString()
}
function Undress(a, b, c) {
return CryptoJS.AES.decrypt(c, CryptoJS.enc.Utf8.parse(a), {
iv: CryptoJS.enc.Utf8.parse(b),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
}).toString(CryptoJS.enc.Utf8)
}
//toutiao://v0200f450000bfe0a6t8n75g79khtlj0
function toutiaoVodParsePlay(originUrl){
var vid = originUrl.replace('toutiao://', '');
var rand = Math.floor(Math.random()*10000000);
var s = crc32("/video/urls/v/1/toutiao/mp4/"+vid+"?r=909354380"+rand);
var apiUrl = "https://ib.365yg.com/video/urls/v/1/toutiao/mp4/"+vid+"?r=909354380"+rand+"&s="+s;
var apiCont = getUrlContent(apiUrl);
var apiJson = eval('(' + apiCont + ')');
var enPlayUrl = apiJson.data.video_list.video_2.main_url;
var playUrl = base64decode(enPlayUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#短视频");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function crc32(str){
var table = "00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D";
crc = 0;
var n = 0; //a number between 0 and 255
var x = 0; //an hex number
crc = crc ^ (-1);
for( var i = 0, iTop = str.length; i < iTop; i++ ) {
n = ( crc ^ str.charCodeAt( i ) ) & 0xFF;
x = "0x" + table.substr( n * 9, 8 );
crc = ( crc >>> 8 ) ^ x;
}
var a = parseInt((crc ^ (-1)).toString(10));
if(a>=0){
return a;
}else{
return a+4294967296;
}
}
//kdsvod://sdxw://3
function sdxwLiveParsePlay(originUrl){
var vid = originUrl.replace('sdxw://', '');
var apiUrl = "https://sdxw.iqilu.com/v1/app/play/tv/live";
var apiCont = getUrlContent(apiUrl);
var jsonContent = eval('(' + apiCont + ')');
var data = jsonContent.data;
for(var i = 0;i < data.length; i++){
var id = data[i].id;
if(id==vid){
var playUrl = data[i].stream;
break;
}
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@Referer=http://v.iqilu.com/live/qlpd/@@#官方线路");
}else{
urlarr.push(playUrl+"@@Referer=http://v.iqilu.com/live/qlpd/@@");
}
return urlarr;
}
function sdtvLiveParsePlay1(originUrl){
var vid = originUrl.replace('sdtv1://', '');
var apiUrl = "http://v.iqilu.com/live/sdtv/";
var header = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.3.306"
var info = urlRequestWithHeader(apiUrl,header);
var salt = getStringBtween(info,"mxpx = '","';");
console.log("sdtv1-salt=====>"+salt);
var key = getStringBtween(info,"aly = '","';");
console.log("sdtv1-key=====>"+key);
var t = new Date().valueOf()
var s = getMD5(vid + t + salt)
var postUrl = 'https://feiying.litenews.cn/api/v1/auth/exchange?t=' + t + '&s=' + s;
var iv = "0000000000000000";
var postData='{"channelMark":"'+vid+'"}';
postData=sdtvEncrypt(postData,key,iv);
console.log("sdtv1-postUrl=====>"+postUrl);
console.log("sdtv1-postData=====>"+postData);
var postHeader="Origin:http://v.iqilu.com@Referer:http://v.iqilu.com/@User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.3.306"
var enApiCont = getPostContent1(postUrl,postData,postHeader,"text/plain");
console.log("sdtv1-enApiCont=====>"+enApiCont);
deApiCont = sdtvDecrypt(enApiCont,key,iv);
console.log("sdtv1-deApiCont=====>"+deApiCont);
var jsonContent = eval('(' + deApiCont + ')');
var playUrl = jsonContent.data;
//result = CryptoJS.enc.Utf8.stringify(plaintext);
console.log("sdtv1解密2=====>"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@Referer=http://v.iqilu.com/live/qlpd/@@#官方线路");
}else{
urlarr.push(playUrl+"@@Referer=http://v.iqilu.com/live/qlpd/@@");
}
return urlarr;
}
function sdtvDecrypt(str,key,iv){
return CryptoJS.AES.decrypt(str, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
function sdtvEncrypt(str,key,iv){
return CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
}
//sobey://http://appstreamings.hrbtv.net/09267a2e15214137aaae37b8a7124b1b/h264_400k_ts/index.m3u8?type=hls_live_redirect
function sobeyLiveParsePlay(originUrl){
var srcUrl = originUrl.replace('sobey://', '');
var timeKeyCont = urlRequest("http://streamings.hrbtv.net/ess/gettimekey");
var timeKey = getStringBtween(timeKeyCont,"<timekey>","</timekey>");
timeKey = parseInt(timeKey);
var passKey = getJxtvKey(timeKey);
var playUrl = srcUrl + "&passkey="+passKey;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//sobey1://121
function sobey1LiveParsePlay(originUrl){
var vid = originUrl.replace('sobey1://', '');
var apiCont = urlRequest("http://livenewsapi.i2863.com/media/details?proId="+vid);
var jsonContent = eval('(' + apiCont + ')');
var playUrl = jsonContent.data.program.hlsUrl;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function createuuid(num){
var arr = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
var str = "";
for(var i=0;i<num;i++){
var rand = parseInt(15*Math.random());
str += arr[rand];
}
return str;
}
function makeCRCTable() {
var c;
var crcTable = [];
for (var n = 0; n < 256; n++) {
c = n;
for (var k = 0; k < 8; k++) {
c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
}
crcTable[n] = c;
}
return crcTable;
}
function crc32(str) {
var crcTable = makeCRCTable();
var crc = 0 ^ -1;
for (var i = 0; i < str.length; i++) {
crc = crc >>> 8 ^ crcTable[(crc ^ str.charCodeAt(i)) & 255];
}
return (crc ^ -1) >>> 0;
}
//hntv://280
function hntvLiveParsePlay(originUrl){
vid = originUrl.replace('hntv://', '');
var url = "https://mpplive.api.mgtv.com/v1/epg/turnplay/getLivePlayUrlMPP?version=PCweb_1.0&platform=1&buss_id=2000001&channel_id="+vid+"&definition=std&_support=10000000";
htmlContent = getUrlContent(url);
if (htmlContent.length <= 0){
return new Array();
}
jsonContent = eval('(' + htmlContent + ')');
playUrl = jsonContent.data.url;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#湖南官网");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
// kdsvod://hbtv://http://app.cjyun.org@10008@431@http://www.hbtv.com.cn/ 域名 网站id 流id referer可留空
function hbtvLiveParsePlay(originUrl){
vid = originUrl.replace('hbtv://', '');
var arr = vid.split("@");
var host = arr[0];
var siteId = arr[1];
var streamId = arr[2];
var url = host + "/video/player/stream?stream_id=" + streamId + "&site_id=" + siteId;
htmlContent = getUrlContent(url);
if (htmlContent.length <= 0){
return new Array();
}
jsonContent = eval('(' + htmlContent + ')');
playUrl = jsonContent.stream;
if(arr.length==4){
playUrl=playUrl+"@@Referer="+arr[3]+"@@";
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#湖南官网");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function createRand(len){
var arr = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];
var a = "";
for(var i=0;i<len;i++){
var j = Math.ceil(Math.random()*15);
a = a + arr[j];
}
return a;
}
// kdsvod://ahcztv://flv&PD00823dbb5439c4d74bbaec7e7454a568d
// kdsvod://ahcztv://flv&PD0fb62a7714ce14ad7a851259f3d62daae
function ahcztvLiveParsePlay(originUrl){
originUrl = originUrl.replace('ahcztv://', '');
var urlArr = originUrl.split("&");
var fmt = urlArr[0];
var vid = urlArr[1];
var curTime=getNwtime();
var enParamsStr="apiversion%3D10%26params%3DmenuIdchz010idx0size16%26service%3DgetMenuContentList%26terminaltype%3Dwebsite";
var param=getMD5(enParamsStr);
var butelSign="service=/upm/external/externalService&securitykey=55f7e48af822cd1a7a73eb9a8c7fa7d6&butelTst=" + curTime+ "930¶m=" + param;
var lastSign=getMD5(butelSign);
var postUrl="https://czapi.chiznews.com/upm/external/externalService";
var postData = "service=getMenuContentList¶ms=%7B%22menuId%22%3A%22chz010%22%2C%22idx%22%3A0%2C%22size%22%3A16%7D&apiVersion=1.0&terminalType=website&butelAppkey=website&butelTst=" + curTime+ "930&butelSign=" + lastSign;
var postHeader = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.3";
var apiCont = getPostContent1(postUrl,postData,postHeader,"application/x-www-form-urlencoded");
//console.log("apiCont=====>"+apiCont);
var jsonObject = eval('('+apiCont+')');
var rows = jsonObject.data.rows;
var num = rows.length;
var playStr = "";
for(var i =0;i<num;i++){
var id = rows[i].id;
if(id==vid){
playStr = rows[i].playUrl;
break;
}
}
var playArr=playStr.split(",");
var playUrl="";
if(fmt=="flv"){
playUrl=playArr[0];
}else if(fmt=="hls"){
playUrl=playArr[1];
}else{
playUrl=playArr[2];
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//http://zhibo.ijntv.cn/m2o/channel/channel_info.php?id=6
//kdsvod://hoge1://http://zhibo.ijntv.cn@6 单个获取
function hoge1LiveParsePlay(originUrl){
originUrl = originUrl.replace('hoge1://', '');
var urlArr = originUrl.split("@");
var host = urlArr[0];
var vid = urlArr[1];
var apiUrl = host + "/m2o/channel/channel_info.php?id=" + vid;
var apiCont = urlRequestWithHeader(apiUrl,"Upgrade-Insecure-Requests:1@User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
//console.log("apiCont=====>"+apiCont);
var jsonObject = eval('('+apiCont+')');
var playUrl = jsonObject[0].m3u8;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://hoge2://http://pmobile.ijntv.cn/ijntv2/channel.php?appkey=199bIMpav3kSRNtuo9GEEBpQMNPw3aaV&appid=7@6
//遍历列表 找到对应id
function hoge2LiveParsePlay(originUrl){
originUrl = originUrl.replace('hoge2://', '');
if(originUrl.indexOf("@@")!=-1){
var header = getStringBtween(originUrl,"@@","@@");
}
var urlArr = originUrl.split("@");
var apiUrl = urlArr[0];
var vid = urlArr[1];
var apiCont = urlRequestWithHeader(apiUrl,"Upgrade-Insecure-Requests:1@User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
//console.log("apiCont=====>"+apiCont);
var jsonObject = eval('('+apiCont+')');
var num = jsonObject.length;
var playUrl = "";
for(var i =0;i<num;i++){
var id = jsonObject[i].id;
if(id==vid){
playUrl = jsonObject[i].m3u8;
break;
}
}
playUrl=playUrl+"@@"+header+"@@";
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//hoge3://http://mobile.fjtv.net/fjtv/channel.php?appkey=YS8UDU14TuhJ4JLpfuV49XSrxNykqihe&appid=8@1
//只获取对应的id
function hoge3LiveParsePlay(originUrl){
originUrl = originUrl.replace('hoge3://', '');
var urlArr = originUrl.split("@");
var apiUrl = urlArr[0];
var vid = urlArr[1];
if(- 1 != apiUrl.indexOf('?')){
apiUrl = apiUrl + "&channel_id=" + vid;
}else{
apiUrl = apiUrl + "?channel_id=" + vid;
}
var apiCont = urlRequestWithHeader(apiUrl,"Upgrade-Insecure-Requests:1@User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
//console.log("apiCont=====>"+apiCont);
var jsonObject = eval('('+apiCont+')');
var playUrl = jsonObject[0].m3u8;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://hoge4://https://mapi.zunyifb.com@5@@User-Agent=Mozilla/5.0@@
//kdsvod://hoge4://http://mapi.cbbn.net@5
//http://mapi.cbbn.net/api/v1/program.php?channel_id=5&zone=
function hoge4LiveParsePlay(originUrl){
originUrl = originUrl.replace('hoge4://', '');
var urlArr = originUrl.split("@");
var host = urlArr[0];
var vid = urlArr[1];
var apiUrl = host+"/api/v1/program.php?channel_id="+vid+"&zone=";
var apiCont = urlRequestWithHeader(apiUrl,"Upgrade-Insecure-Requests:1@User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
var jsonObject = eval('('+apiCont+')');
var num = jsonObject.length;
var playUrl = "";
for(var i =0;i<num;i++){
var playUrl = jsonObject[i].m3u8;
if(playUrl.indexOf("playlist.m3u8")!=-1){
break;
}
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://ahtv2://72
function ahtv2LiveParsePlay(originUrl){
var vid = originUrl.replace('ahtv2://', '');
var apiUrl = "https://mapi.ahtv.cn/api/open/ahtv/program.php?appid=m2otdjzyuuu8bcccnq&appkey=5eab6b4e1969a8f9aef459699f0d9000&zone=0&channel_id="+vid;
var apiCont = urlRequestWithHeader(apiUrl,"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36@Origin:https://www.ahtv.cn@Referer:https://www.ahtv.cn/");
var jsonObject = eval('('+apiCont+')');
var num = jsonObject.length;
var playUrl = "";
for(var i =0;i<num;i++){
var playUrl = jsonObject[i].m3u8;
if(playUrl.indexOf("playlist.m3u8")!=-1){
break;
}
}
var arr1 = playUrl.split("playlist.m3u8");
var host = arr1[0];
var m3u8Cont = urlRequestWithHeader(playUrl,"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36@Origin:https://www.ahtv.cn@Referer:https://www.ahtv.cn/");
var arr2 = m3u8Cont.split("\n");
playUrl = host + arr2[2];
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@Referer=https://www.ahtv.cn/@User-Agent=Mozilla/5.0@@#官方线路");
}else{
urlarr.push(playUrl+"@@Referer=https://www.ahtv.cn/@User-Agent=Mozilla/5.0@@");
}
return urlarr;
}
// iqilu://1-3
function sdqlwLiveParsePlay(originUrl){
originUrl = originUrl.replace('iqilu://', '');
var urlArr = originUrl.split("-");
var orgid = urlArr[0];
var vid = urlArr[1];
var apiUrl = "https://app.litenews.cn/v1/app/play/tv/live?orgid="+orgid;
var headers = "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36";
var apiCont = urlRequestWithHeader(apiUrl,headers);
var apiJson = eval('(' + apiCont + ')');
var data = apiJson.data;
var playUrl = "";
for(var i=0;i<data.length;i++){
curId=data[i].id;
if(curId==vid){
playUrl=data[i].stream;
break;
}
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//sdtv://aoduawtvvuqcspcsbdcupprxxpprqbcu&c330bf7f897f4dc5bb97c93ad64c2c6c
function sdtvLiveParsePlay(originUrl){
originUrl = originUrl.replace('sdtv://', '');
var urlArr = originUrl.split("&");
var appid = urlArr[0];
var vid = urlArr[1];
var day1 = getformatDate();
var token = "";
var udid = createRandomStr(32);
var info = getUrlContent("https://api.qingk.cn/jkplatform/v1/liveVideo/detail?appid="+appid+"&v=1.0.0.0&os=android&terminal=2&channel=&udid="+udid+"×tamp="+day1+"&token="+token+"&sign=c42543162ab40c70cbc12b210d93325b&page=&step=&liveVideoId="+vid);
var key2 = getMD5("sign"+appid+udid+token+day1+"sign");
var postUrl2 = "https://api.qingk.cn/jkplatform/v1/mediaPlayer/getPlayerUrl";
var postData2 = "appid="+appid+"&v=1.0.0.0&os=android&terminal=2&channel=&udid="+udid+"×tamp="+day1+"&token="+token+"&sign="+key2+"&page=1&step=18&programId="+vid+"&programType=liveVideo"
var postHeader2 = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.3@Referer:http://htgd.qingk.cn@Origin:http://htgd.qingk.cn";
var apiCont2 = getPostContent1(postUrl2,postData2,postHeader2,"application/x-www-form-urlencoded");
var playUrl = getStringBtween(apiCont2,"SDUrl\":\"","\"");
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function createRandomStr(length){
var str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符
var arr = str.split("");
var result = "";
for(i=0;i<length;i++){
var rand = Math.floor(Math.random()*62);
result = result + arr[rand];
}
return result;
}
function getformatDate(){
var myDate = new Date();
var year = myDate.getFullYear();
var month = formatNum(myDate.getMonth()+1);
var date = formatNum(myDate.getDate());
var hour = formatNum(myDate.getHours());
var min = formatNum(myDate.getMinutes());
var sec = formatNum(myDate.getSeconds());
var date = ""+year+month+date+hour+min+sec;
return date;
}
function formatNum(num){
num = num.toString();
if(num.length==1){
return "0"+num;
}else{
return num;
}
}
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)
for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)
for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}
return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}
return new r.init(q,j)},clone:function(){var a=t.clone.call(this);a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,e)).finalize(b)}}});var n=d.algo={};return d}(Math);(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)
for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))
for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<l;w++)
if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}
return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}
function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}
function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}
function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}
for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}
var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}
b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,l)}})();CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}
return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}
var H=[0,1,2,4,8,16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)
if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}
c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)
CryptoJS.pad.ZeroPadding={pad:function(data,blockSize){var blockSizeBytes=blockSize*4;data.clamp();data.sigBytes+=blockSizeBytes-((data.sigBytes%blockSizeBytes)||blockSizeBytes);},unpad:function(data){var dataWords=data.words;var i=data.sigBytes-1;while(!((dataWords[i>>>2]>>>(24-(i%4)*8))&0xff)){i--;}
data.sigBytes=i+1;}}})();
encrypt_migu_live.js文件Hook打印结果如下所示。
function yndxLiveParsePlay(originUrl){
vid = originUrl.replace('yndx://', '');
var postUrl = "http://220.165.133.22:78/EPG/jsp/getChannelPlayUrl";
var postData='{"codes":["'+vid+'"],"contentType":"Channel","urlFormat":1}';
var postHeaders = "User-Agent:Mozilla/5.0 (Linux; Android 10; SM-G981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Mobile Safari/537.36";
var apiCont = getPostContent1(postUrl,postData,postHeaders,"application/json");
console.log("apiCont====>"+apiCont);
var apiJson = eval('(' + apiCont + ')');
var playUrl = apiJson.contentURL[0].url.playURL;
console.log("playUrl====>"+playUrl);
playUrl = playUrl+"@@User-Agent=AppleCoreMedia/1.0.0.15F79 (iPhone; U; CPU OS 11_4 like Mac OS X; zh_cn)@@";
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://cntv://0fe0a753e1784b80abd48494b2fd724a
function cntvVodParsePlay(originUrl){
vid = originUrl.replace('cntv://', '');
hostArr = new Array();
var host = "hls.cntv.myalicdn.com";
hostArr.push("hls.cntv.lxdns.com");
hostArr.push("hls.cntv.myalicdn.com");
hostArr.push("hls.cntv.myhwcdn.cn");
hostArr.push("hls.cntv.kcdnvip.com");
hostArr.push("newcntv.qcloudcdn.com");
for(var i=0;i<hostArr.length;i++){
var mainUrl = "http://"+hostArr[i]+"/asp/hls/main/0303000a/3/default/"+vid+"/main.m3u8";
var m3u8Cont = getUrlContent(mainUrl);
if(m3u8Cont.indexOf(".m3u8")!=-1 && m3u8Cont.indexOf("#EXTM3U")!=-1){
host = hostArr[i];
break;
}
}
var btArr = ["2000","1200","850","450"];
var playUrl = "";
urlarr = new Array();
for(var j=0;j<btArr.length;j++){
playUrl = "http://"+host+"/asp/hls/"+btArr[j]+"/0303000a/3/default/"+vid+"/"+btArr[j]+".m3u8";
var tsCont = getUrlContent(playUrl);
if(tsCont.indexOf(".ts")!=-1 && tsCont.indexOf("#EXTM3U")!=-1){
console.log("playUrl=======>"+j+"--"+playUrl);
switch(j){
case 0:
urlarr.push(playUrl+"#超清");
break;
case 1:
urlarr.push(playUrl+"#高清");
break;
case 2:
urlarr.push(playUrl+"#标清");
break;
case 3:
urlarr.push(playUrl+"#流畅");
break;
}
}
}
return urlarr;
}
function getCdnConTentDelay(cdnUrl){
}
//kdsvod://cntv1://0fe0a753e1784b80abd48494b2fd724a
function cntvVodParsePlay1(originUrl){
vid = originUrl.replace('cntv1://', '');
var apiUrl = "https://vdn.apps.cntv.cn/api/getHttpVideoInfo.do?pid="+vid+"&client=flash";
var apiCont = getUrlContent(apiUrl);
jsonContent = eval('(' + apiCont + ')');
var video = jsonContent.video
var highIndex = 1;
highIndex = video.validChapterNum;
if (!video['chapters' + highIndex]) {
highIndex = ''
}
var list = video['chapters' + highIndex];
fileContent = 'ffconcat version 1.0 \n';
for(var i=0;i<list.length;i++){
if ('' == list[i]){
continue
}
var url = list[i].url;
var duration = list[i].duration;
fileContent += 'file '+url + '\n';
fileContent += 'duration ' + duration + '\n';
}
console.log("fileContent=======>"+fileContent);
fileName = 'cctv.lbk';
filePath = writeFileWithName(fileContent, fileName);
playUrl = filePath;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://https://www.1905.com/vod/play/938117.shtml
function m1905VodParsePlay(originUrl){
var cid = getStringBtween(originUrl,"/vod/play/",".shtml");
var nonce = getNwtime();
var expiretime = parseInt(nonce)+600;
var page = encodeURIComponent(originUrl);
//var uuid = "4e87d796-6819-4dc6-bba2-a75094e412a1";
var uuid = "0d1428da-51a2-41eb-9ae6-795b5d912345";
var playerid = "971707366349493";
var signature = sha1("cid="+cid+"&expiretime="+expiretime+"&nonce="+nonce+"&page="+page+"&playerid="+playerid+"&type=hls&uuid="+uuid+".dde3d61a0411511d");
var apiUrl = "https://profile.m1905.com/mvod/getVideoinfo.php?nonce="+nonce+"&expiretime="+expiretime+"&cid="+cid+"&uuid="+uuid+"&playerid="+playerid+"&page="+page+"&type=hls&signature="+signature+"&callback=fnCallback0";
var apiCont = getUrlContent(apiUrl);
apiCont=apiCont.replace("fnCallback0(","");
apiCont=apiCont.replace("}})","}}");
jsonContent = eval('(' + apiCont + ')');
var path = jsonContent.data.path;
highIndex = "uhd";
if (!path[highIndex]) {
highIndex = 'hd';
if(!path[highIndex]){
highIndex = 'sd';
}
}
var path = jsonContent.data.path[highIndex].path;
var host = jsonContent.data.quality[highIndex].host;
var sign = jsonContent.data.sign[highIndex].sign;
playUrl = host+sign+path;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://https://www.ixigua.com/6699356792905794055?id=6699405806422458894
function xiguaVodParsePlay(originUrl){
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36@Cookie:csrf_session_id=8e1112780afb09479517f2f9c7c71483; ttwid=1%7Cc6yF_lWYjBIsmmWx_qT2IH1iWLtuB23JcZJ1vUWUBLc%7C1696299365%7C50db2220fcd67a204b2c3328446e0ba2d89ac4d77d3604bd18204d0812bb96c8";
var apiCont = urlRequestWithHeader(originUrl,headers);
if(apiCont.indexOf("main_url")!=-1){
console.log("xigua=====>获取正常");
}else{
console.log("xigua=====>获取失败");
}
apiCont = getStringBtween(apiCont,"_SSR_HYDRATED_DATA=","</script>");
apiCont = replaceAll(apiCont,':null',':"null"');
apiCont = replaceAll(apiCont,':undefined',':"undefined"');
console.log("xigua=====>apiCont"+apiCont);
jsonContent = eval('(' + apiCont + ')');
var video_list=jsonContent.anyVideo.gidInformation.packerData.videoResource.normal.video_list;
for(var i=5;i>=1;i--){
var videoNum = "video_"+i;
var video = video_list[videoNum];
if(!video){
break;
}
console.log("xigua=====>videoNum"+videoNum);
}
var enUrl = video.main_url;
var playUrl = base64decode(enUrl);
console.log("xigua=====>playUrl"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://baitv://661995@11880
function baitvVodParsePlay(originUrl){
var vid = originUrl.replace("baitv://","");
var arr1 = vid.split("@");
var titleId = arr1[0];
var contentId = arr1[1];
var postUrl="https://bp-api.bestv.com.cn/cms/api/c/player/common";
var postData='{"devid":"1899999","anonymousId":"78aabc90-a3b4-4b47-bcaf-ab59afcd3c86","roleId":"","titleId":"'+titleId+'","contentId":"'+contentId+'","sign":"154a4e994c9198fbb6fa8946e6b968cc","modelType":"1","type":"CONTENT","roleType":"1","userId":"0","version":4909,"platform":"android","curModel":0,"deviceToken":"ApI0KOnh_ErMDnoNxH91R9AM3ihZiZyHPi-YsGPW59pQ","osVersion":29,"limit":25,"page":0,"time":"20230326183813","udid":"7d83977c52b9b3d6","channelid":"199999"}';
var apiCont = getPostContent1(postUrl,postData,"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36","application/json");
jsonContent = eval('(' + apiCont + ')');
var playUrl=jsonContent.dt.currentMedias.qualitys[0].originalUrl;
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function encodeUTF8(s) {
var i, r = [], c, x;
for (i = 0; i < s.length; i++)
if ((c = s.charCodeAt(i)) < 0x80) r.push(c);
else if (c < 0x800) r.push(0xC0 + (c >> 6 & 0x1F), 0x80 + (c & 0x3F));
else {
if ((x = c ^ 0xD800) >> 10 == 0) //对四字节UTF-16转换为Unicode
c = (x << 10) + (s.charCodeAt(++i) ^ 0xDC00) + 0x10000,
r.push(0xF0 + (c >> 18 & 0x7), 0x80 + (c >> 12 & 0x3F));
else r.push(0xE0 + (c >> 12 & 0xF));
r.push(0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
};
return r;
}
// 字符串加密成 hex 字符串
function sha1(s) {
var data = new Uint8Array(encodeUTF8(s))
var i, j, t;
var l = ((data.length + 8) >>> 6 << 4) + 16, s = new Uint8Array(l << 2);
s.set(new Uint8Array(data.buffer)), s = new Uint32Array(s.buffer);
for (t = new DataView(s.buffer), i = 0; i < l; i++)s[i] = t.getUint32(i << 2);
s[data.length >> 2] |= 0x80 << (24 - (data.length & 3) * 8);
s[l - 1] = data.length << 3;
var w = [], f = [
function () { return m[1] & m[2] | ~m[1] & m[3]; },
function () { return m[1] ^ m[2] ^ m[3]; },
function () { return m[1] & m[2] | m[1] & m[3] | m[2] & m[3]; },
function () { return m[1] ^ m[2] ^ m[3]; }
], rol = function (n, c) { return n << c | n >>> (32 - c); },
k = [1518500249, 1859775393, -1894007588, -899497514],
m = [1732584193, -271733879, null, null, -1009589776];
m[2] = ~m[0], m[3] = ~m[1];
for (i = 0; i < s.length; i += 16) {
var o = m.slice(0);
for (j = 0; j < 80; j++)
w[j] = j < 16 ? s[i + j] : rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1),
t = rol(m[0], 5) + f[j / 20 | 0]() + m[4] + w[j] + k[j / 20 | 0] | 0,
m[1] = rol(m[1], 30), m.pop(), m.unshift(t);
for (j = 0; j < 5; j++)m[j] = m[j] + o[j] | 0;
};
t = new DataView(new Uint32Array(m).buffer);
for (var i = 0; i < 5; i++)m[i] = t.getUint32(i << 2);
var hex = Array.prototype.map.call(new Uint8Array(new Uint32Array(m).buffer), function (e) {
return (e < 16 ? "0" : "") + e.toString(16);
}).join("");
return hex;
}
function createRand(len){
var arr = ["0","1","2","3","4","5","6","7","8","9"];
var a = "";
for(var i=0;i<len;i++){
var j = Math.ceil(Math.random()*10);
a = a + arr[j];
}
return a;
}
// kdsvod://sccdtv://https://cdn1.cditv.cn/cdtv1high/CDTV1High.flv
function sccdtvLiveParsePlay(originUrl){
vid = originUrl.replace('sccdtv://', '');
var enUrl = encodeURIComponent (vid);
var apiUrl = "https://cstvweb.cdmp.candocloud.cn/live/getLiveUrl?url="+enUrl;
var headers = "Referer:https://www.cditv.cn/@User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1@X-Requested-With: XMLHttpRequest";
var apiCont = urlRequestWithHeader(apiUrl,headers);
var apiJson = eval('(' + apiCont + ')');
var playUrl = apiJson.data.url;
playUrl = playUrl+"@@User-Agent=AppleCoreMedia/1.0.0.15F79 (iPhone; U; CPU OS 11_4 like Mac OS X; zh_cn)@@"
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function salt_table() {
return [
"b3bdac8bf67042f2965d92d9c1437053", "770fafdf5ba04d279a59ef1600baae98", "eee6aac1191e4e84afda27d1d6aa6b59",
"b7fab2cdbe9c44a08c3e9eb2af93d4bb", "d2a987144aba48469e66bbbda63ba1c8", "deb34b761e704a31b65845c5f7b12886",
"a8a868c3d290462496ebf041ff1f7bc9", "8324a239ed934d8bb88bdf031a09b9cf", "bf54dd9616fb4e6080bc985b0016921a",
"9b8aceb24a674d00ad1e86c97bb40d00", "d3dadb4e177b40bd86d1ecd756bc1088", "c74abfa0ddf249118146f88aec97e77a",
"d11c62e83baf4879bc089ec762df2e86", "8b7732373fa448ca89dd82cc630b92e9", "2d475c19231c4367b77d9d0d71acb0b7",
"484d02e8aee54b2e8129c899f8a75eff", "bec179d5a34f482fb5bd4fe4cc4bbfc9", "3a9ee5d981544035bffa84ef662b6328",
"ba5a6383024a4e198914ff64331d3519", "b40b343fe73c453399c50b06bff690c4", "e1900f69412c466fbfa4243d8cb57af5",
"5e3bfc21c00846aa8dcc3e0cb4231c0d", "7ab8582a2efe41fc978041dbda1fbc53", "5f93c5bcd01b4d8ba870a5d524f65322",
"efb0fa2362034750935dbe9c88e8a4d9", "5bf8a59b3b7846458d2928494f21f531", "32f25ab9dd2f4b3a9614cffaddaf2994",
"186d0e0f31a64460bd99f09db5135a8a", "bc23a5de295e4efc8a58b0a1e331f87b", "da4523ed7163432596e6f583e5eee9bf",
"6bba2c3e7a12401494638b8fcc3ccb32", "62c0f04c3a914ab0a237c66f00ac1c87", "3d58f0ffcfa9479ba627b56a1f966cde",
"95f54cd474ed418da264fdc62d3f0eca", "032f69bc6bbb4183a0ca6860ff7a5b80", "2678ca342220416e9831bf21028bb3b4",
"904aa38a9d584ae998db226b66f9150a", "534718e3ff1745979416bfd1d98860e2", "5b4fd6946f694ff79617fcb4f0d53913",
"454a302947ef4635a14234946e850f20", "320104ad02ff487b8c83761c71b344ee", "acdcc42ae086442f99d2152d665b2cac",
"e888d7b620854e45abbe85c1d7754921", "6298f3fec8eb4273ab6ac52c6b763dcb", "898d52af841b4a54b0cbcbc49faa1d47",
"6678bd9767e3468eb85522435eacbce3", "53c5ef2f866a49eaa74825e70d8db3ac", "59d1cc6b9265407f954f48e5d8f1ac69",
"f12d498fc4704b85b4759277c1f80212", "75f62d8f88134d468ffc5d15a0cf57cc", "69b949623bb047c9bdb38b6636a1daad",
"ade7a1bf7f3d4da3bd77ee0427cf91c9", "35d54a787ef54bb3bdd1eb3fe806fa8f", "7af240a3b0d74e5190f684e5cf14b5ea",
"0f4b448f661642aeaf20fc50ae18e132", "78a9543e97224952ada17316ed1f1e4b", "86b2007310ef4bdf9a95f84cacce79d3",
"009da9f69d1b477eb4c8bacd479fb437", "d18bbc0e9d6a458b8181d10c64f69bf9", "2e69fb35e7e54fe3b50ae42f2c33a355",
"2ba256cecade41ba8b0b38fb82485ba4", "a472331c09b5486fbe7642afe3d5e564", "00376402f9c642029350f4299877b8a7",
"682c4f83c66540c0b16e84252f00c959", "772a60fe9c494963992ad4a3b7e42310", "f155a35565fa47f3911fa4610aaccfc0",
"ef2519f7334e437d97f9245073a7be6b", "2a7bf4efd63c4ebea0d5052797f79e93", "1d7c3a46c1564500946d88c581ffde03",
"3d4b0be7872b45ee984bac6b748b91fe", "0be9723300b64e0d8602fb326e6d8dfe", "8b36b81555274b29912e188bb90f9f21",
"de652c1802f045bfa2baa8c9ac37a8d1", "43fcd2564c094bc3b992995022a7dedb", "5cd89e5b39c34c819b9a6d5b9303dc80",
"0a6eebc249a748dbaf44e77f83979ec4", "35c290379d204b3d83cbb3985fc007cb", "0c23c3e73e1342bdb04edccd67fdb26b",
"730a1a2fd81643cdad26c22dc6a6220f", "a0ab6d06ddfd4bf795292f8c2dc7077a", "f2f53bd144e14f6e92f996b9ca40765c",
"6edd9d658900444ab93770aa3cb21f70", "687de5ae53944922835d711a5d137ace", "7aeb21c41c71461cb5aeb9c53bec429c",
"20fd4caf8fce4210928374bea1cadde9", "2e63e91f276840dfa54055234ef178f6", "ac5cacc2d3164078a0a2a09ff45efb57",
"9e11aaa8db234e37a91e340757a939c1", "5ce23be6515345b1b758af58511d7ba5", "7944802dfc734bb2857cd36f99dbde8e",
"2ae4114c91e34591949261d5c4408d4f", "7a3134777d9f45ffbb69e0d1d508c588", "bd1ff2c60a384c0bb9dc48dd3fa78372",
"6512fd685dbf4052942561a659af42f4", "9a0f1dd156e44959b5598bf7f9d6aa33", "7a2414c185334d76837d38f44709681e",
"2ff0ef10c83b403baa7d506a6963730e", "71446601613d49f28e13619a0f7c0d81", "aa47ca4afbc148038f0f7ec609196cf3",
"de955dd1a8aa44ca9076c2af9def94da",
];
}
function url_sign(md5string) {
var salt = Math.floor(10000000 + Math.random() * 90000000).toString();
var saltInt = parseInt(salt.substring(6));
var idx = saltInt % 100;
var table = salt_table();
var text = md5string + table[idx] + "migu" + salt.substring(0, 4);
var sign = getMD5(text);
return [salt, sign];
}
function get_sign_config(contId) {
var appVersion = "2600000900";
var tm = Math.floor(Date.now()).toString();
var md5string = getMD5(tm + contId + appVersion.substring(0, 8));
return [tm, url_sign(md5string)];
}
function migu_encrypted_url(str) {
if (!str || str.trim() === "") {
return "";
}
var url;
try {
url = new URL(str);
} catch (e) {
return "";
}
var q = {};
url.searchParams.forEach(function(value, key) {
q[key] = value;
});
var S = q.puData || "";
var U = q.userid || "";
var T = q.timestamp || "";
var P = q.ProgramID || "";
var C = q.Channel_ID || "";
var V = q.playurlVersion || "";
var sRunes = S.split('');
var N = sRunes.length;
var half = Math.floor((N + 1) / 2);
var sb = "";
for (var i = 0; i < half; i++) {
if (N % 2 === 1 && i === half - 1) {
sb += sRunes[i];
break;
}
sb += sRunes[N - 1 - i];
sb += sRunes[i];
switch (i) {
case 1:
var uRunes = U.split('');
if (uRunes.length > 2) {
sb += uRunes[2];
} else {
var vRunes = V.split('');
if (vRunes.length > 0) {
sb += vRunes[vRunes.length - 1].toLowerCase();
}
}
break;
case 2:
var tRunes = T.split('');
if (tRunes.length > 6) {
sb += tRunes[6];
} else {
sb += sRunes[i];
}
break;
case 3:
var pRunes = P.split('');
if (pRunes.length > 2) {
sb += pRunes[2];
} else {
sb += sRunes[i];
}
break;
case 4:
var cRunes = C.split('');
if (cRunes.length >= 4) {
sb += cRunes[cRunes.length - 4];
} else {
sb += sRunes[i];
}
break;
}
}
var base = url.origin + url.pathname;
var dd = sb;
var result = base + "?" + url.searchParams.toString() + "&ddCalcu=" + dd;
return result;
}
//kdsvod://bstv://Umai:CHAN/111131@BESTV.SMG.SMG
function bstvLiveParsePlay(originUrl) {
var vid = originUrl.replace('bstv://', '');
var time = getNwtime();
var date = formatDate(time, "YYYY-MM-DD");
var postUrl = "https://bp-api.bestv.cn/cms/api/live/play";
var postData = '{"date":"' + date + '","devid":"1899999","anonymousId":"f6983910-13ab-46c1-8bfe-3af7a2b2cb01","roleId":"","sign":"0b0d3dd694e1723fe5b06dd0c2f4a4f9","modelType":"1","roleType":"1","deviceName":"CLT-AL00","userId":"0","version":4923,"platform":"android","curModel":0,"auroraUdid":"1104a89793a571e4cf3","osVersion":29,"time":"20240718091522","udid":"7d83977c52b9b3d6","channelid":"199999","channelCode":"' + vid + '"}';
var info = getPostContent1(postUrl, postData, "User-Agent:okhttp/3.12.10","application/json");
var apiJson = eval('(' + info + ')');
var qualityUrl=apiJson.dt.liveChannelPlayList[0].qualitys[0].qualityUrl;
var arr = qualityUrl.split("&aliyunols=on");
var arr1 = arr[0].split("&tsCodecname=");
var playUrl = arr1[0];
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#百视通");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
// 日期格式化函数(需要自行实现)
function formatDate(timestamp, format) {
var date = new Date(timestamp * 1000);
var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
if (format === "YYYY-MM-DD") {
return year + "-" + month + "-" + day;
}
return year + "-" + month + "-" + day;
}
function miguLiveParsePlay(originUrl) {
var id = originUrl.replace('migu://', '');
var signConfig = get_sign_config(id);
var tm = signConfig[0];
var saltSign = signConfig[1];
var salt = saltSign[0];
var sign = saltSign[1];
var url = "https://play.miguvideo.com/playurl/v1/play/playurl?contId=" + id +
"&dolby=true&isMultiView=true&xh265=true&os=13&ott=false&rateType=3&salt=" +
salt + "&sign=" + sign + "×tamp=" + tm + "&ua=oneplus-12&vr=true";
var headers ="Host:play.miguvideo.com@appId:miguvideo@terminalId:android@User-Agent:Dalvik/2.1.0+(Linux;+U;+Android+13;+oneplus-13+Build/TP1A.220624.014)@MG-BH:true@appVersionName:6.0.9.00@appVersion:2600000900@Phone-Info:oneplus-13|13@X-UP-CLIENT-CHANNEL-ID:2600000900-99000-200300140100004@APP-VERSION-CODE:25000653@Accept:*/*@Connection:keep-alive"
var apiCont = urlRequestWithHeader(url, headers);
var apiJson = eval('(' + apiCont + ')');
var rawUrl = apiJson.body.urlInfo.url;
var playUrl = migu_encrypted_url(rawUrl);
playUrl = decodeURIComponent(playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#咪咕直播");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
// Example usage:
// handle_migu_main_request("608807420", function(url) {
// console.log(url);
// });
//kdsvod://mgiplbk://http://39.134.216.5/mgsp.live.miguvideo.com:8088/migu/kailu/cctv1hd265/57/20191230/index.m3u8?&encrypt=1@1630375200@1630378800
function mgipLbkParsePlay(originUrl){
console.log("originUrl=====>"+originUrl);
var srcUrl = originUrl.replace('mgiplbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var start = formatDateTime(st);
var end = formatDateTime(et);
var playUrl = url +"&playbackbegin="+start+"&playbackend="+end;
console.log("playUrl=====>"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#咪咕直播");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function formatDateTime(timeStamp) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute = date.getMinutes();
var second = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
return y+ "" + m + d +h+minute+second;
}
function formatDateTime1(timeStamp) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute = date.getMinutes();
var second = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
return y+ "" + m + d + "T" +h+minute+second+".00Z";
}
function formatDateTimeGitv(timeStamp) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
var h = date.getHours();
h = h < 10 ? ('0' + h) : h;
var minute = date.getMinutes();
var second = date.getSeconds();
minute = minute < 10 ? ('0' + minute) : minute;
second = second < 10 ? ('0' + second) : second;
return y+ "" + m + d + "T" +h+minute+second;
}
function formatDateYmd(timeStamp) {
var date = new Date();
date.setTime(timeStamp * 1000);
var y = date.getFullYear();
var m = date.getMonth() + 1;
m = m < 10 ? ('0' + m) : m;
var d = date.getDate();
d = d < 10 ? ('0' + d) : d;
return y+ "" + m + d;
}
//kdslbk://shydbst@cctv1@1585022400@1585026000
function kdsLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('kdslbk://', '');
var arr = srcUrl.split("@");
var ename = arr[1];
var st =arr[2];
var et =arr[3];
var app = getPkgName();
var version = getAppVersion();
var host = getHost();
var url = "http://"+host+"/tf/"+arr[0]+".m3u8?id="+ename+"&app="+app+"&version="+version+"&st="+st+"&et="+et;
var playUrl = decodeLbk(url);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@User-Agent=AppleCoreMedia/1.0.0.15F79 (iPhone; U; CPU OS 11_4 like Mac OS X; zh_cn)@@#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//htmllbk://gdtv@gdws@1585022400@1585026000
function htmlLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('htmllbk://', '');
var arr = srcUrl.split("@");
var ename = arr[1];
var st =arr[2];
var et =arr[3];
var host = getHost();
var url = "http://"+host+"/tf/"+arr[0]+".m3u8?id="+ename+"&st="+st+"&et="+et;
var playUrl = decodeLbk(url);
playUrl = getUrlContent(playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//iptvlbk://http://39.135.53.216/TVOD/88888888/224/3221225495/index.m3u8@1587520800@1587524400
function iptvLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('iptvlbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var start = formatDateTime(st);
var end = formatDateTime(et);
if(url.indexOf("?")!=-1){
var playUrl = url+"&playseek="+start+"-"+end;
}else{
var playUrl = url+"?playseek="+start+"-"+end;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//iptvdllbk://http://158.247.232.58:82/hlj/[2409:8087:1a16:d1::9]/3221226559/index.m3u8@1724126400@1724130000
function iptvdlLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('iptvdllbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var start = formatDateTime(st);
var end = formatDateTime(et);
var tm = getNwtime();
var sign = getMD5("KLGJHhawjhdjgjG"+tm);
if(url.indexOf("?")!=-1){
var playUrl = url+"&playseek="+start+"-"+end+"&tm="+tm+"&sign="+sign;
}else{
var playUrl = url+"?playseek="+start+"-"+end+"&tm="+tm+"&sign="+sign;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://iptvlbk1://rtsp://123.147.113.84:554/000000002000/04000001/01000000004000000000000000000231?AuthInfo=xxx&userid=@1717387200@1717390800
function iptvLbkParsePlay1(originUrl){
var srcUrl = originUrl.replace('iptvlbk1://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1]-3600*8;
var et =arr[2]-3600*8;
var start = formatDateTime(st);
var end = formatDateTime(et);
if(url.indexOf("?")!=-1){
var playUrl = url+"&playseek="+start+"-"+end;
}else{
var playUrl = url+"?playseek="+start+"-"+end;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://sdyxlbk://http://222.173.9.81/00/SNM/CHANNEL00001076/index.m3u8@1717387200@1717390800
function sdyxLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('sdyxlbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var start = formatDateTime(st);
var end = formatDateTime(et);
if(url.indexOf("?")!=-1){
var playUrl = url+"&startTime="+st+"&endTime="+et;
}else{
var playUrl = url+"?startTime="+st+"&endTime="+et;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//ztelbk://http://39.130.215.158:6610/000000002000/G_YNTV-2-HD/G_YNTV-2-HD.m3u8@1593230400@1593234000
function zteLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('ztelbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var start = formatDateTime1(st);
var end = formatDateTime1(et);
if(url.indexOf("?")!=-1){
var playUrl = url+"&AuthInfo=xxx&version=xxx&sss=xxx&starttime="+start+"&endtime="+end;
}else{
var playUrl = url+"?AuthInfo=xxx&version=xxx&sss=xxx&starttime="+start+"&endtime="+end;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//ztelbk1://http://124.232.231.246:6610/000000002001/201600020005/index.m3u8?A=&IASHttpSessionId=OTT@1593230400@1593234000
function zteLbkParsePlay1(originUrl){
var srcUrl = originUrl.replace('ztelbk1://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1]-3600*8;
var et =arr[2]-3600*8;
var start = formatDateTime1(st);
var end = formatDateTime1(et);
if(url.indexOf("?")!=-1){
var playUrl = url+"&AuthInfo=xxx&version=xxx&sss=xxx&starttime="+start+"&endtime="+end;
}else{
var playUrl = url+"?AuthInfo=xxx&version=xxx&sss=xxx&starttime="+start+"&endtime="+end;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//kdsvod://gitvlbk://http://111.20.35.103:6610/yinhe/2/ch00000090990000001008/index.m3u8?virtualDomain=yinhe.tvod_hls.zte.com&IASHttpSessionId=@1671854400@1671858000
function gitvLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('gitvlbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var start = formatDateTimeGitv(st);
var end = formatDateTimeGitv(et);
if(url.indexOf("?")!=-1){
var playUrl = url+"&programbegin="+start+".00Z&programend="+end+".00Z";
}else{
var playUrl = url+"?&programbegin="+start+".00Z&programend="+end+".00Z";
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//sumalbk://http://live1.setvn.com:8060/live/qz1_1200.m3u8@1596168000@1596171600
function sumaLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('sumalbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
if(url.indexOf("?")!=-1){
var playUrl = url+"&starttime="+st+"&endtime="+et;
}else{
var playUrl = url+"?starttime="+st+"&endtime="+et;
}
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//hogelbk://http://live.lytv.net.cn/zhpwd/hd/@1596168000@1596171600
function hogeLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('hogelbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var len=et-st;
var playUrl = url+st+"000,"+len+"000.m3u8";
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
function decodeLbk(url){
var tm = getNwtime();
var srcKey = "2d5ab37bb85db4573788e6ffd012dc05"+tm+"b5335769e9971c07dea153591d7ee707";
var key = getMD5(srcKey);
var playUrl = url+"&tm="+tm+"&key="+key;
return playUrl;
}
//jxtvlbk://http://live02.jxtvcn.com.cn/live-jxtvcn/jxtv02.m3u8@1548116544@1548119544
function jxtvLbkParsePlay(originUrl){
var srcUrl = originUrl.replace('jxtvlbk://', '');
var arr = srcUrl.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var playUrl = url +"?start="+st+"&end="+et+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36@@";
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//nxtv://http://stream.nxtv.com.cn/yspd/sd/live.m3u8
function nxtvLiveParsePlay(originUrl){
var vid = originUrl.replace('nxtv://', '');
var time = getNwtime();
time = time+"123";
var srch="862DF6728D919D06E3182D51298325594.03http://gd.nxtv.com.cn/tv/wsh"+time+vid+"862DF6728D919D06E3182D5129832559";
var hash=getMD5(srch);
var apiUrl="http://www.nxtv.com.cn/m2o/player/drmx.php?hash="+hash+"&time="+time+"&playerVersion=4.03&refererurl=http://gd.nxtv.com.cn/tv/wsh&url="+vid;
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36@Upgrade-Insecure-Requests:1";
var playUrl = urlRequestWithHeader(apiUrl,headers);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36@@#官方线路");
}else{
urlarr.push(playUrl+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36@@");
}
return urlarr;
}
//nxtvlbk://http://stream.nxtv.com.cn/yspd/sd/@1591243200@1591246800
function nxtvLbkParsePlay(originUrl){
var vid = originUrl.replace('nxtvlbk://', '');
var arr = vid.split("@");
var url =arr[0];
var st =arr[1];
var et =arr[2];
var len = et-st;
var srcUrl = url+st+"000,"+len+"000.m3u8";
var time = getNwtime();
time = time+"123";
var srch="862DF6728D919D06E3182D51298325594.03http://gd.nxtv.com.cn/tv/wsh"+time+srcUrl+"862DF6728D919D06E3182D5129832559";
var hash=getMD5(srch);
var apiUrl="http://www.nxtv.com.cn/m2o/player/drmx.php?hash="+hash+"&time="+time+"&playerVersion=4.03&refererurl=http://gd.nxtv.com.cn/tv/wsh&url="+srcUrl;
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36@Upgrade-Insecure-Requests:1";
var playUrl = urlRequestWithHeader(apiUrl,headers);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"#官方线路");
}else{
urlarr.push(playUrl);
}
return urlarr;
}
//jsyztv://235 291 236 292
function jsyztvLiveParsePlay(originUrl){
var vid = originUrl.replace('jsyztv://', '');
var htmlUrl1="https://pc.96189.com/tvlist";
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36";
var resp = getRespAndHeaders(htmlUrl1,headers);
var cookie = getStringBtween(resp,"Set-Cookie:",";");
cookie=cookie.replace("\\u003d","=");
var headers1 = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36@Cookie:"+cookie;
var htmlContent1 = urlRequestWithHeader(htmlUrl1,headers1);
var lid = getStringBtween(htmlContent1,"livel?cid="+vid+"&lid=","\"");
var liveHtmlUrl = "https://pc.96189.com/maintab/livel?cid="+vid+"&lid="+lid;
console.log("liveHtmlUrl======>"+liveHtmlUrl);
var liveHtmlContent = urlRequestWithHeader(liveHtmlUrl,headers1);
console.log("liveHtmlContent======>"+liveHtmlContent);
var playUrls= getStringBtween(liveHtmlContent,"{beginplayurl=\"","\"");
var arr = playUrls.split(",");
var playUrl="";
if(arr.length>1){
playUrl=arr[1];
}else{
playUrl=arr[0];
}
playUrl = playUrl.replace("yztv.wshls","yztv-wshls");
console.log("playUrl====>"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36@Referer="+liveHtmlUrl+"@@#官方线路");
}else{
urlarr.push(playUrl+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36@@");
}
return urlarr;
}
//kdsvod://jsyztv1://flv&235 291 236 292
function jsyztv1LiveParsePlay(originUrl){
var originUrl = originUrl.replace('jsyztv1://', '');
var arr = originUrl.split("&");
var fmt = arr[0];
var vid = arr[1];
var t =getNwtime();
t = t*1000;
/*var param = getMD5("apiversion%3D29%26params%3Dimeidc723e86eccc3872clientVersionv291channelId"+vid+"tokenterminalTypeandroid%26service%3DgetChannelDetail");
var butelSign = getMD5("service=/setsail/external/externalService&securitykey=bc4886a0b24794f3a538756cbb6a8b0e&butelTst="+t+"¶m="+param);
var array = '{"imei":"dc723e86eccc3872","clientVersion":"v2.9.1","channelId":"'+vid+'","token":"","terminalType":"android"}';
//apiVersion=2.9&service=getChannelDetail¶ms={"imei":"dc723e86eccc3872","clientVersion":"v2.9.1","channelId":"235","token":"","terminalType":"android"}
var data = "service=getChannelDetail¶ms="+array+"&apiVersion=2.9&butelAppkey=yangfanapp&butelTst="+t+"&butelSign="+butelSign;
var apiUrl = "https://vapp.96189.com/setsail/external/externalService?"+data;
var headers = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36 HBPC/12.1.1.301";
var apiCont = urlRequestWithHeader(apiUrl,headers);*/
var rand = createRand(4);
var postUrl='https://vapp.96189.com/setsail/external/externalService';
var postData='apiVersion=2.9&service=getChannelDetail¶ms={"imei":"dc723e86eccc'+rand+'","clientVersion":"v2.9.1","channelId":"'+vid+'","token":"","terminalType":"android"}';
var apiCont = getPostContent1(postUrl,postData,"User-Agent:okhttp/3.12.10","application/x-www-form-urlencoded");
console.log("apiCont======>"+apiCont);
var apiJson = eval('(' + apiCont + ')');
var liveUrls = apiJson.data.playUrl;
liveUrls = replaceAll(liveUrls,"yztv.wshls","yztv-wshls");
liveUrls = replaceAll(liveUrls,"yftv-wshls","yztv-wshls");
var arr = liveUrls.split(",");
var playUrl="";
if(fmt=="hls"){
playUrl=arr[1];
}else{
playUrl=arr[0];
}
console.log("playUrl====>"+playUrl);
urlarr = new Array();
if(typeof client!= 'undefined'){
urlarr.push(playUrl+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36@@#官方线路");
}else{
urlarr.push(playUrl+"@@User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36@@");
}
return urlarr;
}
还原加密js文件后,我们结合所有文件进一步分析源码,先是加载了native_layer.js和encrypt_root.js两个文件,然后调用native_layer.js的getParser(url)方法,该方法又调用了encrypt_root.js的RootFunction(url),url以kdsvod://http://v.91kds.com/b7/hoge.m3u8?ip=hncztv&id=33&pwd=jsdecode为例,则RootFunction(url)方法返回一个数组,包含了加密的other_live.js文件和文件里面待解析url的kdsLiveParsePlay方法两个值,先加载该文件,然后再调用native_layer.js的getParseResult(methodName, url)方法,最终通过window[methodName]调用对应解析url方法。
下面我们再进一步结合Fiddler抓包分析kdsLiveParsePlay方法的加密逻辑。抓包请求url为http://121.199.48.54/live1/hoge.m3u8?ip=hncztv&id=33&app=com.xytv.tvhd&version=1.0.4&mac=l1:1l:l1:1l:l1:1l&nwtime=1780472167&sign=7a6255b545bca952f3f3ae61f1540425&ev=20260214,返回了一个重定向播放地址https://live.ngcz.tv/aczxw/playlist.m3u8?auth_key=1780479368-0-0-2f023ef886a4ddd2d983076636ba0cd1,但是该播放地址隔一天就会失效,所以需要每天重新发起请求更新。kdsLiveParsePlay方法主要是调用了addSign(originUrl)加签方法,然后调用了getHost()替换了Ip,最后拼接参数,app包名、version版本、mac地址、ev日期参数是固定的,nwtime时间戳是变化的,sign参数是做了md5签名,如果签名不对的话服务器不会返回真实的直播源地址,签名的具体规则为var sign = getMD5(id+app+"ahkajfkahlajjaflfakhfakfbuyaozaigaolefuquqikangbuzhu"+version+mac+nwtime+ev);。


我们手工构造一个hncztv台的请求,通过在线网站先获取10位长度的时间戳为1781082180,然后构造待签名md5的字符串为33com.xytv.tvhdahkajfkahlajjaflfakhfakfbuyaozaigaolefuquqikangbuzhu1.0.4l1:1l:l1:1l:l1:1l178108218020260214,通过在线网站进行哈希得到32位小写的签名值为edc07f80f5d901ee2b29f42baf58390e,修改请求url替换nwtime和sign值后url为http://121.199.48.54/live1/hoge.m3u8?ip=hncztv&id=33&app=com.xytv.tvhd&version=1.0.4&mac=l1:1l:l1:1l:l1:1l&nwtime=1781082180&sign=edc07f80f5d901ee2b29f42baf58390e&ev=20260214,接口会返回重定向播放源地址比如https://live.ngcz.tv/aczxw/playlist.m3u8?auth_key=1781089862-0-0-e93ab526c95ad74f33cb785a908be20f,将该地址放入Potplayer即可播放。


