diff --git a/app/build.gradle b/app/build.gradle index 67e5177e..419a9ab8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,7 @@ dependencies { testImplementation "org.robolectric:robolectric:4.13" testImplementation 'cn.hutool:hutool-all:5.8.26' + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1" //implementation 'wang.harlon.quickjs:wrapper-java:1.0.0' // implementation(ext: 'aar', name: 'quickjs', group: 'fongmi', version: 'release') diff --git a/app/src/main/java/com/github/catvod/api/TianYiHandler.java b/app/src/main/java/com/github/catvod/api/TianYiHandler.java index 86bd13bb..1986f582 100644 --- a/app/src/main/java/com/github/catvod/api/TianYiHandler.java +++ b/app/src/main/java/com/github/catvod/api/TianYiHandler.java @@ -4,7 +4,10 @@ import android.app.AlertDialog; import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.util.Base64; import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; @@ -19,14 +22,21 @@ import com.github.catvod.utils.Notify; import com.github.catvod.utils.Path; import com.github.catvod.utils.QRCode; import com.github.catvod.utils.ResUtil; +import com.github.catvod.utils.Util; import com.google.gson.JsonObject; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -37,6 +47,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import javax.crypto.Cipher; + import okhttp3.Headers; import okhttp3.HttpUrl; import okhttp3.Request; @@ -72,6 +84,16 @@ public class TianYiHandler { cookieJar = new SimpleCookieJar(); cache = Cache.objectFrom(Path.read(getCache())); + String user = cache.getUser().getCookie(); + if (StringUtils.isNoneBlank(user)) { + JsonObject jsonObject = Json.safeObject(user); + String username = jsonObject.get("username").getAsString(); + String password = jsonObject.get("password").getAsString(); + this.loginWithPassword(username, password); + } else { + this.startFlow(); + } + } @@ -155,6 +177,172 @@ public class TianYiHandler { } + public void loginWithPassword(String uname, String passwd) { + try { + // Step 1: 获取加密配置 + JsonObject encryptConf = getEncryptConf(); + String pubKey = encryptConf.getAsJsonObject("data").get("pubKey").getAsString(); + + // Step 2: 获取登录参数 + PasswordLoginParams params = getLoginParams(); + + // Step 3: 准备请求头 + Map headers = buildLoginHeaders(params.lt, params.reqId); + + // Step 4: 获取应用配置 + AppConfig config = getAppConfig(headers); + + // Step 5: 加密凭证 + EncryptedCredentials credentials = encryptCredentials(uname, passwd, pubKey); + + // Step 6: 提交登录 + LoginResult loginResult = submitLogin(headers, config, credentials); + + // Step 7: 处理登录结果 + processLoginResult(loginResult); + + } catch (Exception e) { + SpiderDebug.log("登录失败: " + e.getMessage()); + Notify.show("天翼登录失败: " + e.getMessage()); + } + } + + // 辅助方法实现 + private JsonObject getEncryptConf() throws Exception { + String url = API_URL + "/api/logbox/config/encryptConf.do?appId=cloud"; + OkResult result = OkHttp.post(url, new HashMap<>(), getHeader(url)); + return Json.safeObject(result.getBody()); + } + + private PasswordLoginParams getLoginParams() throws Exception { + String url = "https://cloud.189.cn/api/portal/loginUrl.action?redirectURL=https://cloud.189.cn/web/redirect.html?returnURL=/main.action"; + Map> resHeaderMap = OkHttp.getLocationHeader(url, getHeader(url)); + + + String redUrl = resHeaderMap.get("Location").get(0); + resHeaderMap = OkHttp.getLocationHeader(redUrl, getHeader(redUrl)); + HttpUrl httpUrl = HttpUrl.parse(resHeaderMap.get("Location").get(0)); + return new PasswordLoginParams(httpUrl.queryParameter("reqId"), httpUrl.queryParameter("lt")); + } + + private Map buildLoginHeaders(String lt, String reqId) { + Map headers = new HashMap<>(getHeader(API_URL)); + headers.put("Content-Type", "application/x-www-form-urlencoded"); + headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/76.0"); + headers.put("Referer", "https://open.e.189.cn/"); + headers.put("Lt", lt); + headers.put("Reqid", reqId); + return headers; + } + + private AppConfig getAppConfig(Map headers) throws Exception { + Map data = new HashMap<>(); + data.put("version", "2.0"); + data.put("appKey", "cloud"); + + OkResult result = OkHttp.post(API_URL + "/api/logbox/oauth2/appConf.do", data, headers); + JsonObject dataObj = Json.safeObject(result.getBody()).getAsJsonObject("data"); + return new AppConfig(dataObj.get("returnUrl").getAsString(), dataObj.get("paramId").getAsString()); + } + + private EncryptedCredentials encryptCredentials(String uname, String passwd, String pubKey) throws Exception { + SpiderDebug.log("pubKey: " + pubKey); + PublicKey publicKey = parsePublicKey(pubKey); + return new EncryptedCredentials(encryptRSA(uname, publicKey), encryptRSA(passwd, publicKey)); + } + + private LoginResult submitLogin(Map headers, AppConfig config, EncryptedCredentials credentials) throws Exception { + Map data = new HashMap<>(); + data.put("appKey", "cloud"); + data.put("version", "2.0"); + data.put("accountType", "02"); + //data.put("mailSuffix", "@189.cn"); + data.put("validateCode", ""); + data.put("returnUrl", config.returnUrl); + data.put("paramId", config.paramId); + data.put("captchaToken", ""); + data.put("dynamicCheck", "FALSE"); + data.put("clientType", "1"); + data.put("cb_SaveName", "3"); + data.put("isOauth2", "false"); + data.put("userName", "{NRP}" + credentials.encryptedUname); + data.put("password", "{NRP}" + credentials.encryptedPasswd); + + OkResult result = OkHttp.post(API_URL + "/api/logbox/oauth2/loginSubmit.do", data, headers); + return new LoginResult(Json.safeObject(result.getBody()).get("toUrl").getAsString(), result.getResp().get("Set-Cookie")); + } + + private void processLoginResult(LoginResult result) throws Exception { + saveCookie(result.cookies, API_URL + "/api/logbox/oauth2/loginSubmit.do"); + + // 处理重定向 + Map> okResult = OkHttp.getLocationHeader(result.toUrl, getHeader(result.toUrl)); + saveCookie(okResult.get("Set-Cookie"), result.toUrl); + } + + // 辅助类 + private static class PasswordLoginParams { + final String reqId; + final String lt; + + PasswordLoginParams(String reqId, String lt) { + this.reqId = reqId; + this.lt = lt; + } + } + + private static class AppConfig { + final String returnUrl; + final String paramId; + + AppConfig(String returnUrl, String paramId) { + this.returnUrl = returnUrl; + this.paramId = paramId; + } + } + + private static class EncryptedCredentials { + final String encryptedUname; + final String encryptedPasswd; + + EncryptedCredentials(String encryptedUname, String encryptedPasswd) { + this.encryptedUname = encryptedUname; + this.encryptedPasswd = encryptedPasswd; + } + } + + private static class LoginResult { + final String toUrl; + final List cookies; + + LoginResult(String toUrl, List cookies) { + this.toUrl = toUrl; + this.cookies = cookies; + } + } + + private PublicKey parsePublicKey(String pubKey) throws Exception { + + byte[] decoded = android.util.Base64.decode(pubKey, Base64.NO_WRAP); + X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded); + return KeyFactory.getInstance("RSA").generatePublic(spec); + + } + + private String encryptRSA(String data, PublicKey publicKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encrypted = cipher.doFinal(data.getBytes(Charset.defaultCharset())); + return bytesToHex(encrypted); + } + + private String bytesToHex(byte[] bytes) { + StringBuilder hex = new StringBuilder(); + for (byte b : bytes) { + hex.append(String.format("%02x", b)); + } + return hex.toString().toUpperCase(); + } private String api(String url, Map params, Map headers, Integer retry, String method) throws InterruptedException { @@ -346,6 +534,39 @@ public class TianYiHandler { } } + public void startFlow() { + Init.run(this::showInput); + } + + + private void showInput() { + try { + int margin = ResUtil.dp2px(16); + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + FrameLayout frame = new FrameLayout(Init.context()); + params.setMargins(margin, margin, margin, margin); + EditText username = new EditText(Init.context()); + EditText password = new EditText(Init.context()); + frame.addView(username, params); + frame.addView(password, params); + dialog = new AlertDialog.Builder(Init.getActivity()).setTitle("请输入天意用户名和密码").setView(frame).setNegativeButton(android.R.string.cancel, null).setPositiveButton(android.R.string.ok, (dialog, which) -> onPositive(username.getText().toString(), password.getText().toString())).show(); + } catch (Exception ignored) { + } + } + + + private void onPositive(String username, String password) { + dismiss(); + Init.execute(() -> { + loginWithPassword(username, password); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("username", username); + jsonObject.addProperty("password", password); + cache.setTianyiUser(new User(Json.toJson(jsonObject))); + + }); + } + private void dismiss() { try { if (dialog != null) dialog.dismiss(); diff --git a/app/src/test/java/com/github/catvod/api/TianYiHandlerTest.java b/app/src/test/java/com/github/catvod/api/TianYiHandlerTest.java index 32c2758e..e3c23f5d 100644 --- a/app/src/test/java/com/github/catvod/api/TianYiHandlerTest.java +++ b/app/src/test/java/com/github/catvod/api/TianYiHandlerTest.java @@ -78,4 +78,10 @@ public class TianYiHandlerTest { } + @Test + public void loginWithPassword() throws Exception { + tianYiHandler.loginWithPassword("18896781601","Lushunming@0526"); + System.out.println("1111"); + } + } \ No newline at end of file diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 0dd50ce6..543e088c 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index 08e76f63..fee4cced 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -c792d86e7032adf77614775a3aaea124 +8ab2c84ea8b35e3be7a269af78dee6a5 diff --git a/json/test.json b/json/test.json index 5354480e..d50bdb30 100644 --- a/json/test.json +++ b/json/test.json @@ -1,27 +1,27 @@ { - "spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;3b36586b88952e9599f43fe755b4480f", + "spider": "https://ghproxy.net/https://raw.githubusercontent.com/lushunming/AndroidCatVodSpider/refs/heads/tianyiPassword/jar/custom_spider.jar;md5;8ab2c84ea8b35e3be7a269af78dee6a5", "lives": [ + { + "name": "电视直播", + "type": "0", + "pass": true, + "url": "https://ghfast.top/raw.githubusercontent.com/Supprise0901/TVBox_live/main/live.txt", + "epg": "https://epg.112114.xyz/?ch={name}&date={date}", + "logo": "https://epg.112114.xyz/logo/{name}.png" + }, + { + "name": "网络直播", + "type": "0", + "pass": true, + "url": "https://tv.iill.top/m3u/Live", + "epg": "https://epg.112114.xyz/?ch={name}&date={date}", + "logo": "https://epg.112114.xyz/logo/{name}.png" + }, { "name": "直播", "type": "0", "pass": true, - "url": "https://ghp.ci/https://raw.githubusercontent.com/zwc456baby/iptv_alive/master/live.txt", - "epg": "https://epg.112114.xyz/?ch={name}&date={date}", - "logo": "https://epg.112114.xyz/logo/{name}.png" - }, - { - "name": "直播ipv6", - "type": "0", - "pass": true, - "url": "https://fanmingming.com/txt?url=https://live.fanmingming.com/tv/m3u/ipv6.m3u", - "epg": "https://epg.112114.xyz/?ch={name}&date={date}", - "logo": "https://epg.112114.xyz/logo/{name}.png" - }, - { - "name": "一木", - "type": "0", - "pass": true, - "url": "https://mirror.ghproxy.com/https://raw.githubusercontent.com/xianyuyimu/TVBOX-/main/TVBox/%E4%B8%80%E6%9C%A8%E7%9B%B4%E6%92%AD%E6%BA%90.txt", + "url": "https://ghfast.top/https://raw.githubusercontent.com/Wirili/IPTV/main/live.txt", "epg": "https://epg.112114.xyz/?ch={name}&date={date}", "logo": "https://epg.112114.xyz/logo/{name}.png" }, @@ -35,7 +35,249 @@ } ], "sites": [ + { + "key": "Introduce", + "name": "Cookie设置", + "type": 3, + "api": "csp_Introduce" + }, + { + "key": "Douban", + "name": " 豆瓣仅推荐", + "type": 3, + "api": "csp_Douban", + "searchable": 0, + "filterable": 1 + }, + { + "key": "Jianpian", + "name": "荐片视频", + "type": 3, + "api": "csp_Jianpian", + "searchable": 1, + "filterable": 1 + }, + { + "key": "玩偶", + "name": "玩偶哥哥", + "type": 3, + "api": "csp_Wogg", + "searchable": 1, + "changeable": 1, + "ext": "{\"site\": [\"https://www.wogg.net/\",\"https://wogg.xxooo.cf/\"]}" + }, + { + "key": "PanTa", + "name": "盘他|139Pan", + "type": 3, + "api": "csp_PanTa", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { + "key": "BiXin", + "name": "彼心|139Pan", + "type": 3, + "api": "csp_BiXin", + "searchable": 1, + "changeable": 1, + "ext": {} + }, { + "key": "TgSearch", + "name": "TgSearch|Pan", + "type": 3, + "api": "csp_TgSearch", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { + "key": "KuaKeBa", + "name": "夸克吧", + "type": 3, + "api": "csp_KuaKeBa", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { + "key": "DianYingYunJi", + "name": "电影云集", + "type": 3, + "api": "csp_DianYingYunJi", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { + "key": "KuaKeS", + "name": "夸克网盘社", + "type": 3, + "api": "csp_KuaKeS", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + + { + "key": "XuanFeng", + "name": "旋风影视", + "type": 3, + "api": "csp_XuanFeng", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { + "key": "NCat", + "name": "网飞猫影视", + "type": 3, + "api": "csp_NCat", + "searchable": 1, + "filterable": 1 + }, + { + "key": "ChangZhang", + "name": "厂长影视", + "type": 3, + "api": "csp_ChangZhang", + "searchable": "1", + "filterable": "0", + "changeable": 0, + "ext": "https://www.czzy.site/" + }, + { + "key": "Zxzj", + "name": "在线之家", + "type": 3, + "api": "csp_Zxzj", + "searchable": "1", + "filterable": "0", + "changeable": 0, + "ext": {} + }, + { + "key": "TvDy", + "name": "电影天堂影视", + "type": 3, + "api": "csp_TvDy", + "searchable": 1, + "filterable": 1 + }, + { + "key": "W55Movie", + "name": "555电影", + "type": 3, + "api": "csp_W55Movie", + "searchable": 0, + "filterable": 1, + "ext": "https://w55xy.com/" + }, + { + "key": "DaGongRen", + "name": "打工人电影", + "type": 3, + "api": "csp_DaGongRen", + "searchable": 1, + "filterable": 1 + }, + { + "key": "HkTv", + "name": "TVB云播影视", + "type": 3, + "api": "csp_HkTv", + "searchable": 0, + "filterable": 1, + "ext": "http://www.hktvyb.vip/" + }, + { + "key": "NGkt", + "name": "瓜瓜", + "type": 3, + "api": "csp_NG", + "searchable": 1, + "filterable": 0, + "ext": {} + }, + { + "key": "JustLive", + "name": "JustLive直播", + "type": 3, + "api": "csp_JustLive", + "searchable": 1, + "filterable": 1 + }, + { + "key": "Xb6v", + "name": "新版6V视频", + "type": 3, + "api": "csp_Xb6v", + "searchable": 1, + "filterable": 1 + }, + { + "key": "ikanbot", + "name": "爱看机器人", + "type": 3, + "api": "csp_Ikanbot", + "searchable": 1, + "filterable": 0, + "ext": "{\"box\": \"TVBox\", \"danmu\": false}" + }, + { + "key": "Libvio", + "name": "立播影视", + "type": 3, + "api": "csp_Libvio", + "searchable": 1, + "filterable": 0, + "ext": "{ \"site\": \"https://www.libvio.app\" }" + }, + { + "key": "Ddrk", + "name": "低端影视", + "type": 3, + "api": "csp_Ddrk", + "searchable": 1, + "filterable": 0, + "ext": " {\"site\":\"https://ddys.info/\"}" + }, + { + "key": "Ysj", + "name": "异世界动漫(不稳定)", + "type": 3, + "api": "csp_Ysj", + "searchable": 1, + "filterable": 1 + }, + { + "key": "QxiTv", + "name": "七喜影视", + "type": 3, + "api": "csp_QxiTv", + "searchable": 1, + "changeable": 0, + "ext": {} + }, + { + "key": "glod", + "name": "金牌 | 影视", + "type": 3, + "api": "csp_Glod", + "searchable": 1, + "changeable": 0, + "ext": {} + }, + { + "key": "YunPanBa", + "name": "云盘吧", + "type": 3, + "api": "csp_YunPanBa", + "searchable": 1, + "timeout": 30 + }, { "key": "QiLeSo", "name": "奇乐搜┃搜索", @@ -43,8 +285,367 @@ "api": "csp_QiLeSo", "searchable": 1, "timeout": 30 + }, + { + "key": "PanSearch", + "name": "盘搜┃搜索", + "type": 3, + "api": "csp_PanSearch", + "searchable": 1, + "timeout": 30 + }, + { + "key": "TianYiSo", + "name": "天翼┃搜索", + "type": 3, + "api": "csp_TianYiSo", + "searchable": 1, + "timeout": 30 + }, + { + "key": "newvision", + "name": "(js)新视觉影院(不稳定)", + "api": "https://androidcatvodspider.netlify.app/json/js/newvision.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "kankan70", + "name": "(js)70看看┃📺", + "api": "https://androidcatvodspider.netlify.app/json/js/kankan70.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "jpyy", + "name": "(js)金牌影院", + "api": "https://androidcatvodspider.netlify.app/json/js/jpyy.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "jpyy2", + "name": "(js)金牌影院", + "api": "https://androidcatvodspider.netlify.app/json/js/jpyy2.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "tiantian", + "name": "(js)天天影视┃⛄", + "api": "https://androidcatvodspider.netlify.app/json/js/tiantian.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "xb6v", + "name": "(js)磁力新6V┃🧲", + "api": "https://androidcatvodspider.netlify.app/json/js/xb6v.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "mp4movie", + "name": "(js)Mp4电影┃🍚", + "api": "https://androidcatvodspider.netlify.app/json/js/mp4movie.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "jianpian", + "name": "(js)荐片┃🌼", + "api": "https://androidcatvodspider.netlify.app/json/js/jianpian.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "alipansou", + "name": "(js)阿里猫狸┃😸", + "api": "https://androidcatvodspider.netlify.app/json/js/alipansou.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "aliToken": "26fc6787afff43e78b78992e782502f1", + "quarkCookie": "_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "huya", + "name": "(js)虎牙直播┃🐯", + "api": "https://androidcatvodspider.netlify.app/json/js/huya.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "star", + "name": "(js)星视界┃墙☄️", + "api": "https://androidcatvodspider.netlify.app/json/js/star.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "nivod", + "name": "(js)泥视频┃墙👑", + "api": "https://androidcatvodspider.netlify.app/json/js/nivod.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "code": 0 + }, + "playerType": 0, + "type": 3 + }, + { + "key": "aiyingshi", + "name": "(js)爱影视┃🚀", + "api": "https://androidcatvodspider.netlify.app/json/js/aiyingshi.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "sp360", + "name": "(js)360影视┃🥎", + "api": "https://androidcatvodspider.netlify.app/json/js/sp360.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "mxanime", + "name": "(js)MX动漫┃🍒", + "api": "https://androidcatvodspider.netlify.app/json/js/mxanime.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "cntv", + "name": "(js)中央影视┃🤵‍♂️", + "api": "https://androidcatvodspider.netlify.app/json/js/cntv.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "douban", + "name": "(js)豆瓣┃🍥", + "api": "https://androidcatvodspider.netlify.app/json/js/douban.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "pan_search", + "name": "(js)阿里盘搜┃🗂️", + "api": "https://androidcatvodspider.netlify.app/json/js/pan_search.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "aliToken": "26fc6787afff43e78b78992e782502f1", + "quarkCookie": "_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "bilibili", + "name": "(js)哔哩哔哩┃🏰", + "api": "https://androidcatvodspider.netlify.app/json/js/bilibili.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "cookie": "buvid3=02675249-8ED3-C418-87F5-59E18316459714816infoc; b_nut=1704421014; _uuid=5D435F74-F574-D9AB-62C1-B9294DE465D913102infoc; buvid_fp=e8c5650c749398e9b5cad3f3ddb5081e; buvid4=007E85D1-52C1-7E6E-07CF-837FFBC9349516677-024010502-J5vTDSZDCw4fNnXRejbSVg%3D%3D; rpdid=|()kYJmulRu0J'u~|RRJl)JR; PVID=1; SESSDATA=3be091d3%2C1720332009%2C699ed%2A11CjAcCdwXG5kY1umhCOpQHOn_WP7L9xFBfWO7KKd4BPweodpR6VyIfeNyPiRmkr5jCqsSVjg0R0dZOVVHRUo3RnhPRTZFc3JPbGdiUjFCdHpiRDhiTkticmdKTjVyS1VhbDdvNjFMSDJlbUJydUlRdjFUNGFBNkJlV2ZTa0N1Q1BEVi1QYTQzTUh3IIEC; bili_jct=b0ee7b5d3f27df893545d811d95506d4; DedeUserID=78014638; DedeUserID__ckMd5=4c8c5d65065e468a; enable_web_push=DISABLE; header_theme_version=CLOSE; home_feed_column=5; CURRENT_BLACKGAP=0; CURRENT_FNVAL=4048; b_lsid=75E916AA_18EA1A8D995; bsource=search_baidu; FEED_LIVE_VERSION=V_HEADER_LIVE_NO_POP; browser_resolution=1507-691; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTIzNjk5MTMsImlhdCI6MTcxMjExMDY1MywicGx0IjotMX0.8zQW_fNTCSBlK_JkHnzu3gDw62wuTK1qgKcbGec3swM; bili_ticket_expires=171236985" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "changzhang", + "name": "(js)厂长直连┃🏭️", + "api": "https://androidcatvodspider.netlify.app/json/js/changzhang.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "aliToken": "26fc6787afff43e78b78992e782502f1", + "quarkCookie": "_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "wogg", + "name": "(js)阿里玩偶┃💂", + "api": "https://androidcatvodspider.netlify.app/json/js/wogg.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "aliToken": "26fc6787afff43e78b78992e782502f1", + "quarkCookie": "_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "nangua", + "name": "(js)南瓜影视┃🎃", + "api": "https://androidcatvodspider.netlify.app/json/js/nangua.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "aliyunpanshare", + "name": "(js)阿里云盘分享┃🥏‍", + "api": "https://androidcatvodspider.netlify.app/json/js/aliyunpanshare.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "aliToken": "26fc6787afff43e78b78992e782502f1", + "quarkCookie": "_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "dubo", + "name": "(js)独播影视┃🛶", + "api": "https://androidcatvodspider.netlify.app/json/js/dubo.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "haiwaikan", + "name": "(js)海外看┃☕墙", + "api": "https://androidcatvodspider.netlify.app/json/js/haiwaikan.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "dygangs", + "name": "(js)电影港┃🏖️", + "api": "https://androidcatvodspider.netlify.app/json/js/dygangs.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "cilixiong", + "name": "(js)磁力熊┃🐻", + "api": "https://androidcatvodspider.netlify.app/json/js/cilixiong.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "lovemovie", + "name": "(js)爱情电影网┃💕", + "api": "https://androidcatvodspider.netlify.app/json/js/lovemovie.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "gitcafe", + "name": "(js)阿里纸条┃🦊", + "api": "https://androidcatvodspider.netlify.app/json/js/gitcafe.js", + "timeout": 30, + "ext": { + "box": "TVBox", + "aliToken": "26fc6787afff43e78b78992e782502f1", + "quarkCookie": "_UP_A4A_11_=wb965111521e45ffa80410c24a071a54; _UP_D_=pc; tfstk=fXFith4nnRk114LAjWc1TT-OQUXL5hGjqodxDjnVLDoBBchYujR4Drht3GaYxmqYlcPtWc34mknIMcFTB-Y_tuAv6G6_uIcxggIRw_U15jGV2EjCXmnslyoqlSMN9PGjgMEW0dR85uVOAjYmgwcEoqOqgIrqLyoIlq-ZuC738DgqgCJZgH8EuqxZNmAqqSPQTaC3h7bb2rFnSvW87D8jTW0iX0zasIR2zVDi4Poh2svabvzjnSTXixaaFogzbhS-Cry3xVcc9dlz--roR55Jj2wT8znUrEdYrfV3t-kh71znscDo-vYWpf24fSD_IE_78frQF0MNdMg367HmVvxFbyUnbY20XMOqX84UxYFpvQhbA-rqok-G4A9eUc4wG27YtK9jQ2gnVNJioG_mbu_h-wv5CAuIWgQh-K9jQ2gn2wbHFhMZRVIR.; __pus=c81f57897dafcb65d4ecb501bc299199AARcqF72zsatdbsCbiT3qVqsk36caaycoPQW7hz8rbEf+UY7f5aGgH1e90lsONAUwCAW8y27u5A/KXyYqkHCWgjS; __kp=99fa2760-1669-11ef-90cf-8f7a59c3b86e; __kps=AATSt4xuf6r6bqes3LdJvxvy; __ktd=c2e+aLICIvFoeklXXz36VA==; __uid=AATSt4xuf6r6bqes3LdJvxvy; Video-Auth=smob3MOUslklDq2MutANJYZCVo50sLv0GFelx3+cu1nK2fkdL2kvkdpT5yNOhNz0NLTyi5ThWRL47+ztJA4kXQ==; __puus=72f667c533c9a22496f88d2f1bb7ae71AAQ7mrvFw7s9AUPUXvnuGPkcDU3RRTVPdYaYQfsM9Cje2doYXgRZXbImg02EaUaEG+G9ikpo3xubGGdElArOuYvUtJzIXb6yHDnSZbtEUxkwvjfQRNEnDnVwLQ6LL2ORjRaxa9OUfwk/WppWvy6OcDqQtHYkaqB+Poxn5kFs7ZVdAtX7ZQks1czD+g9gAZjsbeBHxHQ1AP5MGc1s3M4RhwZQ" + }, + "playerType": 0, + "type": 3 + }, + { + "key": "kuaikan", + "name": "(js)快看视频┃🛥︎", + "api": "https://androidcatvodspider.netlify.app/json/js/kuaikan.js", + "timeout": 30, + "ext": { + "box": "TVBox" + }, + "playerType": 0, + "type": 3 } - ], "parses": [ {