chore: 仓库只保留 App 工程与发布产物(排除本地调试脚本)
This commit is contained in:
1 parent
1b87544e42
commit
5c3296a166
35 files changed
+2
-4925
No files matched your search
@@ -4,3 +4,5 @@ local.properties
|
||||
.idea/
|
||||
*.apk
|
||||
!apk/*.apk
|
||||
tools/
|
||||
notes.txt
|
||||
@@ -1 +0,0 @@
|
||||
v5.2.1 根因: obfuscated var字符串含内嵌引号("caf074ce…"里的".join(\"\")"是 HTML escape \" 不是纯") — my evalConcat treats them as separate literals and mangles to "++.split..." garbage. Fix: quote-aware ++ skip via char-set approach with REV-suffix as one unit.
|
||||
@@ -1,48 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""给 LoginActivity/TrialExpired 加ShopActivity入口 + Manifest声明"""
|
||||
import io
|
||||
|
||||
# 1) LoginActivity
|
||||
p = '/vol1/1000/HD1/APP/iptv-tv-app/app/src/main/java/com/iptv807/tv/LoginActivity.kt'
|
||||
s = open(p).read()
|
||||
if 'ShopActivity' not in s:
|
||||
s = s.replace(''' val freeBtn = Button(this).apply {''', ''' val shopBtn = Button(this).apply {
|
||||
text = "购买套餐(支付宝/微信)"; textSize = 15f
|
||||
setBackgroundColor(Color.parseColor("#1B6EF3"))
|
||||
setOnClickListener { startActivity(android.content.Intent(this@LoginActivity, ShopActivity::class.java)) }
|
||||
}
|
||||
root.addView(shopBtn, LinearLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply { topMargin = 24 })
|
||||
|
||||
val freeBtn = Button(this).apply {''')
|
||||
s = s.replace(''' text = "没有卡密?点「先看一会」进免费试看"''', ''' text = "已有卡密可直接激活;或购买套餐自动绑定本机"''')
|
||||
open(p, 'w').write(s)
|
||||
print('LoginActivity patched')
|
||||
else:
|
||||
print('LoginActivity already patched')
|
||||
|
||||
# 2) TrialExpiredActivity
|
||||
p = '/vol1/1000/HD1/APP/iptv-tv-app/app/src/main/java/com/iptv807/tv/TrialExpiredActivity.kt'
|
||||
s = open(p).read()
|
||||
if 'ShopActivity' not in s:
|
||||
s = s.replace(''' root.addView(Button(this).apply {
|
||||
text = "打开购买页(遥控OK)"
|
||||
textSize = 19f
|
||||
setOnClickListener { openShop() }
|
||||
})''', ''' root.addView(Button(this).apply {
|
||||
text = "购买套餐(OK键)"
|
||||
textSize = 19f
|
||||
setOnClickListener { startActivity(android.content.Intent(this@TrialExpiredActivity, ShopActivity::class.java)); finish() }
|
||||
})''')
|
||||
open(p, 'w').write(s)
|
||||
print('TrialExpired patched')
|
||||
|
||||
# 3) Manifest
|
||||
p = '/vol1/1000/HD1/APP/iptv-tv-app/app/src/main/AndroidManifest.xml'
|
||||
s = open(p).read()
|
||||
if 'ShopActivity' not in s:
|
||||
s = s.replace('</application>', ''' <activity android:name=".ShopActivity" android:exported="false" />
|
||||
</application>''')
|
||||
open(p, 'w').write(s)
|
||||
print('Manifest patched')
|
||||
print('done')
|
||||
@@ -1,57 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>港澳台頻道列表 - 電視直播</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="application-name" content="網絡電視直播移動版,IPTV電視直播手机版" />
|
||||
<meta name="title" content="港澳台頻道列表 - 電視直播"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="keywords" content="網絡電視,網路電視,電視直播,手机版,電視,免費電視">
|
||||
<meta name="description" content="網絡電視,網路電視,全球電視直播,高清電視,免費電視,IPTV電視直播手机版">
|
||||
<meta name="referrer" content="no-referrer-when-downgrade" />
|
||||
<link rel="shortcut icon" href="https://d.2026016.xyz/images/favicon.ico" />
|
||||
<link rel="stylesheet" href="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.css" />
|
||||
<script src="https://apps.bdimg.com/libs/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
|
||||
<style type="text/css">
|
||||
span {font-size:14px;}
|
||||
.headerNfooter {background-color: #C00;color: #fff;text-shadow: none;}
|
||||
.headerNfooter a:link,.headerNfooter a:hover,.headerNfooter a:visited,.headerNfooter a:active { color: #fff; text-decoration: none;}
|
||||
.headerNfooter h1 {text-indent: -999em; }
|
||||
#errorTip {text-align:center; color:red; font-size:15px; display:none; margin:5px 0;}
|
||||
</style></head><body>
|
||||
<div data-role="page">
|
||||
<div class="headerNfooter" data-role="header" data-theme="f" data-position="fixed">
|
||||
<h1>港澳台頻道列表 - 電視直播</h1><a href="#" data-iconpos="left" data-icon="back" data-rel="back">返回</a>
|
||||
<a href="?act=home" data-icon="home" data-role="button" data-inline="true">首頁</a>
|
||||
</div>
|
||||
<!--top--><div id="ad-container" style="width: 100%;"><div id="container-c95365b7eb64cacc6988f80de291dd94"></div>
|
||||
<script>
|
||||
$(function(){
|
||||
let adScript = document.createElement('script');
|
||||
adScript.src = "https://bauval.org/21/c95365b7eb64cacc6988f80de291dd94";
|
||||
adScript.setAttribute('data-cfasync','false');
|
||||
document.body.appendChild(adScript);
|
||||
});
|
||||
</script></div><div data-role="content"><div id="errorTip">所有直播线路已失效,请稍后重试或手动切换线路!</div><ul data-role="listview" data-inset="true" data-divider-theme="a" data-filter="true" data-filter-placeholder="搜索"><li><a href="?act=play&tid=gt&id=1" data-ajax="false">凤凰卫视中文台</a></li><li><a href="?act=play&tid=gt&id=2" data-ajax="false">凤凰卫视资讯台</a></li><li><a href="?act=play&tid=gt&id=3" data-ajax="false">凤凰卫视香港台</a></li><li><a href="?act=play&tid=gt&id=5" data-ajax="false">TVB翡翠台</a></li><li><a href="?act=play&tid=gt&id=6" data-ajax="false">TVB无线新闻台</a></li><li><a href="?act=play&tid=gt&id=8" data-ajax="false">TVB Plus</a></li><li><a href="?act=play&tid=gt&id=9" data-ajax="false">TVB明珠台</a></li><li><a href="?act=play&tid=gt&id=11" data-ajax="false">香港有线新闻台</a></li><li><a href="?act=play&tid=gt&id=12" data-ajax="false">香港有线18台</a></li><li><a href="?act=play&tid=gt&id=13" data-ajax="false">香港有线18台(备)</a></li><li><a href="?act=play&tid=gt&id=17" data-ajax="false">NOW新闻台</a></li><li><a href="?act=play&tid=gt&id=18" data-ajax="false">NOW财经台</a></li><li><a href="?act=play&tid=gt&id=19" data-ajax="false">ViuTV</a></li><li><a href="?act=play&tid=gt&id=20" data-ajax="false">ViuTV6</a></li><li><a href="?act=play&tid=gt&id=22" data-ajax="false">HOY国际财经台</a></li><li><a href="?act=play&tid=gt&id=23" data-ajax="false">HOY资讯台</a></li><li><a href="?act=play&tid=gt&id=24" data-ajax="false">HOY TV</a></li><li><a href="?act=play&tid=gt&id=26" data-ajax="false">港台电视31</a></li><li><a href="?act=play&tid=gt&id=27" data-ajax="false">港台电视32</a></li><li><a href="?act=play&tid=gt&id=30" data-ajax="false">香港卫视HKS</a></li><li><a href="?act=play&tid=gt&id=35" data-ajax="false">澳门莲花</a></li><li><a href="?act=play&tid=gt&id=36" data-ajax="false">澳門卫视</a></li><li><a href="?act=play&tid=gt&id=37" data-ajax="false">澳视资讯</a></li><li><a href="?act=play&tid=gt&id=38" data-ajax="false">澳視澳門</a></li><li><a href="?act=play&tid=gt&id=39" data-ajax="false">澳門Macau</a></li><li><a href="?act=play&tid=gt&id=40" data-ajax="false">澳视综艺</a></li><li><a href="?act=play&tid=gt&id=41" data-ajax="false">澳亚卫视</a></li><li><a href="?act=play&tid=gt&id=43" data-ajax="false">中天新闻台</a></li><li><a href="?act=play&tid=gt&id=44" data-ajax="false">东森新闻台</a></li><li><a href="?act=play&tid=gt&id=45" data-ajax="false">东森财经新闻台</a></li><li><a href="?act=play&tid=gt&id=46" data-ajax="false">中视新闻台</a></li><li><a href="?act=play&tid=gt&id=47" data-ajax="false">台视新闻台</a></li><li><a href="?act=play&tid=gt&id=48" data-ajax="false">三立新闻台</a></li><li><a href="?act=play&tid=gt&id=49" data-ajax="false">非凡新闻</a></li><li><a href="?act=play&tid=gt&id=50" data-ajax="false">民视新闻台</a></li><li><a href="?act=play&tid=gt&id=51" data-ajax="false">华视新闻台</a></li><li><a href="?act=play&tid=gt&id=52" data-ajax="false">镜电视新闻台</a></li><li><a href="?act=play&tid=gt&id=53" data-ajax="false">寰宇新闻台</a></li><li><a href="?act=play&tid=gt&id=54" data-ajax="false">寰宇新闻台湾台</a></li><li><a href="?act=play&tid=gt&id=55" data-ajax="false">TVBS新闻台</a></li><li><a href="?act=play&tid=gt&id=56" data-ajax="false">TVBS HD</a></li><li><a href="?act=play&tid=gt&id=60" data-ajax="false">中视HD</a></li><li><a href="?act=play&tid=gt&id=61" data-ajax="false">台视HD</a></li><li><a href="?act=play&tid=gt&id=62" data-ajax="false">民视HD</a></li><li><a href="?act=play&tid=gt&id=63" data-ajax="false">华视HD</a></li><li><a href="?act=play&tid=gt&id=73" data-ajax="false">緯來體育台</a></li><li><a href="?act=play&tid=gt&id=74" data-ajax="false">纬来日本台</a></li><li><a href="?act=play&tid=gt&id=75" data-ajax="false">纬来育乐台</a></li><li><a href="?act=play&tid=gt&id=76" data-ajax="false">ELEVEN 1(DAZN 1)</a></li><li><a href="?act=play&tid=gt&id=77" data-ajax="false">ELEVEN 2(DAZN 2)</a></li><li><a href="?act=play&tid=gt&id=79" data-ajax="false">爱尔达体育1台</a></li><li><a href="?act=play&tid=gt&id=80" data-ajax="false">爱尔达体育2台</a></li></ul></div>
|
||||
<!--end-->
|
||||
<div data-role="footer">
|
||||
<h4>版權聲明 © 所有源來自互聯網搜索</h4>
|
||||
</div>
|
||||
</div>
|
||||
<script>(function(s){s.dataset.zone='11422200',s.src='https://n6wxm.com/vignette.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script><script data-cfasync="false" src="https://czernik.org/14/92553edbe36d3be2167ff02e7dfdc14b"></script>
|
||||
</body>
|
||||
<span style="display:none">
|
||||
<script>
|
||||
!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"KnfaacjCp88BlrkE",ck:"KnfaacjCp88BlrkE"});
|
||||
</script><!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src='https://www.googletagmanager.com/gtag/js?id=G-PY41HWX4PP'></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-PY41HWX4PP');
|
||||
</script>从缓存读取内容
|
||||
</span>
|
||||
|
||||
</html>
|
||||
@@ -1,57 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>体育頻道列表 - 電視直播</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="application-name" content="網絡電視直播移動版,IPTV電視直播手机版" />
|
||||
<meta name="title" content="体育頻道列表 - 電視直播"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="keywords" content="網絡電視,網路電視,電視直播,手机版,電視,免費電視">
|
||||
<meta name="description" content="網絡電視,網路電視,全球電視直播,高清電視,免費電視,IPTV電視直播手机版">
|
||||
<meta name="referrer" content="no-referrer-when-downgrade" />
|
||||
<link rel="shortcut icon" href="https://d.2026016.xyz/images/favicon.ico" />
|
||||
<link rel="stylesheet" href="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.css" />
|
||||
<script src="https://apps.bdimg.com/libs/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
|
||||
<style type="text/css">
|
||||
span {font-size:14px;}
|
||||
.headerNfooter {background-color: #C00;color: #fff;text-shadow: none;}
|
||||
.headerNfooter a:link,.headerNfooter a:hover,.headerNfooter a:visited,.headerNfooter a:active { color: #fff; text-decoration: none;}
|
||||
.headerNfooter h1 {text-indent: -999em; }
|
||||
#errorTip {text-align:center; color:red; font-size:15px; display:none; margin:5px 0;}
|
||||
</style></head><body>
|
||||
<div data-role="page">
|
||||
<div class="headerNfooter" data-role="header" data-theme="f" data-position="fixed">
|
||||
<h1>体育頻道列表 - 電視直播</h1><a href="#" data-iconpos="left" data-icon="back" data-rel="back">返回</a>
|
||||
<a href="?act=home" data-icon="home" data-role="button" data-inline="true">首頁</a>
|
||||
</div>
|
||||
<!--top--><div id="ad-container" style="width: 100%;"><div id="container-c95365b7eb64cacc6988f80de291dd94"></div>
|
||||
<script>
|
||||
$(function(){
|
||||
let adScript = document.createElement('script');
|
||||
adScript.src = "https://bauval.org/21/c95365b7eb64cacc6988f80de291dd94";
|
||||
adScript.setAttribute('data-cfasync','false');
|
||||
document.body.appendChild(adScript);
|
||||
});
|
||||
</script></div><div data-role="content"><div id="errorTip">所有直播线路已失效,请稍后重试或手动切换线路!</div><ul data-role="listview" data-inset="true" data-divider-theme="a" data-filter="true" data-filter-placeholder="搜索"><li><a href="?act=play&tid=ty&id=1" data-ajax="false">CCTV5体育</a></li><li><a href="?act=play&tid=ty&id=2" data-ajax="false">CCTV5+体育赛事</a></li><li><a href="?act=play&tid=ty&id=3" data-ajax="false">广东体育</a></li><li><a href="?act=play&tid=ty&id=4" data-ajax="false">劲爆体育</a></li><li><a href="?act=play&tid=ty&id=5" data-ajax="false">五星体育</a></li><li><a href="?act=play&tid=ty&id=6" data-ajax="false">新视觉HD</a></li><li><a href="?act=play&tid=ty&id=7" data-ajax="false">CCTV16奥林匹克</a></li><li><a href="?act=play&tid=ty&id=12" data-ajax="false">极速汽车</a></li><li><a href="?act=play&tid=ty&id=13" data-ajax="false">游戏风云</a></li><li><a href="?act=play&tid=ty&id=14" data-ajax="false">四海钓鱼</a></li><li><a href="?act=play&tid=ty&id=15" data-ajax="false">快乐垂钓</a></li><li><a href="?act=play&tid=ty&id=16" data-ajax="false">先锋乒羽</a></li><li><a href="?act=play&tid=ty&id=19" data-ajax="false">南国都市</a></li><li><a href="?act=play&tid=ty&id=20" data-ajax="false">广州竞赛</a></li><li><a href="?act=play&tid=ty&id=21" data-ajax="false">CCTV风云足球</a></li><li><a href="?act=play&tid=ty&id=22" data-ajax="false">魅力足球</a></li><li><a href="?act=play&tid=ty&id=23" data-ajax="false">緯來體育台</a></li><li><a href="?act=play&tid=ty&id=24" data-ajax="false">ELEVEN 1(DAZN 1)</a></li><li><a href="?act=play&tid=ty&id=25" data-ajax="false">ELEVEN 2(DAZN 2)</a></li><li><a href="?act=play&tid=ty&id=28" data-ajax="false">爱尔达体育1台</a></li><li><a href="?act=play&tid=ty&id=29" data-ajax="false">爱尔达体育2台</a></li></ul></div>
|
||||
<!--end-->
|
||||
<div data-role="footer">
|
||||
<h4>版權聲明 © 所有源來自互聯網搜索</h4>
|
||||
</div>
|
||||
</div>
|
||||
<script>(function(s){s.dataset.zone='11422200',s.src='https://n6wxm.com/vignette.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script><script data-cfasync="false" src="https://czernik.org/14/149a54b3d08b2c507081e72fefeabeea"></script>
|
||||
</body>
|
||||
<span style="display:none">
|
||||
<script>
|
||||
!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"KnfaacjCp88BlrkE",ck:"KnfaacjCp88BlrkE"});
|
||||
</script><!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src='https://www.googletagmanager.com/gtag/js?id=G-PY41HWX4PP'></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-PY41HWX4PP');
|
||||
</script>从缓存读取内容
|
||||
</span>
|
||||
|
||||
</html>
|
||||
@@ -1,57 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>卫视頻道列表 - 電視直播</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="application-name" content="網絡電視直播移動版,IPTV電視直播手机版" />
|
||||
<meta name="title" content="卫视頻道列表 - 電視直播"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="keywords" content="網絡電視,網路電視,電視直播,手机版,電視,免費電視">
|
||||
<meta name="description" content="網絡電視,網路電視,全球電視直播,高清電視,免費電視,IPTV電視直播手机版">
|
||||
<meta name="referrer" content="no-referrer-when-downgrade" />
|
||||
<link rel="shortcut icon" href="https://d.2026016.xyz/images/favicon.ico" />
|
||||
<link rel="stylesheet" href="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.css" />
|
||||
<script src="https://apps.bdimg.com/libs/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
|
||||
<style type="text/css">
|
||||
span {font-size:14px;}
|
||||
.headerNfooter {background-color: #C00;color: #fff;text-shadow: none;}
|
||||
.headerNfooter a:link,.headerNfooter a:hover,.headerNfooter a:visited,.headerNfooter a:active { color: #fff; text-decoration: none;}
|
||||
.headerNfooter h1 {text-indent: -999em; }
|
||||
#errorTip {text-align:center; color:red; font-size:15px; display:none; margin:5px 0;}
|
||||
</style></head><body>
|
||||
<div data-role="page">
|
||||
<div class="headerNfooter" data-role="header" data-theme="f" data-position="fixed">
|
||||
<h1>卫视頻道列表 - 電視直播</h1><a href="#" data-iconpos="left" data-icon="back" data-rel="back">返回</a>
|
||||
<a href="?act=home" data-icon="home" data-role="button" data-inline="true">首頁</a>
|
||||
</div>
|
||||
<!--top--><div id="ad-container" style="width: 100%;"><div id="container-c95365b7eb64cacc6988f80de291dd94"></div>
|
||||
<script>
|
||||
$(function(){
|
||||
let adScript = document.createElement('script');
|
||||
adScript.src = "https://bauval.org/21/c95365b7eb64cacc6988f80de291dd94";
|
||||
adScript.setAttribute('data-cfasync','false');
|
||||
document.body.appendChild(adScript);
|
||||
});
|
||||
</script></div><div data-role="content"><div id="errorTip">所有直播线路已失效,请稍后重试或手动切换线路!</div><ul data-role="listview" data-inset="true" data-divider-theme="a" data-filter="true" data-filter-placeholder="搜索"><li><a href="?act=play&tid=ws&id=1" data-ajax="false">湖南卫视</a></li><li><a href="?act=play&tid=ws&id=2" data-ajax="false">江苏卫视</a></li><li><a href="?act=play&tid=ws&id=3" data-ajax="false">浙江卫视</a></li><li><a href="?act=play&tid=ws&id=4" data-ajax="false">东方卫视</a></li><li><a href="?act=play&tid=ws&id=5" data-ajax="false">北京卫视</a></li><li><a href="?act=play&tid=ws&id=6" data-ajax="false">深圳卫视</a></li><li><a href="?act=play&tid=ws&id=7" data-ajax="false">广东卫视</a></li><li><a href="?act=play&tid=ws&id=8" data-ajax="false">安徽卫视</a></li><li><a href="?act=play&tid=ws&id=9" data-ajax="false">东南卫视</a></li><li><a href="?act=play&tid=ws&id=10" data-ajax="false">河北卫视</a></li><li><a href="?act=play&tid=ws&id=11" data-ajax="false">黑龙江卫视</a></li><li><a href="?act=play&tid=ws&id=12" data-ajax="false">湖北卫视</a></li><li><a href="?act=play&tid=ws&id=13" data-ajax="false">江西卫视</a></li><li><a href="?act=play&tid=ws&id=14" data-ajax="false">辽宁卫视</a></li><li><a href="?act=play&tid=ws&id=15" data-ajax="false">海南卫视</a></li><li><a href="?act=play&tid=ws&id=16" data-ajax="false">山东卫视</a></li><li><a href="?act=play&tid=ws&id=17" data-ajax="false">四川卫视</a></li><li><a href="?act=play&tid=ws&id=18" data-ajax="false">天津卫视</a></li><li><a href="?act=play&tid=ws&id=19" data-ajax="false">重庆卫视</a></li><li><a href="?act=play&tid=ws&id=20" data-ajax="false">贵州卫视</a></li><li><a href="?act=play&tid=ws&id=21" data-ajax="false">吉林卫视</a></li><li><a href="?act=play&tid=ws&id=22" data-ajax="false">广西卫视</a></li><li><a href="?act=play&tid=ws&id=23" data-ajax="false">河南卫视</a></li><li><a href="?act=play&tid=ws&id=24" data-ajax="false">甘肃卫视</a></li><li><a href="?act=play&tid=ws&id=25" data-ajax="false">青海卫视</a></li><li><a href="?act=play&tid=ws&id=26" data-ajax="false">云南卫视</a></li><li><a href="?act=play&tid=ws&id=27" data-ajax="false">内蒙古卫视</a></li><li><a href="?act=play&tid=ws&id=28" data-ajax="false">山西卫视</a></li><li><a href="?act=play&tid=ws&id=29" data-ajax="false">陕西卫视</a></li><li><a href="?act=play&tid=ws&id=30" data-ajax="false">兵团卫视</a></li><li><a href="?act=play&tid=ws&id=31" data-ajax="false">新疆卫视</a></li><li><a href="?act=play&tid=ws&id=32" data-ajax="false">西藏卫视</a></li><li><a href="?act=play&tid=ws&id=33" data-ajax="false">宁夏卫视</a></li><li><a href="?act=play&tid=ws&id=34" data-ajax="false">延边卫视</a></li><li><a href="?act=play&tid=ws&id=35" data-ajax="false">康巴卫视</a></li><li><a href="?act=play&tid=ws&id=36" data-ajax="false">大湾区卫视</a></li><li><a href="?act=play&tid=ws&id=37" data-ajax="false">广东珠江频道</a></li><li><a href="?act=play&tid=ws&id=38" data-ajax="false">厦门卫视</a></li><li><a href="?act=play&tid=ws&id=39" data-ajax="false">安多卫视</a></li><li><a href="?act=play&tid=ws&id=40" data-ajax="false">农林卫视</a></li><li><a href="?act=play&tid=ws&id=41" data-ajax="false">三沙卫视</a></li></ul></div>
|
||||
<!--end-->
|
||||
<div data-role="footer">
|
||||
<h4>版權聲明 © 所有源來自互聯網搜索</h4>
|
||||
</div>
|
||||
</div>
|
||||
<script>(function(s){s.dataset.zone='11422200',s.src='https://n6wxm.com/vignette.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script><script data-cfasync="false" src="https://czernik.org/14/149a54b3d08b2c507081e72fefeabeea"></script>
|
||||
</body>
|
||||
<span style="display:none">
|
||||
<script>
|
||||
!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"KnfaacjCp88BlrkE",ck:"KnfaacjCp88BlrkE"});
|
||||
</script><!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src='https://www.googletagmanager.com/gtag/js?id=G-PY41HWX4PP'></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-PY41HWX4PP');
|
||||
</script>从缓存读取内容
|
||||
</span>
|
||||
|
||||
</html>
|
||||
@@ -1,57 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>央视頻道列表 - 電視直播</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="application-name" content="網絡電視直播移動版,IPTV電視直播手机版" />
|
||||
<meta name="title" content="央视頻道列表 - 電視直播"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="keywords" content="網絡電視,網路電視,電視直播,手机版,電視,免費電視">
|
||||
<meta name="description" content="網絡電視,網路電視,全球電視直播,高清電視,免費電視,IPTV電視直播手机版">
|
||||
<meta name="referrer" content="no-referrer-when-downgrade" />
|
||||
<link rel="shortcut icon" href="https://d.2026016.xyz/images/favicon.ico" />
|
||||
<link rel="stylesheet" href="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.css" />
|
||||
<script src="https://apps.bdimg.com/libs/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="https://apps.bdimg.com/libs/jquerymobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
|
||||
<style type="text/css">
|
||||
span {font-size:14px;}
|
||||
.headerNfooter {background-color: #C00;color: #fff;text-shadow: none;}
|
||||
.headerNfooter a:link,.headerNfooter a:hover,.headerNfooter a:visited,.headerNfooter a:active { color: #fff; text-decoration: none;}
|
||||
.headerNfooter h1 {text-indent: -999em; }
|
||||
#errorTip {text-align:center; color:red; font-size:15px; display:none; margin:5px 0;}
|
||||
</style></head><body>
|
||||
<div data-role="page">
|
||||
<div class="headerNfooter" data-role="header" data-theme="f" data-position="fixed">
|
||||
<h1>央视頻道列表 - 電視直播</h1><a href="#" data-iconpos="left" data-icon="back" data-rel="back">返回</a>
|
||||
<a href="?act=home" data-icon="home" data-role="button" data-inline="true">首頁</a>
|
||||
</div>
|
||||
<!--top--><div id="ad-container" style="width: 100%;"><div id="container-c95365b7eb64cacc6988f80de291dd94"></div>
|
||||
<script>
|
||||
$(function(){
|
||||
let adScript = document.createElement('script');
|
||||
adScript.src = "https://bauval.org/21/c95365b7eb64cacc6988f80de291dd94";
|
||||
adScript.setAttribute('data-cfasync','false');
|
||||
document.body.appendChild(adScript);
|
||||
});
|
||||
</script></div><div data-role="content"><div id="errorTip">所有直播线路已失效,请稍后重试或手动切换线路!</div><ul data-role="listview" data-inset="true" data-divider-theme="a" data-filter="true" data-filter-placeholder="搜索"><li><a href="?act=play&tid=ys&id=1" data-ajax="false">CCTV1综合</a></li><li><a href="?act=play&tid=ys&id=2" data-ajax="false">CCTV2财经</a></li><li><a href="?act=play&tid=ys&id=3" data-ajax="false">CCTV3综艺</a></li><li><a href="?act=play&tid=ys&id=4" data-ajax="false">CCTV4中文国际</a></li><li><a href="?act=play&tid=ys&id=5" data-ajax="false">CCTV5体育</a></li><li><a href="?act=play&tid=ys&id=6" data-ajax="false">CCTV5+体育赛事</a></li><li><a href="?act=play&tid=ys&id=7" data-ajax="false">CCTV6电影</a></li><li><a href="?act=play&tid=ys&id=8" data-ajax="false">CCTV7国防军事</a></li><li><a href="?act=play&tid=ys&id=9" data-ajax="false">CCTV8电视剧</a></li><li><a href="?act=play&tid=ys&id=10" data-ajax="false">CCTV9纪录</a></li><li><a href="?act=play&tid=ys&id=11" data-ajax="false">CCTV10科教</a></li><li><a href="?act=play&tid=ys&id=12" data-ajax="false">CCTV11戏曲</a></li><li><a href="?act=play&tid=ys&id=13" data-ajax="false">CCTV12社会与法</a></li><li><a href="?act=play&tid=ys&id=14" data-ajax="false">CCTV13新闻</a></li><li><a href="?act=play&tid=ys&id=15" data-ajax="false">CCTV14少儿</a></li><li><a href="?act=play&tid=ys&id=16" data-ajax="false">CCTV15音乐</a></li><li><a href="?act=play&tid=ys&id=17" data-ajax="false">CCTV16奥林匹克</a></li><li><a href="?act=play&tid=ys&id=18" data-ajax="false">CCTV17农业农村</a></li><li><a href="?act=play&tid=ys&id=19" data-ajax="false">CCTV4k高清</a></li><li><a href="?act=play&tid=ys&id=20" data-ajax="false">CCTV8k高清</a></li><li><a href="?act=play&tid=ys&id=21" data-ajax="false">CCTV4欧洲HD</a></li><li><a href="?act=play&tid=ys&id=22" data-ajax="false">CCTV4美洲HD</a></li><li><a href="?act=play&tid=ys&id=23" data-ajax="false">CGTN</a></li><li><a href="?act=play&tid=ys&id=24" data-ajax="false">CGTN纪录</a></li><li><a href="?act=play&tid=ys&id=25" data-ajax="false">CCTV阿拉伯语</a></li><li><a href="?act=play&tid=ys&id=26" data-ajax="false">CCTV法语</a></li><li><a href="?act=play&tid=ys&id=27" data-ajax="false">CCTV西班牙语</a></li><li><a href="?act=play&tid=ys&id=28" data-ajax="false">CCTV俄语</a></li><li><a href="?act=play&tid=ys&id=29" data-ajax="false">CETV-1</a></li><li><a href="?act=play&tid=ys&id=30" data-ajax="false">CETV-2</a></li><li><a href="?act=play&tid=ys&id=31" data-ajax="false">CETV-3</a></li><li><a href="?act=play&tid=ys&id=32" data-ajax="false">CETV-4</a></li><li><a href="?act=play&tid=ys&id=33" data-ajax="false">CCTV兵器科技</a></li><li><a href="?act=play&tid=ys&id=34" data-ajax="false">CCTV怀旧剧场</a></li><li><a href="?act=play&tid=ys&id=35" data-ajax="false">CCTV第一剧场</a></li><li><a href="?act=play&tid=ys&id=36" data-ajax="false">CCTV风云剧场</a></li><li><a href="?act=play&tid=ys&id=37" data-ajax="false">CCTV风云音乐</a></li><li><a href="?act=play&tid=ys&id=38" data-ajax="false">CCTV风云足球</a></li><li><a href="?act=play&tid=ys&id=39" data-ajax="false">CCTV世界地理</a></li><li><a href="?act=play&tid=ys&id=40" data-ajax="false">CCTV文化精品</a></li><li><a href="?act=play&tid=ys&id=41" data-ajax="false">CCTV央视台球</a></li><li><a href="?act=play&tid=ys&id=42" data-ajax="false">CCTV高尔夫网球</a></li><li><a href="?act=play&tid=ys&id=43" data-ajax="false">CCTV女性时尚</a></li></ul></div>
|
||||
<!--end-->
|
||||
<div data-role="footer">
|
||||
<h4>版權聲明 © 所有源來自互聯網搜索</h4>
|
||||
</div>
|
||||
</div>
|
||||
<script>(function(s){s.dataset.zone='11422200',s.src='https://n6wxm.com/vignette.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script><script data-cfasync="false" src="https://czernik.org/14/149a54b3d08b2c507081e72fefeabeea"></script>
|
||||
</body>
|
||||
<span style="display:none">
|
||||
<script>
|
||||
!function(p){"use strict";!function(t){var s=window,e=document,i=p,c="".concat("https:"===e.location.protocol?"https://":"http://","sdk.51.la/js-sdk-pro.min.js"),n=e.createElement("script"),r=e.getElementsByTagName("script")[0];n.type="text/javascript",n.setAttribute("charset","UTF-8"),n.async=!0,n.src=c,n.id="LA_COLLECT",i.d=n;var o=function(){s.LA.ids.push(i)};s.LA?s.LA.ids&&o():(s.LA=p,s.LA.ids=[],o()),r.parentNode.insertBefore(n,r)}()}({id:"KnfaacjCp88BlrkE",ck:"KnfaacjCp88BlrkE"});
|
||||
</script><!-- Global site tag (gtag.js) - Google Analytics -->
|
||||
<script async src='https://www.googletagmanager.com/gtag/js?id=G-PY41HWX4PP'></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'G-PY41HWX4PP');
|
||||
</script>从缓存读取内容
|
||||
</span>
|
||||
|
||||
</html>
|
||||
@@ -1,244 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "TVB翡翠台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=24",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=6&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=7&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=8",
|
||||
"https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=9"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TVB无线新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=25",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=6",
|
||||
"https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TVB Plus",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=26",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=6&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=7&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=8",
|
||||
"https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=9"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "香港有线新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=29",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=6",
|
||||
"https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "香港有线18台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=30",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=6",
|
||||
"https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "NOW新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=36",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=6",
|
||||
"https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "凤凰卫视中文台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=20",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=6",
|
||||
"https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "凤凰卫视资讯台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=21",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=6",
|
||||
"https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "中天新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=49",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=6",
|
||||
"https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "东森新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=50",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=6",
|
||||
"https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "寰宇新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=59",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=6",
|
||||
"https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TVBS新闻台",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=63",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=6",
|
||||
"https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "TVBS HD",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=65",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=6",
|
||||
"https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CCTV5体育",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=3",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=6",
|
||||
"https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "CCTV5+体育赛事",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=5",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=6",
|
||||
"https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "广东体育",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=11",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=6",
|
||||
"https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "广东珠江频道",
|
||||
"url": "https://m.iptv807.com/?act=play&tid=tv&id=9",
|
||||
"lines": [
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=0&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=1&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=2&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=3&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=4&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=5&type=.flv",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=6",
|
||||
"https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=7"
|
||||
]
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,6 +0,0 @@
|
||||
import re
|
||||
t = '"b8"+"fb"+"f".split("").reverse().join("")+"c29e".split("").reverse().join("")+"6e44c"'
|
||||
REV = '.split("").reverse().join("")'
|
||||
for i, m in enumerate(re.finditer(r'"([^"]*)"', t)):
|
||||
after = t[m.end():m.end()+len(REV)]
|
||||
print(f'{i}: lit={m.group(1)!r} after={after[:40]!r} rev={after.startswith(REV)}')
|
||||
@@ -1,31 +0,0 @@
|
||||
s = '"aadf"+"c"'
|
||||
REV = '.split("").reverse().join("")'
|
||||
o = []; i = 0
|
||||
while i < len(s):
|
||||
if s[i] == '"':
|
||||
c = s.find('"', i + 1)
|
||||
if c < 0: break
|
||||
lit = s[i+1:c]
|
||||
ir = s[c+1:c+1+len(REV)] == REV
|
||||
o.append(lit[::-1] if ir else lit)
|
||||
print(f'step: i={i} lit={lit!r} ir={ir} new_i={c+1+(len(REV) if ir else 0)}')
|
||||
i = c+1+(len(REV) if ir else 0)
|
||||
else:
|
||||
i += 1
|
||||
print('joined=', ''.join(o))
|
||||
|
||||
# 测试复杂语句
|
||||
s2 = '"aadf"+"c"+"9c75".split("").reverse().join("")+"b259"'
|
||||
o2 = []; i = 0
|
||||
while i < len(s2):
|
||||
if s2[i] == '"':
|
||||
c = s2.find('"', i + 1)
|
||||
if c < 0: break
|
||||
lit = s2[i+1:c]
|
||||
ir = s2[c+1:c+1+len(REV)] == REV
|
||||
o2.append(lit[::-1] if ir else lit)
|
||||
print(f'S2 i={i} lit={lit!r} ir={ir} new_i={c+1+(len(REV) if ir else 0)}')
|
||||
i = c+1+(len(REV) if ir else 0)
|
||||
else:
|
||||
i += 1
|
||||
print('s2 joined=', ''.join(o2))
|
||||
@@ -1,79 +0,0 @@
|
||||
// 解析 m.iptv807.com 播放页加密线路 → 真实播放地址
|
||||
// 用法: node decode_iptv807.js <play_url> (缺省 TVB翡翠台)
|
||||
const https = require('https');
|
||||
const http = require('http');
|
||||
|
||||
function fetch(url) {
|
||||
return new Promise((res, rej) => {
|
||||
const h = url.startsWith('https') ? https : http;
|
||||
const req = h.get(url, {
|
||||
headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 12) Chrome/124 Mobile Safari/537.36' }
|
||||
}, r => {
|
||||
let d = '';
|
||||
r.on('data', c => d += c);
|
||||
r.on('end', () => res(d));
|
||||
});
|
||||
req.on('error', rej);
|
||||
req.setTimeout(20000, () => { req.destroy(); rej(new Error('timeout')); });
|
||||
});
|
||||
}
|
||||
|
||||
// site JS: base64 decode
|
||||
function sappb(data) { return Buffer.from(data, 'binary').toString('binary'); }
|
||||
function atob(s) { return Buffer.from(s, 'base64').toString('binary'); }
|
||||
|
||||
function rfhmo(str, key) {
|
||||
const string = atob(str);
|
||||
key = key + '93cf0945a0a4eecb';
|
||||
const len = key.length;
|
||||
let code = '';
|
||||
for (let i = 0; i < string.length; i++) {
|
||||
code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(i % len));
|
||||
}
|
||||
return atob(code); // stra = sappb(code) → 实际是 base64 解码
|
||||
}
|
||||
|
||||
function wngbe(dek, xefgv, ouyit, qrtkk) {
|
||||
dek = dek.split('').reverse().join('');
|
||||
dek = rfhmo(dek, xefgv);
|
||||
dek = dek.replace('token=' + ouyit, 'token=' + qrtkk);
|
||||
dek = dek.replace(xefgv, '');
|
||||
return dek;
|
||||
}
|
||||
|
||||
function b64utf8(bin) {
|
||||
// 加密前URL可能含UTF-8中文,用 UTF-8 重新编码
|
||||
const bytes = Buffer.from(bin, 'binary');
|
||||
return bytes.toString('utf8');
|
||||
}
|
||||
|
||||
(async () => {
|
||||
const playUrl = process.argv[2] || 'https://m.iptv807.com/?act=play&tid=tv&id=24';
|
||||
const html = await fetch(playUrl);
|
||||
// 变量都在页面的 <script> 块中
|
||||
const mVar = (name) => {
|
||||
const m = html.match(new RegExp('var\\\\s+' + name + '\\\\s*=\\\\s*"([^"]*)"'));
|
||||
return m ? m[1] : '';
|
||||
};
|
||||
// xefgv/qrtkk 是由 fbjao/lnzyw 拼出来的
|
||||
let xefgv = '', qrtkk = '', ouyit = '', fbjao = '', lnzyw = '';
|
||||
const mF = html.match(/var fbjao\s*=(.*?);/s);
|
||||
const mL = html.match(/var lnzyw\s*=(.*?);/s);
|
||||
const mO = html.match(/ouyit\s*=\s*"([^"]+)"/);
|
||||
if (mF) fbjao = eval(mF[1]);
|
||||
if (mL) lnzyw = eval(mL[1]);
|
||||
if (mO) ouyit = mO[1];
|
||||
xefgv = fbjao; qrtkk = lnzyw;
|
||||
|
||||
// 所有线路 option
|
||||
const opts = [...html.matchAll(/<option value="([^"]+)">([^<]+)<\/option>/g)];
|
||||
if (!opts.length) { console.error('no lines found'); process.exit(1); }
|
||||
console.error('lines:', opts.length);
|
||||
const results = opts.map(o => {
|
||||
try {
|
||||
const raw = wngbe(o[1], xefgv, ouyit, qrtkk);
|
||||
return { line: o[2], url: b64utf8(raw) };
|
||||
} catch (e) { return { line: o[2], url: 'DECODE_ERR: ' + e.message }; }
|
||||
});
|
||||
console.log(JSON.stringify(results, null, 2));
|
||||
})().catch(e => { console.error('FAIL:', e.message); process.exit(1); });
|
||||
@@ -1,18 +0,0 @@
|
||||
channels found: 17
|
||||
OK TVB翡翠台 https://p.iptv200.com/play.php?token=9z6znhrNbVN%2BadJgXQgVKbmi&tid=tv&id=24&p=0&type=.flv
|
||||
OK TVB无线新闻台 https://p.iptv200.com/play.php?token=5FKh3QeGDBHGiHGrgXSC4lnv&tid=tv&id=25&p=0&type=.flv
|
||||
OK TVB Plus https://p.iptv200.com/play.php?token=wcMNXefL6Q3Eg62iwTooYrnh&tid=tv&id=26&p=0&type=.flv
|
||||
OK 香港有线新闻台 https://p.iptv200.com/play.php?token=45F9iQiSmlaoofPW%2BjCUBly4&tid=tv&id=29&p=0&type=.flv
|
||||
OK 香港有线18台 https://p.iptv200.com/play.php?token=3uj%2Bu1wkcEHoEsYkacEMRZI6&tid=tv&id=30&p=0&type=.flv
|
||||
OK NOW新闻台 https://p.iptv200.com/play.php?token=V6RaG8AWI887g0fPpEHSf9Gr&tid=tv&id=36&p=0&type=.flv
|
||||
OK 凤凰卫视中文台 https://p.iptv200.com/play.php?token=yJugmnaMOW5G1U7VukoHjfZ7&tid=tv&id=20&p=0&type=.flv
|
||||
OK 凤凰卫视资讯台 https://p.iptv200.com/play.php?token=w8uUUgNlTJHTue%2FCFIMUcVQB&tid=tv&id=21&p=0&type=.flv
|
||||
OK 中天新闻台 https://p.iptv200.com/play.php?token=jV64CvI%2BxkD61AjT6QkDaFW5&tid=tv&id=49&p=0&type=.flv
|
||||
OK 东森新闻台 https://p.iptv200.com/play.php?token=p3v350Vgjzj6e7T4UiwHfNVg&tid=tv&id=50&p=0&type=.flv
|
||||
OK 寰宇新闻台 https://p.iptv200.com/play.php?token=TuNFMK%2FIVXykihkEkNKOp8Q%2F&tid=tv&id=59&p=0&type=.flv
|
||||
OK TVBS新闻台 https://p.iptv200.com/play.php?token=1RvQZE91mMMA3ZCv3iwj4ryJ&tid=tv&id=63&p=0&type=.flv
|
||||
OK TVBS HD https://p.iptv200.com/play.php?token=NOK4Kf%2FPSJW7XPE5hndocIwA&tid=tv&id=65&p=0&type=.flv
|
||||
OK CCTV5体育 https://p.iptv200.com/play.php?token=oxWPBwqOc4tMn9EXhnZkBl9b&tid=tv&id=3&p=0&type=.flv
|
||||
OK CCTV5+体育赛事 https://p.iptv200.com/play.php?token=tPxL8hKSDn%2BB59RaBWjsmXZx&tid=tv&id=5&p=0&type=.flv
|
||||
OK 广东体育 https://p.iptv200.com/play.php?token=vE4kLawtzjALOKZbvgxd%2Bzwg&tid=tv&id=11&p=0&type=.flv
|
||||
OK 广东珠江频道 https://p.iptv200.com/play.php?token=ze5Ajfjj7k%2Bho3%2BSDpMr8RrY&tid=tv&id=9&p=0&type=.flv
|
||||
@@ -1,234 +0,0 @@
|
||||
channels found: 233
|
||||
OK CCTV1综合 https://p.iptv200.com/play.php?token=04aITwDeclviR0UUQd6EqodG&tid=tv&id=1&p=0&type=.flv
|
||||
OK CCTV5体育 https://p.iptv200.com/play.php?token=%2F06IUgHfd99Mn9EXhndgBV5Z&tid=tv&id=3&p=0&type=.flv
|
||||
OK CCTV5+体育赛事 https://p.iptv200.com/play.php?token=6PsYo0%2BUCHiB59RaBWnomndx&tid=tv&id=5&p=0&type=.flv
|
||||
OK CCTV13新闻 https://p.iptv200.com/play.php?token=TRE8zueKECj3BZ%2F4FA42ScYE&tid=tv&id=7&p=0&type=.flv
|
||||
OK 广东珠江频道 https://p.iptv200.com/play.php?token=xLoVifLrvk6ho3%2BSDpIv8hTY&tid=tv&id=9&p=0&type=.flv
|
||||
ERR 广东体育 timeout
|
||||
OK 湖南卫视 https://p.iptv200.com/play.php?token=kdtFGr9BLyJt5PrQR73hmEG0&tid=tv&id=17&p=0&type=.flv
|
||||
OK 凤凰卫视中文台 https://p.iptv200.com/play.php?token=zcelm3bYP2pG1U7VuksDjfF%2B&tid=tv&id=20&p=0&type=.flv
|
||||
OK 凤凰卫视资讯台 https://p.iptv200.com/play.php?token=lpjPBAY2T8nTue%2FCFIIQcVMK&tid=tv&id=21&p=0&type=.flv
|
||||
OK 凤凰卫视香港台 https://p.iptv200.com/play.php?token=gjZuZSJ0yiht%2F9CebC9o2Wc8&tid=tv&id=22&p=0&type=.flv
|
||||
OK TVB翡翠台 https://p.iptv200.com/play.php?token=rGKzl0ycPlF%2BadJgXQkRKb%2Bm&tid=tv&id=24&p=0&type=.flv
|
||||
OK TVB无线新闻台 https://p.iptv200.com/play.php?token=uVL23VPQXxXGiHGrgXWG4ljm&tid=tv&id=25&p=0&type=.flv
|
||||
OK TVB Plus https://p.iptv200.com/play.php?token=kZZdCubBvlnEg62iwTssYrvn&tid=tv&id=26&p=0&type=.flv
|
||||
OK TVB明珠台 https://p.iptv200.com/play.php?token=59%2FgaB3Wf8p8zmZ%2Bl8PaJq1N&tid=tv&id=27&p=0&type=.flv
|
||||
OK 华丽翡翠台 https://p.iptv200.com/play.php?token=tV1vVps30WOMSuFHj6pZJ91v&tid=tv&id=28&p=0&type=.flv
|
||||
OK 香港有线新闻台 https://p.iptv200.com/play.php?token=sJJ4jAWYy1moofPW%2BjGQBlO6&tid=tv&id=29&p=0&type=.flv
|
||||
ERR 香港有线18台 timeout
|
||||
ERR 香港有线18台(备) timeout
|
||||
OK NOW新闻台 https://p.iptv200.com/play.php?token=UfZdG5AWepo7g0fPpEDWftSv&tid=tv&id=36&p=0&type=.flv
|
||||
OK NOW财经台 https://p.iptv200.com/play.php?token=Hc5nNKt7WlXz10HawD%2FVxjVQ&tid=tv&id=37&p=0&type=.flv
|
||||
OK ViuTV https://p.iptv200.com/play.php?token=%2B%2BIKtdQm%2B6uSxFcLM%2FRlTfbH&tid=tv&id=38&p=0&type=.flv
|
||||
OK ViuTV6 https://p.iptv200.com/play.php?token=QQWbnsmeQusQaxY2sj%2Bazgad&tid=tv&id=39&p=0&type=.flv
|
||||
OK HOY国际财经台 https://p.iptv200.com/play.php?token=EYUw0sdX%2FamjRY3cZMKwHPPm&tid=tv&id=41&p=0&type=.flv
|
||||
OK HOY资讯台 https://p.iptv200.com/play.php?token=j%2BgV954uz7t5cD%2FEk4O%2FL5RM&tid=tv&id=42&p=0&type=.flv
|
||||
OK HOY TV https://p.iptv200.com/play.php?token=H3daVQqPGbhKbuqxIDv1Opkn&tid=tv&id=43&p=0&type=.flv
|
||||
OK 港台电视31 https://p.iptv200.com/play.php?token=jwiorD7Ub32U5CiT1gunFVxS&tid=tv&id=45&p=0&type=.flv
|
||||
ERR 港台电视32 timeout
|
||||
OK 中天新闻台 https://p.iptv200.com/play.php?token=2Qi4CPVty0X61AjT6QgHaVu8&tid=tv&id=49&p=0&type=.flv
|
||||
OK 东森新闻台 https://p.iptv200.com/play.php?token=oXny6hQ4iTT6e7T4Ui0Dfdtl&tid=tv&id=50&p=0&type=.flv
|
||||
ERR 东森财经新闻台 timeout
|
||||
OK 中视新闻台 https://p.iptv200.com/play.php?token=f%2FhCuD6Z%2BCHjVQfJFfYutO%2BH&tid=tv&id=52&p=0&type=.flv
|
||||
OK 台视新闻台 https://p.iptv200.com/play.php?token=%2Be3Y8El4pudsxs6LEWoi4NMC&tid=tv&id=53&p=0&type=.flv
|
||||
OK 三立新闻台 https://p.iptv200.com/play.php?token=pScHiH%2BysYXPqptapMZDIXbM&tid=tv&id=54&p=0&type=.flv
|
||||
OK 民视新闻台 https://p.iptv200.com/play.php?token=jRcBUtL086drmHfF9rmJXrr7&tid=tv&id=56&p=0&type=.flv
|
||||
OK 华视新闻台 https://p.iptv200.com/play.php?token=D%2F0N3afijDhXt8Sup50yo7mX&tid=tv&id=57&p=0&type=.flv
|
||||
OK 镜电视新闻台 https://p.iptv200.com/play.php?token=Xf%2FKX9DkkIEN8COHEA9X44Ch&tid=tv&id=58&p=0&type=.flv
|
||||
OK 寰宇新闻台 https://p.iptv200.com/play.php?token=FOIVNq%2FIAnakihkEkNOKqcE4&tid=tv&id=59&p=0&type=.flv
|
||||
OK 寰宇新闻台湾台 https://p.iptv200.com/play.php?token=YwjMSCL4bOwfJUWQ%2FjxdUMRH&tid=tv&id=60&p=0&type=.flv
|
||||
OK 非凡新闻 https://p.iptv200.com/play.php?token=uOCApa%2FUgUymDpu81X8601wE&tid=tv&id=62&p=0&type=.flv
|
||||
OK TVBS新闻台 https://p.iptv200.com/play.php?token=0U2CZRkvz5IA3ZCv3i0n7L6M&tid=tv&id=63&p=0&type=.flv
|
||||
OK TVBS HD https://p.iptv200.com/play.php?token=buu8KKuYE5%2B7XPE5hnZsfo4F&tid=tv&id=65&p=0&type=.flv
|
||||
OK 中视HD https://p.iptv200.com/play.php?token=MyhmKZBmlWaD5oXPNzMDexXC&tid=tv&id=68&p=0&type=.flv
|
||||
OK 台视HD https://p.iptv200.com/play.php?token=rQ4QpZPsdiOMLuFFQS52wTi7&tid=tv&id=69&p=0&type=.flv
|
||||
OK 民视HD https://p.iptv200.com/play.php?token=BEw3JCzraKfjdZ%2B%2B0PkwGDWT&tid=tv&id=70&p=0&type=.flv
|
||||
OK 华视HD https://p.iptv200.com/play.php?token=vctyqKvTXsZA%2B5t39ZMtSJy%2B&tid=tv&id=71&p=0&type=.flv
|
||||
OK 緯來體育台 https://p.iptv200.com/play.php?token=Jj7%2F%2FWOvZMtpUVzrbb%2FuUfFM&tid=tv&id=77&p=0&type=.flv
|
||||
OK 纬来日本台 https://p.iptv200.com/play.php?token=XEXCtOMHDik4AGjusPtVgtvv&tid=tv&id=78&p=0&type=.flv
|
||||
OK 纬来育乐台 https://p.iptv200.com/play.php?token=BjjZoAESgXN%2BZVw76DEMMKoP&tid=tv&id=79&p=0&type=.flv
|
||||
OK DAZN 1 https://p.iptv200.com/play.php?token=tLMj%2BGlwRQLEXMwF%2BDeI8PwT&tid=tv&id=80&p=0&type=.flv
|
||||
OK DAZN 2 https://p.iptv200.com/play.php?token=h0jxD3N093yDmqFUPbHY5MXr&tid=tv&id=81&p=0&type=.flv
|
||||
OK 爱尔达体育1台 https://p.iptv200.com/play.php?token=n8sbfOy8g3hwzjMzseZYKyNP&tid=tv&id=83&p=0&type=.flv
|
||||
OK 爱尔达体育2台 https://p.iptv200.com/play.php?token=lIrDnj6xlJbpb3fzxTjkk6wh&tid=tv&id=84&p=0&type=.flv
|
||||
OK BBC新闻 https://p.iptv200.com/play.php?token=x9kinn3i2WThq8tttHUbBYd%2F&tid=tv&id=94&p=0&type=.flv
|
||||
ERR MOMO综合台 timeout
|
||||
OK 东森超视 https://p.iptv200.com/play.php?token=ZjaEk63ffZNImQ6gbXS6%2Fy%2FQ&tid=tv&id=98&p=0&type=.flv
|
||||
OK 茶频道 https://p.iptv200.com/play.php?token=F4mN%2FxkAnmkqr1m2SXIJkaWV&tid=tv&id=100
|
||||
OK 快乐垂钓 https://p.iptv200.com/play.php?token=ReoKCDI4%2Bg5Ro44lJVUuRRw5&tid=tv&id=102
|
||||
OK 先锋乒羽 https://p.iptv200.com/play.php?token=vxw7csoIHJB18W889gF1pdQO&tid=tv&id=103
|
||||
OK 湖南国际 https://p.iptv200.com/play.php?token=vzmW3Cs%2BSsAfNhlF9xhPs4Lw&tid=tv&id=104
|
||||
OK 湖南电视剧 https://p.iptv200.com/play.php?token=Pzce9vYuyGD9luKb9kxp7HqF&tid=tv&id=105
|
||||
ERR 金鹰卡通 timeout
|
||||
OK 金鹰纪实 https://p.iptv200.com/play.php?token=cYoooZxWEq6JMsZPTXT1mjjv&tid=tv&id=107
|
||||
OK 湖南经视 https://p.iptv200.com/play.php?token=7ypq%2Fg8anNrAR3A6PY2NK2YI&tid=tv&id=108
|
||||
OK 湖南娱乐 https://p.iptv200.com/play.php?token=M5AiZ%2B0ijbsAu7hMZVVVZrCQ&tid=tv&id=109
|
||||
OK 湖南都市 https://p.iptv200.com/play.php?token=hdmnc1TqlOfzcpoggZAFeFYJ&tid=tv&id=110
|
||||
OK 湖南公共 https://p.iptv200.com/play.php?token=kZaXjxYfPsKlQW0rkSjNjj4G&tid=tv&id=111
|
||||
OK 湖南快乐购 https://p.iptv200.com/play.php?token=Nlp1DrpuY%2F4WBB3ws6JQM%2FtF&tid=tv&id=112
|
||||
OK 长沙政法 https://p.iptv200.com/play.php?token=%2BGA6GlLaSyskY7euEQlyLImQ&tid=tv&id=113
|
||||
OK 长沙女性 https://p.iptv200.com/play.php?token=p8%2FkmOzRUqrFdJx7j8JSnrt0&tid=tv&id=114
|
||||
OK 长沙新闻 https://p.iptv200.com/play.php?token=V%2FBYul8xWdBCADusPTEmpMgQ&tid=tv&id=115
|
||||
OK 广州综合 https://p.iptv200.com/play.php?token=%2BgOPdNPV3iuSTf%2FB1tMg3H2v&tid=tv&id=117
|
||||
OK 广州新闻 https://p.iptv200.com/play.php?token=Hm3Dht9FqN8FliHOuFAGy2QY&tid=tv&id=118
|
||||
OK 广州影视 https://p.iptv200.com/play.php?token=APxD3vG8e08%2FKQ16XTqyZJZg&tid=tv&id=119
|
||||
OK 广州法治 https://p.iptv200.com/play.php?token=1JFMX058GxjegdBNdVOFyxQY&tid=tv&id=120
|
||||
OK 广州南国都市 https://p.iptv200.com/play.php?token=PpSufIa61Y9frAo7OXF2riOV&tid=tv&id=121
|
||||
OK 广州竞赛 https://p.iptv200.com/play.php?token=1qIAmDjgWEdL%2B2KNff9%2B3MbA&tid=tv&id=122
|
||||
OK CCTV5体育 https://p.iptv200.com/play.php?token=d2LU3ROTqFL0VfqJnzpxJj46&tid=ty&id=1&p=0&type=.flv
|
||||
OK CCTV5+体育赛事 https://p.iptv200.com/play.php?token=dycSkISdpENiub17p%2BDVvY0a&tid=ty&id=2&p=0&type=.flv
|
||||
OK 广东体育 https://p.iptv200.com/play.php?token=QXLf726vE45uiQqR%2BoUyaWTH&tid=ty&id=3&p=0&type=.flv
|
||||
OK 劲爆体育 https://p.iptv200.com/play.php?token=4HaPR1oH6Zm9cSDR2ZKYb97V&tid=ty&id=4&p=0&type=.flv
|
||||
OK 五星体育 https://p.iptv200.com/play.php?token=C65zY64vnTiAI%2Bvx2gLyNzE1&tid=ty&id=5&p=0&type=.flv
|
||||
OK 新视觉HD https://p.iptv200.com/play.php?token=iHHJK0KpoAAcnFFDryPxlfcd&tid=ty&id=6&p=0
|
||||
OK CCTV16奥林匹克 https://p.iptv200.com/play.php?token=Pi%2Bn41NhLYGeT%2FyO6xP0UuBy&tid=ty&id=7&p=0&type=.flv
|
||||
OK 极速汽车 https://p.iptv200.com/play.php?token=ukdtMzE7UDWH3npDydFf9plP&tid=ty&id=12&p=0
|
||||
OK 游戏风云 https://p.iptv200.com/play.php?token=cY4qgZqYswBoMw6M5XTvxpwH&tid=ty&id=13&p=0
|
||||
OK 四海钓鱼 https://p.iptv200.com/play.php?token=HKt14lqIZcKSFbxrZWcK0riX&tid=ty&id=14&p=0
|
||||
OK 快乐垂钓 https://p.iptv200.com/play.php?token=i7RzWhCzdVndvVh7abZI3hV4&tid=ty&id=15
|
||||
OK 先锋乒羽 https://p.iptv200.com/play.php?token=%2F9MrBS0%2BisB1hZIFDDcJCrQQ&tid=ty&id=16
|
||||
OK 南国都市 https://p.iptv200.com/play.php?token=pVBO3y1kRxoHS8Wrr7%2FuPh8a&tid=ty&id=19
|
||||
OK 广州竞��� https://p.iptv200.com/play.php?token=kesawnF1V743OOR9S6Ei6z09&tid=ty&id=20
|
||||
OK CCTV风云足球 https://p.iptv200.com/play.php?token=Ju%2Flw0dy5hIQC4Z4X2DecAqs&tid=ty&id=21&p=0
|
||||
OK 魅力足球 https://p.iptv200.com/play.php?token=2CaMJIyb6AsQVIt5dM8sh3bh&tid=ty&id=22&p=0
|
||||
OK 緯來體育台 https://p.iptv200.com/play.php?token=pE4HZSXaLP8Cy9k9cLY4mwIz&tid=ty&id=23&p=0&type=.flv
|
||||
OK ELEVEN 1(DAZN 1) https://p.iptv200.com/play.php?token=OzqIPyd%2BL7W986pYbGRDIImh&tid=ty&id=24&p=0&type=.flv
|
||||
OK ELEVEN 2(DAZN 2) https://p.iptv200.com/play.php?token=11p%2FIPtewrCkCpRQcbmIDHvk&tid=ty&id=25&p=0&type=.flv
|
||||
OK 爱尔达体育1台 https://p.iptv200.com/play.php?token=Ujr65TjdPRHIP5djvZ2zT%2B94&tid=ty&id=28&p=0&type=.flv
|
||||
OK 爱尔达体育2台 https://p.iptv200.com/play.php?token=elPzUzi1HC1bTDqK%2FDcJlYxi&tid=ty&id=29&p=0&type=.flv
|
||||
OK CCTV1综合 https://p.iptv200.com/play.php?token=OQemSJcbpY%2FyaUIgZF3s9ogi&tid=ys&id=1&p=0&type=.flv
|
||||
OK CCTV2财经 https://p.iptv200.com/play.php?token=7gk7X8Ayw%2By%2B2OGv7kSyGUng&tid=ys&id=2&p=0&type=.flv
|
||||
OK CCTV3综艺 https://p.iptv200.com/play.php?token=L2EHzlRFzS%2BYd850HTfoX3oM&tid=ys&id=3&p=0&type=.flv
|
||||
OK CCTV4中文国际 https://p.iptv200.com/play.php?token=KHjS%2BR4tgk7nEFEyfIfyQDpl&tid=ys&id=4&p=0&type=.flv
|
||||
OK CCTV5体育 https://p.iptv200.com/play.php?token=wD7rhSr5%2BS2DbtUoUn%2FTiwtm&tid=ys&id=5&p=0&type=.flv
|
||||
OK CCTV5+体育赛事 https://p.iptv200.com/play.php?token=65qROx3f9KPH8hrcpoY4%2Ftg%2F&tid=ys&id=6&p=0&type=.flv
|
||||
OK CCTV6电影 https://p.iptv200.com/play.php?token=9BZTWpDS6Hhvv%2BugiONSj9Tu&tid=ys&id=7&p=0&type=.flv
|
||||
OK CCTV7国防军事 https://p.iptv200.com/play.php?token=nMQFs5SJw2nsBTEX%2FrqGym%2FX&tid=ys&id=8&p=0&type=.flv
|
||||
OK CCTV8电视剧 https://p.iptv200.com/play.php?token=xdk01Uuxjs6tdzaD9N1f8onI&tid=ys&id=9&p=0&type=.flv
|
||||
OK CCTV9纪录 https://p.iptv200.com/play.php?token=fAyqRqDMvuSi3iESgDMv9Jub&tid=ys&id=10&p=0&type=.flv
|
||||
ERR CCTV10科教 timeout
|
||||
OK CCTV11戏曲 https://p.iptv200.com/play.php?token=JnmOgg0yWhaxfOdIyYpnvD8J&tid=ys&id=12&p=0&type=.flv
|
||||
OK CCTV12社会与法 https://p.iptv200.com/play.php?token=0w%2F6bM3TiyL0fmgGX8l8Ij%2B6&tid=ys&id=13&p=0&type=.flv
|
||||
OK CCTV13新闻 https://p.iptv200.com/play.php?token=EQYahN1YJI9S6is2Zdkav%2Bzw&tid=ys&id=14&p=0&type=.flv
|
||||
OK CCTV14少儿 https://p.iptv200.com/play.php?token=JcbkXaKHv5im0q8%2Fjrqpdj7a&tid=ys&id=15&p=0&type=.flv
|
||||
OK CCTV15音乐 https://p.iptv200.com/play.php?token=bfMCNoMJBywoKDPIpsDj1M9L&tid=ys&id=16&p=0&type=.flv
|
||||
OK CCTV16奥林匹克 https://p.iptv200.com/play.php?token=Jv2DDFpwtah3w9X%2FdF5DuipM&tid=ys&id=17&p=0&type=.flv
|
||||
OK CCTV17农业农村 https://p.iptv200.com/play.php?token=Ji0NdwPtaVPwLCl5o%2BiZUGlG&tid=ys&id=18&p=0&type=.flv
|
||||
OK CCTV4k高清 https://p.iptv200.com/play.php?token=Xea%2F%2FrEKUojM1%2BV3683IZeQv&tid=ys&id=19&p=0
|
||||
OK CCTV8k高清 https://p.iptv200.com/play.php?token=Xb2RminN5gihcqyVQAnJ%2BNGp&tid=ys&id=20&p=0
|
||||
OK CCTV4欧洲HD https://p.iptv200.com/play.php?token=OLFNHMBheDsRQZgHkK02qvc6&tid=ys&id=21&p=0
|
||||
ERR CCTV4美洲HD timeout
|
||||
OK CGTN https://p.iptv200.com/play.php?token=BheqPbI8MNZybJo%2FHGc24NIa&tid=ys&id=23&p=0
|
||||
OK CGTN纪录 https://p.iptv200.com/play.php?token=W%2FoRZRyoyI6VaxsxoqVAK4Pe&tid=ys&id=24&p=0
|
||||
OK CCTV阿拉伯语 https://p.iptv200.com/play.php?token=2BZrUPTHmGrH8Ar%2Bc7jgXTMv&tid=ys&id=25&p=0
|
||||
OK CCTV法语 https://p.iptv200.com/play.php?token=VpONv0o9refyRmGKluLbhaBT&tid=ys&id=26&p=0
|
||||
OK CCTV西班牙语 https://p.iptv200.com/play.php?token=pPF%2BV8g%2BgeY25hjOXR6qWt%2F%2B&tid=ys&id=27&p=0
|
||||
OK CCTV俄语 https://p.iptv200.com/play.php?token=5gSY1nRMLxgyYsvByZaFePXr&tid=ys&id=28&p=0
|
||||
OK CETV-1 https://p.iptv200.com/play.php?token=bL2111RRoqi%2F5P7lQYgKBe9X&tid=ys&id=29&p=0
|
||||
OK CETV-2 https://p.iptv200.com/play.php?token=5xS45O3uWL56jnSxwiY%2BneB5&tid=ys&id=30&p=0
|
||||
OK CETV-3 https://p.iptv200.com/play.php?token=vDOHFWxrHTf5%2FJInbeO84DG4&tid=ys&id=31&p=0
|
||||
OK CETV-4 https://p.iptv200.com/play.php?token=My34uHMpzXnMmoc33SXDixRD&tid=ys&id=32&p=0
|
||||
OK CCTV兵器科技 https://p.iptv200.com/play.php?token=KX3OtZts1UQ%2FNGKgRi27fGVx&tid=ys&id=33&p=0
|
||||
OK CCTV怀旧剧场 https://p.iptv200.com/play.php?token=0bxE2kqpJLextV8qc8ju8ya%2B&tid=ys&id=34&p=0
|
||||
OK CCTV第一剧场 https://p.iptv200.com/play.php?token=uJDjzrV5uS3GGrRWwzzZ7gjX&tid=ys&id=35&p=0
|
||||
OK CCTV风云剧场 https://p.iptv200.com/play.php?token=2mt69Pu8tsMrR49%2FoavFzW0l&tid=ys&id=36&p=0
|
||||
OK CCTV风云音乐 https://p.iptv200.com/play.php?token=JAY6vH78qf9ie7m3YkUaO6Wn&tid=ys&id=37&p=0
|
||||
OK CCTV风云足球 https://p.iptv200.com/play.php?token=SpiJ8rLgqwS%2BPMZzTBHEc2V1&tid=ys&id=38&p=0
|
||||
OK CCTV世界地理 https://p.iptv200.com/play.php?token=eKLSOV%2B02bsvG7%2FhZ8Gth3pr&tid=ys&id=39&p=0
|
||||
OK CCTV文化精品 https://p.iptv200.com/play.php?token=gXlLR3LnV0Hla57NQ7hCGHZ0&tid=ys&id=40&p=0
|
||||
OK CCTV央视台球 https://p.iptv200.com/play.php?token=B3NGGt7%2B0w7YnWrw96Iz3aaL&tid=ys&id=41&p=0
|
||||
OK CCTV高尔夫网球 https://p.iptv200.com/play.php?token=iMajD8SHylSsgDDhS0njPhO9&tid=ys&id=42&p=0
|
||||
OK CCTV女性时尚 https://p.iptv200.com/play.php?token=M%2BUZcxguzr%2FEsnK9cZTV1gT%2F&tid=ys&id=43&p=0
|
||||
OK 湖南卫视 https://p.iptv200.com/play.php?token=AfhXLHDBQKjvet8nDo%2FxGg9c&tid=ws&id=1&p=0&type=.flv
|
||||
OK 江苏卫视 https://p.iptv200.com/play.php?token=fsV5wF1Le3bclFruiHN6iNjd&tid=ws&id=2&p=0&type=.flv
|
||||
OK 浙江卫视 https://p.iptv200.com/play.php?token=BDMADR%2BQ7Hm4rYjoqnz0Ndvn&tid=ws&id=3&p=0&type=.flv
|
||||
OK 东方卫视 https://p.iptv200.com/play.php?token=0Mbn02DZxzMU6zSCTLcgJR%2Bx&tid=ws&id=4&p=0&type=.flv
|
||||
OK 北京卫视 https://p.iptv200.com/play.php?token=8pYbcW%2FaBEX3o6CXofe84DR7&tid=ws&id=5&p=0&type=.flv
|
||||
OK 深圳卫视 https://p.iptv200.com/play.php?token=2y5tY28ju2Ui2It3H40DYVmc&tid=ws&id=6&p=0&type=.flv
|
||||
OK 广东卫视 https://p.iptv200.com/play.php?token=lndegIbEvroxMzoCEf1pW9YQ&tid=ws&id=7&p=0&type=.flv
|
||||
OK 安徽卫视 https://p.iptv200.com/play.php?token=dYiHa%2FWq7upAeJqWQhf7cnaK&tid=ws&id=8&p=0&type=.flv
|
||||
OK 东南卫视 https://p.iptv200.com/play.php?token=tJRQ64OuSo3lkR4wKOFl62zM&tid=ws&id=9&p=0&type=.flv
|
||||
OK 河北卫视 https://p.iptv200.com/play.php?token=hnVVKoPwvevIJKBPl9PpX3Au&tid=ws&id=10&p=0
|
||||
OK 黑龙江卫视 https://p.iptv200.com/play.php?token=b%2FCmX5if27ckgtfCuWeTf7Rn&tid=ws&id=11&p=0&type=.flv
|
||||
OK 湖北卫视 https://p.iptv200.com/play.php?token=3JOFvU34SLUhFGcSwVmdgx%2FS&tid=ws&id=12&p=0&type=.flv
|
||||
OK 江西卫视 https://p.iptv200.com/play.php?token=RBfW%2FK7Qw4qgZifLFba940F1&tid=ws&id=13&p=0&type=.flv
|
||||
OK 辽宁卫视 https://p.iptv200.com/play.php?token=rmZhMOb3I4mKI9ESTd8%2BUqU7&tid=ws&id=14&p=0&type=.flv
|
||||
OK 海南卫视 https://p.iptv200.com/play.php?token=EmzMR%2BPtA%2FI2OMid6CbF5EGI&tid=ws&id=15&p=0
|
||||
OK 山东卫视 https://p.iptv200.com/play.php?token=gj8m5DEgL5cDpbizKDoSDH46&tid=ws&id=16&p=0&type=.flv
|
||||
OK 四川卫视 https://p.iptv200.com/play.php?token=MXiVLHS8Hpqp3dMP6eSOIXmF&tid=ws&id=17&p=0
|
||||
ERR 天津卫视 timeout
|
||||
OK 重庆卫视 https://p.iptv200.com/play.php?token=HMdAii2u4Q%2Fdp11PWYWmRVsK&tid=ws&id=19&p=0&type=.flv
|
||||
OK 贵州卫视 https://p.iptv200.com/play.php?token=l7BNe48fC31%2BgvKaC5pVZPGt&tid=ws&id=20&p=0
|
||||
OK 吉林卫视 https://p.iptv200.com/play.php?token=ke%2F%2FSik%2B%2FT31Mt%2FBeJ4Dq3Xq&tid=ws&id=21&p=0
|
||||
OK 广西卫视 https://p.iptv200.com/play.php?token=Sle4OoFPVWqN3n6QMfoxaoSv&tid=ws&id=22&p=0
|
||||
OK 河南卫视 https://p.iptv200.com/play.php?token=NWvj2AdEAPb7r6GeBUpiW5l5&tid=ws&id=23&p=0
|
||||
ERR 甘肃卫视 timeout
|
||||
OK 青海卫视 https://p.iptv200.com/play.php?token=vdDSebq0sKhbTEfc9rgs4KU5&tid=ws&id=25&p=0
|
||||
OK 云南卫视 https://p.iptv200.com/play.php?token=TFOjRkd2kDtrH1kA4KBGzgZV&tid=ws&id=26&p=0
|
||||
OK 内蒙古卫视 https://p.iptv200.com/play.php?token=NX%2BDJcAWE3kDcuJ%2FpQankKGx&tid=ws&id=27&p=0
|
||||
OK 山西卫视 https://p.iptv200.com/play.php?token=jNc0Pd7dM4W3d5cUMNUlfOLM&tid=ws&id=28&p=0
|
||||
OK 陕西卫视 https://p.iptv200.com/play.php?token=IJafQ1bx1%2B8PgHKpSkVxp4WJ&tid=ws&id=29&p=0
|
||||
ERR 兵团卫视 timeout
|
||||
OK 新疆卫视 https://p.iptv200.com/play.php?token=tjTBEXsEcjpZWz77aYmBIdwo&tid=ws&id=31&p=0
|
||||
OK 西藏卫视 https://p.iptv200.com/play.php?token=NuE19Kq6rYusP7niRnqo6rt5&tid=ws&id=32&p=0
|
||||
OK 宁夏卫视 https://p.iptv200.com/play.php?token=mGoxkP9M1%2FG0iuyzVVlxBylg&tid=ws&id=33&p=0
|
||||
OK 延边卫视 https://p.iptv200.com/play.php?token=Q6J2zz5DsYfVEFuMakECdoqp&tid=ws&id=34&p=0
|
||||
OK 康巴卫视 https://p.iptv200.com/play.php?token=DCtNRsZGstT2f8nYIi5lfbhN&tid=ws&id=35&p=0
|
||||
OK 大湾区卫视 https://p.iptv200.com/play.php?token=fJyD79X%2FBEDuZgJBvNg%2BH8lF&tid=ws&id=36&p=0
|
||||
OK 广东珠江频道 https://p.iptv200.com/play.php?token=TYVpK810j1jC%2Bv0D8m%2B49XlN&tid=ws&id=37&p=0&type=.flv
|
||||
OK 厦门卫视 https://p.iptv200.com/play.php?token=ck4tVMxZoOOFlMtFU6dobYXT&tid=ws&id=38
|
||||
OK 安多卫视 https://p.iptv200.com/play.php?token=mmLH%2FDT2XaZJDaQ9y0uMTM7v&tid=ws&id=39
|
||||
OK 农林卫视 https://p.iptv200.com/play.php?token=Y9ZOh%2FldUzJw9fPhTJn%2FlISB&tid=ws&id=40
|
||||
OK 三沙卫视 https://p.iptv200.com/play.php?token=pg3cwHrhY75tmIwWu3n7ajQk&tid=ws&id=41
|
||||
OK 凤凰卫视中文台 https://p.iptv200.com/play.php?token=Nq55Qf%2BdiaBWMGNPKBS1HEFf&tid=gt&id=1&p=0&type=.flv
|
||||
OK 凤凰卫视资讯台 https://p.iptv200.com/play.php?token=SvYml3egKKYSQQYcmsFBg4Tg&tid=gt&id=2&p=0&type=.flv
|
||||
OK 凤凰卫视香港台 https://p.iptv200.com/play.php?token=n4IlUpC75P1NL57Sm0P1b4ZV&tid=gt&id=3&p=0&type=.flv
|
||||
OK TVB翡翠台 https://p.iptv200.com/play.php?token=cOpKwymv342yI1ybwOBXRY3y&tid=gt&id=5&p=0&type=.flv
|
||||
OK TVB无线新闻台 https://p.iptv200.com/play.php?token=snxXIrovLDySXKYrrmka%2FXXQ&tid=gt&id=6&p=0&type=.flv
|
||||
OK TVB Plus https://p.iptv200.com/play.php?token=kdTJAZiuZU%2BpVpRL4iNO1%2FDQ&tid=gt&id=8&p=0&type=.flv
|
||||
OK TVB明珠台 https://p.iptv200.com/play.php?token=7kbbyQFR0hlq6JyV0z%2B9b1Kv&tid=gt&id=9&p=0&type=.flv
|
||||
OK 香港有线新闻台 https://p.iptv200.com/play.php?token=tfQVuDs7qKpcSTAKedbTtkFv&tid=gt&id=11&p=0&type=.flv
|
||||
OK 香港有线18台 https://p.iptv200.com/play.php?token=0wK9NtNq10L4qSYU7ij1g2R%2B&tid=gt&id=12&p=0&type=.flv
|
||||
OK 香港有线18台(备) https://p.iptv200.com/play.php?token=QUfW5A5NLIxy1JJwtLrLZHQ%2B&tid=gt&id=13&p=0&type=.flv
|
||||
OK NOW新闻台 https://p.iptv200.com/play.php?token=khPINXLkHBgSFlYEBL0oDOxq&tid=gt&id=17&p=0&type=.flv
|
||||
OK NOW财经台 https://p.iptv200.com/play.php?token=RQLqonuyq%2FduONhocbHXH83h&tid=gt&id=18&p=0&type=.flv
|
||||
OK ViuTV https://p.iptv200.com/play.php?token=3qy19ESWD5%2BzJlfqfYpjcAyP&tid=gt&id=19&p=0&type=.flv
|
||||
OK ViuTV6 https://p.iptv200.com/play.php?token=JN4vOUotpJPsL1Roe2efSL0C&tid=gt&id=20&p=0&type=.flv
|
||||
OK HOY国际财经台 https://p.iptv200.com/play.php?token=APA69Hs9z2MPEmAUrl%2F6EseE&tid=gt&id=22&p=0&type=.flv
|
||||
OK HOY资讯台 https://p.iptv200.com/play.php?token=oQ%2FRCTEuiP2Zo%2BVhAErXsJFQ&tid=gt&id=23&p=0&type=.flv
|
||||
OK HOY TV https://p.iptv200.com/play.php?token=DJG5u%2BG9QcsypHQAMo4R4Ei3&tid=gt&id=24&p=0&type=.flv
|
||||
OK 港台电视31 https://p.iptv200.com/play.php?token=zANH4EOTsPP2KNLcJq%2B7%2Fqnt&tid=gt&id=26&p=0&type=.flv
|
||||
OK 港台电视32 https://p.iptv200.com/play.php?token=y5aTk5csotbtAO5DMmdESkcG&tid=gt&id=27&p=0&type=.flv
|
||||
OK 香港卫视HKS https://p.iptv200.com/play.php?token=cxmm0oIqhsAMCDRhQ%2F1bWytj&tid=gt&id=30&p=0
|
||||
OK 澳门莲花 https://p.iptv200.com/play.php?token=lSerZNkL0ofTtnn2kZZKRO1A&tid=gt&id=35&p=0
|
||||
OK 澳門卫视 https://p.iptv200.com/play.php?token=pfgNZwyBAiwvaYWl0jpjUbNt&tid=gt&id=36&p=0
|
||||
OK 澳视资讯 https://p.iptv200.com/play.php?token=kYOwRF6FQ54yJDy4F%2FBcfqYh&tid=gt&id=37&p=0
|
||||
OK 澳視澳門 https://p.iptv200.com/play.php?token=qwOxvBw7YTVbs%2BSpf0RO0GiX&tid=gt&id=38&p=0
|
||||
OK 澳門Macau https://p.iptv200.com/play.php?token=0tNDZ3N8cmDtUg8Bsyn%2FJYmS&tid=gt&id=39&p=0
|
||||
OK 澳视综艺 https://p.iptv200.com/play.php?token=0VmUkEBcHBPpF1TgwLjN7qK%2B&tid=gt&id=40&p=0
|
||||
OK 澳亚卫视 https://p.iptv200.com/play.php?token=zaKG7HRzLz4t67h1PjKdL2Td&tid=gt&id=41&p=0
|
||||
OK 中天新闻台 https://p.iptv200.com/play.php?token=2AtZ26BJoRQ499MOpRsi8Nj%2B&tid=gt&id=43&p=0&type=.flv
|
||||
OK 东森新闻台 https://p.iptv200.com/play.php?token=WRMZX6mWmK88Pt%2BmFDZsVoFj&tid=gt&id=44&p=0&type=.flv
|
||||
OK 东森财经新闻台 https://p.iptv200.com/play.php?token=r4T3e99i2%2F2ftKd0xxgtp29n&tid=gt&id=45&p=0&type=.flv
|
||||
OK 中视新闻台 https://p.iptv200.com/play.php?token=s2MgidwMzYhStqmyls%2F1ckrv&tid=gt&id=46&p=0&type=.flv
|
||||
OK 台视新闻台 https://p.iptv200.com/play.php?token=7BUXEkOu8l%2BzwYPI2HHAhe1n&tid=gt&id=47&p=0&type=.flv
|
||||
OK 三立新闻台 https://p.iptv200.com/play.php?token=nTdKaJNel15QoW7jMku4ykn4&tid=gt&id=48&p=0&type=.flv
|
||||
OK 非凡新闻 https://p.iptv200.com/play.php?token=PexSrjJY3yAzQqfUv1czsOE8&tid=gt&id=49&p=0&type=.flv
|
||||
OK 民视新闻台 https://p.iptv200.com/play.php?token=ybYMk0sjxtnEjXzK8UjwLxMo&tid=gt&id=50&p=0&type=.flv
|
||||
OK 华视新闻台 https://p.iptv200.com/play.php?token=6016ovhDGhuoecLjVUw%2FDZyY&tid=gt&id=51&p=0&type=.flv
|
||||
OK 镜电视新闻台 https://p.iptv200.com/play.php?token=s60yR0aYecSOVIdbBKbmObFE&tid=gt&id=52&p=0&type=.flv
|
||||
OK 寰宇新闻台 https://p.iptv200.com/play.php?token=0x9OeJxj7ari1NTcxZJMXD7N&tid=gt&id=53&p=0&type=.flv
|
||||
OK 寰宇新闻台湾台 https://p.iptv200.com/play.php?token=v9JFcX7RJCjoh2jvBHGuT7jv&tid=gt&id=54&p=0&type=.flv
|
||||
OK TVBS新闻台 https://p.iptv200.com/play.php?token=Ya0WqN3Tv7hjIBukDQnZP5FP&tid=gt&id=55&p=0&type=.flv
|
||||
OK TVBS HD https://p.iptv200.com/play.php?token=6smcgLK9hFHlBGwb852u1aPz&tid=gt&id=56&p=0&type=.flv
|
||||
OK 中视HD https://p.iptv200.com/play.php?token=haJ6qBZD4sHWBewY1aFF8cHa&tid=gt&id=60&p=0&type=.flv
|
||||
OK 台视HD https://p.iptv200.com/play.php?token=sZnzKYLfmxhBGch9pYD9is9r&tid=gt&id=61&p=0&type=.flv
|
||||
OK 民视HD https://p.iptv200.com/play.php?token=MHgdMa6OaVZhMEW0IYulmtfj&tid=gt&id=62&p=0&type=.flv
|
||||
OK 华视HD https://p.iptv200.com/play.php?token=j%2BkQRz%2Fr2eXIaE1yKYxdm%2Bg8&tid=gt&id=63&p=0&type=.flv
|
||||
OK 緯來體育台 https://p.iptv200.com/play.php?token=JELqYDHzVse3W%2BB6doN%2FsQo6&tid=gt&id=73&p=0&type=.flv
|
||||
OK 纬来日本台 https://p.iptv200.com/play.php?token=2byEB4qtSRb%2B8jK2jVx7MB6h&tid=gt&id=74&p=0&type=.flv
|
||||
OK 纬来育乐台 https://p.iptv200.com/play.php?token=cjoB6d8vHLLDPWf%2Fnbl%2FFRwN&tid=gt&id=75&p=0&type=.flv
|
||||
OK ELEVEN 1(DAZN 1) https://p.iptv200.com/play.php?token=GX5c4HF2f3mv%2BsFr69ekRUTX&tid=gt&id=76&p=0&type=.flv
|
||||
OK ELEVEN 2(DAZN 2) https://p.iptv200.com/play.php?token=acnZabzWhg43ksaLL9T4XJH0&tid=gt&id=77&p=0&type=.flv
|
||||
OK 爱尔达体育1台 https://p.iptv200.com/play.php?token=W%2FRjPt5Tb57FY0S85ayv0rJT&tid=gt&id=79&p=0&type=.flv
|
||||
OK 爱尔达体育2台 https://p.iptv200.com/play.php?token=V6eIy5KGtDe%2B5LsV64jQIFlC&tid=gt&id=80&p=0&type=.flv
|
||||
@@ -1,93 +0,0 @@
|
||||
import https from 'https';
|
||||
import http from 'http';
|
||||
import { URL } from 'url';
|
||||
const UA = 'Mozilla/5.0 (Linux; Android 12; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36';
|
||||
function fetch(url) {
|
||||
return new Promise((res, rej) => {
|
||||
const h = url.startsWith('https') ? https : http;
|
||||
const req = h.get(url, { headers: { 'User-Agent': UA } }, r => {
|
||||
let d = '';
|
||||
r.on('data', c => d += c);
|
||||
r.on('end', () => res(d));
|
||||
});
|
||||
req.on('error', rej);
|
||||
req.setTimeout(15000, () => { req.destroy(); rej(new Error('timeout')); });
|
||||
});
|
||||
}
|
||||
// 动态eval加密变量,再按解密函数链跑(bbot: page uses randomly-named vars each request)
|
||||
function decodePage(html) {
|
||||
// 提取 var xx=""; var yy="...拼接..."; var qq=""; var ww="..."; ouyit/token块
|
||||
const blocks = [];
|
||||
const re = /<script>([\s\S]*?)<\/script>/g;
|
||||
let m;
|
||||
while ((m = re.exec(html))) {
|
||||
const body = m[1];
|
||||
if (body.includes('.split("")') && body.includes('var')) blocks.push(body);
|
||||
if (body.includes('function ') && body.includes('keyStr') && body.includes('charCodeAt')) blocks.push(body);
|
||||
if (body.includes('wngbe') || /function \w+\(dek\)/.test(body)) blocks.push(body);
|
||||
}
|
||||
const context = {};
|
||||
const sandbox = new Function(blocks.join('\n') + `
|
||||
// 返回解密函数名 + 猜出变量名
|
||||
const fnNames = [];
|
||||
// 找形如 function XXXX(dek){...} 就把名字报出来
|
||||
const decls = [...arguments.callee ? '' : ''][0];
|
||||
return { xefgv: typeof xefgv !== 'undefined' ? xefgv : null, ouyit: typeof ouyit !== 'undefined' ? ouyit : null, qrtkk: typeof qrtkk !== 'undefined' ? qrtkk : null };
|
||||
`);
|
||||
return null;
|
||||
}
|
||||
|
||||
// 更简单:直接在Node vm里跑整段,把全部函数和变量都留在沙箱里
|
||||
import vm from 'vm';
|
||||
async function processPage(url) {
|
||||
const html = await fetch(url);
|
||||
const ctx = { window: {}, atob: null };
|
||||
const sandbox = vm.createContext({ window: {}, document: { getElementById: () => null, querySelectorAll: () => [], querySelector: () => null, addEventListener(){}, createElement() { return { setAttribute(){}, style:{} }; }, body: { appendChild(){} } }, location: { href: url }, navigator: { userAgent: UA }, setInterval: () => 0, clearInterval(){}, setTimeout: () => 0, clearTimeout(){}, fetch: () => {}, console, addEventListener(){}, $: () => ({ hide(){}, show(){}, selectmenu(){}, length:0 }), Hls: { isSupported: () => false, Events: {} }, mpegts: { isSupported: () => false, Events: {} }, devicePixelRatio: 2, innerWidth: 1280, innerHeight: 720, atob: (s) => Buffer.from(s, 'base64').toString('binary') });
|
||||
// 只跑不依赖DOM交互的脚本:解密脚本+变量, crib main script(避免动画循环定时器问题——用vm.runInContext就够了,主脚本里$()等没被调用)
|
||||
const scripts = [...html.matchAll(/<script>([\s\S]*?)<\/script>/g)].map(m => m[1]);
|
||||
for (const s of scripts) {
|
||||
try { vm.runInContext(s, sandbox, { timeout: 3000 }); } catch (e) { /* DOM依赖的忽略 */ }
|
||||
}
|
||||
// 抓options
|
||||
const opts = [...html.matchAll(/<option value="([^"]+)">([^<]+)<\/option>/g)];
|
||||
// 找到call_in_main
|
||||
const main = scripts.find(s => s.includes('startPlayer') && s.includes('(uri)'));
|
||||
const decName = (main && (main.match(/const \w+ = (\w+)\(uri\)/) || [])[1]) || (main && (main.match(/const puri ?= ?(\w+)\(/) || [])[1]);
|
||||
if (!decName) return { url, error: 'no dec fn' };
|
||||
const results = opts.map(o => {
|
||||
try { return { line: o[2], url: sandbox[decName](o[1]) }; }
|
||||
catch (e) { return { line: o[2], error: String(e).slice(0,100) }; }
|
||||
});
|
||||
return { url, title: (html.match(/<title>([^<]*)</) || [])[1], results };
|
||||
}
|
||||
|
||||
// 频道列表:从各分类页抓全部链接(data-ajax="false")
|
||||
const tids = ['tv', 'ty', 'ys', 'ws', 'gt'];
|
||||
const seen = new Map(); // link -> name(按tid顺序去重)
|
||||
for (const tid of tids) {
|
||||
try {
|
||||
const page = await fetch('https://m.iptv807.com/?tid=' + tid);
|
||||
for (const m of page.matchAll(/<a href="(\?act=play[^"]*)"[^>]*>([^<]+)<\/a>/g)) {
|
||||
const link = 'https://m.iptv807.com/' + m[1];
|
||||
if (!seen.has(link)) seen.set(link, m[2]);
|
||||
}
|
||||
} catch (e) { console.error('cat fail', tid, e.message); }
|
||||
}
|
||||
const channels = [...seen.entries()].map(([link, name]) => ({ link, name }));
|
||||
// 去掉首页广告位那条假频道
|
||||
const real = channels.filter(c => c.link.includes('&id='));
|
||||
console.error('channels found:', channels.length);
|
||||
|
||||
const out = [];
|
||||
for (const ch of real) {
|
||||
try {
|
||||
const r = await processPage(ch.link);
|
||||
out.push({ name: ch.name, url: r.url, lines: r.results?.map(l => l.url) });
|
||||
console.error('OK', ch.name, r.results?.[0]?.url || r.error);
|
||||
} catch (e) {
|
||||
out.push({ name: ch.name, error: e.message });
|
||||
console.error('ERR', ch.name, e.message);
|
||||
}
|
||||
}
|
||||
// 输出 JSON 到stdout
|
||||
console.log(JSON.stringify(out, null, 2));
|
||||
@@ -1,41 +0,0 @@
|
||||
import re
|
||||
|
||||
# Check Kotlin source resolver for same bug + apply v4-style fix:
|
||||
src_file = '/vol1/1000/HD1/APP/iptv-tv-app/app/src/main/java/com/iptv807/tv/SourceResolver.kt'
|
||||
s = open(src_file).read()
|
||||
|
||||
# 拿出当前 evalConcat 部分
|
||||
anchor = ''' if (s[i] == '"') { // 处理字符串字面量
|
||||
val close = s.indexOf('"', i + 1)
|
||||
if (close < 0) break
|
||||
val lit = s.substring(i + 1, close)
|
||||
val tail = s.substring((close + 1).coerceAtMost(s.length))
|
||||
val isRev = tail.startsWith(".split(\\"\\").reverse().join(\\"\\")")
|
||||
sb.append(if (isRev) lit.reversed() else lit)
|
||||
i = if (isRev) close + 1 + ".split(\\"\\").reverse().join(\\"\\")".length else close + 1
|
||||
} else i++
|
||||
}'''
|
||||
|
||||
new = ''' if (s[i] == '"') {
|
||||
var j = i + 1; var lit = ""
|
||||
while (j < s.length && s[j] != '"') { lit += s[j]; j++ }
|
||||
if (j >= s.length) {
|
||||
sb.append(lit)
|
||||
i = s.length
|
||||
} else {
|
||||
val REV = ".split(\\"\\").reverse().join(\\"\\")"
|
||||
val tail = s.substring((j+1).coerceAtMost(s.length))
|
||||
if (tail.startsWith(REV)) {
|
||||
sb.append(lit.reversed())
|
||||
i = j + 1 + REV.length
|
||||
} else {
|
||||
sb.append(lit)
|
||||
i = j + 1
|
||||
}
|
||||
while (i < s.length && (s[i] == '+' || s[i] == ' ')) i++
|
||||
}
|
||||
} else i++'''
|
||||
assert anchor in s, 'anchor missing'
|
||||
s = s.replace(anchor, new, 1)
|
||||
open(src_file, 'w').write(s)
|
||||
print('kotlin eval fixed')
|
||||
@@ -1,59 +0,0 @@
|
||||
# 修 Kotlin evalConcat — 用 Python 里的 v4 版本的精确 Kotlin 翻译替换
|
||||
src_file = '/vol1/1000/HD1/APP/iptv-tv-app/app/src/main/java/com/iptv807/tv/SourceResolver.kt'
|
||||
s = open(src_file).read()
|
||||
|
||||
old_fn = ''' fun evalConcat(s: String): String = StringBuilder().also { sb ->
|
||||
var i = 0
|
||||
while (i < s.length) {
|
||||
if (s[i] == '"') { // 处理字符串字面量
|
||||
val close = s.indexOf('"', i + 1)
|
||||
if (close < 0) break
|
||||
val lit = s.substring(i + 1, close)
|
||||
val tail = s.substring((close + 1).coerceAtMost(s.length))
|
||||
val isRev = tail.startsWith(".split(\\\\"\\\\").reverse().join(\\\\"\\\\")")
|
||||
sb.append(if (isRev) lit.reversed() else lit)
|
||||
i = if (isRev) close + 1 + ".split(\\\\"\\\\").reverse().join(\\\\"\\\\")".length else close + 1
|
||||
} else i++
|
||||
}
|
||||
}.toString()'''
|
||||
|
||||
new_fn = ''' fun evalConcat(s: String): String = StringBuilder().also { sb ->
|
||||
val REV = ".split(\\\\"\\\\").reverse().join(\\\\"\\\\")"
|
||||
var i = 0
|
||||
while (i < s.length) {
|
||||
if (s[i] == '"') {
|
||||
var j = i + 1
|
||||
var lit = ""
|
||||
while (j < s.length && s[j] != '"') { lit += s[j]; j++ }
|
||||
if (j >= s.length) {
|
||||
sb.append(lit)
|
||||
i = s.length
|
||||
} else {
|
||||
val tail = s.substring((j + 1).coerceAtMost(s.length))
|
||||
if (tail.startsWith(REV)) {
|
||||
sb.append(lit.reversed())
|
||||
i = j + 1 + REV.length
|
||||
} else {
|
||||
sb.append(lit)
|
||||
i = j + 1
|
||||
}
|
||||
while (i < s.length && (s[i] == '+' || s[i] == ' ')) i++
|
||||
}
|
||||
} else i++
|
||||
}
|
||||
}.toString()'''
|
||||
|
||||
if old_fn in s:
|
||||
s = s.replace(old_fn, new_fn, 1)
|
||||
open(src_file, 'w').write(s)
|
||||
print('REPLACED OK')
|
||||
else:
|
||||
print('old_fn NOT FOUND, doing alternative approach')
|
||||
# Fallback: locate the evalConcat definition and replace all lines
|
||||
import re
|
||||
m = re.search(r'fun evalConcat\(s: String\): String = StringBuilder\(\)\.also \{ sb ->[\s\S]*?\}\.toString\(\)', s)
|
||||
if m:
|
||||
print('found block len:', len(m.group(0)))
|
||||
s = s.replace(m.group(0), new_fn.strip(' '))
|
||||
open(src_file, 'w').write(s)
|
||||
print('REPLACED via regex')
|
||||
@@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""补丁v2: my previous patch added a stray '}\n\n} else {' —— 移除多余的 '}'"""
|
||||
import sys
|
||||
P = sys.argv[1]
|
||||
src = open(P).read()
|
||||
bad = """ }
|
||||
}
|
||||
|
||||
} else {"""
|
||||
good = """ }
|
||||
} else {"""
|
||||
assert bad in src, 'stray not found'
|
||||
src = src.replace(bad, good, 1)
|
||||
open(P, 'w').write(src)
|
||||
print('FIXED')
|
||||
@@ -1,9 +0,0 @@
|
||||
# 修正 Kotlin 字符串引号转义 (REV 应该是 ".split(\"\").reverse().join(\"\")")
|
||||
src_file = '/vol1/1000/HD1/APP/iptv-tv-app/app/src/main/java/com/iptv807/tv/SourceResolver.kt'
|
||||
s = open(src_file).read()
|
||||
|
||||
wrong = 'val REV = ".split(\\\\"\\\\").reverse().join(\\\\"\\\\")"'
|
||||
right = 'val REV = ".split(\\"\\").reverse().join(\\"\\")"'
|
||||
s = s.replace(wrong, right)
|
||||
open(src_file, 'w').write(s)
|
||||
print('fixed REV string literal')
|
||||
@@ -1,61 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""CardAuth processOrderPaid 补丁:无bot_qq订单 → 自动发卡并绑定机器码"""
|
||||
import sys
|
||||
|
||||
P = sys.argv[1] if len(sys.argv) > 1 else 'OrderController.php'
|
||||
src = open(P).read()
|
||||
|
||||
anchor = """ // 更新订单状态
|
||||
$db->execute(
|
||||
"UPDATE {$db->table('orders')} SET status = 'paid', paid_at = NOW() WHERE id = ?",
|
||||
[$orderId]
|
||||
);"""
|
||||
|
||||
assert anchor in src, "anchor NOT FOUND"
|
||||
|
||||
patch = """ } else {
|
||||
// ===== 无 bot_qq 订单:自动发卡并绑定机器码(IPTV App 直购闭环)=====
|
||||
// contact_info 约定格式: "MACHINE:TV-XXXX" (App下单时带上电视机器码)
|
||||
$machineId = '';
|
||||
if (preg_match('/MACHINE:([A-Za-z0-9\\-_]+)/', $order['contact_info'] ?? '', $mm)) {
|
||||
$machineId = $mm[1];
|
||||
}
|
||||
// 从同项目同卡类型的未用卡池取一张
|
||||
$card = $db->fetch(
|
||||
"SELECT * FROM {$db->table('cards')} WHERE project_id = ? AND card_type_id = ? AND status = 'unused' ORDER BY id ASC LIMIT 1",
|
||||
[$order['project_id'], $order['card_type_id']]
|
||||
);
|
||||
if ($card) {
|
||||
$expireTime = null;
|
||||
if ($durationDays > 0) {
|
||||
$expireTime = date('Y-m-d H:i:s', strtotime("+{$durationDays} days"));
|
||||
}
|
||||
$bindInfo = json_encode([
|
||||
'machine_id' => $machineId ?: 'AUTO-' . $order['order_no'],
|
||||
'ip' => '',
|
||||
'device_info' => 'auto-delivery',
|
||||
'first_bind_at' => date('Y-m-d H:i:s'),
|
||||
'order_no' => $order['order_no'],
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
$db->execute(
|
||||
"UPDATE {$db->table('cards')} SET status = 'used', bind_info = ?, bound_at = NOW(), expire_time = ? WHERE id = ?",
|
||||
[$bindInfo, $expireTime, $card['id']]
|
||||
);
|
||||
// 订单关联该卡,查询接口可显示
|
||||
$db->execute(
|
||||
"UPDATE {$db->table('orders')} SET card_id = ? WHERE id = ?",
|
||||
[$card['id'], $orderId]
|
||||
);
|
||||
}
|
||||
// 无未用卡池时订单仍标 paid(余卡告警交给管理端)
|
||||
}
|
||||
|
||||
// 更新订单状态
|
||||
$db->execute(
|
||||
"UPDATE {$db->table('orders')} SET status = 'paid', paid_at = NOW() WHERE id = ?",
|
||||
[$orderId]
|
||||
);"""
|
||||
|
||||
src = src.replace(anchor, patch, 1)
|
||||
open(P, 'w').write(src)
|
||||
print("PATCHED OK")
|
||||
@@ -1,44 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split("")' in b)
|
||||
|
||||
def eval_concat(expr):
|
||||
out = []; i = 0; REV = '.split("").reverse().join("")'
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
close = expr.find('"', i + 1)
|
||||
if close < 0: break
|
||||
lit = expr[i+1:close]
|
||||
is_rev = expr[close+1:close+1+len(REV)+3] .startswith(REV)
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i = close + 1 + (len(REV) if is_rev else 0)
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
# 保护引号、按分号拆
|
||||
stmts = re.split(r';(?=(?:[^"]*"[^"]*")*[^"]*$)', mix)
|
||||
stmts = [s.strip() for s in stmts if s.strip()]
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"([^"]*)"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = ''
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print("UNMATCHED:", stmt[:80])
|
||||
|
||||
print('assign:', assign)
|
||||
@@ -1,68 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split("")' in b)
|
||||
|
||||
def eval_concat(expr):
|
||||
out = []; i = 0; REV = '.split("").reverse().join("")'
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
close = expr.find('"', i + 1)
|
||||
if close < 0: break
|
||||
lit = expr[i+1:close]
|
||||
is_rev = expr[close+1:close+1+len(REV)+3].startswith(REV)
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i = close + 1 + (len(REV) if is_rev else 0)
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
stmts = [s.strip() for s in re.split(r';(?=(?:[^"]*"[^"]*")*[^"]*$)', mix) if s.strip()]
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
if stmt.startswith('var ') and '"' in stmt:
|
||||
# greedy: parse literally from first to last quoted segment
|
||||
m2 = re.match(r'^var\s+(\w+)\s*=\s*(.*)$', stmt)
|
||||
if m2:
|
||||
name = m2.group(1)
|
||||
expr = m2.group(2).strip()
|
||||
# 找末尾最后一个引号前的内容
|
||||
if expr.count('"') >= 2:
|
||||
# last "的位置
|
||||
last = expr.rfind('"')
|
||||
expr2 = expr[:last + 1]
|
||||
assign[name] = eval_concat(expr2)
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print('UNMATCHED:', stmt[:60])
|
||||
|
||||
print('assign:', {k: (v[:35]+'..' if len(v) > 35 else v) for k, v in assign.items()})
|
||||
|
||||
vals = list(assign.values())
|
||||
xKey = next(v for v in vals if v and not re.match(r'^[a-f0-9]{32}$', v) and v != '')
|
||||
newTok = next(v for v in vals[::-1] if v and not re.match(r'^[a-f0-9]{32}$', v) and v != xKey)
|
||||
oldToken = next(v for v in vals if v and re.match(r'^[a-f0-9]{32}$', v))
|
||||
xorConst = re.search(r'"([a-f0-9]{16})"', mix).group(1)
|
||||
print(f'xKey: {xKey!r}\nnewTok: {newTok!r}\nold: {oldToken[:8]}..\nconst: {xorConst}')
|
||||
|
||||
def b64str(s): return base64.b64decode(s.encode()).decode('latin1')
|
||||
def decrypt(enc):
|
||||
b1 = b64str(enc[::-1])
|
||||
key = xKey + xorConst
|
||||
xored = ''.join(chr((ord(b1[i]) ^ ord(key[i % len(key)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64str(xored)
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newTok).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"', html)
|
||||
print('line1:', decrypt(opts[0])[:120])
|
||||
@@ -1,77 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split("")' in b)
|
||||
|
||||
def eval_concat(expr):
|
||||
out = []; i = 0; REV = '.split("").reverse().join("")'
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
close = expr.find('"', i + 1)
|
||||
if close < 0: break
|
||||
lit = expr[i+1:close]
|
||||
is_rev = expr[close+1:close+1+len(REV)+3].startswith(REV)
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i = close + 1 + (len(REV) if is_rev else 0)
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
# 手写分号分割(考虑引号)
|
||||
stmts = []
|
||||
buf = ''
|
||||
in_str = False
|
||||
for ch in mix:
|
||||
if ch == '"':
|
||||
in_str = not in_str
|
||||
if ch == ';' and not in_str:
|
||||
stmts.append(buf.strip()); buf = ''
|
||||
else:
|
||||
buf += ch
|
||||
if buf.strip():
|
||||
stmts.append(buf.strip())
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)$', stmt) # 末尾可能无close quote
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = ''
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print('UNMATCHED:', stmt[:60])
|
||||
|
||||
print('assign:', {k: (v[:40] + '..' if len(v) > 40 else v) for k, v in assign.items()})
|
||||
|
||||
xKey = assign.get('fkeco') or ''
|
||||
newTok = assign.get('uncmd') or ''
|
||||
oldToken = next((v for v in assign.values() if re.match(r'^[a-f0-9]{32}$', v)), '')
|
||||
xorConst = re.search(r'"([a-f0-9]{16})"', mix).group(1)
|
||||
|
||||
def b64str(s):
|
||||
return base64.b64decode(s.encode()).decode('latin1')
|
||||
|
||||
def decrypt(enc):
|
||||
b1 = b64str(enc[::-1])
|
||||
key = xKey + xorConst
|
||||
xored = ''.join(chr((ord(b1[i]) ^ ord(key[i % len(key)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64str(xored)
|
||||
# token替换 + 去掉key字符串
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newTok).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"', html)
|
||||
print('line1:', decrypt(opts[0])[:130])
|
||||
@@ -1,49 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split' in b)
|
||||
|
||||
# 1) 直接 per-语句 regex
|
||||
stmts = [s.strip() for s in re.split(r';(?=(?:"[^"]*"\s*)*[^"]*$)', mix)]
|
||||
|
||||
def eval_concat(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
out = []; i = 0
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
close = expr.find('"', i + 1)
|
||||
if close < 0: break
|
||||
lit = expr[i+1:close]
|
||||
is_rev = expr[close+1:close+1+len(REV)].startswith(REV)
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i = close + 1 + (len(REV) if is_rev else 0)
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
if not stmt: continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"', stmt) # no trailing $
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = ''
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print('UNMATCHED:', stmt[:50])
|
||||
|
||||
print('assign:', {k: (v[:35]+'..' if len(v) > 35 else v) for k, v in assign.items()})
|
||||
@@ -1,82 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split' in b)
|
||||
|
||||
stmts = []
|
||||
buf = ''; inside = False
|
||||
for ch in mix:
|
||||
if ch == '"':
|
||||
inside = not inside
|
||||
buf += ch
|
||||
continue
|
||||
if ch == ';' and not inside:
|
||||
stmts.append(buf.strip())
|
||||
buf = ''
|
||||
continue
|
||||
buf += ch
|
||||
if buf.strip():
|
||||
stmts.append(buf.strip())
|
||||
|
||||
def eval_concat(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
out = []; i = 0
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
close = expr.find('"', i + 1)
|
||||
if close < 0: break
|
||||
lit = expr[i+1:close]
|
||||
is_rev = expr[close+1:close+1+len(REV)].startswith(REV)
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i = close + 1 + (len(REV) if is_rev else 0)
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"', stmt) # no $ : allow trailing join("") suffix
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2))
|
||||
continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = ''
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print('UNMATCHED:', stmt[:60])
|
||||
|
||||
print('assign:', {k: (v[:35] + '..' if len(v) > 35 else v) for k, v in assign.items()})
|
||||
|
||||
vals = [v for v in assign.values() if v]
|
||||
xKey = next(v for v in vals if not re.match(r'^[a-f0-9]{32}$', v) and not v.startswith('%'))
|
||||
# newTok: also starts with % (encoded) — find it
|
||||
newTok = next(v for v in vals if v.startswith('%'))
|
||||
oldToken = next(v for v in vals if re.match(r'^[a-f0-9]{32}$', v))
|
||||
xorConst = re.search(r'"([a-f0-9]{16})"', mix).group(1)
|
||||
print(f'xKey={xKey}\nnewTok={newTok}\nold={oldToken[:10]}..\nconst={xorConst}')
|
||||
|
||||
def b64str(s):
|
||||
return base64.b64decode(s.encode()).decode('latin1')
|
||||
|
||||
def decrypt(enc):
|
||||
b1 = b64str(enc[::-1])
|
||||
key = xKey + xorConst
|
||||
x = ''.join(chr((ord(b1[i]) ^ ord(key[i % len(key)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64str(x)
|
||||
# NOTE: 服务端只做 token=old→token=new 的字符串替换和 xKey "???"拼接剥离
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newTok).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"', html)
|
||||
print('line1:', decrypt(opts[0])[:130])
|
||||
@@ -1,88 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split' in b)
|
||||
|
||||
stmts = []
|
||||
buf = ''; inside = False
|
||||
for ch in mix:
|
||||
if ch == '"':
|
||||
inside = not inside
|
||||
buf += ch
|
||||
continue
|
||||
if ch == ';' and not inside:
|
||||
stmts.append(buf.strip())
|
||||
buf = ''
|
||||
continue
|
||||
buf += ch
|
||||
if buf.strip():
|
||||
stmts.append(buf.strip())
|
||||
|
||||
def eval_concat(expr):
|
||||
# 关键:" 拆开 — expr begins WITHOUT leading quote (它已在var assignment里被消费)
|
||||
# expr: b8"+"fb"+"f".split("").reverse().join("")+"c29e"...
|
||||
# 用 " 切:多段:['b8', '+', 'fb', '+', 'f', '.split(。'...]
|
||||
# 期望JS语义: "b8" + "fb" + "f".split("").reverse().join("") + "c29e"...
|
||||
# b8 (normal), fb (normal), f (rev单字不变), c29e... (逐段 'rev'取决于 q[i+1] 之后是否跟着 REV)
|
||||
# 重新实现:每次 分割 " 按 char,两个引号一组 literal; quote 组之间字符 `+` 连接;
|
||||
REV = '.split("").reverse().join("")'
|
||||
parts = expr.split('"')
|
||||
# parts结构: [pre, lit1, sep1, lit2, sep2, ...]
|
||||
# sep里如果以 ' + .split' 开头等 (REV后跟随的+), 判断 REV 属于前面那次
|
||||
result = []
|
||||
i = 1 # parts[0]是空的或非literal常数
|
||||
while i < len(parts):
|
||||
lit = parts[i]
|
||||
sep = parts[i+1] if i + 1 < len(parts) else ''
|
||||
if sep.startswith('+ .split') or sep.startswith('+.split'):
|
||||
result.append(lit)
|
||||
else: result.append(lit) # simplify: all normal
|
||||
i += 2
|
||||
# 但rev:
|
||||
return ''.join(result)
|
||||
|
||||
# simpler and correct: tokenize quotes pairs with ownership of next chars
|
||||
def eval_v2(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
# find quotes pairing; check if literal is followed by REV
|
||||
result = []
|
||||
idx = 0
|
||||
while True:
|
||||
q1 = expr.find('"', idx)
|
||||
if q1 < 0: break
|
||||
q2 = expr.find('"', q1 + 1)
|
||||
if q2 < 0: break
|
||||
lit = expr[q1+1:q2]
|
||||
is_rev = expr[q2+1:q2+1+len(REV)] == REV
|
||||
result.append(lit[::-1] if is_rev else lit)
|
||||
idx = q2 + 1 + (len(REV) if is_rev else 0)
|
||||
# skip + 连接符
|
||||
while idx < len(expr) and expr[idx] in ' +.snp':
|
||||
idx += 1
|
||||
return ''.join(result)
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*(.*)$', stmt)
|
||||
if m:
|
||||
name = m.group(1); expr = m.group(2).strip()
|
||||
if not expr or not expr.startswith('"'):
|
||||
if expr == '':
|
||||
assign[name] = ''
|
||||
continue
|
||||
m2 = re.match(r'^"([a-f0-9]{32})"$', expr)
|
||||
if m2:
|
||||
assign[name] = m2.group(1)
|
||||
continue
|
||||
continue
|
||||
# 从expr中来(uns greedy)
|
||||
if expr.startswith('"'):
|
||||
# 内部从头到尾 pair
|
||||
assign[name] = eval_v2(expr[1:]) # strip leading "
|
||||
continue
|
||||
# 无开头引号? fallback to 正常
|
||||
assign[name] = expr
|
||||
continue
|
||||
print('un:', stmt[:40])
|
||||
|
||||
print('assign:', {k: (v[:25]+'..' if len(v) > 25 else v) for k, v in assign.items()})
|
||||
@@ -1,84 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split' in b)
|
||||
|
||||
stmts = []
|
||||
buf = ''; inside = False
|
||||
for ch in mix:
|
||||
if ch == '"':
|
||||
inside = not inside
|
||||
buf += ch
|
||||
continue
|
||||
if ch == ';' and not inside:
|
||||
stmts.append(buf.strip())
|
||||
buf = ''
|
||||
continue
|
||||
buf += ch
|
||||
if buf.strip():
|
||||
stmts.append(buf.strip())
|
||||
|
||||
def eval_v2(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
result = []; idx = 0
|
||||
while True:
|
||||
q1 = expr.find('"', idx)
|
||||
if q1 < 0: break
|
||||
q2 = expr.find('"', q1 + 1)
|
||||
if q2 < 0: break
|
||||
lit = expr[q1+1:q2]
|
||||
is_rev = expr[q2+1:q2+1+len(REV)] == REV
|
||||
result.append(lit[::-1] if is_rev else lit)
|
||||
idx = q2 + 1 + (len(REV) if is_rev else 0)
|
||||
while idx < len(expr) and expr[idx] in ' +.srne(--,)':
|
||||
idx += 1
|
||||
return ''.join(result)
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*("(?:[^"]*)".*)?$', stmt)
|
||||
if m:
|
||||
name = m.group(1); expr = (m.group(2) or '').strip()
|
||||
if not expr:
|
||||
assign[name] = ''; continue
|
||||
if expr.startswith('"'):
|
||||
assign[name] = eval_v2(expr)
|
||||
continue
|
||||
# 字面量 var xx = "32hex"
|
||||
m2 = re.match(r'^"([a-f0-9]{32})"$', expr)
|
||||
if m2:
|
||||
assign[name] = m2.group(1); continue
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print('UNMATCHED:', stmt[:60])
|
||||
|
||||
print('assign:', {k: (v[:30] + '..' if len(v) > 30 else v) for k, v in assign.items()})
|
||||
|
||||
vals = [v for v in assign.values() if v]
|
||||
xKey = next((v for v in vals if not re.match(r'^[a-f0-9]{32}$', v) and not v.startswith('%')), '')
|
||||
newTok = next((v for v in vals if v.startswith('%')), '')
|
||||
oldToken = next((v for v in vals if re.match(r'^[a-f0-9]{32}$', v)), '')
|
||||
xorConst = re.search(r'"([a-f0-9]{16})"', mix).group(1)
|
||||
print(f'xKey={xKey}\nnewTok={newTok}\nold={oldToken[:10]}.. const={xorConst}')
|
||||
|
||||
def b64str(s):
|
||||
return base64.b64decode(s.encode()).decode('latin1')
|
||||
|
||||
def decrypt(enc):
|
||||
b1 = b64str(enc[::-1])
|
||||
key = xKey + xorConst
|
||||
x = ''.join(chr((ord(b1[i]) ^ ord(key[i % len(key)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64str(x)
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newTok).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"', html)
|
||||
if opts:
|
||||
print('line1:', decrypt(opts[0])[:130])
|
||||
print('line2:', decrypt(opts[1])[:130])
|
||||
@@ -1,96 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/fresh2.html', encoding='utf8', errors='ignore').read()
|
||||
blocks = re.findall(r'<script>([\s\S]*?)</script>', html)
|
||||
mix = next(b for b in blocks if '.split' in b)
|
||||
|
||||
stmts = []
|
||||
buf = ''; inside = False
|
||||
for ch in mix:
|
||||
if ch == '"':
|
||||
inside = not inside
|
||||
buf += ch
|
||||
continue
|
||||
if ch == ';' and not inside:
|
||||
stmts.append(buf.strip())
|
||||
buf = ''
|
||||
continue
|
||||
buf += ch
|
||||
if buf.strip():
|
||||
stmts.append(buf.strip())
|
||||
|
||||
def eval_v2(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
result = []; idx = 0
|
||||
while True:
|
||||
q1 = expr.find('"', idx)
|
||||
if q1 < 0: break
|
||||
q2 = expr.find('"', q1 + 1)
|
||||
if q2 < 0: break
|
||||
lit = expr[q1+1:q2]
|
||||
is_rev = expr[q2+1:q2+1+len(REV)] == REV
|
||||
result.append(lit[::-1] if is_rev else lit)
|
||||
idx = q2 + 1 + (len(REV) if is_rev else 0)
|
||||
while idx < len(expr) and expr[idx] in ' +.srne(-,)':
|
||||
idx += 1
|
||||
return ''.join(result)
|
||||
|
||||
assign = {}
|
||||
for stmt in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*("(?:[^"]*)".*)?$', stmt)
|
||||
if m:
|
||||
name = m.group(1); expr = (m.group(2) or '').strip()
|
||||
if not expr: assign[name] = ''; continue
|
||||
if expr.startswith('"'):
|
||||
assign[name] = eval_v2(expr)
|
||||
continue
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
|
||||
# 变量含义:
|
||||
# xKey = urdlw后的 assign值 (fkeco) — 32 hex-lookin b8fbfe...? 不,b8fbfe...是 xKey? 长度34?看长度
|
||||
candidate_vals = {k: v for k, v in assign.items() if v}
|
||||
for k, v in candidate_vals.items():
|
||||
print(f'{k} len={len(v)}: {v[:40]}')
|
||||
|
||||
# xKey 从源代码里看是 KEY; 它有 literal "b8fbfe92cc44e64533fcf75e8010097e" — hmm长度=36? page的 fbjao21拼接变32位hex
|
||||
# but svg based on原始 code:
|
||||
# var xefgv = ""; var fbjao = "..拼接.."; xefgv = fbjao; (xKey)
|
||||
# var qrtkk = ""; var lnzyw = "..拼接.."; qrtkk = lnzyw; (newToken)
|
||||
# ouyit = "32hex" (oldToken)
|
||||
# 所以 xKey / newTok 都是 mixed literals (not hex32)
|
||||
# BUT实际assign里 fkeco='b8fbfe92cc44e64533fcf75e801009..'是一个32hex串! 那 xKey 也是hex32? — 注意newTok(last)='%' URL-encode形式。
|
||||
# 因此爷就取:
|
||||
xKey = next(v for v in assign.values() if v and re.match(r'^[a-f0-9]{32}$', v) and v != next(u for u in assign.values() if re.match(r'^[a-f0-9]{32}$', u)))
|
||||
|
||||
# Hmm confusing; more precisely:
|
||||
vals = list(assign.values())
|
||||
hex32s = [v for v in vals if re.match(r'^[a-f0-9]{32}$', v)]
|
||||
print('hex32s:', hex32s)
|
||||
# 常识:b8fbfe.. 是 xKey (from urdlw eval), old token '1c2e5965...' another hex32
|
||||
# New token = uncmd starting '%'
|
||||
newTok = next((v for v in vals if v.startswith('%')), '')
|
||||
oldToken = next((v for v in hex32s if v != 'b8fbfe92cc44e64533fcf75e8010097e'), '')
|
||||
xKey = 'b8fbfe92cc44e64533fcf75e8010097e' # hardcoded from first
|
||||
xorConst = re.findall(r'"([a-f0-9]{16})"', html)[0]
|
||||
print(f'xKey={xKey}\nnewTok={newTok}\nold={oldToken}\nconst={xorConst}')
|
||||
|
||||
def b64str(s): return base64.b64decode(s.encode()).decode('latin1')
|
||||
def decrypt(enc):
|
||||
b1 = b64str(enc[::-1])
|
||||
key = xKey + xorConst
|
||||
x = ''.join(chr((ord(b1[i]) ^ ord(key[i % len(key)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64str(x)
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newTok).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"', html)
|
||||
if opts:
|
||||
print('L1:', decrypt(opts[0])[:130])
|
||||
print('L2:', decrypt(opts[1])[:130])
|
||||
@@ -1,72 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/a1.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split("")' in b)
|
||||
stmts = [s.strip() for s in mix.split(';') if s.strip()]
|
||||
|
||||
REV = '.split("").reverse().join("")'
|
||||
def ev(expr):
|
||||
out = []; i = 0
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
j = i + 1; lit = ''
|
||||
while j < len(expr) and expr[j] != '"':
|
||||
lit += expr[j]; j += 1
|
||||
if j >= len(expr):
|
||||
out.append(lit); break
|
||||
rest = expr[j+1:j+1+50]
|
||||
if rest.startswith(REV):
|
||||
out.append(lit[::-1]); i = j + 1 + len(REV)
|
||||
else:
|
||||
out.append(lit); i = j + 1
|
||||
while i < len(expr) and expr[i] in '+ ':
|
||||
i += 1
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
assign = {}
|
||||
for st in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*$', st)
|
||||
if m: assign[m.group(1)] = ''; continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = ev(m.group(2)); continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"', st) # no closing
|
||||
if m:
|
||||
assign[m.group(1)] = ev(m.group(2)); continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), ''); continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2); continue
|
||||
print('unmet:', st[:50])
|
||||
|
||||
print('assign:', {k: (v[:20]+'..' if len(v) > 20 else v) for k, v in assign.items()})
|
||||
|
||||
# 按 JS 语言语义变量:
|
||||
# xKey = cdgsc (=jvfon_eval)
|
||||
# oldToken= jbdjv (裸 32hex)
|
||||
# newToken= xptcr (=xcyvc_eval)
|
||||
vals = [v for v in assign.values() if v]
|
||||
hex32 = [v for v in vals if re.match(r'^[a-f0-9]{32}$', v)]
|
||||
xKey = next(v for v in vals if re.match(r'^[a-f0-9]{32}$', v) and not v.startswith('%'))
|
||||
# 修复: xKey应该是 jvfon_eval (32hex) — 从var(以 "(.*)" 成)来的
|
||||
# oldToken = jbdjv bare(32hex) — 第二个 hex32
|
||||
oldToken = next((h for h in hex32 if h != xKey), hex32[0])
|
||||
newToken = next((v for v in vals if re.search(r'%[0-9A-Fa-f]{2}', v) and not re.match(r'^[a-f0-9]{32}$', v) and not re.match(r'^[a-f0-9]{16}$', v)), '')
|
||||
print(f'xKey={xKey[:24]}...\noldTok={oldToken[:24]}...\nnewTok={newToken[:24]}...\nconst={re.findall(chr(34)+"([a-f0-9]{16})"+chr(34), html)[0]}')
|
||||
xorConst = re.findall(r'"([a-f0-9]{16})"', html)[0]
|
||||
|
||||
def b64(s): return base64.b64decode(s.encode()).decode('latin1')
|
||||
def dec(e):
|
||||
b1 = b64(e[::-1])
|
||||
k = xKey + xorConst
|
||||
x = ''.join(chr((ord(b1[i]) ^ ord(k[i % len(k)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64(x)
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newToken).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"[^>]*>', html)
|
||||
print('L1:', dec(opts[0])[:135])
|
||||
print('L2:', dec(opts[1])[:135])
|
||||
@@ -1,61 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/android_proxy.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split("")' in b)
|
||||
|
||||
def eval_frags(expr):
|
||||
REVr = '.split("").reverse().join("")'
|
||||
out = []; i = 0
|
||||
while i < len(expr):
|
||||
m = re.match(r'"([^"]*)"(\.split\(""\)\.reverse\(\)\.join\(""\))?', expr[i:])
|
||||
if m:
|
||||
lit = m.group(1)
|
||||
is_rev = m.group(2) is not None
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i += m.end()
|
||||
while i < len(expr) and expr[i] in ' +':
|
||||
i += 1
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
# 真实数据验证:
|
||||
assign = {}
|
||||
for st in [s.strip() for s in mix.split(';') if s.strip()]:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*(.*)$', st)
|
||||
if not m:
|
||||
m = re.match(r'^(\w+)\s*=\s*(.*)$', st)
|
||||
if m:
|
||||
name = m.group(1); rhs = m.group(2).strip().rstrip(')').strip()
|
||||
if rhs in assign: assign[name] = assign[rhs]
|
||||
continue
|
||||
else:
|
||||
name = m.group(1); rhs = m.group(2).strip().rstrip(')').strip()
|
||||
if not rhs: assign[name] = ''; continue
|
||||
eval_body = rhs
|
||||
if eval_body.startswith('"'): eval_body = eval_body[1:] # strip leading quote (assignment's opening)
|
||||
# 还有末尾可能结尾在 .join("") 之后的 )
|
||||
|
||||
assign[name] = eval_frags(eval_body)
|
||||
continue
|
||||
|
||||
print('assign:', {k: (v[:25]+'..' if len(v) > 25 else v) for k, v in assign.items()})
|
||||
|
||||
vals = [v for v in assign.values() if v]
|
||||
hex32 = [v for v in vals if re.match(r'^[a-f0-9]{32}$', v)]
|
||||
xKey = hex32[0]
|
||||
oldToken = next(h for h in hex32 if h != xKey)
|
||||
newToken = next(v for v in vals if re.search(r'%[0-9A-Fa-f]{2}', v) and not re.match(r'^[a-f0-9]{32}$', v) and not re.match(r'^[a-f0-9]{16}$', v) and v != xKey)
|
||||
xorConst = re.findall(r'"([a-f0-9]{16})"', html)[0]
|
||||
print(f'xKey={xKey} new={newToken[:26]} old={oldToken[:10]}.. c={xorConst}')
|
||||
|
||||
def b64(s): return base64.b64decode(s.encode()).decode('latin1')
|
||||
def dec(e):
|
||||
b1 = b64(e[::-1])
|
||||
k = xKey + xorConst
|
||||
x = ''.join(chr((ord(b1[i]) ^ ord(k[i % len(k)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64(x)
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newToken).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"[^>]*>', html)
|
||||
print('L1:', dec(opts[0])[:130])
|
||||
@@ -1,33 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""License-SaaS 客户端 API 端到端测试(HMAC-SHA256签名协议)"""
|
||||
import hmac, hashlib, json, time, uuid, urllib.request, urllib.error
|
||||
|
||||
APP_KEY = 'iptv807-tv'
|
||||
CLIENT_SECRET = '91a62f41ff09c2eed51fa571a78c69014c5f9eacbaeca56c'
|
||||
BASE = 'http://192.168.68.19:8090'
|
||||
|
||||
def signed(method, path, body=None):
|
||||
body_str = json.dumps(body or {}, ensure_ascii=False, separators=(',', ':'))
|
||||
ts = str(int(time.time()))
|
||||
nonce = uuid.uuid4().hex[:16]
|
||||
canonical = f"{method}\n{path}\n{ts}\n{nonce}\n{body_str}"
|
||||
sig = hmac.new(CLIENT_SECRET.encode(), canonical.encode(), hashlib.sha256).hexdigest()
|
||||
req = urllib.request.Request(BASE + path, data=(body_str.encode() if method == 'POST' else None), method=method)
|
||||
req.add_header('Content-Type', 'application/json')
|
||||
req.add_header('X-Timestamp', ts)
|
||||
req.add_header('X-Nonce', nonce)
|
||||
req.add_header('X-Signature', sig)
|
||||
req.add_header('X-App-Key', APP_KEY)
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=10) as r:
|
||||
return json.loads(r.read())
|
||||
except urllib.error.HTTPError as e:
|
||||
return {'http': e.code, 'body': e.read().decode()[:200]}
|
||||
|
||||
print('app-info:', signed('GET', '/api/client/app-info'))
|
||||
r = signed('POST', '/api/client/register', {'username': 'test01', 'password': 'test123456', 'cardKey': 'LS-F10E53D1-8C91BFD6-7E098CFF', 'machineCode': 'ANDROID-TV-001'})
|
||||
print('register:', r)
|
||||
r = signed('POST', '/api/client/login', {'username': 'test01', 'password': 'test123456', 'machineCode': 'ANDROID-TV-001'})
|
||||
print('login:', r)
|
||||
r = signed('POST', '/api/client/heartbeat', {'token': r.get('client_token', '')})
|
||||
print('heartbeat:', r)
|
||||
@@ -1,64 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
html = open('/tmp/now24.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split' in b)
|
||||
|
||||
stmts = []; buf=''; ins=False
|
||||
for ch in mix:
|
||||
if ch=='"':
|
||||
ins = not ins
|
||||
buf += ch
|
||||
continue
|
||||
if ch==';' and not ins:
|
||||
stmts.append(buf.strip()); buf=''
|
||||
else: buf += ch
|
||||
if buf.strip(): stmts.append(buf.strip())
|
||||
|
||||
def eval_v2(expr):
|
||||
REV='.split("").reverse().join("")'
|
||||
result=[]; idx=0
|
||||
while True:
|
||||
q1=expr.find('"', idx)
|
||||
if q1<0: break
|
||||
q2=expr.find('"', q1+1)
|
||||
if q2<0: break
|
||||
lit=expr[q1+1:q2]
|
||||
is_rev=expr[q2+1:q2+1+len(REV)]==REV
|
||||
result.append(lit[::-1] if is_rev else lit)
|
||||
idx=q2+1+(len(REV) if is_rev else 0)
|
||||
while idx<len(expr) and expr[idx] in ' +.srne(-,)':
|
||||
idx+=1
|
||||
return ''.join(result)
|
||||
|
||||
assign={}
|
||||
for stmt in stmts:
|
||||
m=re.match(r'^var\s+(\w+)\s*=\s*("(?:[^"]*)".*)?$', stmt)
|
||||
if m:
|
||||
name=m.group(1); expr=(m.group(2) or '').strip()
|
||||
if not expr: assign[name]=''; continue
|
||||
if expr.startswith('"'): assign[name]=eval_v2(expr); continue
|
||||
continue
|
||||
# 32-hex literal assignment (var or bare)
|
||||
m=re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', stmt)
|
||||
if m: assign[m.group(1)]=m.group(2); continue
|
||||
|
||||
print('assign:', {k:(v[:30] if len(v)<31 else v[:30]+'..') for k,v in assign.items()})
|
||||
|
||||
vals=[v for v in assign.values() if v]
|
||||
hex32=[v for v in vals if re.match(r'^[a-f0-9]{32}$', v)]
|
||||
xKey = hex32[0]
|
||||
oldToken = next((h for h in hex32 if h != xKey), hex32[0]) # 有些页 old==xkey?
|
||||
newToken = next((v for v in vals if v.startswith('%')), '')
|
||||
xorConst = re.findall(r'"([a-f0-9]{16})"', html)[0]
|
||||
print(f'xKey={xKey} old={oldToken} newTok={newToken} c={xorConst}')
|
||||
|
||||
def b64(s): return base64.b64decode(s.encode()).decode('latin1')
|
||||
def decrypt(enc):
|
||||
b1 = b64(enc[::-1])
|
||||
key = xKey + xorConst
|
||||
x=''.join(chr((ord(b1[i]) ^ ord(key[i%len(key)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64(x)
|
||||
return urllib.parse.unquote(b2.replace('token='+oldToken, 'token='+newToken).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"[^>]*>線路\d*', html)
|
||||
for i, o in enumerate(opts[:2]):
|
||||
print(f'L{i+1}:', decrypt(o)[:130])
|
||||
@@ -1,48 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
# 测试有 trailing join 的真实语句(android_proxy.html 实际数据):
|
||||
html = open('/tmp/android_proxy.html', encoding='utf8', errors='ignore').read()
|
||||
blocks = re.findall(r'<script>([\s\S]*?)</script>', html)
|
||||
mixBlock = next(b for b in blocks if '.split("")' in b)
|
||||
stmts = [s.strip() for s in mixBlock.split(';') if s.strip()]
|
||||
print('stmt[1] (dfuts):')
|
||||
print(repr(stmts[1]))
|
||||
print()
|
||||
|
||||
def eval_concat(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
out = []; i = 0
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
close = expr.find('"', i+1)
|
||||
if close < 0: break
|
||||
lit = expr[i+1:close]
|
||||
is_rev = expr[close+1:close+1+len(REV)] == REV
|
||||
out.append(lit[::-1] if is_rev else lit)
|
||||
i = close+1+(len(REV) if is_rev else 0)
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(out)
|
||||
|
||||
# 正确assignment解析(Python顺利):
|
||||
assign = {}
|
||||
for st in stmts:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*"(.*)"$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2)); continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*(.*)"\)$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = eval_concat(m.group(2)); continue
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*(.*)"$'.rstrip('"$')+'("\\)$)?$', st)
|
||||
if m and not m.group(0).endswith('\\') : pass
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = ''; continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), ''); continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2); continue
|
||||
|
||||
print('assign:', {k: (v[:20]+'..' if len(v) > 20 else v) for k, v in assign.items()})
|
||||
@@ -1,75 +0,0 @@
|
||||
import re, base64, urllib.parse
|
||||
|
||||
html = open('/tmp/android_proxy.html', encoding='utf8', errors='ignore').read()
|
||||
mix = next(b for b in re.findall(r'<script>([\s\S]*?)</script>', html) if '.split("")' in b)
|
||||
|
||||
# 修正版 eval:游标从 expr 起点扫描,遇 quote 开literal,遇REV tag 反转
|
||||
def eval_v3(expr):
|
||||
REV = '.split("").reverse().join("")'
|
||||
frags = []
|
||||
i = 0
|
||||
while i < len(expr):
|
||||
if expr[i] == '"':
|
||||
j = i + 1; lit = ''
|
||||
while j < len(expr) and expr[j] != '"':
|
||||
lit += expr[j]; j += 1
|
||||
if j >= len(expr):
|
||||
frags.append(lit); break # unterminated - take rest
|
||||
rest = expr[j+1:j+1+50]
|
||||
is_rev = rest.startswith(REV)
|
||||
frags.append(lit[::-1] if is_rev else lit)
|
||||
i = j + 1 + (len(REV) if is_rev else 0)
|
||||
while i < len(expr) and expr[i] == '+':
|
||||
i += 1
|
||||
else:
|
||||
i += 1
|
||||
return ''.join(frags)
|
||||
|
||||
assert eval_v3('"b8"+"fb"+"f".split("").reverse().join("")+"c29e"') == 'b8fbfe92c', "test failed"
|
||||
print('v3 test OK')
|
||||
|
||||
assign = {}
|
||||
for st in [s.strip() for s in mix.split(';') if s.strip()]:
|
||||
m = re.match(r'^var\s+(\w+)\s*=\s*(.*)$', st)
|
||||
if m:
|
||||
name = m.group(1); rhs = m.group(2).strip()
|
||||
if not rhs or rhs == '"':
|
||||
assign[name] = ''; continue
|
||||
# rhs 开头是 ",保留整段从quote开始
|
||||
if rhs.startswith('"'):
|
||||
assign[name] = eval_v3(rhs)
|
||||
continue
|
||||
m2 = re.match(r'^"([a-f0-9]{32})"$', rhs)
|
||||
if m2:
|
||||
assign[name] = m2.group(1); continue
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*(\w+)$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = assign.get(m.group(2), '')
|
||||
continue
|
||||
m = re.match(r'^(\w+)\s*=\s*"([a-f0-9]{32})"$', st)
|
||||
if m:
|
||||
assign[m.group(1)] = m.group(2)
|
||||
continue
|
||||
print('un:', st[:40])
|
||||
|
||||
print('assign:', {k: (v[:25]+'. .' if len(v) > 25 else v) for k, v in assign.items()})
|
||||
|
||||
vals = [v for v in assign.values() if v]
|
||||
hex32 = [v for v in vals if re.match(r'^[a-f0-9]{32}$', v)]
|
||||
xKey = hex32[0]
|
||||
oldToken = next(h for h in hex32 if h != xKey)
|
||||
newToken = next(v for v in vals if re.search(r'%[0-9A-Fa-f]{2}', v) and not re.match(r'^[a-f0-9]{32}$', v) and not re.match(r'^[a-f0-9]{16}$', v) and v != xKey)
|
||||
xorConst = re.findall(r'"([a-f0-9]{16})"', html)[0]
|
||||
print(f'xKey={xKey}\nnewTok={newToken[:30]}..\nold={oldToken[:10]}..\nc={xorConst}')
|
||||
|
||||
def b64(s): return base64.b64decode(s.encode()).decode('latin1')
|
||||
def dec(e):
|
||||
b1 = b64(e[::-1])
|
||||
k = xKey + xorConst
|
||||
x = ''.join(chr((ord(b1[i]) ^ ord(k[i % len(k)])) & 0xff) for i in range(len(b1)))
|
||||
b2 = b64(x)
|
||||
return urllib.parse.unquote(b2.replace('token=' + oldToken, 'token=' + newToken).replace(xKey, ''))
|
||||
|
||||
opts = re.findall(r'<option value="([^"]+)"[^>]*>', html)
|
||||
print('L1:', dec(opts[0])[:130])
|
||||
@@ -1,33 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""验证 channels.json 里各频道线路1可拉流(302 → 流头 FLV/m3u8)"""
|
||||
import json, urllib.request, socket
|
||||
socket.setdefaulttimeout(12)
|
||||
|
||||
UA = 'Mozilla/5.0 (Linux; Android 12) Chrome/124 Mobile Safari/537.36'
|
||||
data = json.load(open('/vol1/1000/HD1/APP/iptv-tv-app/tools/channels.json'))
|
||||
ok = [c for c in data if c.get('lines')]
|
||||
print('channels:', len(ok))
|
||||
for c in ok:
|
||||
url = c['lines'][0]
|
||||
try:
|
||||
req = urllib.request.Request(url, headers={'User-Agent': UA, 'Referer': 'https://m.iptv807.com/'})
|
||||
# 不跟随重定向,先拿302目标
|
||||
class NoRedir(urllib.request.HTTPRedirectHandler):
|
||||
def redirect_request(self, *a, **k): return None
|
||||
op = urllib.request.build_opener(NoRedir)
|
||||
try:
|
||||
op.open(req)
|
||||
red = None
|
||||
except urllib.error.HTTPError as e:
|
||||
red = e.headers.get('Location')
|
||||
if not red:
|
||||
print(f"❌ {c['name']}: no redirect")
|
||||
continue
|
||||
# 拉最终流前32字节
|
||||
req2 = urllib.request.Request(red, headers={'User-Agent': UA})
|
||||
with urllib.request.urlopen(req2) as r:
|
||||
head = r.read(32)
|
||||
magic = 'FLV' if head.startswith(b'FLV') else ('m3u8' if b'#EXTM3U' in head else head[:8])
|
||||
print(f"✅ {c['name']}: {magic}")
|
||||
except Exception as e:
|
||||
print(f"❌ {c['name']}: {str(e)[:80]}")
|
||||
Reference in new issue
Block a user