From 297850769fa3d40faf67924b07c74f187d5a32c0 Mon Sep 17 00:00:00 2001 From: T00700 <119649139+T00700@users.noreply.github.com> Date: Mon, 30 Jan 2023 12:24:00 +0800 Subject: [PATCH] Delete TVBox_Java directory --- TVBox_Java/crawler/Spider.java | 103 - TVBox_Java/crawler/SpiderDebug.java | 19 - TVBox_Java/crawler/SpiderReq.java | 299 --- TVBox_Java/crawler/SpiderReqResult.java | 17 - TVBox_Java/crawler/SpiderUrl.java | 20 - TVBox_Java/demo/MainActivity.java | 28 - TVBox_Java/live/TxtSubscribe.java | 144 -- TVBox_Java/parser/JsonBasic.java | 73 - TVBox_Java/parser/JsonParallel.java | 94 - TVBox_Java/parser/JsonSequence.java | 48 - TVBox_Java/parser/MixDemo.java | 189 -- TVBox_Java/spider/Acg.java | 498 ----- TVBox_Java/spider/Aidi.java | 466 ---- TVBox_Java/spider/AliPS.java | 108 - TVBox_Java/spider/Alist.java | 187 -- TVBox_Java/spider/Anfuns.java | 376 ---- TVBox_Java/spider/Anime1.java | 460 ---- TVBox_Java/spider/AppTT.java | 332 --- TVBox_Java/spider/AppYs.java | 1124 ---------- TVBox_Java/spider/AppYsV2.java | 845 ------- TVBox_Java/spider/Auete.java | 540 ----- TVBox_Java/spider/Bdys01.java | 559 ----- TVBox_Java/spider/Bili.java | 273 --- TVBox_Java/spider/Buka.java | 483 ---- TVBox_Java/spider/Cokemv.java | 513 ----- TVBox_Java/spider/Czsapp.java | 435 ---- TVBox_Java/spider/Ddrk.java | 581 ----- TVBox_Java/spider/Ddys.java | 627 ------ TVBox_Java/spider/Dy555.java | 568 ----- TVBox_Java/spider/Dy6080.java | 546 ----- TVBox_Java/spider/EEEDY.java | 407 ---- TVBox_Java/spider/EPang.java | 463 ---- TVBox_Java/spider/Enlienli.java | 252 --- TVBox_Java/spider/Fuli.java | 489 ----- TVBox_Java/spider/Gitcafe.java | 310 --- TVBox_Java/spider/IKan.java | 234 -- TVBox_Java/spider/IQIYI.java | 324 --- TVBox_Java/spider/If101.java | 482 ---- TVBox_Java/spider/Imaple.java | 465 ---- TVBox_Java/spider/Init.java | 17 - TVBox_Java/spider/Juhi.java | 472 ---- TVBox_Java/spider/Juhuang.java | 406 ---- TVBox_Java/spider/Jumi.java | 466 ---- TVBox_Java/spider/Kmys.java | 567 ----- TVBox_Java/spider/Kuaikan.java | 681 ------ TVBox_Java/spider/Kunyu77.java | 399 ---- TVBox_Java/spider/Lgyy.java | 521 ----- TVBox_Java/spider/Lib.java | 516 ----- TVBox_Java/spider/LiteApple.java | 466 ---- TVBox_Java/spider/LocalFile.java | 144 -- TVBox_Java/spider/MGTV.java | 314 --- TVBox_Java/spider/MixWeb.java | 178 -- TVBox_Java/spider/N0ys.java | 471 ---- TVBox_Java/spider/Nekk.java | 489 ----- TVBox_Java/spider/NewXPath.java | 474 ---- TVBox_Java/spider/Nfx.java | 449 ---- TVBox_Java/spider/Nfyun.java | 503 ----- TVBox_Java/spider/Olevod.java | 503 ----- TVBox_Java/spider/Proxy.java | 70 - TVBox_Java/spider/PushAgent.java | 656 ------ TVBox_Java/spider/QQ.java | 331 --- TVBox_Java/spider/QXBiubiu.java | 505 ----- TVBox_Java/spider/SP293.java | 339 --- TVBox_Java/spider/SP360.java | 345 --- TVBox_Java/spider/Smdyy.java | 514 ----- TVBox_Java/spider/Tangrenjie.java | 538 ----- TVBox_Java/spider/Upyunso.java | 118 - TVBox_Java/spider/Vid.java | 503 ----- TVBox_Java/spider/Voflix.java | 499 ----- TVBox_Java/spider/Wybg.java | 481 ---- TVBox_Java/spider/XBiu.java | 1935 ----------------- TVBox_Java/spider/XBiubiu.java | 528 ----- TVBox_Java/spider/XPath.java | 474 ---- TVBox_Java/spider/XPathBde4.java | 135 -- TVBox_Java/spider/XPathEgg.java | 113 - TVBox_Java/spider/XPathFilter.java | 36 - TVBox_Java/spider/XPathMac.java | 196 -- TVBox_Java/spider/XPathMacFilter.java | 30 - TVBox_Java/spider/XPathMacTvgook.java | 37 - TVBox_Java/spider/XPbd.java | 154 -- TVBox_Java/spider/Xiaoh.java | 471 ---- TVBox_Java/spider/Xifanys.java | 479 ---- TVBox_Java/spider/Xmau.java | 263 --- TVBox_Java/spider/Xxys.java | 77 - TVBox_Java/spider/Yj1211.java | 398 ---- TVBox_Java/spider/Ysdq.java | 275 --- TVBox_Java/spider/Ysgc.java | 394 ---- TVBox_Java/spider/YydsAli1.java | 517 ----- TVBox_Java/spider/Zhaozy.java | 100 - TVBox_Java/spider/Zxzj.java | 486 ----- TVBox_Java/spider/merge/RSA.java | 96 - TVBox_Java/utils/AES.java | 114 - TVBox_Java/utils/Base64Ext.java | 755 ------- TVBox_Java/utils/CBC.java | 21 - TVBox_Java/utils/Misc.java | 155 -- TVBox_Java/utils/RSAUtils.java | 364 ---- TVBox_Java/utils/SSLSocketFactoryCompat.java | 167 -- TVBox_Java/utils/SpiderOKClient.java | 36 - TVBox_Java/utils/gZip.java | 22 - TVBox_Java/utils/okhttp/OKCallBack.java | 60 - TVBox_Java/utils/okhttp/OKRequest.java | 132 -- TVBox_Java/utils/okhttp/OkHttpUtil.java | 200 -- .../utils/okhttp/SSLSocketFactoryCompat.java | 167 -- TVBox_Java/xpath/XPathRule.java | 687 ------ TVBox_Java/xpath/p.json | 1326 ----------- TVBox_Java/xpath/test.json | 791 ------- TVBox_Java/加进去报错的Java源代码/Alist2.java | 187 -- .../加进去报错的Java源代码/Bdys01_SSSVIP.java | 604 ----- TVBox_Java/加进去报错的Java源代码/Bttwoo.java | 386 ---- TVBox_Java/加进去报错的Java源代码/Dy1010.java | 479 ---- .../加进去报错的Java源代码/Jianying.java | 296 --- .../加进去报错的Java源代码/NianYing.java | 326 --- TVBox_Java/加进去报错的Java源代码/Tkys.java | 410 ---- TVBox_Java/加进去报错的Java源代码/XYQBiu.java | 1167 ---------- TVBox_Java/加进去报错的Java源代码/Yisou.java | 90 - TVBox_Java/加进去报错的Java源代码/kansj.java | 227 -- TVBox_Java/加进去报错的Java源代码/错误.txt | 1 - 117 files changed, 43280 deletions(-) delete mode 100644 TVBox_Java/crawler/Spider.java delete mode 100644 TVBox_Java/crawler/SpiderDebug.java delete mode 100644 TVBox_Java/crawler/SpiderReq.java delete mode 100644 TVBox_Java/crawler/SpiderReqResult.java delete mode 100644 TVBox_Java/crawler/SpiderUrl.java delete mode 100644 TVBox_Java/demo/MainActivity.java delete mode 100644 TVBox_Java/live/TxtSubscribe.java delete mode 100644 TVBox_Java/parser/JsonBasic.java delete mode 100644 TVBox_Java/parser/JsonParallel.java delete mode 100644 TVBox_Java/parser/JsonSequence.java delete mode 100644 TVBox_Java/parser/MixDemo.java delete mode 100644 TVBox_Java/spider/Acg.java delete mode 100644 TVBox_Java/spider/Aidi.java delete mode 100644 TVBox_Java/spider/AliPS.java delete mode 100644 TVBox_Java/spider/Alist.java delete mode 100644 TVBox_Java/spider/Anfuns.java delete mode 100644 TVBox_Java/spider/Anime1.java delete mode 100644 TVBox_Java/spider/AppTT.java delete mode 100644 TVBox_Java/spider/AppYs.java delete mode 100644 TVBox_Java/spider/AppYsV2.java delete mode 100644 TVBox_Java/spider/Auete.java delete mode 100644 TVBox_Java/spider/Bdys01.java delete mode 100644 TVBox_Java/spider/Bili.java delete mode 100644 TVBox_Java/spider/Buka.java delete mode 100644 TVBox_Java/spider/Cokemv.java delete mode 100644 TVBox_Java/spider/Czsapp.java delete mode 100644 TVBox_Java/spider/Ddrk.java delete mode 100644 TVBox_Java/spider/Ddys.java delete mode 100644 TVBox_Java/spider/Dy555.java delete mode 100644 TVBox_Java/spider/Dy6080.java delete mode 100644 TVBox_Java/spider/EEEDY.java delete mode 100644 TVBox_Java/spider/EPang.java delete mode 100644 TVBox_Java/spider/Enlienli.java delete mode 100644 TVBox_Java/spider/Fuli.java delete mode 100644 TVBox_Java/spider/Gitcafe.java delete mode 100644 TVBox_Java/spider/IKan.java delete mode 100644 TVBox_Java/spider/IQIYI.java delete mode 100644 TVBox_Java/spider/If101.java delete mode 100644 TVBox_Java/spider/Imaple.java delete mode 100644 TVBox_Java/spider/Init.java delete mode 100644 TVBox_Java/spider/Juhi.java delete mode 100644 TVBox_Java/spider/Juhuang.java delete mode 100644 TVBox_Java/spider/Jumi.java delete mode 100644 TVBox_Java/spider/Kmys.java delete mode 100644 TVBox_Java/spider/Kuaikan.java delete mode 100644 TVBox_Java/spider/Kunyu77.java delete mode 100644 TVBox_Java/spider/Lgyy.java delete mode 100644 TVBox_Java/spider/Lib.java delete mode 100644 TVBox_Java/spider/LiteApple.java delete mode 100644 TVBox_Java/spider/LocalFile.java delete mode 100644 TVBox_Java/spider/MGTV.java delete mode 100644 TVBox_Java/spider/MixWeb.java delete mode 100644 TVBox_Java/spider/N0ys.java delete mode 100644 TVBox_Java/spider/Nekk.java delete mode 100644 TVBox_Java/spider/NewXPath.java delete mode 100644 TVBox_Java/spider/Nfx.java delete mode 100644 TVBox_Java/spider/Nfyun.java delete mode 100644 TVBox_Java/spider/Olevod.java delete mode 100644 TVBox_Java/spider/Proxy.java delete mode 100644 TVBox_Java/spider/PushAgent.java delete mode 100644 TVBox_Java/spider/QQ.java delete mode 100644 TVBox_Java/spider/QXBiubiu.java delete mode 100644 TVBox_Java/spider/SP293.java delete mode 100644 TVBox_Java/spider/SP360.java delete mode 100644 TVBox_Java/spider/Smdyy.java delete mode 100644 TVBox_Java/spider/Tangrenjie.java delete mode 100644 TVBox_Java/spider/Upyunso.java delete mode 100644 TVBox_Java/spider/Vid.java delete mode 100644 TVBox_Java/spider/Voflix.java delete mode 100644 TVBox_Java/spider/Wybg.java delete mode 100644 TVBox_Java/spider/XBiu.java delete mode 100644 TVBox_Java/spider/XBiubiu.java delete mode 100644 TVBox_Java/spider/XPath.java delete mode 100644 TVBox_Java/spider/XPathBde4.java delete mode 100644 TVBox_Java/spider/XPathEgg.java delete mode 100644 TVBox_Java/spider/XPathFilter.java delete mode 100644 TVBox_Java/spider/XPathMac.java delete mode 100644 TVBox_Java/spider/XPathMacFilter.java delete mode 100644 TVBox_Java/spider/XPathMacTvgook.java delete mode 100644 TVBox_Java/spider/XPbd.java delete mode 100644 TVBox_Java/spider/Xiaoh.java delete mode 100644 TVBox_Java/spider/Xifanys.java delete mode 100644 TVBox_Java/spider/Xmau.java delete mode 100644 TVBox_Java/spider/Xxys.java delete mode 100644 TVBox_Java/spider/Yj1211.java delete mode 100644 TVBox_Java/spider/Ysdq.java delete mode 100644 TVBox_Java/spider/Ysgc.java delete mode 100644 TVBox_Java/spider/YydsAli1.java delete mode 100644 TVBox_Java/spider/Zhaozy.java delete mode 100644 TVBox_Java/spider/Zxzj.java delete mode 100644 TVBox_Java/spider/merge/RSA.java delete mode 100644 TVBox_Java/utils/AES.java delete mode 100644 TVBox_Java/utils/Base64Ext.java delete mode 100644 TVBox_Java/utils/CBC.java delete mode 100644 TVBox_Java/utils/Misc.java delete mode 100644 TVBox_Java/utils/RSAUtils.java delete mode 100644 TVBox_Java/utils/SSLSocketFactoryCompat.java delete mode 100644 TVBox_Java/utils/SpiderOKClient.java delete mode 100644 TVBox_Java/utils/gZip.java delete mode 100644 TVBox_Java/utils/okhttp/OKCallBack.java delete mode 100644 TVBox_Java/utils/okhttp/OKRequest.java delete mode 100644 TVBox_Java/utils/okhttp/OkHttpUtil.java delete mode 100644 TVBox_Java/utils/okhttp/SSLSocketFactoryCompat.java delete mode 100644 TVBox_Java/xpath/XPathRule.java delete mode 100644 TVBox_Java/xpath/p.json delete mode 100644 TVBox_Java/xpath/test.json delete mode 100644 TVBox_Java/加进去报错的Java源代码/Alist2.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/Bdys01_SSSVIP.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/Bttwoo.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/Dy1010.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/Jianying.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/NianYing.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/Tkys.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/XYQBiu.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/Yisou.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/kansj.java delete mode 100644 TVBox_Java/加进去报错的Java源代码/错误.txt diff --git a/TVBox_Java/crawler/Spider.java b/TVBox_Java/crawler/Spider.java deleted file mode 100644 index 9f3bf4a..0000000 --- a/TVBox_Java/crawler/Spider.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.github.catvod.crawler; - -import android.content.Context; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.List; - -public abstract class Spider { - - public static JSONObject empty = new JSONObject(); - - public void init(Context context) { - } - - public void init(Context context, String extend) { - init(context); - } - - /** - * 首页数据内容 - * - * @param filter 是否开启筛选 - * @return - */ - public String homeContent(boolean filter) { - return ""; - } - - /** - * 首页最近更新数据 如果上面的homeContent中不包含首页最近更新视频的数据 可以使用这个接口返回 - * - * @return - */ - public String homeVideoContent() { - return ""; - } - - /** - * 分类数据 - * - * @param tid - * @param pg - * @param filter - * @param extend - * @return - */ - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - return ""; - } - - /** - * 详情数据 - * - * @param ids - * @return - */ - public String detailContent(List ids) { - return ""; - } - - /** - * 搜索数据内容 - * - * @param key - * @param quick - * @return - */ - public String searchContent(String key, boolean quick) { - return ""; - } - - /** - * 播放信息 - * - * @param flag - * @param id - * @return - */ - public String playerContent(String flag, String id, List vipFlags) { - return ""; - } - - /** - * webview解析时使用 可自定义判断当前加载的 url 是否是视频 - * - * @param url - * @return - */ - public boolean isVideoFormat(String url) { - return false; - } - - /** - * 是否手动检测webview中加载的url - * - * @return - */ - public boolean manualVideoCheck() { - return false; - } -} diff --git a/TVBox_Java/crawler/SpiderDebug.java b/TVBox_Java/crawler/SpiderDebug.java deleted file mode 100644 index fc155a1..0000000 --- a/TVBox_Java/crawler/SpiderDebug.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.catvod.crawler; - -public class SpiderDebug { - public static void log(Throwable th) { - try { - android.util.Log.d("SpiderLog", th.getMessage(), th); - } catch (Throwable th1) { - - } - } - - public static void log(String msg) { - try { - android.util.Log.d("SpiderLog", msg); - } catch (Throwable th1) { - - } - } -} diff --git a/TVBox_Java/crawler/SpiderReq.java b/TVBox_Java/crawler/SpiderReq.java deleted file mode 100644 index 6b5265f..0000000 --- a/TVBox_Java/crawler/SpiderReq.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.github.catvod.crawler; - -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import okhttp3.OkHttpClient; -import okhttp3.RequestBody; -import okhttp3.Response; -import rxhttp.RxHttpPlugins; -import rxhttp.wrapper.param.RxHttp; -import rxhttp.wrapper.parse.Parser; - -public class SpiderReq { - - private static final String defaultTag = "sp_req_default"; - - private static OkHttpClient defaultClient = initDefaultClient(); - - private static OkHttpClient initDefaultClient() { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.readTimeout(15, TimeUnit.SECONDS); - builder.writeTimeout(15, TimeUnit.SECONDS); - builder.connectTimeout(15, TimeUnit.SECONDS); - builder.retryOnConnectionFailure(true); - return builder.build(); - } - - /** - * 取消请求 - * - * @param tag - */ - public static void cancel(String tag) { - try { - RxHttpPlugins.cancelAll(tag); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - /** - * Get - * - * @param su - * @return - */ - public static SpiderReqResult get(SpiderUrl su) { - return get(defaultClient, su.url, defaultTag, su.headers); - } - - /** - * Get whit custom tag - * - * @param su - * @param tag - * @return - */ - public static SpiderReqResult get(SpiderUrl su, String tag) { - return get(defaultClient, su.url, tag, su.headers); - } - - /** - * Get with custom http client - * - * @param client - * @param su - * @return - */ - public static SpiderReqResult get(OkHttpClient client, SpiderUrl su) { - return get(client, su.url, defaultTag, su.headers); - } - - /** - * Get with custom http client & tag - * - * @param client - * @param su - * @param tag - * @return - */ - - public static SpiderReqResult get(OkHttpClient client, SpiderUrl su, String tag) { - return get(client, su.url, tag, su.headers); - } - - /** - * Get base - * - * @param client - * @param url - * @param tag - * @param headers - * @return - */ - public static SpiderReqResult get(OkHttpClient client, String url, String tag, HashMap headers) { - try { - return RxHttp.get(url) - .setOkClient(client) - .tag(tag) - .addAllHeader(headers) - .execute(new Parser() { - @Override - public SpiderReqResult onParse(@NotNull Response response) throws IOException { - String content = ""; - if (response.body() != null) { - content = response.body().string(); - } - Map> headers = response.headers().toMultimap(); - return new SpiderReqResult(headers, content); - } - }); - } catch (Throwable e) { - SpiderDebug.log(e); - } - return SpiderReqResult.empty; - } - - /** - * Header - * - * @param url - * @param headers - * @return - */ - public static SpiderReqResult header(String url, HashMap headers) { - return header(defaultClient, url, defaultTag, headers); - } - - /** - * Header - * - * @param client - * @param url - * @param tag - * @param headers - * @return - */ - public static SpiderReqResult header(OkHttpClient client, String url, String tag, HashMap headers) { - try { - return RxHttp.head(url) - .setOkClient(client) - .tag(tag) - .addAllHeader(headers) - .execute(new Parser() { - @Override - public SpiderReqResult onParse(@NotNull Response response) throws IOException { - Map> headers = response.headers().toMultimap(); - return new SpiderReqResult(headers, ""); - } - }); - } catch (Throwable e) { - SpiderDebug.log(e); - } - return SpiderReqResult.empty; - } - - /** - * Post Body - * - * @param url - * @param body - * @param headers - * @return - */ - public static SpiderReqResult postBody(String url, RequestBody body, HashMap headers) { - return postBody(defaultClient, url, body, defaultTag, headers); - } - - /** - * Post Body - * - * @param client - * @param url - * @param body - * @param tag - * @param headers - * @return - */ - public static SpiderReqResult postBody(OkHttpClient client, String url, RequestBody body, String tag, HashMap headers) { - try { - return RxHttp.postBody(url) - .setOkClient(client) - .setBody(body) - .tag(tag) - .addAllHeader(headers) - .execute(new Parser() { - @Override - public SpiderReqResult onParse(@NotNull Response response) throws IOException { - String content = ""; - if (response.body() != null) { - content = response.body().string(); - } - Map> headers = response.headers().toMultimap(); - return new SpiderReqResult(headers, content); - } - }); - } catch (Throwable e) { - SpiderDebug.log(e); - } - return SpiderReqResult.empty; - } - - /** - * Post Form - * - * @param url - * @param form - * @param headers - * @return - */ - public static SpiderReqResult postForm(String url, HashMap form, HashMap headers) { - return postForm(defaultClient, url, form, defaultTag, headers); - } - - /** - * Post Form - * - * @param client - * @param url - * @param form - * @param tag - * @param headers - * @return - */ - public static SpiderReqResult postForm(OkHttpClient client, String url, HashMap form, String tag, HashMap headers) { - try { - return RxHttp.postForm(url) - .setOkClient(client) - .addAll(form) - .tag(tag) - .addAllHeader(headers) - .execute(new Parser() { - @Override - public SpiderReqResult onParse(@NotNull Response response) throws IOException { - String content = ""; - if (response.body() != null) { - content = response.body().string(); - } - Map> headers = response.headers().toMultimap(); - return new SpiderReqResult(headers, content); - } - }); - } catch (Throwable e) { - SpiderDebug.log(e); - } - return SpiderReqResult.empty; - } - - /** - * Post Json - * - * @param url - * @param json - * @param headers - * @return - */ - public static SpiderReqResult postJson(String url, HashMap json, HashMap headers) { - return postJson(defaultClient, url, json, defaultTag, headers); - } - - /** - * Post Json - * - * @param client - * @param url - * @param json - * @param tag - * @param headers - * @return - */ - public static SpiderReqResult postJson(OkHttpClient client, String url, HashMap json, String tag, HashMap headers) { - try { - return RxHttp.postJson(url) - .setOkClient(client) - .addAll(json) - .tag(tag) - .addAllHeader(headers) - .execute(new Parser() { - @Override - public SpiderReqResult onParse(@NotNull Response response) throws IOException { - String content = ""; - if (response.body() != null) { - content = response.body().string(); - } - Map> headers = response.headers().toMultimap(); - return new SpiderReqResult(headers, content); - } - }); - } catch (Throwable e) { - SpiderDebug.log(e); - } - return SpiderReqResult.empty; - } -} diff --git a/TVBox_Java/crawler/SpiderReqResult.java b/TVBox_Java/crawler/SpiderReqResult.java deleted file mode 100644 index 808f665..0000000 --- a/TVBox_Java/crawler/SpiderReqResult.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.catvod.crawler; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SpiderReqResult { - SpiderReqResult(Map> headers, String content) { - this.headers = headers; - this.content = content; - } - - public static SpiderReqResult empty = new SpiderReqResult(new HashMap>(), ""); - - public Map> headers; - public String content; -} diff --git a/TVBox_Java/crawler/SpiderUrl.java b/TVBox_Java/crawler/SpiderUrl.java deleted file mode 100644 index 7260f92..0000000 --- a/TVBox_Java/crawler/SpiderUrl.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.github.catvod.crawler; - -import java.util.HashMap; - -public class SpiderUrl { - - public static SpiderUrl Empty = new SpiderUrl(); - - public String url = ""; - public HashMap headers = new HashMap<>(); - - public SpiderUrl() { - } - - public SpiderUrl(String url, HashMap headers) { - this.url = url; - if (headers != null) - this.headers = headers; - } -} diff --git a/TVBox_Java/demo/MainActivity.java b/TVBox_Java/demo/MainActivity.java deleted file mode 100644 index 51f11a9..0000000 --- a/TVBox_Java/demo/MainActivity.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.catvod.demo; - -import android.app.Activity; -import android.os.Bundle; - -import org.json.JSONObject; - -public class MainActivity extends Activity { - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - new Thread(new Runnable() { - - @Override - public void run() { - - - - } - }). - start(); - } -} - - diff --git a/TVBox_Java/live/TxtSubscribe.java b/TVBox_Java/live/TxtSubscribe.java deleted file mode 100644 index 38ab7b8..0000000 --- a/TVBox_Java/live/TxtSubscribe.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.github.catvod.live; - -import android.util.Base64; - -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; - -public class TxtSubscribe { - - public static void subscribe(LinkedHashMap>> allLives, String url, HashMap headers) { - if (url.contains(".bmp")) { - String content = OkHttpUtil.string(url, headers); - String[] split = content.split("\\*\\*"); - String a = new String(Base64.decode(split[1], Base64.DEFAULT)); - parse(allLives, a); - } else { - String content = OkHttpUtil.string(url, headers); - parse(allLives, content); - } - } - - public static void parse(LinkedHashMap>> allLives, String txt) { - try { - BufferedReader br = new BufferedReader(new StringReader(txt)); - String line = br.readLine(); - LinkedHashMap> noGroup = new LinkedHashMap<>(); - LinkedHashMap> groupLives = noGroup; - while (line != null) { - if (line.trim().isEmpty()) { - line = br.readLine(); - continue; - } - String[] lineInfo = line.split(","); - if (lineInfo.length < 2) { - line = br.readLine(); - continue; - } - if (line.contains("#genre#")) { - String group = lineInfo[0].trim(); - if (!allLives.containsKey(group)) { - groupLives = new LinkedHashMap<>(); - allLives.put(group, groupLives); - } else { - groupLives = allLives.get(group); - } - } else { - String title = lineInfo[0].trim(); - String[] urlMix = lineInfo[1].trim().split("#"); - for (int j = 0; j < urlMix.length; j++) { - String url = urlMix[j].trim(); - if (url.isEmpty()) - continue; - if (url.startsWith("http") || url.startsWith("rtsp") || url.startsWith("rtmp")) { - ArrayList urls = null; - if (!groupLives.containsKey(title)) { - urls = new ArrayList<>(); - groupLives.put(title, urls); - } else { - urls = groupLives.get(title); - } - if (!urls.contains(url)) - urls.add(url); - } else { - // SpiderDebug.log("Skip " + url); - } - } - } - line = br.readLine(); - } - br.close(); - if (!noGroup.isEmpty()) { - allLives.put("未分组", noGroup); - } - } catch (Throwable th) { - - } - } - - public static String live2Json(LinkedHashMap>> lives) { - JSONArray groups = new JSONArray(); - Iterator groupKeys = lives.keySet().iterator(); - while (groupKeys.hasNext()) { - String group = groupKeys.next(); - JSONArray channels = new JSONArray(); - LinkedHashMap> allChannel = lives.get(group); - if (allChannel.isEmpty()) - continue; - Iterator channelKeys = allChannel.keySet().iterator(); - while (channelKeys.hasNext()) { - String channel = channelKeys.next(); - ArrayList allUrls = allChannel.get(channel); - if (allUrls.isEmpty()) - continue; - JSONArray urls = new JSONArray(); - for (int i = 0; i < allUrls.size(); i++) { - urls.put(allUrls.get(i)); - } - JSONObject newChannel = new JSONObject(); - try { - newChannel.put("name", channel); - newChannel.put("urls", urls); - } catch (JSONException e) { - } - channels.put(newChannel); - } - JSONObject newGroup = new JSONObject(); - try { - newGroup.put("group", group); - newGroup.put("channels", channels); - } catch (JSONException e) { - } - groups.put(newGroup); - } - return groups.toString(); - } - - public static Object[] load(String ext) { - try { - LinkedHashMap>> allLives = new LinkedHashMap<>(); - TxtSubscribe.subscribe(allLives, ext, null); - String json = TxtSubscribe.live2Json(allLives); - Object[] result = new Object[3]; - result[0] = 200; - result[1] = "text/plain; charset=utf-8"; - ByteArrayInputStream baos = new ByteArrayInputStream(json.getBytes("UTF-8")); - result[2] = baos; - return result; - } catch (Throwable th) { - th.printStackTrace(); - } - return null; - } -} diff --git a/TVBox_Java/parser/JsonBasic.java b/TVBox_Java/parser/JsonBasic.java deleted file mode 100644 index 940001b..0000000 --- a/TVBox_Java/parser/JsonBasic.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.github.catvod.parser; - -import android.util.Base64; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Set; - -public class JsonBasic { - public static JSONObject parse(LinkedHashMap jx, String url) { - try { - SpiderDebug.log("Load Json Parse Basic..."); - if (jx.size() > 0) { - Set jxNames = jx.keySet(); - for (String jxName : jxNames) { - String parseUrl = jx.get(jxName); - HashMap reqHeaders = getReqHeader(parseUrl); - try { - String realUrl = reqHeaders.get("url"); - reqHeaders.remove("url"); - SpiderDebug.log(realUrl + url); - String json = OkHttpUtil.string(realUrl + url, reqHeaders); - JSONObject taskResult = Misc.jsonParse(url, json); - if (taskResult == null) - continue; - taskResult.put("jxFrom", jxName); - SpiderDebug.log(taskResult.toString()); - return taskResult; - } catch (Throwable th) { - SpiderDebug.log(th); - } - } - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - return new JSONObject(); - } - - public static HashMap getReqHeader(String url) { - HashMap reqHeaders = new HashMap<>(); - reqHeaders.put("url", url); - if (url.contains("cat_ext")) { - try { - int start = url.indexOf("cat_ext="); - int end = url.indexOf("&", start); - String ext = url.substring(start + 8, end); - ext = new String(Base64.decode(ext, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP)); - String newUrl = url.substring(0, start) + url.substring(end + 1); - JSONObject jsonObject = new JSONObject(ext); - if (jsonObject.has("header")) { - JSONObject headerJson = jsonObject.optJSONObject("header"); - Iterator keys = headerJson.keys(); - while (keys.hasNext()) { - String key = keys.next(); - reqHeaders.put(key, headerJson.optString(key, "")); - } - } - reqHeaders.put("url", newUrl); - } catch (Throwable th) { - - } - } - return reqHeaders; - } -} diff --git a/TVBox_Java/parser/JsonParallel.java b/TVBox_Java/parser/JsonParallel.java deleted file mode 100644 index c8efa1c..0000000 --- a/TVBox_Java/parser/JsonParallel.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.github.catvod.parser; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.CompletionService; -import java.util.concurrent.ExecutorCompletionService; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -/** - * 并发解析,直到获得第一个结果 - *

- * 默认解析超时时间为15秒,如果需要请自定义SpiderReq的HttpClient - *

- * Author: CatVod - */ -public class JsonParallel { - private static final String ParseOKTag = "p_json_parse"; - - public static JSONObject parse(LinkedHashMap jx, String url) { - try { - if (jx.size() > 0) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - CompletionService completionService = new ExecutorCompletionService(executorService); - List> futures = new ArrayList<>(); - Set jxNames = jx.keySet(); - for (String jxName : jxNames) { - String parseUrl = jx.get(jxName); - futures.add(completionService.submit(new Callable() { - @Override - public JSONObject call() throws Exception { - try { - HashMap reqHeaders = JsonBasic.getReqHeader(parseUrl); - String realUrl = reqHeaders.get("url"); - reqHeaders.remove("url"); - SpiderDebug.log(realUrl + url); - String json = OkHttpUtil.string(realUrl + url, ParseOKTag, reqHeaders); - JSONObject taskResult = Misc.jsonParse(url, json); - taskResult.put("jxFrom", jxName); - SpiderDebug.log(taskResult.toString()); - return taskResult; - } catch (Throwable th) { - SpiderDebug.log(th); - return null; - } - } - })); - } - JSONObject pTaskResult = null; - for (int i = 0; i < futures.size(); ++i) { - Future completed = completionService.take(); - try { - pTaskResult = completed.get(); - if (pTaskResult != null) { - OkHttpUtil.cancel(ParseOKTag); - for (int j = 0; j < futures.size(); j++) { - try { - futures.get(j).cancel(true); - } catch (Throwable th) { - SpiderDebug.log(th); - } - } - futures.clear(); - break; - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - } - try { - executorService.shutdownNow(); - } catch (Throwable th) { - SpiderDebug.log(th); - } - if (pTaskResult != null) - return pTaskResult; - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - return new JSONObject(); - } -} diff --git a/TVBox_Java/parser/JsonSequence.java b/TVBox_Java/parser/JsonSequence.java deleted file mode 100644 index e850558..0000000 --- a/TVBox_Java/parser/JsonSequence.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.github.catvod.parser; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Set; - -/** - * 依次解析,失败尝试下一个 - *

- * 默认解析超时时间为15秒,如果需要请自定义SpiderReq的HttpClient - *

- * Author: CatVod - */ -public class JsonSequence { - public static JSONObject parse(LinkedHashMap jx, String url) { - try { - if (jx.size() > 0) { - Set jxNames = jx.keySet(); - for (String jxName : jxNames) { - String parseUrl = jx.get(jxName); - try { - HashMap reqHeaders = JsonBasic.getReqHeader(parseUrl); - String realUrl = reqHeaders.get("url"); - reqHeaders.remove("url"); - SpiderDebug.log(realUrl + url); - String json = OkHttpUtil.string(realUrl + url, reqHeaders); - JSONObject taskResult = Misc.jsonParse(url, json); - if (taskResult == null) - continue; - taskResult.put("jxFrom", jxName); - return taskResult; - } catch (Throwable th) { - SpiderDebug.log(th); - } - } - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - return new JSONObject(); - } -} diff --git a/TVBox_Java/parser/MixDemo.java b/TVBox_Java/parser/MixDemo.java deleted file mode 100644 index 4db3f25..0000000 --- a/TVBox_Java/parser/MixDemo.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.github.catvod.parser; - -import android.util.Base64; - -import com.github.catvod.crawler.SpiderDebug; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; - -public class MixDemo { - - /* - "parses": [ - { - "name": "聚合", - "type": 3, - "url": "Demo" - }, - { - "name": "解析", - "type": 1, - "url": "https://192.168.10.88/jx.php?url=", - "ext": { - "flag": [ - "qq", - "iqiyi", - "qiyi", - "爱奇艺", - "腾讯", - "letv", - "sohu", - "tudou", - "pptv", - "mgtv", - "wasu", - "bilibili" - ] - } - }] - */ - - public static HashMap> flagWebJx = new HashMap<>(); - - static HashMap> configs = null; - - public static JSONObject parse(LinkedHashMap> jx, String nameMe, String flag, String url) { - try { - if (configs == null) { - configs = new HashMap<>(); - Iterator keys = jx.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next(); - HashMap parseBean = jx.get(key); - String type = parseBean.get("type"); - if (type.equals("1") || type.equals("0")) { - try { - JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag"); - for (int j = 0; j < flags.length(); j++) { - String flagKey = flags.getString(j); - ArrayList flagJx = configs.get(flagKey); - if (flagJx == null) { - flagJx = new ArrayList<>(); - configs.put(flagKey, flagJx); - } - flagJx.add(key); - } - } catch (Throwable th) { - - } - } - } - } - // 通过上面的配置获得解析列表 - LinkedHashMap jsonJx = new LinkedHashMap<>(); - ArrayList webJx = new ArrayList<>(); - ArrayList flagJx = configs.get(flag); - if (flagJx != null && !flagJx.isEmpty()) { - for (int i = 0; i < flagJx.size(); i++) { - String key = flagJx.get(i); - HashMap parseBean = jx.get(key); - String type = parseBean.get("type"); - if (type.equals("1")) { - jsonJx.put(key, mixUrl(parseBean.get("url"), parseBean.get("ext"))); - } else if (type.equals("0")) { - webJx.add(parseBean.get("url")); - } - } - } else { - Iterator keys = jx.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next(); - HashMap parseBean = jx.get(key); - String type = parseBean.get("type"); - if (type.equals("1")) { - jsonJx.put(key, mixUrl(parseBean.get("url"), parseBean.get("ext"))); - } else if (type.equals("0")) { - webJx.add(parseBean.get("url")); - } - } - } - if (!webJx.isEmpty()) { - flagWebJx.put(flag, webJx); - } - // 优先使用json并发解析 - JSONObject jsonResult = JsonParallel.parse(jsonJx, url); - if (jsonResult != null && jsonResult.has("url")) { - return jsonResult; - } - // json解析没有得到结果 用webview解析 - if (!webJx.isEmpty()) { - JSONObject webResult = new JSONObject(); - webResult.put("url", "proxy://do=MixDemo&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP)); - webResult.put("parse", 1); - return webResult; - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - return new JSONObject(); - } - - private static String mixUrl(String url, String ext) { - if (ext.trim().length() > 0) { - int idx = url.indexOf("?"); - if (idx > 0) { - return url.substring(0, idx + 1) + "cat_ext=" + Base64.encodeToString(ext.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + "&" + url.substring(idx + 1); - } - } - return url; - } - - public static Object[] loadHtml(String flag, String url) { - try { - url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); - String html = "\n" + - "\n" + - "\n" + - "\n" + - "解析\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - ""; - - StringBuilder jxs = new StringBuilder(); - if (flagWebJx.containsKey(flag)) { - ArrayList jxUrls = flagWebJx.get(flag); - for (int i = 0; i < jxUrls.size(); i++) { - jxs.append("\""); - jxs.append(jxUrls.get(i)); - jxs.append("\""); - if (i < jxUrls.size() - 1) { - jxs.append(","); - } - } - } - html = html.replace("#url#", url).replace("#jxs#", jxs.toString()); - Object[] result = new Object[3]; - result[0] = 200; - result[1] = "text/html; charset=\"UTF-8\""; - ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8")); - result[2] = baos; - return result; - } catch (Throwable th) { - th.printStackTrace(); - } - return null; - } -} diff --git a/TVBox_Java/spider/Acg.java b/TVBox_Java/spider/Acg.java deleted file mode 100644 index 69dcaff..0000000 --- a/TVBox_Java/spider/Acg.java +++ /dev/null @@ -1,498 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.LinkedHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Headers; - -public class Acg extends Spider { - private static final String siteUrl = "http://www.acgnya.com"; - private static final String siteHost = "www.acgnya.com"; - private String cookie=""; - private String referer=""; - - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+)/"); - private Pattern regexVid = Pattern.compile("/voddetail/(\\d+)/"); - private Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+)/"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\d+)/"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"buka\":{\"sh\":\"不卡推荐\",\"pu\":\"https://pro.ascepan.top/player/?url=\",\"sn\":1,\"or\":999}}"); - filterConfig = new JSONObject("{\"20\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"异世界\",\"v\":\"异世界\"},{\"n\":\"穿越\",\"v\":\"穿越\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"动作\",\"v\":\"动作\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders2(siteUrl,referer))); - // 分类节点 - Elements elements = doc.select("ul.navbar-items>li.navbar-item>a"); - System.out.println("shouye" + elements); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("连载动画") || - name.equals("国漫") || - name.equals("完结动画"); - - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div[class='module-items module-poster-items-base'] >a"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - Matcher matcher = regexVid.matcher(vod.selectFirst(".module-poster-item").attr("href")); - if (!matcher.find()) - continue; - String title = vod.selectFirst(".module-poster-item").attr("title"); - String cover = vod.selectFirst("div.module-item-cover div.module-item-pic img").attr("data-original"); - String remark = vod.selectFirst("div.module-item-cover div.module-item-note").text(); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id='page']"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = pageInfo.select("span.page-current").text(); - String wy = doc.select("div[id='page'] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.module-items.module-poster-items-base a "); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("img.lazy.lazyload").attr("data-original"); - String remark = vod.select("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders2(url,referer))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.module-item-cover div.module-item-pic > img").attr("data-original"); - String title = doc.selectFirst("div.module-info-main div.module-info-heading > h1").text(); - String desc = doc.selectFirst("div.module-info-item div.module-info-introduction-content > p").text().trim(); - - - String category = "", area = "", year = "", director = "", actor = ""; - category = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(2).text(); - area = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(1).text(); - year = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(0).text(); - - Elements span_text_muted = doc.select("div.module-info-content div.module-info-items div.module-info-item"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.select("span").text(); - if (info.contains("导演")) { - try { - director = text.select("div > a").text(); - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演")) { - try { - actor = text.select("div > a").text(); - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new LinkedHashMap<>(); - /* Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - });*/ - - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-items-box>div>span"); - System.out.print("sor++" + sources); - Elements sourceList = doc.select("div.module-list>div.module-play-list"); - System.out.print("sor1++" + sourceList); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - // boolean found = false; - boolean found = true; - // for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - // String flag = it.next(); - // if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - // sourceName = playerConfig.getJSONObject(flag).getString("sh"); - // found = true; - // break; - // } - // } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("div.module-play-list-content>a"); - System.out.print("pl++" + playList); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " http://www.acgnya.com"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/vodplay/" + id + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders2(String url,String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(!ref.equals("google")){ - headers.put("Authority", "www.acgnya.com"); - if(ref.length()>0){ - if(ref.equals("origin")){ - headers.put("Origin", "http://www.acgnya.com"); - } else { - headers.put("Referer", ref); - } - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - protected void getCookie(){ - cookie=""; - String cookieurl="http://www.acgnya.com/zzzzz"; - Map> cookies = new HashMap<>(); - OkHttpUtil.string(cookieurl,getHeaders2(cookieurl,""),cookies); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = TextUtils.join(";",entry.getValue()); - break; - } - } - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=35×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Aidi.java b/TVBox_Java/spider/Aidi.java deleted file mode 100644 index d72c5f8..0000000 --- a/TVBox_Java/spider/Aidi.java +++ /dev/null @@ -1,466 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Demo for spider - *

- * Author: CatVod - */ -public class Aidi extends Spider { - private static final String siteUrl = "https://aidi.tv"; - private static final String siteHost = "aidi.tv"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - private Pattern regexCategory = Pattern.compile("/v/(\\w+).html"); - private Pattern regexVid = Pattern.compile("/movie/(\\w+).html"); - private Pattern regexPlay = Pattern.compile("\\S+/play/(\\w+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/show/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"xg_app_player\":{\"sh\":\"app全局解析\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dplayer\":{\"sh\":\"dplayer\",\"pu\":\"\",\"sn\":0,\"or\":999},\"videojs\":{\"sh\":\"videojs-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"iva\":{\"sh\":\"iva-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"iframe\":{\"sh\":\"iframe外链数据\",\"pu\":\"\",\"sn\":0,\"or\":999},\"link\":{\"sh\":\"外链数据\",\"pu\":\"top.\",\"sn\":0,\"or\":999},\"swf\":{\"sh\":\"Flash文件\",\"pu\":\"\",\"sn\":0,\"or\":999},\"flv\":{\"sh\":\"Flv文件\",\"pu\":\"\",\"sn\":0,\"or\":999},\"qiepian\":{\"sh\":\"爱迪云播\",\"pu\":\"\",\"sn\":0,\"or\":999},\"ckm3u8\":{\"sh\":\"爱迪影视\",\"pu\":\"\",\"sn\":0,\"or\":999},\"xin\":{\"sh\":\"爱迪高速\",\"pu\":\"\",\"sn\":0,\"or\":999},\"ppyun\":{\"sh\":\"爱迪云链\",\"pu\":\"\",\"sn\":0,\"or\":999},\"jisu\":{\"sh\":\"极速路线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"ppayun\":{\"sh\":\"pp云\",\"pu\":\"https://wy.ppayun.cn/api/ShowVideoWy/973ed6d6891c43269706718cb0aedb72/\",\"sn\":0,\"or\":999},\"yun3edu\":{\"sh\":\"爱迪云三\",\"pu\":\"\",\"sn\":0,\"or\":999},\"guoji\":{\"sh\":\"國際路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"ddyunp\":{\"sh\":\"蓝光线路\",\"pu\":\"\",\"sn\":0,\"or\":999},\"eduyun\":{\"sh\":\"爱迪云二\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"720P线路\",\"pu\":\"\",\"sn\":0,\"or\":999},\"yjm3u8\":{\"sh\":\"备用线路\",\"pu\":\"\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"dianying\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"dianying\"},{\"n\":\"动作片\",\"v\":\"dongzuopian\"},{\"n\":\"喜剧片\",\"v\":\"xijupian\"},{\"n\":\"爱情片\",\"v\":\"aiqingpian\"},{\"n\":\"科幻片\",\"v\":\"kehuanpian\"},{\"n\":\"恐怖片\",\"v\":\"kongbupian\"},{\"n\":\"剧情片\",\"v\":\"juqingpian\"},{\"n\":\"战争片\",\"v\":\"zhanzhengpian\"},{\"n\":\"传记\",\"v\":\"zhuanji\"}]},{\"key\":3,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"},{\"n\":\"情色\",\"v\":\"情色\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"lianxuju\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"lianxuju\"},{\"n\":\"国产剧\",\"v\":\"guochanju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"}]},{\"key\":3,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"zongyi\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"zongyi\"},{\"n\":\"内地综艺\",\"v\":\"ndzy\"},{\"n\":\"港台综艺\",\"v\":\"gtzy\"},{\"n\":\"韩国综艺节目\",\"v\":\"variety\"},{\"n\":\"欧美综艺\",\"v\":\"oumeizongyi\"}]},{\"key\":3,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"dongman\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"dongman\"},{\"n\":\"日韩动漫\",\"v\":\"rihan\"},{\"n\":\"国产动漫\",\"v\":\"guoman\"},{\"n\":\"欧美动漫\",\"v\":\"oumei\"},{\"n\":\"动漫电影\",\"v\":\"cartoon\"}]},{\"key\":3,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"jilu\":[{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.nav_list > li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.select("span").text(); - if (name.equals("樱花动漫")) { - name = "动漫"; - } - boolean show = name.equals("电影") || - name.equals("连续剧") || - name.equals("动漫") || - name.equals("纪录片") || - name.equals("综艺"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.vod_row").get(1); - Elements list = homeList.select("div.cbox1 > ul.vodlist li a.vodlist_thumb"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = vod.selectFirst("span.pic_text").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/show/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.page li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("ul.vodlist li a.vodlist_thumb"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = vod.selectFirst("span.pic_text").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 60); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 60); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/movie/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.detail_list_box a.vodlist_thumb img").attr("data-original"); - String title = doc.selectFirst("div.detail_list_box h2.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.detail_list_box div.content_detail span"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("类型:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("状态:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.play_source_tab > a"); - Elements sourceList = doc.select("div.play_list_box > div.playlist_full"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.attr("alt"); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("li > a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - String url = siteUrl + "/vsearch/-------------.html?wd=" + URLEncoder.encode(key) + "&submit="; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - - JSONArray videos = new JSONArray(); - Elements list = doc.select("div.search_box li.searchlist_item a.vodlist_thumb"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = vod.selectFirst("span.pic_text").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/AliPS.java b/TVBox_Java/spider/AliPS.java deleted file mode 100644 index d7d2cf6..0000000 --- a/TVBox_Java/spider/AliPS.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - - -public class AliPS extends Spider { - private PushAgent pushAgent; - private static String b = "https://www.alipansou.com"; - private static Pattern a = Pattern.compile("(https:\\/\\/www.aliyundrive.com\\/s\\/[^\\\"]+)"); - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - pushAgent = new PushAgent(); - pushAgent.init(context, extend); - } - - @Override - public String detailContent(List list) { - try { - Pattern pattern = a; - if (pattern.matcher(list.get(0)).find()) { - return pushAgent.detailContent(list); - } - Matcher matcher = pattern.matcher(OkHttpUtil.string("https://www.alipansou.com" + list.get(0), null)); - if (!matcher.find()) { - return ""; - } - list.set(0, matcher.group(1).replaceAll("\\\\","")); - return pushAgent.detailContent(list); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - @Override - public String playerContent(String str, String str2, List list) { - return pushAgent.playerContent(str, str2, list); - } - - protected static HashMap sHeaders() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - return headers; - } - - @Override - public String searchContent(String key, boolean z) { - try { - HashMap hashMap = new HashMap(); - hashMap.put("7", "文件夹"); - hashMap.put("1", "视频"); - JSONArray jSONArray = new JSONArray(); - Iterator entries = hashMap.entrySet().iterator(); - while (entries.hasNext()) { - Map.Entry entry = (Map.Entry) entries.next(); - String str2 = (String) entry.getValue(); - String sb2 = b + "/search?k=" + URLEncoder.encode(key) + "&t=" + (String) entry.getKey(); - Document doc = Jsoup.parse(OkHttpUtil.string(sb2, sHeaders())); - Elements Data = doc.select("van-row a"); - for (int i = 0; i < Data.size(); i++) { - Element next = Data.get(i); - String filename = next.select("template div").text(); - Pattern pattern = Pattern.compile("(时间: \\S+)"); - Matcher matcher = pattern.matcher(filename); - if (!matcher.find()) - continue; - String remark = matcher.group(1); - if (filename.contains(key)) { - JSONObject v = new JSONObject(); - String id = next.attr("href"); - String title = "[" + str2 + "]" + filename; - v.put("vod_id", id); - v.put("vod_name", title); - v.put("remark", remark); - v.put("vod_pic", "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000"); - jSONArray.put(v); - } - } - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("list", jSONArray); - return jSONObject2.toString(); - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Alist.java b/TVBox_Java/spider/Alist.java deleted file mode 100644 index aa7ecac..0000000 --- a/TVBox_Java/spider/Alist.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONObject; - -import okhttp3.Call; - -public class Alist extends Spider { - private String ext; - - public String categoryContent(String tid, String pg, boolean filter, HashMap hashMap) { - try { - String url = this.ext + "/api/public/path"; - JSONObject params = new JSONObject(); - params.put("path", tid); - - JSONArray jSONArray2 = new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, params.toString(), new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - try { - JSONObject retval = new JSONObject(response); - JSONArray list = retval.getJSONObject("data").getJSONArray("files"); - for (int i =0; i < list.length(); ++i){ - JSONObject o = list.getJSONObject(i); - String pic = o.getString("thumbnail"); - if(pic.isEmpty()){ - pic = "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png"; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", tid + (tid.charAt(tid.length()-1) == '/' ? "" : "/") + o.getString("name")); - jSONObject2.put("vod_name", o.getString("name")); - jSONObject2.put("vod_pic", pic); - jSONObject2.put("vod_tag",o.getInt("type")==1 ? "folder" : "file" ); - jSONObject2.put("vod_remarks", o.getInt("type")==1 ? "文件夹" : "文件"); - jSONArray2.put(jSONObject2); - - } - }catch (Exception e){ - e.printStackTrace(); - } - } - }); - - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("page", 1); - jSONObject3.put("pagecount", 1); - jSONObject3.put("limit", jSONArray2.length()); - jSONObject3.put("total", jSONArray2.length()); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public String detailContent(List ids) { - try - { - String filename = ids.get(0); - String url = this.ext + "/api/public/path"; - JSONObject params = new JSONObject(); - params.put("path", filename); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, params.toString(), new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - try { - JSONObject retval = new JSONObject(response); - JSONArray files = retval.getJSONObject("data").getJSONArray("files"); - for (int i =0; i < files.length(); ++i){ - JSONObject o = files.getJSONObject(i); - String url = o.getString("url"); - if(url.indexOf("//") ==0){ - url = "http:"+url; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", filename + "/" + o.getString("name")); - jSONObject2.put("vod_name", o.getString("name")); - jSONObject2.put("vod_pic", o.getString("thumbnail")); - jSONObject2.put("vod_tag",o.getInt("type")==1 ? "folder" : "file" ); - jSONObject2.put("vod_play_from", "播放"); - jSONObject2.put("vod_play_url", o.getString("name")+"$"+url); - list.put(jSONObject2); - - } - }catch (Exception e){ - e.printStackTrace(); - } - } - }); - - result.put("list", list); - return result.toString(); - } - catch (Exception e){ - e.printStackTrace(); - } - return ""; - - } - - - String fileTime(long time, String fmt) { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(time); - Date date = calendar.getTime(); - SimpleDateFormat sdf = new SimpleDateFormat(fmt); - return sdf.format(date); - } - - public String homeContent(boolean z) { - try { - JSONArray classes = new JSONArray(); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", "/"); - newCls.put("type_name", "Alist"); - newCls.put("type_flag", "1"); // 1 列表形式的文件夹 2 缩略图 0 或者不存在 表示正常 - classes.put(newCls); - - JSONArray jSONArray3 = new JSONArray(); - - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("class", classes); - if(z) { - jSONObject4.put("filters", new JSONObject("{}")); - } - return jSONObject4.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public void init(Context context, String ext){ - Alist.super.init(context); - this.ext = ext; - } - - public String playerContent(String str, String str2, List list) { - try{ - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", str2); - return result.toString(); - }catch (Exception e){ - e.printStackTrace(); - } - return ""; - } - - public String searchContent(String str, boolean z) { - try { - return ""; - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - -} \ No newline at end of file diff --git a/TVBox_Java/spider/Anfuns.java b/TVBox_Java/spider/Anfuns.java deleted file mode 100644 index d0368c5..0000000 --- a/TVBox_Java/spider/Anfuns.java +++ /dev/null @@ -1,376 +0,0 @@ -package com.github.catvod.spider; - - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Anfuns extends Spider { - private static final String siteUrl = "https://www.anfuns.cc"; - private static final String siteHost = "www.anfuns.cc"; - private JSONObject filterConfig; - private String cookie=""; - private String referer=""; - - - - @Override - public void init(Context context) { - super.init(context); - try { - filterConfig = new JSONObject("{\"1\":[{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"最热\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"最热\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"最热\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"最热\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - - - - protected HashMap getHeaders(String url, String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(ref.length()>0){ - headers.put("Referer", ref); - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - - protected HashMap getHeaders2(String url,String ref) { - HashMap headers = new HashMap<>(); - String ss = url.replace("https://","").split("/")[0]; - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Authority", ss); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - if (ref.contains("ref")){ - headers.put("Referer", ref.replace("ref:","")); - } else if (ref.contains("origin")){ - headers.put("Origin", ref.replace("origin:","")); - } - return headers; - } - - - protected void getCookie(){ - cookie=""; - String cookieurl="https://www.anfuns.cc/verify/index.html"; - Map> cookies = new HashMap<>(); - OkHttpUtil.string(cookieurl,getHeaders(cookieurl,""),cookies); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = TextUtils.join(";",entry.getValue()); - break; - } - } - } - - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl,referer))); - referer=siteUrl+"/"; - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - String catestr ="{\"新旧番剧\": \"1\",\"蓝光无修\": \"2\",\"动漫剧场\": \"3\",\"欧美动漫\": \"4\"}"; - JSONObject catedef = new JSONObject(catestr); - Iterator it = catedef.keys(); - while(it.hasNext()){ - JSONObject jsonObject = new JSONObject(); - String key =(String) it.next(); - jsonObject.put("type_name", key); - jsonObject.put("type_id", catedef.getString(key)); - classes.put(jsonObject); - } - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - try { - Element homeList = doc.select("ul.hl-vod-list.swiper-wrapper").get(0); - Elements list = homeList.select("li"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("a").attr("title"); - String cover = vod.selectFirst("a" ).attr("data-original"); - String remark = vod.selectFirst(" a > div.hl-pic-text > span").text(); - String id =vod.selectFirst("a").attr("href"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/show/"+tid+"---{year}/by/{order}/page/"+pg+".html" ; - if (extend != null && extend.size() > 0 ) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url=url.replace("{"+key+"}", value); - } - } - } - for (int i=0 ;i<2;i++) { - if (url.contains("{year}")) { - url = url.replace("{year}", ""); - } else if (url.contains("{order}")) { - url = url.replace("/by/{order}", ""); - } - } - String html = OkHttpUtil.string(url, getHeaders(url,referer)); - referer = url; - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("li.hl-list-item"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("a").attr("title"); - String cover = vod.selectFirst("a" ).attr("data-original"); - String remark = vod.selectFirst(" a > div.hl-pic-text > span").text(); - String id = vod.selectFirst("a").attr("href"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - int page =Integer.parseInt(pg); - result.put("page", page); - result.put("pagecount", videos.length()== 36 ? page + 1 : page); - result.put("limit", 36); - result.put("total",Integer.MAX_VALUE ); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + ids.get(0); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url,referer))); - referer=url; - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - String cover = doc.selectFirst("span.hl-item-thumb").attr("data-original"); - String title = doc.selectFirst("div.hl-dc-sub").text(); - String desc = doc.selectFirst("a.hl-data-menu").text(); - String vid = ids.get(0); - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("vod_content", desc); - Map vod_play = new LinkedHashMap<>(); - Elements sources = doc.select("div.hl-plays-wrap > div > a"); - Elements sourceList = doc.select("div.hl-tabs-box.hl-fadeIn"); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.attr("alt"); - String playList = ""; - Element playListB = sourceList.get(i); - Elements playListA = playListB.select("li.hl-col-xs-4"); - List vodItems = new ArrayList<>(); - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - String playURL = vod.selectFirst("a").attr("href"); - String playUrlName = vod.selectFirst("a").text(); - vodItems.add(playUrlName + "$" + playURL); - } - if (vodItems.size() > 0) { - playList = TextUtils.join("#", vodItems); - vod_play.put(sourceName, playList); - } - } - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - getCookie(); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String url = siteUrl + id ; - String htmlplay = OkHttpUtil.string(url, getHeaders(url,referer)); - Document doc = Jsoup.parse(htmlplay); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - String urlreq=""; - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).toString(); - if (scContent.contains("var player_aaaa=")) { - int start = scContent.indexOf("{"); - int end = scContent.lastIndexOf("}") + 1; - String urltmp = scContent.substring(start, end); - JSONObject urltmpobj = new JSONObject(urltmp); - String urlraw = urltmpobj.getString("url"); - String urlnext= urltmpobj.optString("link_next"); - urlreq = new String(Base64.decode(urlraw.getBytes(), Base64.DEFAULT)); - urlreq = urlreq.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); - urlreq = URLDecoder.decode(urlreq); - if(urlreq.contains("yanm")){ - urlreq = "https://api.peizq.online/play/anfuns.php?url="+urlreq+"&next=//www.anfuns.cc"+urlnext; - }else { - if(urlreq.contains("%u")){ - start = urlreq.indexOf("%u"); - end = urlreq.lastIndexOf("%u")+6; - String urlreqtmp =urlreq.substring(start,end); - String urlreqtmps = urlreq.substring(0,start); - String urlreqtmpe = urlreq.substring(end,urlreq.length()); - urlreqtmp = urlreqtmp.replace("%","\\"); - Pattern pattern = Pattern.compile("(\\\\u(\\w{4}))"); - Matcher matcher = pattern.matcher(urlreqtmp); - while (matcher.find()) { - String unicodeFull = matcher.group(1); - String unicodeNum = matcher.group(2); - char singleChar = (char) Integer.parseInt(unicodeNum, 16); - urlreqtmp = urlreqtmp.replace(unicodeFull, singleChar + ""); - } - urlreq = urlreqtmps+urlreqtmp+urlreqtmpe; - } - urlreq = urlreq+"&next=//www.anfuns.cc"+urlnext; - } - break; - } - } - - if(urlreq.contains("yanm")){ - String htmlyanm = OkHttpUtil.string(urlreq, getHeaders2(urlreq,"ref:https://www.anfuns.cc/")); - Document docyanm = Jsoup.parse(htmlyanm); - Elements allScriptyanm = docyanm.select("script"); - String urlreqyanm=""; - for (int i = 0; i < allScriptyanm.size(); i++) { - String scContent = allScriptyanm.get(i).toString(); - if (scContent.contains("var config =")) { - int start = scContent.indexOf("getrandom('")+11; - int end = scContent.indexOf("'),") ; - String getrandom = scContent.substring(start,end); - String getrandomb64 = new String(Base64.decode(getrandom.substring(8,getrandom.length()).getBytes(), Base64.DEFAULT)); - String urlreqyanmtmp = URLDecoder.decode(getrandomb64.substring(8,getrandomb64.length()-8)); - Map> respHeaders = new HashMap<>(); - OkHttpUtil.stringNoRedirect(urlreqyanmtmp, getHeaders2(urlreqyanmtmp,"origin:https://api.peizq.online"), respHeaders); - String redirect = OkHttpUtil.getRedirectLocation(respHeaders); - String m3u8raw = OkHttpUtil.string(redirect, getHeaders2(redirect,"origin:https://api.peizq.online")); - start = m3u8raw.indexOf("/hls/"); - String m3ubrawf1tmp =m3u8raw.substring(start,start+200); - end = m3ubrawf1tmp.indexOf("#EXTINF"); - String m3ubrawf1req="https://fata.peizq.online"+m3ubrawf1tmp.substring(0,end); - OkHttpUtil.stringNoRedirect(m3ubrawf1req, getHeaders2(m3ubrawf1req,"origin:https://api.peizq.online"), respHeaders); - String m3ubrawf1 = OkHttpUtil.getRedirectLocation(respHeaders); - m3u8raw = m3u8raw.replace(m3u8raw.substring(start,start+end),m3ubrawf1); - String realm3u8b64=Base64.encodeToString(m3u8raw.getBytes(), 2); - result.put("url", "data:application/vnd.apple.mpegurl;base64,"+realm3u8b64); - result.put("header", new JSONObject(getHeaders2(m3ubrawf1,"origin:https://api.peizq.online")).toString()); - break; - } - } - }else { - Map> respHeaders = new HashMap<>(); - OkHttpUtil.stringNoRedirect(urlreq, getHeaders2(urlreq,""), respHeaders); - String redirect = OkHttpUtil.getRedirectLocation(respHeaders); - result.put("url", redirect); - result.put("header", getHeaders2(redirect,"").toString()); - } - result.put("parse", 0); - result.put("playUrl", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = "https://www.anfuns.cc/search.html?wd="+URLEncoder.encode(key)+"&submit="; - Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders(url,referer))); - referer=url; - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - Elements sourceList = doc.select("ul.hl-one-list"); - if(sourceList.size()>0){ - for (int i = 0; i < sourceList.size(); i++) { - Element sources = sourceList.get(i); - JSONObject v = new JSONObject(); - String cover = sources.selectFirst("a").attr("data-original"); - String title = sources.selectFirst("a").attr("title"); - String id =sources.selectFirst("a").attr("href"); - String remarks =sources.selectFirst("span.hl-lc-1.remarks ").text(); - v.put("vod_name", title); - v.put("vod_remarks", remarks); - v.put("vod_id", id); - v.put("vod_pic", cover); - videos.put(v); - } - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Anime1.java b/TVBox_Java/spider/Anime1.java deleted file mode 100644 index 034c3d5..0000000 --- a/TVBox_Java/spider/Anime1.java +++ /dev/null @@ -1,460 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import okhttp3.Call; -import okhttp3.Response; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.Calendar; -import java.net.URLDecoder; - - - - -public class Anime1 extends Spider { - - private String cookies = ""; - private String authority = ""; - private JSONArray srcArray = new JSONArray(); - - @Override - public void init(Context context) { - super.init(context); - } - - @Override - public String homeContent(boolean filter) { - try { - long a = System.currentTimeMillis(); - String srcurl = "https://d1zquzjgwo9yb.cloudfront.net/?_=" + a; - String srcOrignstr = OkHttpUtil.string(srcurl, getHeaders3(srcurl)); - JSONArray srcOrign = new JSONArray(srcOrignstr); - int srclen = srcOrign.length(); - for (int i = 0; i < srclen; i++){ - JSONObject subobj= new JSONObject(); - subobj.put("link", srcOrign.getJSONArray(i).get(0).toString()); - subobj.put("name", srcOrign.getJSONArray(i).get(1).toString()); - subobj.put("hit" , srcOrign.getJSONArray(i).get(2).toString()); - subobj.put("year", srcOrign.getJSONArray(i).get(3).toString()); - subobj.put("season", srcOrign.getJSONArray(i).get(4).toString()); - subobj.put("team", srcOrign.getJSONArray(i).get(5).toString()); - srcArray.put(subobj); - } - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - Calendar cal = Calendar.getInstance(); - int doy = cal.get(Calendar.YEAR) + 1; - for (int i = 0; i < 8; i++) { - JSONObject cateobj = new JSONObject(); - String istr = Integer.toString(i); - if (i == 0) { - cateobj.put("type_name", "最近更新"); - cateobj.put("type_id", istr); - } else if (i < 7) { - doy = doy - 1; - String year = Integer.toString(doy); - cateobj.put("type_name", year); - cateobj.put("type_id", istr); - } else { - cateobj.put("type_name", "更早"); - cateobj.put("type_id", istr); - } - classes.put(cateobj); - } - result.put("class", classes); - JSONArray videos = new JSONArray(); - for (int i = 0; i < 10; i++) { - JSONObject v = new JSONObject(); - String id = srcArray.getJSONObject(i).getString("link"); - String name = srcArray.getJSONObject(i).getString("name"); - String mark = srcArray.getJSONObject(i).getString("hit"); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic","https://sta.anicdn.com/playerImg/8.jpg"); - v.put("vod_remarks", mark); - videos.put(v); - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - JSONArray srccate = new JSONArray(); - int cateId = Integer.parseInt( tid ); - int srclen = srcArray.length(); - Calendar cal = Calendar.getInstance(); - int doy = cal.get(Calendar.YEAR) + 1; - if( cateId==0 ){ - for (int i = 0; i < 100; i++) { - JSONObject subobj = srcArray.getJSONObject(i); - srccate.put(subobj); - } - } else if( cateId > 0 && cateId < 7 ){ - int yearchk = doy - cateId; - for (int i = 0; i < srclen; i++) { - JSONObject subobj = srcArray.getJSONObject(i); - String yystr = subobj.getString("year"); - if(yystr.contains("/")){ - yystr=yystr.substring(5); - } - int yy = Integer.parseInt( yystr ); - if( yy==yearchk ){ - srccate.put(subobj); - } - } - } else { - int yy = doy - 6 ; - for (int i = 0; i < srclen; i++) { - JSONObject subobj = srcArray.getJSONObject(i); - String yearchk = subobj.getString("year"); - if(yearchk.contains("/")){ - yearchk=yearchk.substring(5); - } - int yearint = Integer.parseInt( yearchk ); - if(yearint < yy){ - srccate.put(subobj); - } - } - } - JSONArray videos = new JSONArray(); - for (int i = 0; i < srccate.length() ; i++) { - JSONObject v = new JSONObject(); - String id = srccate.getJSONObject(i).getString("link"); - String name = srccate.getJSONObject(i).getString("name"); - String mark = srccate.getJSONObject(i).getString("hit"); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", "https://sta.anicdn.com/playerImg/8.jpg"); - v.put("vod_remarks", mark); - videos.put(v); - } - pg ="1"; - JSONObject result = new JSONObject(); - int limit = 20; - int page = Integer.parseInt(pg); - result.put("page", page); - int pageCount = videos.length() == limit ? page + 1 : page; - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String id = ids.get(0); - JSONObject dtinfo = new JSONObject(); - for (int i = 0 ; i < srcArray.length() ; i++) { - JSONObject dtobj = srcArray.getJSONObject(i); - String objid = dtobj.getString("link"); - if( objid.equals(id) ){ - dtinfo = dtobj ; - } - } - String title = dtinfo.getString("name"); - String mark = dtinfo.getString("hit"); - String year = dtinfo.getString("year"); - String season = dtinfo.getString("season"); - String team = dtinfo.getString("team"); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", "https://sta.anicdn.com/playerImg/8.jpg"); - vodList.put("vod_year", year); - vodList.put("type_name", season); - vodList.put("vod_area","日本" ); - vodList.put("vod_actor", team); - vodList.put("vod_content", mark); - - /** - * 播放源配置 - */ - String url = "https://anime1.me/?cat=" + id; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders2(url))); - String nextPage = ""; - Map vod_play_Order = new TreeMap<>(); - do { - Element nextPageEle = doc.selectFirst("div.nav-previous a"); - if( nextPageEle!=null ) { - nextPage = nextPageEle.attr("href"); - }else{ - nextPage =""; - } - Elements sources = doc.select("article"); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - Element sno =source.selectFirst("h2 > a"); - String sourceNameori =""; - if( sno!=null ) { - sourceNameori = sno.text().trim(); - }else { - Element sno2 =source.selectFirst("h2"); - if (sno2 != null) { - sourceNameori = sno2.text().trim(); - } else { - sourceNameori = "[No Title]"; - } - } - int st = sourceNameori.indexOf("[") + 1; - int ed = sourceNameori.indexOf("]"); - String sourceName = sourceNameori.substring(st, ed); - Elements playListA = source.select("div.vjscontainer video"); - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - String playURL = vod.attr("data-apireq"); - if (playURL.isEmpty()) { - continue; - } - if (playListA.size() > 1) { - if (j < 9) { - int jj = j + 1; - String nn = sourceName + "0" + Integer.toString(jj); - vod_play_Order.put(nn, playURL); - } else { - int jj = j + 1; - String nn = sourceName + Integer.toString(jj); - vod_play_Order.put(nn, playURL); - } - continue; - } - String regex=".*[a-zA-Z\\u4e00-\\u9fa5]+.*"; - Matcher m=Pattern.compile(regex).matcher(sourceName); - if ( m.matches() == true ){ - vod_play_Order.put(sourceName, playURL); - } else { - float count = Float.parseFloat(sourceName); - if(count < 100.0 ){ - String nnn = "0" + sourceName; - vod_play_Order.put(nnn, playURL); - }else { - vod_play_Order.put(sourceName, playURL); - } - } - } - } - if(nextPage != ""){ - doc = Jsoup.parse(OkHttpUtil.string(nextPage, getHeaders2(nextPage))); - } - }while(nextPage != ""); - String playList = ""; - List vodItems = new ArrayList<>(); - Set> entrySet = vod_play_Order.entrySet(); - for(Map.Entry entry : entrySet){ - String key = entry.getKey(); - String value = entry.getValue(); - String pl = key + "$" + value; - vodItems.add(pl); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - playList = "nothing here"; - Map vod_play = new TreeMap<>(); - vod_play.put("Anime1", playList); - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - cookies = ""; - authority = ""; - String vlink = id ; - String url = "https://v.anime1.me/api"; - JSONObject result = new JSONObject(); - String apireq = vlink; - String jsonreq = URLDecoder.decode(apireq,"UTF-8"); - HashMap reqpayload = new HashMap<>(); - reqpayload.put("d", jsonreq); - OkHttpUtil.post(OkHttpUtil.defaultClient(), url, reqpayload, getHeaders2(url), new OKCallBack.OKCallBackString() { - @Override - public String onParseResponse(Call call, Response response) { - try { - Map> respHeader = new HashMap<>(); - respHeader.clear(); - respHeader.putAll(response.headers().toMultimap()); - for (int i = 0; i < 3; i++) { - cookies = cookies + respHeader.get("set-cookie").get(i).split(";")[0]; - if ( i < 2 ) {cookies = cookies + ";";} - } - return response.body().string(); - } catch (IOException e) { - return ""; - } - } - - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String respbody) { - try { - JSONObject obj = new JSONObject(respbody); - JSONArray objarray = obj.getJSONArray("s"); - JSONObject obj2 = objarray.getJSONObject(0); - String videolink = obj2.getString("src"); - authority = videolink.split("/")[2]; - videolink = "https:" + videolink; - result.put("url", videolink); - } catch (JSONException unused) { - } - } - }); - result.put("header", new JSONObject(getHeaders1(url)).toString()); - result.put("parse", 0); - result.put("playUrl", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private HashMap getHeaders3(String url) { - HashMap headers = new HashMap<>(); - headers.put("Authority", "d1zquzjgwo9yb.cloudfront.net"); - headers.put("Accept","application/json, text/javascript, */*; q=0.01"); - headers.put("Accept-Encoding","gzip, deflate, br"); - headers.put("Accept-Language","zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6"); - headers.put("Origin","https://anime1.me"); - headers.put("Referer","https://anime1.me/"); - headers.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.134 YaBrowser/22.7.1.755 (beta) Yowser/2.5 Safari/537.36"); - headers.put("Sec-Fetch-Dest","empty"); - headers.put("Sec-Fetch-Mode","cors"); - headers.put("Sec-Fetch-Site","cross-site"); - headers.put("sec-ch-ua-mobile","?0"); - headers.put("sec-ch-ua-platform","\"Windows\""); - headers.put("sec-ch-ua"," \" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\" "); - return headers; - } - - private HashMap getHeaders2(String url) { - HashMap headers = new HashMap<>(); - headers.put("Authority", "v.anime1.me"); - headers.put("Accept","*/*"); - headers.put("Accept-Language","en,zh-TW;q=0.9,zh;q=0.8"); - headers.put("Origin","https://anime1.me"); - headers.put("Referer","https://anime1.me/"); - headers.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.134 YaBrowser/22.7.1.755 (beta) Yowser/2.5 Safari/537.36"); - headers.put("Sec-Fetch-Dest","empty"); - headers.put("Sec-Fetch-Mode","cors"); - headers.put("Sec-Fetch-Site","same-site"); - headers.put("sec-ch-ua-mobile","?0"); - headers.put("sec-ch-ua-platform","\"Windows\""); - headers.put("sec-ch-ua"," \" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\" "); - return headers; - } - - private HashMap getHeaders1(String url) { - HashMap headers = new HashMap<>(); - headers.put("Accept","*/*"); - headers.put("Accept-encoding", "identity;q=1, *;q=0"); - headers.put("Accept-language", "en,zh-TW;q=0.9,zh;q=0.8"); - headers.put("Referer", "https://anime1.me"); - headers.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.134 YaBrowser/22.7.1.755 (beta) Yowser/2.5 Safari/537.36"); - headers.put("Sec-Fetch-Dest","video"); - headers.put("Sec-Fetch-Mode","no-cors"); - headers.put("Sec-Fetch-Site","same-site"); - headers.put("sec-ch-ua-mobile","?0"); - headers.put("sec-ch-ua-platform","\"Windows\""); - headers.put("sec-ch-ua"," \" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\" "); - headers.put("Authority", authority); - headers.put("cookie", cookies); - return headers; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - JSONArray searchResult = new JSONArray(); - for (int i = 0; i < srcArray.length() ; i++) { - JSONObject srobj = srcArray.getJSONObject(i); - String kw = srobj.getString("name"); - if(kw.contains(key)) { - searchResult.put(srobj); - } - } - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.length() > 0) { - int ch = searchResult.length() < 10 ? searchResult.length() : 10 ; - for (int i = 0; i < ch ; i++) { - String id = searchResult.getJSONObject(i).getString("link"); - String name = searchResult.getJSONObject(i).getString("name"); - String mark = searchResult.getJSONObject(i).getString("hit"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", "https://sta.anicdn.com/playerImg/8.jpg"); - v.put("vod_remarks", mark); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - -} diff --git a/TVBox_Java/spider/AppTT.java b/TVBox_Java/spider/AppTT.java deleted file mode 100644 index 7f612d9..0000000 --- a/TVBox_Java/spider/AppTT.java +++ /dev/null @@ -1,332 +0,0 @@ -package com.github.catvod.spider; - -import static com.github.catvod.utils.Misc.CharsetUTF8; - -import android.content.Context; -import android.os.Build; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Set; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - - -/** - * Author: @SDL - */ -public class AppTT extends Spider { - private static final String KEY = "SRK#e%4UYtU#KiEo*vsPqpr0cC4bxAQW"; - private static final String IV = "o6sYmm*x5hn#rcCt"; - private static final String siteUrl = "http://110.42.1.95:7788"; - - private String uAgent = "Dalvik/2.1.0 (Linux; U; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")"; - - private HashMap getHeaders(String url) { - HashMap hashMap = new HashMap(); - hashMap.put("User-Agent", getUA(url)); - return hashMap; - } - - private String getUA(String str) { - if (!(str.contains("api.php/app") || str.contains("xgapp"))) { - if (!str.contains("freekan")) { - if (!(str.contains("zsb") || str.contains("fkxs") || str.contains("xays") || str.contains("xcys") || str.contains("szys") || str.contains("dxys") || str.contains("ytys"))) { - if (!str.contains("qnys")) { - return str.contains(".vod") ? "okhttp/4.1.0" : "Dalvik/2.1.0"; - } - } - return "Dart/2.15 (dart:io)"; - } - } - return "Dart/2.14 (dart:io)"; - } - - @Override - public void init(Context context) { - super.init(context); - } - - @Override - public String homeContent(boolean filter) { - try { - - JSONArray classes = new JSONArray(); - JSONObject jSONObject1 = new JSONObject(); - jSONObject1.put("type_id", 1); - jSONObject1.put("type_name", "电影"); - classes.put(jSONObject1); - - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("type_id", 2); - jSONObject2.put("type_name", "连续剧"); - classes.put(jSONObject2); - - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("type_id", 3); - jSONObject3.put("type_name", "动漫"); - classes.put(jSONObject3); - - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("type_id", 4); - jSONObject4.put("type_name", "综艺"); - classes.put(jSONObject4); - - JSONObject result = new JSONObject(); - result.put("class", classes); - - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - JSONArray videos = new JSONArray(); - try { - String url = siteUrl + "/api.php/v1.vod/curnavitemlist?type_id=0"; - - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jsonObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("swiperList"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject blockObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", blockObj.getString("vod_id")); - v.put("vod_name", blockObj.getString("vod_name")); - v.put("vod_pic", blockObj.getString("vod_pic")); - v.put("vod_remarks", blockObj.getString("vod_remarks")); - videos.put(v); - } - } catch (Exception e) { - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/api.php/v1.vod?type=" + tid + "&page=" + pg + "&pagesize=20"; -// Set keys = extend.keySet(); -// for (String key : keys) { -// String val = extend.get(key).trim(); -// if (val.length() == 0) -// continue; -// url += "&" + key + "=" + URLEncoder.encode(val); -// } - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject dataObject = new JSONObject(decryptResponse(content)).getJSONObject("data"); - JSONArray jsonArray = dataObject.getJSONArray("list"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - JSONObject result = new JSONObject(); - int limit = 20; - int page = dataObject.getInt("page"); - int total = dataObject.getInt("total"); - int pageCount = videos.length(); - result.put("page", page); - result.put("pagecount", total / 20); - result.put("limit", limit); - result.put("total", total); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + "/api.php/v1.vod/detilldata?vod_id=" + ids.get(0); - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONObject vObj = dataObject.getJSONObject("data"); - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - - JSONObject videoInfo = vObj.getJSONObject("videoInfo"); - - JSONObject vodAtom = new JSONObject(); - String title = videoInfo.getString("vod_name"); - vodAtom.put("vod_id", videoInfo.getString("vod_id")); - vodAtom.put("vod_name", videoInfo.getString("vod_name")); - vodAtom.put("vod_pic", videoInfo.getString("vod_pic")); - // vodAtom.put("type_name", videoInfo.getString("subCategory")); - vodAtom.put("vod_year", videoInfo.getString("vod_year")); - vodAtom.put("vod_area", videoInfo.getString("vod_area")); - vodAtom.put("vod_remarks", videoInfo.getString("vod_remarks")); - vodAtom.put("vod_actor", videoInfo.getString("vod_actor")); - vodAtom.put("vod_director", videoInfo.getString("vod_director")); - vodAtom.put("vod_content", videoInfo.getString("vod_content").trim()); - - - JSONArray episodes = vObj.getJSONArray("source"); - LinkedHashMap> playlist = new LinkedHashMap<>(); - String show = null; - String parse = null; - for (int i = 0; i < episodes.length(); i++) { - JSONArray playurls = episodes.getJSONObject(i).getJSONArray("list"); - - show = episodes.getJSONObject(i).getJSONObject("player_info").getString("show"); - parse = episodes.getJSONObject(i).getJSONObject("player_info").getString("parse"); - ArrayList urls = playlist.get(show); - if (urls == null) { - urls = new ArrayList<>(); - playlist.put(show, urls); - } - - for (int j = 0; j < playurls.length(); j++) { - if (playurls.get(j).toString().contains(".m3u8") || playurls.get(j).toString().contains(".mp4")) { - urls.add(playurls.get(j).toString()); - } else { - String name = playurls.get(j).toString().split("\\$")[0]; - String pid = playurls.get(j).toString().split("\\$")[1]; - - urls.add(name + "$" + parse + pid); - } - - - } - } - - - String vod_play_from = TextUtils.join("$$$", playlist.keySet()); - StringBuilder sb = new StringBuilder(); - Iterator> iter = playlist.values().iterator(); - short fromSize = (short) playlist.size(); - while (iter.hasNext()) { - fromSize--; - ArrayList urls = iter.next(); - sb.append(TextUtils.join("#", urls)); - if (fromSize > 0) - sb.append("$$$"); - } - vodAtom.put("vod_play_from", vod_play_from); - vodAtom.put("vod_play_url", sb.toString()); - list.put(vodAtom); - result.put("list", list); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String jxurl = null; - if (id.contains(".m3u8") || id.toString().contains(".mp4")) { - jxurl = id; - } else { - String url = id + "&sc=1&token=" + getToken(); - String content = OkHttpUtil.string(url, getHeaders(url)); - String decryptcontent = decrypt(content, "UTF-8", KEY, IV); - jxurl = new JSONObject(decryptcontent).getString("url"); - } - - - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", jxurl); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = siteUrl + "/api.php/v1.vod?wd=" + URLEncoder.encode(key); - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = dataObject.getJSONObject("data").getJSONArray("list"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - protected String decryptResponse(String src) { - return src; - } - - public String decrypt(String str, String str2, String str3, String str4) { - try { - SecretKeySpec secretKeySpec = new SecretKeySpec(str3.getBytes("UTF-8"), "AES"); - Cipher instance = Cipher.getInstance("AES/CTR/PKCS5Padding"); - instance.init(2, secretKeySpec, new IvParameterSpec(str4.getBytes())); - return new String(instance.doFinal(Base64.decode(str, 0)), str2); - } catch (Exception unused) { - return null; - } - } - - public String encrypt(String str, String str2, String str3, String str4) { - try { - Cipher instance = Cipher.getInstance("AES/CTR/PKCS5Padding"); - instance.init(1, new SecretKeySpec(str3.getBytes(), "AES"), new IvParameterSpec(str4.getBytes())); - return Base64.encodeToString(instance.doFinal(str.getBytes(str2)), 0); - } catch (Exception unused) { - return null; - } - } - - public String getToken() { - return encrypt(Long.valueOf(new Date().getTime()).toString(), "UTF-8", KEY, IV); - } -} diff --git a/TVBox_Java/spider/AppYs.java b/TVBox_Java/spider/AppYs.java deleted file mode 100644 index 051eaef..0000000 --- a/TVBox_Java/spider/AppYs.java +++ /dev/null @@ -1,1124 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * M浏览器中的App影视 - *

- * Author: 群友 不负此生 - */ -public class AppYs extends Spider { - - private String extString = ""; - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - this.extString = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - String url = getCateUrl(extString); - JSONArray jsonArray = null; - if (!url.isEmpty()) { - SpiderDebug.log(url); - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject obj = new JSONObject(json); - if (obj.has("list") && obj.get("list") instanceof JSONArray) { - jsonArray = obj.getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) { - jsonArray = obj.getJSONObject("data").getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONArray) { - jsonArray = obj.getJSONArray("data"); - } - } else { // 通过filter列表读分类 - String filterStr = getFilterTypes(url, null); - String[] classes = filterStr.split("\n")[0].split("\\+"); - jsonArray = new JSONArray(); - for (int i = 1; i < classes.length; i++) { - String[] kv = classes[i].trim().split("="); - if (kv.length < 2) - continue; - JSONObject newCls = new JSONObject(); - newCls.put("type_name", kv[0].trim()); - newCls.put("type_id", kv[1].trim()); - jsonArray.put(newCls); - } - } - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - if (jsonArray != null) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - String typeName = jObj.getString("type_name"); - if (isBan(typeName)) - continue; - String typeId = jObj.getString("type_id"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - JSONObject typeExtend = jObj.optJSONObject("type_extend"); - if (filter) { - String filterStr = getFilterTypes(url, typeExtend); - String[] filters = filterStr.split("\n"); - JSONArray filterArr = new JSONArray(); - for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) { - String l = filters[k].trim(); - if (l.isEmpty()) - continue; - String[] oneLine = l.split("\\+"); - String type = oneLine[0].trim(); - String typeN = type; - if (type.contains("筛选")) { - type = type.replace("筛选", ""); - if (type.equals("class")) - typeN = "类型"; - else if (type.equals("area")) - typeN = "地区"; - else if (type.equals("lang")) - typeN = "语言"; - else if (type.equals("year")) - typeN = "年份"; - } - JSONObject jOne = new JSONObject(); - jOne.put("key", type); - jOne.put("name", typeN); - JSONArray valueArr = new JSONArray(); - for (int j = 1; j < oneLine.length; j++) { - JSONObject kvo = new JSONObject(); - String kv = oneLine[j].trim(); - int sp = kv.indexOf("="); - if (sp == -1) { - if (isBan(kv)) - continue; - kvo.put("n", kv); - kvo.put("v", kv); - } else { - String n = kv.substring(0, sp); - if (isBan(n)) - continue; - kvo.put("n", n.trim()); - kvo.put("v", kv.substring(sp + 1).trim()); - } - valueArr.put(kvo); - } - jOne.put("value", valueArr); - filterArr.put(jOne); - } - if (!result.has("filters")) { - result.put("filters", new JSONObject()); - } - result.getJSONObject("filters").put(typeId, filterArr); - } - classes.put(newCls); - } - } - result.put("class", classes); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - String apiUrl = extString; - String url = getRecommendUrl(apiUrl); - boolean isTV = false; - if (url.isEmpty()) { - url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start="; - isTV = true; - } - SpiderDebug.log(url); - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject obj = new JSONObject(json); - JSONArray videos = new JSONArray(); - if (isTV) { - JSONArray jsonArray = obj.getJSONArray("data"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("nextlink")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("state")); - videos.put(v); - } - } else { - ArrayList arrays = new ArrayList<>(); - findJsonArray(obj, "vlist", arrays); - if (arrays.isEmpty()) { - findJsonArray(obj, "vod_list", arrays); - } - List ids = new ArrayList<>(); - for (JSONArray jsonArray : arrays) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - String vid = vObj.getString("vod_id"); - if (ids.contains(vid)) - continue; - ids.add(vid); - JSONObject v = new JSONObject(); - v.put("vod_id", vid); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String apiUrl = extString; - String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl); - url = url.replace("#PN#", pg); - url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : ""); - url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : ""); - url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : ""); - url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : ""); - url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : ""); - SpiderDebug.log(url); - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject obj = new JSONObject(json); - int totalPg = Integer.MAX_VALUE; - try { - if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) { - totalPg = obj.getInt("totalpage"); - } else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) { - totalPg = obj.getInt("pagecount"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && - (obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer && - obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) { - int limit = obj.getJSONObject("data").getInt("limit"); - int total = obj.getJSONObject("data").getInt("total"); - totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - - JSONArray jsonArray = null; - JSONArray videos = new JSONArray(); - if (obj.has("list") && obj.get("list") instanceof JSONArray) { - jsonArray = obj.getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) { - jsonArray = obj.getJSONObject("data").getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONArray) { - jsonArray = obj.getJSONArray("data"); - } - if (jsonArray != null) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - if (vObj.has("vod_id")) { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } else { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("nextlink")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("state")); - videos.put(v); - } - } - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", totalPg); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String apiUrl = extString; - String url = getPlayUrlPrefix(apiUrl) + ids.get(0); - SpiderDebug.log(url); - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject obj = new JSONObject(json); - JSONObject result = new JSONObject(); - JSONObject vod = new JSONObject(); - genPlayList(apiUrl, obj, json, vod, ids.get(0)); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String apiUrl = extString; - String url = getSearchUrl(apiUrl, URLEncoder.encode(key)); - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject obj = new JSONObject(json); - JSONArray jsonArray = null; - JSONArray videos = new JSONArray(); - if (obj.has("list") && obj.get("list") instanceof JSONArray) { - jsonArray = obj.getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) { - jsonArray = obj.getJSONObject("data").getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONArray) { - jsonArray = obj.getJSONArray("data"); - } - if (jsonArray != null) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - if (vObj.has("vod_id")) { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } else { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("nextlink")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("state")); - videos.put(v); - } - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String apiUrl = extString; - String parseUrl = getParseUrl(apiUrl, flag); - String playerUrl = getPlayerUrl(apiUrl, parseUrl, id); - JSONObject result = new JSONObject(); - getFinalVideo(playerUrl, result); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private void findJsonArray(JSONObject obj, String match, ArrayList result) { - Iterator keys = obj.keys(); - while (keys.hasNext()) { - String k = keys.next(); - try { - Object o = obj.get(k); - if (k.equals(match) && o instanceof JSONArray) - result.add((JSONArray) o); - if (o instanceof JSONObject) { - findJsonArray((JSONObject) o, match, result); - } else if (o instanceof JSONArray) { - JSONArray array = (JSONArray) o; - for (int i = 0; i < array.length(); i++) { - findJsonArray(array.getJSONObject(i), match, result); - } - } - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - } - - private String jsonArr2Str(JSONArray array) { - try { - ArrayList strings = new ArrayList<>(); - for (int i = 0; i < array.length(); i++) { - strings.add(array.getString(i)); - } - return TextUtils.join(",", strings); - } catch (JSONException e) { - } - return ""; - } - - private static HashMap fakeVips = null; - private static final Object lock = new Object(); - - private static String stopVipFlag(String flag) { - synchronized (lock) { - if (fakeVips == null) { - fakeVips = new HashMap<>(); - fakeVips.put("youku", "优酷M"); - fakeVips.put("qq", "腾讯M"); - fakeVips.put("iqiyi", "爱奇艺M"); - fakeVips.put("qiyi", "奇艺M"); - fakeVips.put("letv", "乐视M"); - fakeVips.put("sohu", "搜狐M"); - fakeVips.put("tudou", "土豆M"); - fakeVips.put("pptv", "PPTVM"); - fakeVips.put("mgtv", "芒果TVM"); - fakeVips.put("wasu", "华数M"); - fakeVips.put("bilibili", "哔哩M"); - } - if (fakeVips.containsKey(flag)) { - return fakeVips.get(flag); - } - return flag; - } - } - - private HashMap getHeaders(String URL) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", UA(URL)); - return headers; - } - - private boolean isBan(String key) { - return key.equals("伦理") || key.equals("情色") || key.equals("福利"); - } - - // M 扩展方法 - - // ######重组搜索 - private String getSearchUrl(String URL, String KEY) { - if (URL.contains(".vod")) { - if (URL.contains("iopenyun.com")) { - return URL + "/list?wd=" + KEY + "&page="; - } else { - return URL + "?wd=" + KEY + "&page="; - } - } else if (URL.contains("api.php/app") || URL.contains("xgapp")) { - return URL + "search?text=" + KEY + "&pg="; - } else if (urlPattern1.matcher(URL).find()) { - if (URL.contains("esellauto") - || URL.contains("1.14.63.101") - || URL.contains("zjys") - || URL.contains("dcd") - || URL.contains("lxue") - || URL.contains("weetai.cn") - || URL.contains("haokanju1") - || URL.contains("fit:8") - || URL.contains("zjj.life") - || URL.contains("love9989") - || URL.contains("8d8q") - || URL.contains("lk.pxun") - || URL.contains("hgyx") - || URL.contains("521x5") - || URL.contains("lxyyy") - || URL.contains("0818tv") - || URL.contains("diyoui") - || URL.contains("diliktv") - || URL.contains("ppzhu") - || URL.contains("aitesucai") - || URL.contains("zz.ci") - || URL.contains("chxjon") - || URL.contains("watchmi") - || URL.contains("vipbp") - || URL.contains("bhtv") - || URL.contains("xfykl")) { - return URL + "?ac=list&" + "wd=" + KEY + "&page="; - } else { - return URL + "?ac=list&" + "zm=" + KEY + "&page="; - } - } - return ""; - } - - // ######UA - private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod"); - private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod"); - private static final Pattern parsePattern = Pattern.compile("/.+\\?.+="); - private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)="); - private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*"); - private static final Pattern[] parseMatchForDotVod = new Pattern[]{ - Pattern.compile("jx\\.+huimaojia\\.+com/player"), - Pattern.compile("py\\.+789pan\\.+cn/player/tm\\.php\\?url="), - Pattern.compile("ztys\\.+waruanzy\\.+com/player/\\?url="), - Pattern.compile("yingshi\\.+waruanzy\\.+com/789pan/\\?url="), - Pattern.compile("vip\\.+parwix\\.+com:4433/player/\\?url="), - Pattern.compile("api\\.+cxitco\\.+cn"), - Pattern.compile("/vip\\.+renrenmi.cc"), - Pattern.compile("yanbing\\.+parwix\\.+com:4433/player"), - Pattern.compile("json\\.+cantin\\.+cc/apijson\\.php"), - Pattern.compile("ffdm\\.+miaoletv\\.+com/\\?url="), - Pattern.compile("vip\\.+sylwl\\.+cn/api/\\?key="), - Pattern.compile("jx\\.+dikotv\\.+com/\\?url="), - Pattern.compile("zly\\.+xjqxz\\.+top/player/\\?url="), - Pattern.compile("5znn\\.+xyz/m3u8\\.+php"), - Pattern.compile("uid=1735&my="), - Pattern.compile("api\\.+xkvideo\\.+design/m3u8\\.+php\\?url="), - Pattern.compile("play\\.+szbodankyy\\.+com/xxoocnmb"), - Pattern.compile("vip\\.+fj6080\\.+xyz/player/\\?url="), - Pattern.compile("a\\.+dxzj88\\.+com/jiexi"), - Pattern.compile("host\\.+q-q\\.+wang/api"), - Pattern.compile("保佑") - }; - - private static final Pattern[] htmlVideoKeyMatch = new Pattern[]{ - Pattern.compile("player=new"), - Pattern.compile("

typeExtendKeys = typeExtend.keys(); - while (typeExtendKeys.hasNext()) { - String key = typeExtendKeys.next(); - if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) { - try { - str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n"; - } catch (JSONException e) { - } - } - } - } - if (URL.contains(".vod")) { - str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score"; - } else if (URL.contains("api.php/app") || URL.contains("xgapp")) { - } else { - str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000"; - } - return str; - } - - // ######推荐地址 - String getRecommendUrl(String URL) { - if (URL.contains("api.php/app") || URL.contains("xgapp")) { - return URL + "index_video?token="; - } else if (URL.contains(".vod")) { - return URL + "/vodPhbAll"; - } else { - return ""; - } - } - - // ######播放器前缀地址 - String getPlayUrlPrefix(String URL) { - if (URL.contains("api.php/app") || URL.contains("xgapp")) { - if (URL.contains("dijiaxia")) { - URL = "https://www.dijiaxia.com/api.php/app/"; - return URL + "video_detail?id="; - } else if (URL.contains("1010dy")) { - URL = "http://www.1010dy.cc/api.php/app/"; - return URL + "video_detail?id="; - } else { - return URL + "video_detail?id="; - } - } else if (URL.contains(".vod")) { - if (URL.contains("iopenyun")) { - return URL + "/detailID?vod_id="; - } else { - return URL + "/detail?vod_id="; - } - } else { - return ""; - } - } - - // ######选集 - private final HashMap parseUrlMap = new HashMap<>(); - - private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException { - ArrayList playUrls = new ArrayList<>(); - ArrayList playFlags = new ArrayList<>(); - if (URL.contains("api.php/app/")) { - JSONObject data = object.getJSONObject("data"); - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("vod_name")); - vod.put("vod_pic", data.getString("vod_pic")); - vod.put("type_name", data.optString("vod_class")); - vod.put("vod_year", data.optString("vod_year")); - vod.put("vod_area", data.optString("vod_area")); - vod.put("vod_remarks", data.optString("vod_remarks")); - vod.put("vod_actor", data.optString("vod_actor")); - vod.put("vod_director", data.optString("vod_director")); - vod.put("vod_content", data.optString("vod_content")); - JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player"); - for (int i = 0; i < vodUrlWithPlayer.length(); i++) { - JSONObject from = vodUrlWithPlayer.getJSONObject(i); - String flag = stopVipFlag(from.getString("name")); - playFlags.add(flag); - playUrls.add(from.getString("url")); - String purl = from.optString("parse_api"); - if (purl.contains("jpg.hou.lu/jm/za/index.php")) { - purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url="; - } - parseUrlMap.put(flag, purl); - } - } else if (URL.contains("xgapp")) { - JSONObject data = object.getJSONObject("data").getJSONObject("vod_info"); - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("vod_name")); - vod.put("vod_pic", data.getString("vod_pic")); - vod.put("type_name", data.optString("vod_class")); - vod.put("vod_year", data.optString("vod_year")); - vod.put("vod_area", data.optString("vod_area")); - vod.put("vod_remarks", data.optString("vod_remarks")); - vod.put("vod_actor", data.optString("vod_actor")); - vod.put("vod_director", data.optString("vod_director")); - vod.put("vod_content", data.optString("vod_content")); - JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player"); - for (int i = 0; i < vodUrlWithPlayer.length(); i++) { - JSONObject from = vodUrlWithPlayer.getJSONObject(i); - String flag = stopVipFlag(from.getString("name")); - playFlags.add(flag); - playUrls.add(from.getString("url")); - String purl = from.optString("parse_api"); - if (purl.contains("jpg.hou.lu/jm/za/index.php")) { - purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url="; - } - parseUrlMap.put(flag, purl); - } - } else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) { - JSONObject data = object.getJSONObject("data"); - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("vod_name")); - vod.put("vod_pic", data.getString("vod_pic")); - vod.put("type_name", data.optString("vod_class")); - vod.put("vod_year", data.optString("vod_year")); - vod.put("vod_area", data.optString("vod_area")); - vod.put("vod_remarks", data.optString("vod_remarks")); - vod.put("vod_actor", data.optString("vod_actor")); - vod.put("vod_director", data.optString("vod_director")); - vod.put("vod_content", data.optString("vod_content")); - JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list"); - for (int i = 0; i < vodUrlWithPlayer.length(); i++) { - JSONObject from = vodUrlWithPlayer.getJSONObject(i); - String flag = stopVipFlag(from.getJSONObject("player_info").getString("show")); - playFlags.add(flag); - playUrls.add(from.getString("url")); - try { - ArrayList parses = new ArrayList<>(); - String[] parse1 = from.getJSONObject("player_info").optString("parse").split(","); - String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(","); - for (String p : parse1) { - if (parsePattern.matcher(p).find()) { - boolean add = true; - for (Pattern pt : parseMatchForDotVod) { - if (pt.matcher(p).find()) { - add = false; - break; - } - } - if (add) { - parses.add(p); - } - } - } - for (String p : parse2) { - if (parsePattern.matcher(p).find()) { - boolean add = true; - for (Pattern pt : parseMatchForDotVod) { - if (pt.matcher(p).find()) { - add = false; - break; - } - } - if (add) { - parses.add(p); - } - } - } - if (parses.size() > 0 && parses.get(0).contains("=")) { - String purl = parses.get(0); - if (purl.contains("http")) { - Matcher matcher = parsePattern1.matcher(purl); - if (matcher.find()) { - purl = matcher.group(0).replace("..", ".").replace("vip.aotian.love", "vip.gaotian.love"); - } - } else if (purl.contains("//")) { - Matcher matcher = parsePattern1.matcher(purl); - if (matcher.find()) { - purl = "http:" + matcher.group(0).replace("..", "."); - } - } else { - Matcher matcher = parsePattern2.matcher(URL); - if (matcher.find()) { - Matcher matcher1 = parsePattern1.matcher(URL); - if (matcher1.find()) { - purl = matcher.group(0) + matcher1.group(0).replace("..", "."); - } - } - } - parseUrlMap.put(flag, purl); - } else { - parseUrlMap.put(flag, "http://1.117.152.239:39000/?url="); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } else if (urlPattern1.matcher(URL).find()) { - JSONObject data = object; - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("title")); - vod.put("vod_pic", data.getString("img_url")); - vod.put("type_name", jsonArr2Str(data.optJSONArray("type"))); - vod.put("vod_year", data.optString("pubtime")); - vod.put("vod_area", jsonArr2Str(data.optJSONArray("area"))); - vod.put("vod_remarks", data.optString("trunk")); - vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor"))); - vod.put("vod_director", jsonArr2Str(data.optJSONArray("director"))); - vod.put("vod_content", data.optString("intro")); - JSONObject playList = data.getJSONObject("videolist"); - Iterator playListKeys = playList.keys(); - while (playListKeys.hasNext()) { - String from = playListKeys.next(); - JSONArray playListUrls = playList.getJSONArray(from); - ArrayList urls = new ArrayList<>(); - for (int j = 0; j < playListUrls.length(); j++) { - JSONObject urlObj = playListUrls.getJSONObject(j); - urls.add(urlObj.getString("title") + "$" + urlObj.getString("url")); - } - playFlags.add(stopVipFlag(from)); - playUrls.add(TextUtils.join("#", urls)); - } - } -// for (int i = 0; i < playFlags.size(); i++) { -// String pu = playUrls.get(i).split("#")[0].split("\\$")[1]; -// System.out.println(pu + " is video?" + isVideoFormat(pu)); -// playerContent(playFlags.get(i), pu, new ArrayList<>()); -// } - vod.put("vod_play_from", TextUtils.join("$$$", playFlags)); - vod.put("vod_play_url", TextUtils.join("$$$", playUrls)); - } - - private String getParseUrl(String URL, String flag) { - String parseUrl = ""; - if (urlPattern2.matcher(URL).find()) { - if (parseUrlMap.containsKey(flag)) - parseUrl = parseUrlMap.get(flag); - } else if (URL.contains("api.php/app/") || URL.contains("xgapp")) { - if (parseUrlMap.containsKey(flag)) - parseUrl = parseUrlMap.get(flag); - } else { - parseUrl = URL; - } - if (parseUrl.contains("svip.jhyun.jx.cn") || parseUrl.contains("svip.jhdyw.vip")) { - if (flag.contains("人人迷")) { - parseUrl = "http://www.1080kan.cc/jiexi/rrmi.php?url="; - } else if (flag.contains("人人")) { - parseUrl = "http://www.1080kan.cc/jiexi/rr.php?url="; - } else if (flag.contains("番茄")) { - parseUrl = "http://www.1080kan.cc/jiexi/fq.php?url="; - } else { - parseUrl = "https://jx.parwix.com:4433/player/?url="; - } - } else if (parseUrl.contains("jhsj.manduhu.com") || parseUrl.contains("v.jhdyw.vip/nhdz666")) { - parseUrl = "https://jx.parwix.com:4433/player/?url="; - } else if (parseUrl.contains("x-n.cc")) { - parseUrl = "https://jx.parwix.com:4433/player/?url="; - } - return parseUrl; - } - - private String getPlayerUrl(String URL, String parseUrl, String playUrl) { - if (URL.contains("xgapp") || URL.contains("api.php/app/") || /*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) { - if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) { - if (playUrl.contains("url=")) { - return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1]; - } else { - return "https://www.baidu.com/s?wd=" + playUrl; - } - } else if (!parseUrl.contains("url=") && playUrl.contains("RongXingVR")) { - return "https://www.baidu.com/s?wd=https://fast.rongxingvr.cn:8866/api/?key=nShWumGdMIbTwngTbI&url=" + playUrl; - } else if (!parseUrl.contains("url=") && playUrl.contains("LT")) { - return "https://www.baidu.com/s?wd=https://f7.pyxddc.com/bcjx/4k.php?url=" + playUrl; - } else if (!parseUrl.contains("url=") && playUrl.contains("renrenmi")) { - return "https://www.baidu.com/s?wd=https://kuba.renrenmi.cc:2266/api/?key=Y6UYLYtjImTCKe98JD&url=" + playUrl; - } else if (!parseUrl.contains("url=") && playUrl.contains(".html")) { - return "https://www.baidu.com/s?wd=http://1.117.152.239:39000/?url=" + playUrl; - } else if (playUrl.contains("xfy")) { - return "https://www.baidu.com/s?wd=http://jiexi.yunl.cc/api/?key=xYNESYSvHp1DV2ckKs&url=" + playUrl; - } else { - return "https://www.baidu.com/s?wd=" + parseUrl + playUrl; - } - } else if (urlPattern1.matcher(URL).find()) { - if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) { - if (playUrl.contains("url=")) { - return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1]; - } else { - return "https://www.baidu.com/s?wd=" + playUrl; - } - } else if (playUrl.contains("xfy")) { - if (playUrl.contains("url=")) { - return "https://www.baidu.com/s?wd=http://cache.dmtt.xyz/xfyjx/xfyjx.php?url=" + playUrl.split("url=")[1]; - } else { - return "https://www.baidu.com/s?wd=https://json.hfyrw.com/mao.go?url=" + playUrl; - } - } else if (playUrl.contains("www.bilibili.com")) { - String spUrl = playUrl.split("url=")[1]; - return "https://www.baidu.com/s?wd=https://jx.parwix.com:4433/player/?url=" + spUrl; - } else if (URL.contains("zhenfy") || URL.contains("cztv") || URL.contains("1.14.63.101") || URL.contains("fit:8") || URL.contains("diliktv.xyz") || URL.contains("ppzhu.vip") || URL.contains("api.8d8q.com") || URL.contains("haokanju1.cc") || URL.contains("cztv")) { - return "https://www.baidu.com/s?wd=" + playUrl + "&app=10000&account=272775028&password=qq272775028"; - } else if (URL.contains("lxyyy") || URL.contains("j.zjj.life") || URL.contains("lktv") || URL.contains("0818tv") || URL.contains("ruoxinew")) { - return "https://www.baidu.com/s?wd=https://play.tkys.tv/?url=" + playUrl.split("url=")[1]; - } else { - return "https://www.baidu.com/s?wd=" + playUrl; - } - } else { - return "https://www.baidu.com/s?wd=" + playUrl; - } - } - - // ######视频地址 - private void getFinalVideo(String uu, JSONObject result) throws JSONException { - if (uu.contains("baidu.com")) { - String playurl = uu.split("wd=")[1]; - if (playurl.contains("duoduozy.com") || playurl.contains("suoyo.cc")) { - String uuu = "https://www.6080kan.cc/app.php?url=" + playurl; - String content = OkHttpUtil.string(uuu, null); - JSONObject obj = new JSONObject(content); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", obj.getString("url")); - result.put("header", "{\"User-Agent\":\" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0\",\"referer\":\" https://player.duoduozy.com\",\"origin\":\" https://dp.duoduozy.com\",\"Host\":\" cache.m3u8.suoyo.cc\"}"); - } else if (playurl.contains("xfy")) { - String content = OkHttpUtil.string(playurl, null); - JSONObject obj = new JSONObject(content); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", obj.getString("url")); - result.put("header", "{\"referer\":\" appguapi.lihaoyun.top:11543\",\"User-Agent\":\" Dart/2.14 (dart:io)\"}}"); - } else if (playurl.contains("api.iopenyun.com:88")) { - if (playurl.contains("html")) { - String content = OkHttpUtil.string("https://api.m3u8.tv:5678/home/api?type=ys&uid=233711&key=dgilouvFKNRSWX2467&url=" + playurl.split("=")[1], null); - JSONObject obj = new JSONObject(content); - String ppurl = obj.getString("url"); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", ppurl); - } else { - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", playurl); - result.put("ua", "Mozilla/5.0 Windows10"); - result.put("header", "{\"Referer\":\"https://user.iopenyun.com:520/user/video/\"}"); - } - } else if (playurl.contains("cat.wkfile.com")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", playurl); - result.put("header", "{\"User-Agent\":\" Lavf/58.12.100\",\"Referer\":\" wkfile.com\"}"); - } else if (!playurl.contains("=") && playurl.indexOf(".m3u8") > 15 || playurl.indexOf(".mp4") > 15 || playurl.contains("/obj/tos")) { - if (playurl.contains("hsl.ysgc.xyz")) { - String content = OkHttpUtil.string("https://jx.ysgc.xyz/?url=" + playurl, null); - JSONObject obj = new JSONObject(content); - String ppurl = obj.getString("url"); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", ppurl); - result.put("header", "{\"Referer\":\" https://ysgc.cc\"}"); - } else if (playurl.contains("1.ruifenglb.com")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", playurl); - result.put("header", "{\"Referer\":\" https://1.ruifenglb.com\"}"); - } else { - Matcher matcher = Pattern.compile(".*(http.*)").matcher(playurl); - if (matcher.find()) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", matcher.group(1)); - } else { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", playurl); - } - } - } else if (playurl.contains("=")) { - HashMap headers = new HashMap(); - headers.put("User-Agent", "Mozilla/5.0 Android"); - Map> respHeaders = new TreeMap<>(); - String content = OkHttpUtil.stringNoRedirect(playurl, headers, respHeaders); - String redLoc = OkHttpUtil.getRedirectLocation(respHeaders); - if (redLoc != null) { - String finalurl = ""; - while (redLoc != null) { - finalurl = redLoc; - if (redLoc.indexOf(".mp4") > 30) { - break; - } else { - headers.put("User-Agent", "Mozilla/5.0 Android"); - content = OkHttpUtil.stringNoRedirect(finalurl, headers, respHeaders); - redLoc = OkHttpUtil.getRedirectLocation(respHeaders); - } - } - String realurl = finalurl; - if (realurl.contains("=http") || realurl.contains("url=")) { - if (content.contains(" 1) { - String realurl = jsonUrl; - if (playurl.contains("mgtv.com")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", realurl); - result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}"); - } else if (playurl.contains("bilibili.com")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", realurl); - } else { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", realurl); - } - } else if (playurl.split("url=")[1].contains("http")) { - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", "http://1.117.152.239:39000/?url=" + playurl.split("url=")[1]); - } else if (playurl.split("url=")[1].contains("renrenmi")) { - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", "http://www.1080kan.cc/jiexi/rrmi.php?url=" + playurl.split("url=")[1]); - result.put("header", "{\"Referer\":\"http://www.1080kan.cc/\"}"); - } else { - String id = playurl.split("url=")[1]; - /* - String uuu = "https://vip.gaotian.love/api/?key=sRy0QAq8hqXRlrEtrq&url=" + id; - content = OkHttpUtil.string(uuu, null); - JSONObject obj = new JSONObject(content); - String realurl = obj.optString("url", ""); - if (realurl.isEmpty()) - realurl = obj.optString("msg", ""); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", realurl); - */ - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", "https://jx.banyung.xyz:7799/player/?url=" + playurl.split("url=")[1]); - } - } - } - } else { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", playurl); - } - } else { - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", uu); - } - } - - @Override - public boolean manualVideoCheck() { - return true; - } - - @Override - public boolean isVideoFormat(String url) { - return Misc.isVideoFormat(url); - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/AppYsV2.java b/TVBox_Java/spider/AppYsV2.java deleted file mode 100644 index 08fb0a5..0000000 --- a/TVBox_Java/spider/AppYsV2.java +++ /dev/null @@ -1,845 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * M浏览器中的App影视 - *

- * Author: 群友 不负此生 - */ -public class AppYsV2 extends Spider { - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - try { - extInfos = extend.split("###"); - } catch (Throwable th) { - } - } - - @Override - public String homeContent(boolean filter) { - try { - String url = getCateUrl(getApiUrl()); - JSONArray jsonArray = null; - if (!url.isEmpty()) { - SpiderDebug.log(url); - String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 0); - JSONObject obj = new JSONObject(json); - if (obj.has("list") && obj.get("list") instanceof JSONArray) { - jsonArray = obj.getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) { - jsonArray = obj.getJSONObject("data").getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONArray) { - jsonArray = obj.getJSONArray("data"); - } - } else { // 通过filter列表读分类 - String filterStr = getFilterTypes(url, null); - String[] classes = filterStr.split("\n")[0].split("\\+"); - jsonArray = new JSONArray(); - for (int i = 1; i < classes.length; i++) { - String[] kv = classes[i].trim().split("="); - if (kv.length < 2) - continue; - JSONObject newCls = new JSONObject(); - newCls.put("type_name", kv[0].trim()); - newCls.put("type_id", kv[1].trim()); - jsonArray.put(newCls); - } - } - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - if (jsonArray != null) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - String typeName = jObj.getString("type_name"); - if (isBan(typeName)) - continue; - String typeId = jObj.getString("type_id"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - JSONObject typeExtend = jObj.optJSONObject("type_extend"); - if (filter) { - String filterStr = getFilterTypes(url, typeExtend); - String[] filters = filterStr.split("\n"); - JSONArray filterArr = new JSONArray(); - for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) { - String l = filters[k].trim(); - if (l.isEmpty()) - continue; - String[] oneLine = l.split("\\+"); - String type = oneLine[0].trim(); - String typeN = type; - if (type.contains("筛选")) { - type = type.replace("筛选", ""); - if (type.equals("class")) - typeN = "类型"; - else if (type.equals("area")) - typeN = "地区"; - else if (type.equals("lang")) - typeN = "语言"; - else if (type.equals("year")) - typeN = "年份"; - } - JSONObject jOne = new JSONObject(); - jOne.put("key", type); - jOne.put("name", typeN); - JSONArray valueArr = new JSONArray(); - for (int j = 1; j < oneLine.length; j++) { - JSONObject kvo = new JSONObject(); - String kv = oneLine[j].trim(); - int sp = kv.indexOf("="); - if (sp == -1) { - if (isBan(kv)) - continue; - kvo.put("n", kv); - kvo.put("v", kv); - } else { - String n = kv.substring(0, sp); - if (isBan(n)) - continue; - kvo.put("n", n.trim()); - kvo.put("v", kv.substring(sp + 1).trim()); - } - valueArr.put(kvo); - } - jOne.put("value", valueArr); - filterArr.put(jOne); - } - if (!result.has("filters")) { - result.put("filters", new JSONObject()); - } - result.getJSONObject("filters").put(typeId, filterArr); - } - classes.put(newCls); - } - } - result.put("class", classes); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - String apiUrl = getApiUrl(); - String url = getRecommendUrl(apiUrl); - boolean isTV = false; - if (url.isEmpty()) { - url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start="; - isTV = true; - } - SpiderDebug.log(url); - String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 1); - JSONObject obj = new JSONObject(json); - JSONArray videos = new JSONArray(); - if (isTV) { - JSONArray jsonArray = obj.getJSONArray("data"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("nextlink")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("state")); - videos.put(v); - } - } else { - ArrayList arrays = new ArrayList<>(); - findJsonArray(obj, "vlist", arrays); - if (arrays.isEmpty()) { - findJsonArray(obj, "vod_list", arrays); - } - List ids = new ArrayList<>(); - for (JSONArray jsonArray : arrays) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - String vid = vObj.getString("vod_id"); - if (ids.contains(vid)) - continue; - ids.add(vid); - JSONObject v = new JSONObject(); - v.put("vod_id", vid); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String apiUrl = getApiUrl(); - String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl); - url = url.replace("#PN#", pg); - url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : ""); - url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : ""); - url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : ""); - url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : ""); - url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : ""); - SpiderDebug.log(url); - String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 2); - JSONObject obj = new JSONObject(json); - int totalPg = Integer.MAX_VALUE; - try { - if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) { - totalPg = obj.getInt("totalpage"); - } else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) { - totalPg = obj.getInt("pagecount"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && - (obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer && - obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) { - int limit = obj.getJSONObject("data").getInt("limit"); - int total = obj.getJSONObject("data").getInt("total"); - totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - - JSONArray jsonArray = null; - JSONArray videos = new JSONArray(); - if (obj.has("list") && obj.get("list") instanceof JSONArray) { - jsonArray = obj.getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) { - jsonArray = obj.getJSONObject("data").getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONArray) { - jsonArray = obj.getJSONArray("data"); - } - if (jsonArray != null) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - if (vObj.has("vod_id")) { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } else { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("nextlink")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("state")); - videos.put(v); - } - } - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", totalPg); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String apiUrl = getApiUrl(); - String url = getPlayUrlPrefix(apiUrl) + ids.get(0); - SpiderDebug.log(url); - String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 3); - JSONObject obj = new JSONObject(json); - JSONObject result = new JSONObject(); - JSONObject vod = new JSONObject(); - genPlayList(apiUrl, obj, json, vod, ids.get(0)); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String apiUrl = getApiUrl(); - String url = getSearchUrl(apiUrl, URLEncoder.encode(key)); - //System.out.println(url); - String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 5); - JSONObject obj = new JSONObject(json); - JSONArray jsonArray = null; - JSONArray videos = new JSONArray(); - if (obj.has("list") && obj.get("list") instanceof JSONArray) { - jsonArray = obj.getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) { - jsonArray = obj.getJSONObject("data").getJSONArray("list"); - } else if (obj.has("data") && obj.get("data") instanceof JSONArray) { - jsonArray = obj.getJSONArray("data"); - } - if (jsonArray != null) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - if (vObj.has("vod_id")) { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } else { - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("nextlink")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("state")); - videos.put(v); - } - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - ArrayList parseUrls = parseUrlMap.get(flag); - if (parseUrls == null) - parseUrls = new ArrayList<>(); - if (!parseUrls.isEmpty()) { - JSONObject result = getFinalVideo(flag, parseUrls, id); - if (result != null) - return result.toString(); - } - if (Misc.isVideoFormat(id)) { - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } else { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", id); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private void findJsonArray(JSONObject obj, String match, ArrayList result) { - Iterator keys = obj.keys(); - while (keys.hasNext()) { - String k = keys.next(); - try { - Object o = obj.get(k); - if (k.equals(match) && o instanceof JSONArray) - result.add((JSONArray) o); - if (o instanceof JSONObject) { - findJsonArray((JSONObject) o, match, result); - } else if (o instanceof JSONArray) { - JSONArray array = (JSONArray) o; - for (int i = 0; i < array.length(); i++) { - findJsonArray(array.getJSONObject(i), match, result); - } - } - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - } - - private String jsonArr2Str(JSONArray array) { - try { - ArrayList strings = new ArrayList<>(); - for (int i = 0; i < array.length(); i++) { - strings.add(array.getString(i)); - } - return TextUtils.join(",", strings); - } catch (JSONException e) { - } - return ""; - } - - private HashMap getHeaders(String URL) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", UA(URL)); - return headers; - } - - private boolean isBan(String key) { - return key.equals("伦理") || key.equals("情色") || key.equals("福利"); - } - - // M 扩展方法 - - // ######重组搜索 - private String getSearchUrl(String URL, String KEY) { - if (URL.contains(".vod")) { - if (URL.contains("iopenyun.com")) { - return URL + "/list?wd=" + KEY + "&page="; - } else { - return URL + "?wd=" + KEY + "&page="; - } - } else if (URL.contains("api.php/app") || URL.contains("xgapp")) { - return URL + "search?text=" + KEY + "&pg="; - } else if (urlPattern1.matcher(URL).find()) { - if (URL.contains("esellauto") - || URL.contains("1.14.63.101") - || URL.contains("zjys") - || URL.contains("dcd") - || URL.contains("lxue") - || URL.contains("weetai.cn") - || URL.contains("haokanju1") - || URL.contains("fit:8") - || URL.contains("zjj.life") - || URL.contains("love9989") - || URL.contains("8d8q") - || URL.contains("lk.pxun") - || URL.contains("hgyx") - || URL.contains("521x5") - || URL.contains("lxyyy") - || URL.contains("0818tv") - || URL.contains("diyoui") - || URL.contains("diliktv") - || URL.contains("ppzhu") - || URL.contains("aitesucai") - || URL.contains("zz.ci") - || URL.contains("chxjon") - || URL.contains("watchmi") - || URL.contains("vipbp") - || URL.contains("bhtv") - || URL.contains("xfykl")) { - return URL + "?ac=list&" + "wd=" + KEY + "&page="; - } else { - return URL + "?ac=list&" + "zm=" + KEY + "&page="; - } - } - return ""; - } - - // ######UA - private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod"); - private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod"); - private static final Pattern parsePattern = Pattern.compile("/.+\\?.+="); - private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)="); - private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*"); - - protected static final Pattern[] htmlVideoKeyMatch = new Pattern[]{ - Pattern.compile("player=new"), - Pattern.compile("

typeExtendKeys = typeExtend.keys(); - while (typeExtendKeys.hasNext()) { - String key = typeExtendKeys.next(); - if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) { - try { - str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n"; - } catch (JSONException e) { - } - } - } - } - if (URL.contains(".vod")) { - str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score"; - } else if (URL.contains("api.php/app") || URL.contains("xgapp")) { - } else { - str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000"; - } - return str; - } - - // ######推荐地址 - String getRecommendUrl(String URL) { - if (URL.contains("api.php/app") || URL.contains("xgapp")) { - return URL + "index_video?token="; - } else if (URL.contains(".vod")) { - return URL + "/vodPhbAll"; - } else { - return ""; - } - } - - // ######播放器前缀地址 - String getPlayUrlPrefix(String URL) { - if (URL.contains("api.php/app") || URL.contains("xgapp")) { - if (URL.contains("dijiaxia")) { - URL = "https://www.dijiaxia.com/api.php/app/"; - return URL + "video_detail?id="; - } else if (URL.contains("1010dy")) { - URL = "http://www.1010dy.cc/api.php/app/"; - return URL + "video_detail?id="; - } else { - return URL + "video_detail?id="; - } - } else if (URL.contains(".vod")) { - if (URL.contains("iopenyun")) { - return URL + "/detailID?vod_id="; - } else { - return URL + "/detail?vod_id="; - } - } else { - return ""; - } - } - - // ######选集 - protected final HashMap> parseUrlMap = new HashMap<>(); - - private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException { - ArrayList playUrls = new ArrayList<>(); - ArrayList playFlags = new ArrayList<>(); - if (URL.contains("api.php/app/")) { - JSONObject data = object.getJSONObject("data"); - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("vod_name")); - vod.put("vod_pic", data.getString("vod_pic")); - vod.put("type_name", data.optString("vod_class")); - vod.put("vod_year", data.optString("vod_year")); - vod.put("vod_area", data.optString("vod_area")); - vod.put("vod_remarks", data.optString("vod_remarks")); - vod.put("vod_actor", data.optString("vod_actor")); - vod.put("vod_director", data.optString("vod_director")); - vod.put("vod_content", data.optString("vod_content")); - JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player"); - for (int i = 0; i < vodUrlWithPlayer.length(); i++) { - JSONObject from = vodUrlWithPlayer.getJSONObject(i); - String flag = from.optString("code").trim(); - if (flag.isEmpty()) - flag = from.getString("name").trim(); - playFlags.add(flag); - playUrls.add(from.getString("url")); - String purl = from.optString("parse_api").trim(); - ArrayList parseUrls = parseUrlMap.get(flag); - if (parseUrls == null) { - parseUrls = new ArrayList<>(); - parseUrlMap.put(flag, parseUrls); - } - if (!purl.isEmpty() && !parseUrls.contains(purl)) - parseUrls.add(purl); - } - } else if (URL.contains("xgapp")) { - JSONObject data = object.getJSONObject("data").getJSONObject("vod_info"); - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("vod_name")); - vod.put("vod_pic", data.getString("vod_pic")); - vod.put("type_name", data.optString("vod_class")); - vod.put("vod_year", data.optString("vod_year")); - vod.put("vod_area", data.optString("vod_area")); - vod.put("vod_remarks", data.optString("vod_remarks")); - vod.put("vod_actor", data.optString("vod_actor")); - vod.put("vod_director", data.optString("vod_director")); - vod.put("vod_content", data.optString("vod_content")); - JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player"); - for (int i = 0; i < vodUrlWithPlayer.length(); i++) { - JSONObject from = vodUrlWithPlayer.getJSONObject(i); - String flag = from.optString("code").trim(); - if (flag.isEmpty()) - flag = from.getString("name").trim(); - playFlags.add(flag); - playUrls.add(from.getString("url")); - String purl = from.optString("parse_api").trim(); - ArrayList parseUrls = parseUrlMap.get(flag); - if (parseUrls == null) { - parseUrls = new ArrayList<>(); - parseUrlMap.put(flag, parseUrls); - } - if (!purl.isEmpty() && !parseUrls.contains(purl)) - parseUrls.add(purl); - } - } else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) { - JSONObject data = object.getJSONObject("data"); - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("vod_name")); - vod.put("vod_pic", data.getString("vod_pic")); - vod.put("type_name", data.optString("vod_class")); - vod.put("vod_year", data.optString("vod_year")); - vod.put("vod_area", data.optString("vod_area")); - vod.put("vod_remarks", data.optString("vod_remarks")); - vod.put("vod_actor", data.optString("vod_actor")); - vod.put("vod_director", data.optString("vod_director")); - vod.put("vod_content", data.optString("vod_content")); - JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list"); - for (int i = 0; i < vodUrlWithPlayer.length(); i++) { - JSONObject from = vodUrlWithPlayer.getJSONObject(i); - String flag = from.getJSONObject("player_info").optString("from").trim(); - if (flag.isEmpty()) - flag = from.getJSONObject("player_info").optString("show").trim(); - playFlags.add(flag); - playUrls.add(from.getString("url")); - try { - ArrayList parses = new ArrayList<>(); - String[] parse1 = from.getJSONObject("player_info").optString("parse").split(","); - String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(","); - parses.addAll(Arrays.asList(parse1)); - parses.addAll(Arrays.asList(parse2)); - ArrayList parseUrls = parseUrlMap.get(flag); - if (parseUrls == null) { - parseUrls = new ArrayList<>(); - parseUrlMap.put(flag, parseUrls); - } - for (String purl : parses) { - if (purl.contains("http")) { - Matcher matcher = parsePattern1.matcher(purl); - if (matcher.find()) { - purl = matcher.group(0); - } - } else if (purl.contains("//")) { - Matcher matcher = parsePattern1.matcher(purl); - if (matcher.find()) { - purl = "http:" + matcher.group(0); - } - } else { - Matcher matcher = parsePattern2.matcher(URL); - if (matcher.find()) { - Matcher matcher1 = parsePattern1.matcher(URL); - if (matcher1.find()) { - purl = matcher.group(0) + matcher1.group(0); - } - } - } - purl = purl.replace("..", ".").trim(); - if (!purl.isEmpty() && !parseUrls.contains(purl)) - parseUrls.add(purl); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } else if (urlPattern1.matcher(URL).find()) { - JSONObject data = object; - vod.put("vod_id", data.optString("vod_id", vid)); - vod.put("vod_name", data.getString("title")); - vod.put("vod_pic", data.getString("img_url")); - vod.put("type_name", jsonArr2Str(data.optJSONArray("type"))); - vod.put("vod_year", data.optString("pubtime")); - vod.put("vod_area", jsonArr2Str(data.optJSONArray("area"))); - vod.put("vod_remarks", data.optString("trunk")); - vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor"))); - vod.put("vod_director", jsonArr2Str(data.optJSONArray("director"))); - vod.put("vod_content", data.optString("intro")); - JSONObject playList = data.getJSONObject("videolist"); - Iterator playListKeys = playList.keys(); - while (playListKeys.hasNext()) { - String flag = playListKeys.next(); - ArrayList parseUrls = parseUrlMap.get(flag); - if (parseUrls == null) { - parseUrls = new ArrayList<>(); - parseUrlMap.put(flag, parseUrls); - } - JSONArray playListUrls = playList.getJSONArray(flag); - ArrayList urls = new ArrayList<>(); - for (int j = 0; j < playListUrls.length(); j++) { - JSONObject urlObj = playListUrls.getJSONObject(j); - String url = urlObj.getString("url"); - if (url.contains("url=")) { - int spIdx = url.indexOf("url=") + 4; - String pUrl = url.substring(0, spIdx).trim(); - if (!pUrl.isEmpty() && !parseUrls.contains(pUrl)) - parseUrls.add(pUrl); - urls.add(urlObj.getString("title") + "$" + url.substring(spIdx).trim()); - } else { - urls.add(urlObj.getString("title") + "$" + url); - } - } - playFlags.add(flag); - playUrls.add(TextUtils.join("#", urls)); - } - } - vod.put("vod_play_from", TextUtils.join("$$$", playFlags)); - vod.put("vod_play_url", TextUtils.join("$$$", playUrls)); - } - - // ######视频地址 - protected JSONObject getFinalVideo(String flag, ArrayList parseUrls, String url) throws JSONException { - String htmlPlayUrl = ""; - for (String parseUrl : parseUrls) { - if (parseUrl.isEmpty() || parseUrl.equals("null")) - continue; - String playUrl = parseUrl + url; - String content = desc(OkHttpUtil.string(playUrl, null), (byte) 4); - if (parseUrl.contains("49.233.47.42:9898")) { - - HashMap hashMap = new HashMap(); - OkHttpUtil.stringNoRedirect(playUrl,null, hashMap); - String d = OkHttpUtil.getRedirectLocation(hashMap); - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", d); - return result; - } - JSONObject tryJson = null; - try { - tryJson = Misc.jsonParse(url, content); - } catch (Throwable th) { - - } - if (tryJson != null && tryJson.has("url") && tryJson.has("header")) { - tryJson.put("header", tryJson.getJSONObject("header").toString()); - return tryJson; - } - if (content.contains(" 1) { - String descFlag = extInfos[1]; - if (descFlag.equals("nftv")) { - - } - } - return src; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Auete.java b/TVBox_Java/spider/Auete.java deleted file mode 100644 index ac03534..0000000 --- a/TVBox_Java/spider/Auete.java +++ /dev/null @@ -1,540 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Auete extends Spider { - private static final String siteUrl = "https://auete.org"; - private static final String siteHost = "auete.org"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - //分类页URL规则 - private Pattern regexCategory = Pattern.compile("/(\\w+)/index.html"); - //详情页URL规则 - private Pattern regexVid = Pattern.compile("/(\\w+/\\w+/\\w+)/"); - //播放页URL规则 - private Pattern regexPlay = Pattern.compile("(/\\w+/\\w+/\\w+/play-\\d+-\\d+.html)"); - //筛选页URL规则 - //private Pattern regexPage = Pattern.compile("/\\w+/\\w+/index(\\d+).html"); - private Pattern regexPage = Pattern.compile("/index(\\d+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"byun\":{\"sh\":\"云播B线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dphd\":{\"sh\":\"云播A线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cyun\":{\"sh\":\"云播C线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"云播D线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"i8i\":{\"sh\":\"云播E线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"m3u8hd\":{\"sh\":\"云播F线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"languang\":{\"sh\":\"云播G线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"hyun\":{\"sh\":\"云播H线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"kyun\":{\"sh\":\"云播K线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"bpyueyu\":{\"sh\":\"云播粤语\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bpguoyu\":{\"sh\":\"云播国语\",\"pu\":\"\",\"sn\":0,\"or\":999},\"lyun\":{\"sh\":\"云播L线\",\"pu\":\"https://auete.com/api/?url=\",\"sn\":1,\"or\":999},\"myun\":{\"sh\":\"云播M线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dp\":{\"sh\":\"Dplayer\",\"pu\":\"\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"Movie\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧片\",\"v\":\"xjp\"},{\"n\":\"动作片\",\"v\":\"dzp\"},{\"n\":\"爱情片\",\"v\":\"aqp\"},{\"n\":\"科幻片\",\"v\":\"khp\"},{\"n\":\"恐怖片\",\"v\":\"kbp\"},{\"n\":\"惊悚片\",\"v\":\"jsp\"},{\"n\":\"战争片\",\"v\":\"zzp\"},{\"n\":\"剧情片\",\"v\":\"jqp\"}]}],\"Tv\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"美剧\",\"v\":\"oumei\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"泰剧\",\"v\":\"yataiju\"},{\"n\":\"网剧\",\"v\":\"wangju\"},{\"n\":\"台剧\",\"v\":\"taiju\"},{\"n\":\"国产\",\"v\":\"neidi\"},{\"n\":\"港剧\",\"v\":\"tvbgj\"}]}],\"Zy\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国综\",\"v\":\"guozong\"},{\"n\":\"韩综\",\"v\":\"hanzong\"},{\"n\":\"美综\",\"v\":\"meizong\"}]}],\"Dm\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"日漫\",\"v\":\"riman\"},{\"n\":\"国漫\",\"v\":\"guoman\"},{\"n\":\"美漫\",\"v\":\"meiman\"}]}],\"qita\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"纪录片\",\"v\":\"Jlp\"},{\"n\":\"经典片\",\"v\":\"Jdp\"},{\"n\":\"经典剧\",\"v\":\"Jdj\"},{\"n\":\"网大电影\",\"v\":\"wlp\"},{\"n\":\"国产老电影\",\"v\":\"laodianying\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul[class='navbar-nav mr-auto']> li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - //分类名 - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("综艺") || - name.equals("动漫") || - name.equals("其他"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("ul.threadlist").get(0); - Elements list = homeList.select("li"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("h2 a").attr("title"); - String cover = vod.selectFirst("a img").attr("src"); - String remark = vod.selectFirst("a button").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - // 获取分类数据的url - String url = ""; - try { - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value != null && value.length() != 0 && value != " ") { - url = siteUrl + "/" + tid + "/" + value; - } else { - url = siteUrl + "/" + tid; - } - ; - } - } else { - url = siteUrl + "/" + tid; - } - ; - if (pg.equals("1")) { - url = url + "/index.html"; - } else { - url = url + "/index" + pg + ".html"; - } - //System.out.println(url); - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.pagination li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - //System.out.println("名称"+name); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - //System.out.println("哈哈"+matcher.group(1)); - page = Integer.parseInt(matcher.group(1)); - } else { - Elements list = doc.select("ul.threadlist li"); - if (list.size() > 0) { - page = 1; - } else { - page = 0; - } - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - //System.out.println("尾页" + matcher.group(1)); - pageCount = Integer.parseInt(matcher.group(1)); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("ul.threadlist li"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("h2 a").attr("title"); - String cover = vod.selectFirst("a img").attr("src"); - String remark = vod.selectFirst("a button").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 20); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 20); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/" + ids.get(0) + "/"; - //System.out.println(url); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.cover a").attr("href"); - String title = doc.selectFirst("div.cover a").attr("title"); - Elements list1 = doc.select("div.message>p"); - String desc = doc.select("div.message>p").get(list1.size() - 1).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.message>p"); - for (int i = 0; i < span_text_muted.size() - 2; i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.contains("分类")) { - try { - category = text.text().split(": ")[1]; - } catch (Exception e) { - category = ""; - } - } else if (info.contains("年份")) { - try { - year = text.text().split(": ")[1]; - } catch (Exception e) { - year = ""; - } - } else if (info.contains("地区")) { - try { - area = text.text().split(": ")[1]; - } catch (Exception e) { - area = ""; - } - } else if (info.contains("影片备注")) { - try { - remark = text.text().split(": ")[1]; - } catch (Exception e) { - remark = ""; - } - } else if (info.contains("导演")) { - try { - director = text.text().split(": ")[1]; - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演")) { - try { - actor = text.text().split(": ")[1]; - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - //System.out.println(vodList.toString()); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div#player_list>h2"); - //System.out.println(sources.size()); - Elements sourceList = doc.select("div#player_list>ul"); - //System.out.println(sourceList.size()); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - //System.out.println(sources.text().split(":")[0].split("』")[1]); - String sourceName = source.text().split("』")[1].split(":")[0]; - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("li > a"); - //System.out.println(playListA.size()); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + id; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - /*取得script下面的JS变量*/ - Elements e = doc.select("div>script"); - /*循环遍历script下面的JS变量*/ - String player = ""; - String pn = ""; - JSONObject result = new JSONObject(); - for (Element element : e) { - /*取得JS变量数组*/ - String[] data = element.data().toString().split("var"); - /*取得单个JS变量*/ - for (String variable : data) { - /*过滤variable为空的数据*/ - if (variable.contains("=")) { - /*取到满足条件的JS变量*/ - if (variable.contains("now")) { - String[] kvp = variable.split("="); - player = kvp[1].replaceAll("\"", "").replaceAll(";", ""); - if (player.startsWith("base64")) { - String[] plist1 = player.split("\\("); - String[] plist2 = plist1[1].split("\\)"); - // 解码 - player = new String(Base64.decode(plist2[0].getBytes(), Base64.DEFAULT)); - //byte[] base64Data = Base64.getDecoder().decode(plist2[0]); - //player = new String(base64Data, "utf-8"); - } - if (player.startsWith("http")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", player); - result.put("header", ""); - } else if (player.contains("m3u8")) { - String finalvideo = "https://datas-s8pwfqdu9yystn90fb----------------cache.haozhansou.com/" + player; - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", finalvideo); - result.put("header", ""); - - } - } - if (variable.contains("pn")) { - String[] kvp = variable.split("="); - pn = kvp[1].replaceAll("\"", "").replaceAll(";", ""); - } - } - } - if (playerConfig.has(pn)) { - JSONObject pCfg = playerConfig.getJSONObject(pn); - String videoUrl = player; - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - String url = siteUrl + "/search.php?searchword=" + key; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - - JSONArray videos = new JSONArray(); - Elements list = doc.select("div.card-body>ul>li.media"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("div.media-body>div.subject>a>span").text(); - String cover = ""; - String remark = vod.selectFirst("div.media-body>div.d-flex>div.text-muted>span").text(); - Matcher matcher = regexVid.matcher(vod.select("div.media-body>div.subject>a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - - // 视频封面 - String vodurl = siteUrl + "/" + id + "/"; - Document voddoc = Jsoup.parse(OkHttpUtil.string(vodurl, getHeaders(vodurl))); - cover = voddoc.selectFirst("div.cover a").attr("href"); - - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Bdys01.java b/TVBox_Java/spider/Bdys01.java deleted file mode 100644 index 9da1ae1..0000000 --- a/TVBox_Java/spider/Bdys01.java +++ /dev/null @@ -1,559 +0,0 @@ -package com.github.catvod.spider; - -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build; -import android.text.TextUtils; -import android.util.Base64; - -import java.io.InputStream; -import java.io.ByteArrayOutputStream; - - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.gZip; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.TreeMap; - -import javax.crypto.Cipher; -import javax.crypto.spec.SecretKeySpec; - -import okhttp3.Call; -import okhttp3.Response; - - - - -public class Bdys01 extends Spider { - private static final String siteUrl = "https://www.bdys01.com"; - private static final String siteHost = "www.bdys01.com"; - private String cookie=""; - private String referer=""; - - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - - @Override - public void init(Context context) { - super.init(context); - try { - filterConfig = new JSONObject("{\"0\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}],\"1\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}],\"a\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url,String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(!ref.equals("google")){ - headers.put("Authority", "www.bdys01.com"); - if(ref.length()>0){ - headers.put("Referer", ref); - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - protected HashMap getHeaders2(String url) { - HashMap headers = new HashMap<>(); - String ss = url.replace("https://","").split("/")[0]; - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Authority", ss); - headers.put("Origin", "www.bdys01.com"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - - protected String getCookie(){ - cookie=""; - String cookieurl="https://www.bdys01.com/zzzzz"; - Map> respHeaders = new HashMap<>(); - OkHttpUtil.stringNoRedirect(cookieurl, getHeaders(cookieurl,referer), respHeaders); - if(respHeaders.containsKey("set-cookie")){ - cookie = respHeaders.get("set-cookie").get(0).split(";")[0]; - } - return cookie; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl,referer))); - referer=siteUrl+"/"; - // 分类节点 - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - String catestr ="{\"全部\": \"a\",\"电影\": \"0\",\"电视剧\": \"1\"}"; - JSONObject catedef = new JSONObject(catestr); - Iterator it = catedef.keys(); - while(it.hasNext()){ - JSONObject jsonObject = new JSONObject(); - String key =(String) it.next(); - jsonObject.put("type_name", key); - jsonObject.put("type_id", catedef.getString(key)); - classes.put(jsonObject); - } - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.row.row-cards").get(0); - Elements list = homeList.select("div.col-4.rows-md-7"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("h3.card-title").text(); - String cover = vod.selectFirst("img.w-100" ).attr("data-src"); - String remark = vod.selectFirst("p.text-muted").text(); - String id =vod.selectFirst("a.d-block.cover").attr("href"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - getCookie(); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/s/" ; - if (extend != null && extend.size() > 0 ) { - String urlformat= ""; - if(tid.equals("a")){ - urlformat= url +"{s}/"+ pg +"?&area={area}&year={year}&order={order}"; - }else { - urlformat= url +"{s}/"+ pg +"?&type="+tid+"&area={area}&year={year}&order={order}"; - } - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - urlformat=urlformat.replace("{"+key+"}",URLEncoder.encode(value)); - } - } - for (int i=0 ;i<4;i++) { - if (urlformat.contains("{s}")) { - urlformat = urlformat.replace("{s}", "all"); - } else if (urlformat.contains("{area}")) { - urlformat = urlformat.replace("&area={area}", ""); - } else if (urlformat.contains("{year}")) { - urlformat = urlformat.replace("&year={year}", ""); - } else if (urlformat.contains("{order}")) { - urlformat = urlformat.replace("{order}", "0"); - } - } - url = urlformat; - } else { - if(tid.equals("a")){ - url += "all/" + pg + "?&order=0"; - }else { - url += "all/" + pg + "?&type=" + tid + "&order=0"; - } - } - referer=siteUrl+"/"; - String html = OkHttpUtil.string(url, getHeaders(url,referer)); - referer = url; - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - Elements pageInfo = doc.select("a.page-link"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - String name = a.text(); - if (name.equals("尾页")) { - String gg =a.attr("href"); - String hf =""; - if(gg.contains("JSESSIONID")){ - int start = gg.lastIndexOf("/")+1; - int end = gg.indexOf(";"); - hf =gg.substring(start,end); - }else{ - int start = gg.lastIndexOf("/")+1; - int end = gg.indexOf("?"); - hf =gg.substring(start,end); - } - if (!hf.isEmpty()) { - pageCount = Integer.parseInt(hf); - } else { - pageCount = 0; - } - break; - } - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.col-lg-8"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("h3.mb-0").text(); - String cover = vod.selectFirst("img.w-100").attr("src"); - String remark = vod.selectFirst("p.mb-0").text(); - String idtt = vod.selectFirst("a.d-block").attr("href"); - String id =""; - if(idtt.contains("JSESSIONID")) { - int end = idtt.indexOf(";"); - id = idtt.substring(0,end); - }else{ - id =idtt; - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + ids.get(0); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url,referer))); - referer=url; - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - String cover = doc.selectFirst("div.col-md-auto img").attr("src"); - String title = doc.selectFirst("h1.d-none.d-md-block").text(); - String desc = doc.select("div.card.collapse > div.card-body").text(); - String year = doc.select("span.badge.bg-purple-lt").text().replace("更新时间:","").split("-")[0]; - String category = "", area = "", remark = "", director = "", actor = ""; - Element details = doc.select("div.col.mb-2").get(0); - Elements allp = details.select("p"); - for (int i = 0; i < allp.size(); i++) { - Element text = allp.get(i); - String info = text.selectFirst("strong").text(); - if (info.equals("类型:")) { - List categorys = new ArrayList<>(); - Elements aa = text.select("a"); - for (int j = 0; j < aa.size(); j++) { - categorys.add(aa.get(j).text()); - } - category ="类型:"+TextUtils.join(",", categorys); - } else if (info.contains("地区")) { - int start= text.text().indexOf("[")+1; - int end = text.text().indexOf("]"); - area = text.text().substring(start,end); - } else if (info.contains("豆瓣")) { - remark = "豆瓣:"+text.text(); - } else if (info.contains("导演:")) { - director = text.selectFirst("a").text(); - } else if (info.contains("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor =TextUtils.join(",", actors); - } - } - String vid = ids.get(0); - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new TreeMap<>(); - // 取播放列表数据 - Elements playListA = doc.select("a.btn.btn-square"); - String sourceName = "播放列表"; - String playList = ""; - List vodItems = new ArrayList<>(); - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - String idtt = vod.attr("href"); - String playURL =""; - if(idtt.contains("JSESSIONID")) { - int end = idtt.indexOf(";"); - playURL = idtt.substring(0,end); - }else{ - playURL =idtt; - } - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - vod_play.put(sourceName, playList); - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @TargetApi(Build.VERSION_CODES.KITKAT) - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String url = siteUrl + id ; - String htmlplay = OkHttpUtil.string(url, getHeaders(url,referer)); - Document doc = Jsoup.parse(htmlplay); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - String pid=""; - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).toString(); - if (scContent.contains("var pid =")) { - int start = scContent.indexOf("var pid ="); - int end = scContent.lastIndexOf("var time") + 1; - String pidtmp = scContent.substring(start, end); - start = pidtmp.indexOf("=")+2; - end = pidtmp.lastIndexOf(";") ; - pid = pidtmp.substring(start, end); - break; - } - } - long t = System.currentTimeMillis(); - String key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16); - String sg = encrypt(pid+"-"+t,key); - String geturl = siteUrl+"/lines?t="+t+"&sg="+sg+"&pid="+pid; - String urlsrc = OkHttpUtil.string(geturl, getHeaders(geturl,"")); - JSONObject urlsrcobj = new JSONObject(urlsrc); - JSONObject urldb = urlsrcobj.getJSONObject("data"); - List urldblist = new ArrayList<>(); - if(!urldb.isNull("url3")){ - String url3 = urldb.optString("url3"); - urldblist.add(url3); - } - if(!urldb.isNull("m3u8")){ - String m3u8 = urldb.optString("m3u8").replace("www.bde4.cc","www.bdys01.com"); - urldblist.add(m3u8); - } - if(!urldb.isNull("m3u8_2")){ - String m3u8_2 =urldb.optString("m3u8_2"); - String[] m2=m3u8_2.split(","); - for(int i=0; i< m2.length ;i++){ - urldblist.add(m2[i].replace("www.bde4.cc","www.bdys01.com")); - } - } - int index =new Random().nextInt(urldblist.size()); - String videourl = urldblist.get(index); - if(videourl.contains("mp4")){ - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videourl); - result.put("header", ""); - return result.toString(); - } - Map> respHeaders = new HashMap<>(); - OkHttpUtil.stringNoRedirect(videourl, getHeaders(videourl,""), respHeaders); - String redirect = OkHttpUtil.getRedirectLocation(respHeaders); - String realm3u8=""; - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - } - @Override - protected void onResponse(Response response) { - } - }; - OkHttpUtil.get(OkHttpUtil.defaultClient(), redirect, null, getHeaders2(redirect), callBack); - if (callBack.getResult().code() == 200) { - InputStream picsrc = callBack.getResult().body().byteStream(); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - int nRead; - byte[] data = new byte[4]; - while ((nRead = picsrc.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); - } - buffer.flush(); - byte[] targetArray = buffer.toByteArray(); - picsrc.close(); - byte[] dep = Arrays.copyOfRange(targetArray,3354,targetArray.length); - String pp = gZip.KS(dep); - String[] m3u8ori = pp.split("\n"); - for(int i=0;i0){ - for (int i = 0; i < 1; i++) { - Element sourcess = sourceList.get(i); - String sourceName = sourcess.select("h3.LC20lb.MBeuO.DKV0Md").text(); - String list1 = sourcess.attr("href"); - if(list1.contains("/s/")||list1.contains("play")||list1.contains("performer")||list1.contains("search")||list1.contains("jsessionid")){ - continue; - } - if (sourceName.contains(key)) { - Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1,referer))); - JSONObject v = new JSONObject(); - String cover = ddrklink.selectFirst("div.col-md-auto img").attr("src"); - String title = ddrklink.selectFirst("h2.d-sm-block.d-md-none").text(); - String id =list1.replace("https://www.bdys01.com",""); - v.put("vod_name", title); - v.put("vod_remarks", ""); - v.put("vod_id", id); - v.put("vod_pic", cover); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String encrypt(String src, String KEY) { - try { - Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - cipher.init(Cipher.ENCRYPT_MODE, keySpec); - return bytesToHexStr(cipher.doFinal(src.getBytes())).toUpperCase(); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - - protected String bytesToHexStr(byte[] bytes) { - StringBuilder hexStr = new StringBuilder(); - for (byte b : bytes) { - String hex = Integer.toHexString(b & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - hexStr.append(hex); - } - return hexStr.toString(); - } - -} \ No newline at end of file diff --git a/TVBox_Java/spider/Bili.java b/TVBox_Java/spider/Bili.java deleted file mode 100644 index 0accb46..0000000 --- a/TVBox_Java/spider/Bili.java +++ /dev/null @@ -1,273 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - -public class Bili extends Spider { - - protected JSONObject ext = null; - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - try { - String content = OkHttpUtil.string(extend, null); - ext = new JSONObject(content); - } catch (JSONException ex) { - ex.printStackTrace(); - } - } - - @Override - public String homeContent(boolean filter) { - JSONObject results = new JSONObject(); - try { - results.put("class", ext.getJSONArray("classes")); - if (filter) { - results.put("filters", ext.getJSONObject("filter")); - } - } catch (JSONException e) { - SpiderDebug.log(e); - } - return results.toString(); - } - - @Override - public String homeVideoContent() { - try { - JSONArray videos = new JSONArray(); - try { - String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=窗 白噪音"; - String content = OkHttpUtil.string(url, null); - JSONObject data = new JSONObject(content).getJSONObject("data"); - JSONArray RArray = data.getJSONArray("result"); - for (int i = 0; i < RArray.length(); i++) { - JSONObject info = RArray.getJSONObject(i); - JSONObject result = new JSONObject(); - String pic = info.getString("pic"); - if (pic.startsWith("//")) { - pic = "https:" + pic; - } - result.put("vod_id", info.getString("bvid")); - String title = info.getString("title"); - Document KS = Jsoup.parse(title); - String name = KS.text(); - result.put("vod_name", name); - result.put("vod_pic", pic); - String duration = info.getString("duration"); - String words = duration.split(":")[0]; - String remark = words + "分钟"; - result.put("vod_remarks", remark); - videos.put(result); - } - } catch (Exception e) { - - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword="; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "&" + key + "=" + URLEncoder.encode(value); - } - } - } - url += "&page=" + pg; - String content = OkHttpUtil.string(url, null); - JSONObject data = new JSONObject(content).getJSONObject("data"); - JSONArray list = new JSONArray(); - JSONArray RSArray = data.getJSONArray("result"); - for (int i = 0; i < RSArray.length(); i++) { - JSONObject info = RSArray.getJSONObject(i); - JSONObject result = new JSONObject(); - String pic = info.getString("pic"); - if (pic.startsWith("//")) { - pic = "https:" + pic; - } - result.put("vod_id", info.getString("bvid")); - String title = info.getString("title"); - Document doc = Jsoup.parse(title); - String name = doc.text(); - result.put("vod_name", name); - result.put("vod_pic", pic); - String duration = info.getString("duration"); - String Split = duration.split(":")[0]; - String remark = Split + "分钟"; - result.put("vod_remarks", remark); - list.put(result); - } - JSONObject result = new JSONObject(); - int limit = 20; - int page = Integer.parseInt(pg); - result.put("page", page); - int pageCount = list.length() == limit ? page + 1 : page; - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", Integer.MAX_VALUE); - result.put("list", list); - return result.toString(); - - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - @Override - public String detailContent(List ids) { - int i = 0; - try { - String str = ids.get(0); - String sb2 = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + str; - JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null)); - JSONObject jSONObject2 = jSONObject.getJSONObject("data"); - long j = jSONObject2.getLong("aid"); - String sb4 = j + ""; - String sb6 = "https://api.bilibili.com/x/web-interface/view?aid=" + sb4; - JSONObject jSONObject3 = new JSONObject(OkHttpUtil.string(sb6, null)); - JSONObject jSONObject4 = jSONObject3.getJSONObject("data"); - JSONObject v = new JSONObject(); - v.put("vod_id", str); - String string = jSONObject4.getString("title"); - v.put("vod_name", string); - String string2 = jSONObject4.getString("pic"); - v.put("vod_pic", string2); - String string3 = jSONObject4.getString("tname"); - v.put("type_name", string3); - v.put("vod_year", ""); - v.put("vod_area", ""); - String sb7 = jSONObject4.getLong("duration") / 60 + "分钟"; - v.put("vod_remarks", sb7); - v.put("vod_actor", ""); - v.put("vod_director", ""); - String string4 = jSONObject4.getString("desc"); - v.put("vod_content", string4); - v.put("vod_play_from", "B站"); - ArrayList arrayList = new ArrayList(); - JSONArray jSONArray = jSONObject4.getJSONArray("pages"); - while (true) { - int length = jSONArray.length(); - if (i < length) { - JSONObject jSONObject6 = jSONArray.getJSONObject(i); - String string5 = jSONObject6.getString("part"); - String replace = string5.replace("$", "_").replace("#", "_"); - StringBuilder sb8 = new StringBuilder(); - sb8.append(replace); - sb8.append("$"); - sb8.append(sb4); - sb8.append("+ "); - long j2 = jSONObject6.getLong("cid"); - sb8.append(j2); - String sb9 = sb8.toString(); - arrayList.add(sb9); - i++; - } else { - v.put("vod_play_url", TextUtils.join("#", arrayList)); - JSONArray jSONArray2 = new JSONArray(); - jSONArray2.put(v); - JSONObject jSONObject7 = new JSONObject(); - jSONObject7.put("list", jSONArray2); - return jSONObject7.toString(); - } - } - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - @Override - public String playerContent(String str, String str2, List list) { - try { - String[] split = str2.split("\\+"); - String str3 = split[0]; - String str4 = split[1]; - String sb2 = "https://api.bilibili.com/x/player/playurl?avid=" + str3 + "&cid= " + str4 + "&qn=120&fourk=1"; - JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null)); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("parse", "0"); - jSONObject2.put("playUrl", ""); - JSONObject jSONObject3 = jSONObject.getJSONObject("data"); - JSONObject jSONObject4 = jSONObject3.getJSONArray("durl").getJSONObject(0); - String string = jSONObject4.getString("url"); - jSONObject2.put("url", string); - jSONObject2.put("header", "{\"Referer\":\"https://www.bilibili.com\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"}"); - jSONObject2.put("contentType", "video/x-flv"); - return jSONObject2.toString(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - @Override - public String searchContent(String key, boolean quick) { - try { - JSONObject result = new JSONObject(); - String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(key); - String content = OkHttpUtil.string(url, null); - JSONObject data = new JSONObject(content).getJSONObject("data"); - JSONArray videos = new JSONArray(); - JSONArray RSArray = data.getJSONArray("result"); - for (int i = 0; i < RSArray.length(); i++) { - JSONObject info = RSArray.getJSONObject(i); - JSONObject v = new JSONObject(); - String pic = info.getString("pic"); - if (pic.startsWith("//")) { - pic = "https:" + pic; - } - v.put("vod_id", info.getString("bvid")); - String title = info.getString("title"); - Document doc = Jsoup.parse(title); - String name = doc.text(); - v.put("vod_name", name); - v.put("vod_pic", pic); - String duration = info.getString("duration"); - String Split = duration.split(":")[0]; - String remark = Split + "分钟"; - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Buka.java b/TVBox_Java/spider/Buka.java deleted file mode 100644 index 328c2ed..0000000 --- a/TVBox_Java/spider/Buka.java +++ /dev/null @@ -1,483 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 真不卡 播放好像还有问题 需要大佬继续修复 - *

- * Author: 小黄瓜 - */ -public class Buka extends Spider { - private static final String siteUrl = "https://www.zhenbuka3.com"; - private static final String siteHost = "www.zhenbuka3.com"; - private static final String ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - private Pattern regexCategory = Pattern.compile("/vodtype/(\\w+)/"); - private Pattern regexVid = Pattern.compile("/voddetail/(\\w+)/"); - private Pattern regexPlay = Pattern.compile("/vodplay/(\\w+)-(\\d+)-(\\d+)/"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\S+)/"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"qqpic\":{\"sh\":\"不卡超清[推荐]\",\"pu\":\"http://good-vip.mmiyue.com/zhenbuka2/player/index.php?video_id=\",\"sn\":0,\"or\":999},\"niuxyun\":{\"sh\":\"不卡备用[推荐]\",\"pu\":\"http://good-vip.mmiyue.com/jiekou/zbk-bkby/jx.php?id=\",\"sn\":0,\"or\":999},\"vipjx\":{\"sh\":\"不卡备用③[推荐]\",\"pu\":\"https://cq.mmiyue.com/zhenbuka2/player/index.php?url=\",\"sn\":0,\"or\":999},\"bkm3u8\":{\"sh\":\"不卡备用②[推荐]\",\"pu\":\"http://good-vip.mmiyue.com/zhenbuka2/player/index.php?url=//good-vip.mmiyue.com/zhenbuka2/api/dymp4.php?video_id=\",\"sn\":0,\"or\":999},\"cy\":{\"sh\":\"动漫云\",\"pu\":\"https://cq.mmiyue.com/jiekou/zbk-bkby/jx.php?id=\",\"sn\":0,\"or\":999},\"mgtv\":{\"sh\":\"不卡芒果\",\"pu\":\"https://cq.mmiyue.com/zhenbuka2/player/index.php?url=\",\"sn\":0,\"or\":999},\"qiyi\":{\"sh\":\"不卡奇艺\",\"pu\":\"https://cq.mmiyue.com/zhenbuka2/player/index.php?url=\",\"sn\":0,\"or\":999},\"qq\":{\"sh\":\"不卡企鹅\",\"pu\":\"https://cq.mmiyue.com/zhenbuka2/player/index.php?url=\",\"sn\":0,\"or\":999},\"youku\":{\"sh\":\"不卡优酷\",\"pu\":\"https://cq.mmiyue.com/zhenbuka2/player/index.php?url=\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"资源备用[不推荐]\",\"pu\":\"\",\"sn\":0,\"or\":999},\"niuyun\":{\"sh\":\"超清备用\",\"pu\":\"https://api.l32c.cn/danmu/niuyun.php?id=\",\"sn\":0,\"or\":999},\"123kum3u8\":{\"sh\":\"资源备用[不推荐]\",\"pu\":\"\",\"sn\":0,\"or\":999},\"sixpan\":{\"sh\":\"不卡备用②[推荐]\",\"pu\":\"https://cq.mmiyue.com/zhenbuka2/player/index.php?url=//cq.mmiyue.com/m3u8/buka/\",\"sn\":0,\"or\":999},\"qq1\":{\"sh\":\"超清云播\",\"pu\":\"https://api.nixingle.com/zhenbuka/player/index.php?id=\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"动画片\",\"v\":\"23\"},{\"n\":\"纪录片\",\"v\":\"25\"},{\"n\":\"犯罪片\",\"v\":\"26\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"海外剧\",\"v\":\"20\"},{\"n\":\"纪录片\",\"v\":\"24\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]}],\"3\":[{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]}],\"4\":[{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", ua); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.dropdown > li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = true; - if (filter) { - show = name.equals("电影") || - name.equals("剧集") || - name.equals("动漫") || - name.equals("综艺"); - } - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - Elements list = doc.select("div.stui-pannel_bd ul.stui-vodlist li div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.trim().length() == 0) - continue; - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - Elements pageInfo = doc.select(".stui-page li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("ul.stui-vodlist li div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("a.stui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("div.stui-content__detail h1.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.stui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("类型:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextSibling().outerHtml().trim(); - } else if (info.equals("地区:")) { - area = text.nextSibling().outerHtml().trim(); - } else if (info.equals("更新:")) { - remark = text.nextSibling().outerHtml().trim(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - Elements sources = doc.select("div.playlist"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.selectFirst("h3.title").text().trim(); - String tabHref = source.attr("href"); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = source.select("ul.stui-content__playlist > li > a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/vodplay/" + id + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - String from = player.getString("from"); - if (from.equals("qqpic")) { - // 感谢猫大神的直连解密代码 - HashMap hds = getHeaders(url); - hds.put("Host", "good-vip.mmiyue.com"); - hds.put("Referer", url); - String content1 = OkHttpUtil.string(playUrl + videoUrl, hds); - Document doc1 = Jsoup.parse(content1); - String url2 = "https:" + doc1.selectFirst("iframe#player").attr("src"); - hds.put("Host", "pcc.mmiyue.com"); - hds.put("Referer", "http://good-vip.mmiyue.com/"); - String content2 = OkHttpUtil.string(url2, hds); - String finder = "var id=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String vvid = content2.substring(start, end); - finder = "var sk=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String skey = content2.substring(start, end); - finder = "var pt=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String pt = content2.substring(start, end); - finder = "var ti=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String time = content2.substring(start, end); - int bkn = 0x195c; - for (int j = 0x0, all = skey.length(); all > j; ++j) { - bkn += ((bkn << 5) + (byte) skey.charAt(j)); - } - bkn = 0x7fffffff & bkn; - int gtk1 = 0x0; - for (int j = 0x0; j < pt.length(); j += 0x4) { - gtk1 += Integer.parseInt(String.format("%c%c%c%c", pt.charAt(j), pt.charAt(j + 0x1), pt.charAt(j + 0x2), pt.charAt(j + 0x3)), 0x10); - gtk1 %= 0x400a; - } - int offset = gtk1 % 10; - int gtk = 0x0; - for (int j = 0x0; j < pt.length(); j++) { - gtk += ((byte) pt.charAt(j)) * (j + offset); - gtk %= gtk1; - } - String finalVideoUrl = "https://pcc.mmiyue.com/hls/play/" + vvid + "%7C" + time + "%7C" + skey + "%7C" + pt + "%7C" + bkn + "%7C" + gtk + ".m3u8"; - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", ""); - result.put("url", finalVideoUrl); - result.put("header", ""); - } else { - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - // 搜索有验证码 不支持 - return ""; - } -} diff --git a/TVBox_Java/spider/Cokemv.java b/TVBox_Java/spider/Cokemv.java deleted file mode 100644 index c95ae12..0000000 --- a/TVBox_Java/spider/Cokemv.java +++ /dev/null @@ -1,513 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.LinkedHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Headers; - -public class Cokemv extends Spider { - private static final String siteUrl = "https://cokemv.me"; - private static final String siteHost = "cokemv.me"; - private String cookie=""; - private String referer=""; - - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/voddetail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"cokebb\":{\"sh\":\"極速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"mp4\":{\"sh\":\"藍光路线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cokemv\":{\"sh\":\"高速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cokemv001\":{\"sh\":\"海外線路\",\"pu\":\"\",\"sn\":0,\"or\":999},\"ddzy\":{\"sh\":\"蓝光采集(暂时)\",\"pu\":\"\",\"sn\":0,\"or\":999},\"tkm3u8\":{\"sh\":\"采集路线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"if101\":{\"sh\":\"海外(禁國內)\",\"pu\":\"\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"5\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜劇\"},{\"n\":\"爱情\",\"v\":\"愛情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"動作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"劇情\"},{\"n\":\"战争\",\"v\":\"戰爭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"動畫\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"悬疑\",\"v\":\"懸疑\"},{\"n\":\"微电影\",\"v\":\"微電影\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"國語\"},{\"n\":\"英语\",\"v\":\"英語\"},{\"n\":\"粤语\",\"v\":\"粵語\"},{\"n\":\"闽南语\",\"v\":\"閩南語\"},{\"n\":\"韩语\",\"v\":\"韓語\"},{\"n\":\"日语\",\"v\":\"日語\"},{\"n\":\"法语\",\"v\":\"法語\"},{\"n\":\"德语\",\"v\":\"德語\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"大陆剧\",\"v\":\"13\"},{\"n\":\"香港剧\",\"v\":\"14\"},{\"n\":\"韩国剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"日本剧\",\"v\":\"20\"},{\"n\":\"台湾剧\",\"v\":\"21\"},{\"n\":\"泰国剧\",\"v\":\"22\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"1\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"犯罪片\",\"v\":\"23\"},{\"n\":\"奇幻片\",\"v\":\"24\"},{\"n\":\"悬疑片\",\"v\":\"25\"},{\"n\":\"记录片\",\"v\":\"27\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"动画电影\",\"v\":\"41\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders2(siteUrl,referer))); - // 分类节点 - Elements elements = doc.select("ul.navbar-items>li.navbar-item>a"); - System.out.println("shouye" + elements); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("续剧") || - name.equals("综艺") || - name.equals("动漫"); - - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.module-main").get(0); - Elements list = homeList.select("div.module-items>a"); - System.out.println("list..." + list); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.selectFirst("img.lazyload").attr("data-original"); - String remark = vod.selectFirst("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + ".html"; - System.out.println("url+++" + url); - String html = OkHttpUtil.string(url, getHeaders2(url,referer)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id=page]"); - System.out.println("pg++" + pageInfo); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = doc.select("span.page-current").text(); - String wy = doc.select("div[id=page] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.module > a"); - System.out.print("list++f" + list); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - System.out.print("title++" + title); - String cover = vod.selectFirst("img.lazyload").attr("data-original"); - System.out.print("cover++" + cover); - String remark = vod.selectFirst("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders2(url,referer))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.module-item-cover div.module-item-pic > img").attr("data-original"); - String title = doc.selectFirst("div.module-info-main div.module-info-heading > h1").text(); - String desc = doc.selectFirst("div.module-info-item div.module-info-introduction-content > p").text().trim(); - - - String category = "", area = "", year = "", director = "", actor = ""; - category = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(2).text(); - area = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(1).text(); - year = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(0).text(); - - Elements span_text_muted = doc.select("div.module-info-content div.module-info-items div.module-info-item"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.select("span").text(); - if (info.contains("导演")) { - try { - director = text.select("div > a").text(); - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演")) { - try { - actor = text.select("div > a").text(); - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new LinkedHashMap<>(); - /* Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - });*/ - - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-items-box>div>span"); - System.out.print("sor++" + sources); - Elements sourceList = doc.select("div.module-list>div.module-play-list"); - System.out.print("sor1++" + sourceList); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - // boolean found = false; - boolean found = true; - // for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - // String flag = it.next(); - // if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - // sourceName = playerConfig.getJSONObject(flag).getString("sh"); - // found = true; - // break; - // } - // } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("div.module-play-list-content>a"); - System.out.print("pl++" + playList); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " https://cokemv.me"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/vodplay/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders2(String url,String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(!ref.equals("google")){ - headers.put("Authority", "cokemv.me"); - if(ref.length()>0){ - if(ref.equals("origin")){ - headers.put("Origin", "https://cokemv.me"); - } else { - headers.put("Referer", ref); - } - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - protected void getCookie(){ - cookie=""; - String cookieurl="https://cokemv.me/zzzzz"; - Map> cookies = new HashMap<>(); - OkHttpUtil.string(cookieurl,getHeaders2(cookieurl,""),cookies); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = TextUtils.join(";",entry.getValue()); - break; - } - } - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = "https://www.xn--flw351e.cf/search?q=site%3A" + siteHost + "+" + URLEncoder.encode(key); - Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders2(url,"google"))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - Elements sourceList = doc.select("div.yuRUbf a"); - if(sourceList.size()>0){ - for (int i = 0; i < 1; i++) { - Element sourcess = sourceList.get(i); - String sourceName = sourcess.select("h3.LC20lb.MBeuO.DKV0Md").text(); - String list1 = sourcess.attr("href"); - if(list1.contains("/s/")||list1.contains("play")||list1.contains("performer")||list1.contains("search")||list1.contains("jsessionid")){ - continue; - } - if (sourceName.contains(key)) { - Document link = Jsoup.parse(OkHttpUtil.string(list1, getHeaders2(list1,referer))); - JSONObject v = new JSONObject(); - Matcher matcher = regexVid.matcher(list1); - if (!matcher.find()) continue; - - String cover = link.selectFirst("div.module-item-cover div.module-item-pic > img").attr("data-original"); - String title = link.selectFirst("div.module-info-main div.module-info-heading > h1").text(); - String id = matcher.group(1); - - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_remarks", ""); - v.put("vod_pic", cover); - videos.put(v); - } - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Czsapp.java b/TVBox_Java/spider/Czsapp.java deleted file mode 100644 index 04519ef..0000000 --- a/TVBox_Java/spider/Czsapp.java +++ /dev/null @@ -1,435 +0,0 @@ -package com.github.catvod.spider; - -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.AES; -import com.github.catvod.utils.CBC; -import com.github.catvod.utils.gZip; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.StringReader; -import java.net.URLEncoder; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Response; -import okhttp3.ResponseBody; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -public class Czsapp extends Spider { - private static final Pattern Y = Pattern.compile("\"([^\"]+)\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\"([\\d\\w]+)\".*md5.enc.Utf8.parse\\(([\\d]+)\\)"); - private static final Pattern pY = Pattern.compile("video: \\{url: \"([^\"]+)\""); - private static final Pattern m = Pattern.compile("subtitle: \\{url:\"([^\"]+\\.vtt)\""); - private static final Pattern Q = Pattern.compile("src: '([^']+\\.css)',"); - private static final Pattern Db = Pattern.compile("/movie/(\\d+).html"); - private static final Pattern I = Pattern.compile("/page/(\\d+)"); - private static final Pattern d = Pattern.compile("/v_play/(.*)\\.html"); - private static final Pattern K = Pattern.compile("var vkey = ['\"]([^'\"]+)['\"]"); - private static final Pattern Oe = Pattern.compile("var fvkey = ['\"]([^'\"]+)['\"]"); - private static final Pattern fi = Pattern.compile("var ua = ['\"]([^'\"]+)['\"]"); - private static final Pattern M = Pattern.compile("var cip = ['\"]([^'\"]+)['\"]"); - private static final Pattern X = Pattern.compile("var time = ['\"]([^'\"]+)['\"]"); - private static final Pattern a = Pattern.compile("var url = ['\"]([^'\"]+)['\"]"); - - - private String mmd5(String str) { - try { - MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - messageDigest.update(str.getBytes()); - byte[] digest = messageDigest.digest(); - StringBuilder sb = new StringBuilder(); - for (byte b : digest) { - String hexString = Integer.toHexString(b & 255); - while (hexString.length() < 2) { - hexString = "0" + hexString; - } - sb.append(hexString); - } - return sb.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public static Object[] loadsub(String sub) { - try { - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(Response response) { - - } - }; - OkHttpClient YM = OkHttpUtil.defaultClient(); - OkHttpUtil.get(YM, sub, null, Headers(), callBack); - Response result = callBack.getResult(); - int code = result.code(); - if (code == 404) { - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())}; - } - ResponseBody body = result.body(); - byte[] bytes = body.bytes(); - byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16); - byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length); - byte[] KS = CBC.CBC(data, tokenkey, tokenkey); - String vtt = gZip.KS(KS); - - - vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1"); - vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3"); - vtt = vtt.replaceAll("<.*><.*>(.*)<.*><.*>", "$1"); - vtt = vtt.replaceAll("&(.*);", ""); - vtt = vtt.replaceAll(".*NOTE.*", ""); - BufferedReader br = new BufferedReader(new StringReader(vtt)); - ArrayList lines = new ArrayList<>(); - int captionNumber = 1; - String line = br.readLine(); - while (line != null) { - if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) { - if (lines.get(lines.size() - 1).trim().isEmpty()) { - lines.add(captionNumber + ""); - captionNumber++; - } - } - lines.add(line); - line = br.readLine(); - } - String join = TextUtils.join("\n", lines); - - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())}; - } catch (Exception e) { - e.printStackTrace(); - SpiderDebug.log(e); - return null; - } - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - try { - JSONObject jSONObject = new JSONObject(); - Document doc = Jsoup.parse(OkHttpUtil.string("https://www.c-zzy.com/" + str + "/page/" + str2, Headers())); - int parseInt = Integer.parseInt(str2); - int parseInt2 = Integer.parseInt(str2); - Matcher matcher = I.matcher(doc.select("div.pagenavi_txt > a.extend").last().attr("href")); - if (matcher.find()) { - parseInt2 = Integer.parseInt(matcher.group(1)); - } - Elements jS = doc.select("div.mi_ne_kd > ul > li"); - JSONArray jSONArray = new JSONArray(); - for (Element next : jS) { - Matcher matcher2 = Db.matcher(next.select("a").attr("href")); - if (matcher2.find()) { - String group = matcher2.group(1); - String trim = next.select("img").attr("alt").trim(); - String trim2 = next.select("img").attr("data-original").trim(); - String trim3 = next.select("div.hdinfo > span").text().trim(); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", group); - jSONObject2.put("vod_name", trim); - jSONObject2.put("vod_pic", trim2); - jSONObject2.put("vod_remarks", trim3); - jSONArray.put(jSONObject2); - } - } - jSONObject.put("list", jSONArray); - jSONObject.put("page", parseInt); - jSONObject.put("pagecount", parseInt2); - jSONObject.put("limit", 24); - jSONObject.put("total", parseInt2 <= 1 ? jSONArray.length() : parseInt2 * 24); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String detailContent(List list) { - String str2 = ""; - try { - - JSONObject jSONObject = new JSONObject(); - JSONArray jSONArray = new JSONArray(); - JSONObject jSONObject2 = new JSONObject(); - Document doc = Jsoup.parse(OkHttpUtil.string("https://www.c-zzy.com/movie/" + list.get(0) + ".html", Headers())); - String trim = doc.select("div.moviedteail_tt > h1").text().trim(); - String pY2 = doc.select("div.dyimg > img").attr("src"); - Iterator it = doc.select("ul.moviedteail_list > li").iterator(); - String str3 = str2; - String str4 = str3; - String str5 = str4; - String str6 = str5; - String str7 = str6; - String str8 = str7; - while (it.hasNext()) { - String trim2 = it.next().text().trim(); - if (trim2.length() >= 4) { - try { - String substring = trim2.substring(0, 2); - String substring2 = trim2.substring(3); - if (substring.equals("类型")) { - str3 = substring2; - } else if (substring.equals("地区")) { - str5 = substring2; - } else if (substring.equals("年份")) { - str4 = substring2; - } else if (substring.equals("导演")) { - str8 = substring2; - } else if (substring.equals("主演")) { - str7 = substring2; - } else if (substring.equals("豆瓣")) { - str6 = substring2; - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } - jSONObject2.put("vod_id", list.get(0)); - jSONObject2.put("vod_name", trim); - jSONObject2.put("vod_pic", pY2); - jSONObject2.put("type_name", str3); - jSONObject2.put("vod_year", str4); - jSONObject2.put("vod_area", str5); - jSONObject2.put("vod_remarks", str6); - jSONObject2.put("vod_actor", str7); - jSONObject2.put("vod_director", str8); - jSONObject2.put("vod_content", doc.select("div.yp_context").text().trim()); - jSONObject2.put("vod_play_from", "厂长资源"); - ArrayList arrayList = new ArrayList(); - for (Element next : doc.select("div.paly_list_btn > a")) { - Matcher matcher = d.matcher(next.attr("href")); - if (matcher.find()) { - arrayList.add(next.text() + "$" + matcher.group(1)); - } - } - jSONObject2.put("vod_play_url", TextUtils.join("#", arrayList)); - jSONArray.put(jSONObject2); - jSONObject.put("list", jSONArray); - return jSONObject.toString(); - } catch (Exception e3) { - }return ""; - } - - public String homeContent(boolean z) { - try { - - JSONObject jSONObject = new JSONObject(); - Document doc = Jsoup.parse(OkHttpUtil.string("https://www.c-zzy.com", Headers())); - Elements jS = doc.select(".navlist > li > a"); - JSONArray jSONArray = new JSONArray(); - for (Element next : jS) { - String pY2 = next.attr("href"); - if (pY2.length() > 1) { - String substring = pY2.substring(1); - String trim = next.text().trim(); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("type_id", substring); - jSONObject2.put("type_name", trim); - jSONArray.put(jSONObject2); - } - } - jSONObject.put("class", jSONArray); - Elements jS2 = doc.select("div.mi_ne_kd > ul > li"); - JSONArray jSONArray2 = new JSONArray(); - for (Element next2 : jS2) { - Matcher matcher = Db.matcher(next2.select("a").attr("href")); - if (matcher.find()) { - String group = matcher.group(1); - String trim2 = next2.select("img").attr("alt").trim(); - String trim3 = next2.select("img").attr("data-original").trim(); - String trim4 = next2.select("div.hdinfo > span").text().trim(); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", group); - jSONObject3.put("vod_name", trim2); - jSONObject3.put("vod_pic", trim3); - jSONObject3.put("vod_remarks", trim4); - jSONArray2.put(jSONObject3); - } - } - jSONObject.put("list", jSONArray2); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - protected static HashMap Headers() { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"); - return hashMap; - } - - - public String playerContent(String str, String str2, List list) { - String str3; - String str4; - Elements G8; - try { - String K2 = OkHttpUtil.string("https://www.c-zzy.com/v_play/" + str2 + ".html", Headers()); - Document UR = Jsoup.parse(K2); - Matcher matcher = Y.matcher(K2); - if (matcher.find()) { - String group = matcher.group(1); - String KEY = matcher.group(2); - String IV = matcher.group(3); - String str5 = AES.CBC(group, KEY, IV); - Matcher matcher2 = pY.matcher(str5); - str3 = matcher2.find() ? matcher2.group(1) : ""; - Matcher matcher3 = m.matcher(str5); - str4 = matcher3.find() ? matcher3.group(1) : ""; - } else { - str4 = ""; - str3 = str4; - } - if (TextUtils.isEmpty(str3) && (G8 = UR.select("iframe.viframe")) != null) { - String pY2 = G8.attr("src"); - if (pY2.contains("jx.xmflv.com")) { - String K3 = OkHttpUtil.string(pY2, Headers()); - Matcher matcher4 = X.matcher(K3); - if (!matcher4.find()) { - return ""; - } - String group2 = matcher4.group(1); - Matcher matcher5 = a.matcher(K3); - if (!matcher5.find()) { - return ""; - } - String group3 = matcher5.group(1); - String K4 = OkHttpUtil.string("https://jx.xmflv.com/player.php?time=" + group2 + "&url=" + group3, Headers()); - Matcher matcher6 = K.matcher(K4); - if (!matcher6.find()) { - return ""; - } - String group4 = matcher6.group(1); - Matcher matcher7 = Oe.matcher(K4); - if (!matcher7.find()) { - return ""; - } - String group5 = matcher7.group(1); - Matcher matcher8 = fi.matcher(K4); - if (!matcher8.find()) { - return ""; - } - String group6 = matcher8.group(1); - Matcher matcher9 = M.matcher(K4); - if (!matcher9.find()) { - return ""; - } - String group7 = matcher9.group(1); - Matcher matcher10 = X.matcher(K4); - if (!matcher10.find()) { - return ""; - } - String group8 = matcher10.group(1); - byte[] bytes3 = mmd5(group5).getBytes(); - byte[] bytes4 = "UVE1NTY4MDY2NQ==".getBytes(); - Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding"); - cipher2.init(1, new SecretKeySpec(bytes3, "AES"), new IvParameterSpec(bytes4)); - String encodeToString = Base64.encodeToString(cipher2.doFinal(group5.getBytes()), 0); - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - - public void onResponse(Response response) { - } - - @Override - protected void onFailure(Call call, Exception exc) { - } - }; - HashMap hashMap = new HashMap(); - hashMap.put("url", group3); - hashMap.put("time", group8); - hashMap.put("ua", group6); - hashMap.put("cip", group7); - hashMap.put("vkey", group4); - hashMap.put("fvkey", encodeToString); - OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://jx.xmflv.com/xmflv-1.SVG", hashMap, Headers(), callBack); - str3 = new JSONObject(callBack.getResult().body().string()).getString("url"); - } else { - Matcher matcher11 = Q.matcher(OkHttpUtil.string(pY2, Headers())); - if (matcher11.find()) { - str3 = matcher11.group(1); - } - } - } - JSONObject jSONObject = new JSONObject(); - jSONObject.put("parse", "0"); - jSONObject.put("playUrl", ""); - jSONObject.put("url", str3); - jSONObject.put("header", ""); - if (!TextUtils.isEmpty(str4)) { - jSONObject.put("subf", "/vtt/utf-8"); - jSONObject.put("subt", Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4)); - } - return jSONObject.toString(); - } catch (Exception e) { - e.printStackTrace(); - SpiderDebug.log(e); - return ""; - } - } - - public String searchContent(String str, boolean z) { - try { - JSONObject jSONObject = new JSONObject(); - Elements jS = Jsoup.parse(OkHttpUtil.string("https://www.c-zzy.com/xssearch?q=" + URLEncoder.encode(str), Headers())).select("div.mi_ne_kd > ul > li"); - JSONArray jSONArray = new JSONArray(); - for (Element next : jS) { - Matcher matcher = Db.matcher(next.select("a").attr("href")); - JSONObject jSONObject2 = new JSONObject(); - if (matcher.find()) { - String group = matcher.group(1); - String trim = next.select("img").attr("alt").trim(); - if (trim.contains(str)) { - String trim2 = next.select("img").attr("src").trim(); - if (next.hasClass(".jidi")) { - String remark = next.select(".jidi span").text(); - jSONObject2.put("vod_remarks", remark); - } else { - String id = next.select("a").attr("href"); - Document doc = Jsoup.parse(OkHttpUtil.string(id, Headers())); - String remark = doc.select("ul.moviedteail_list li span").get(0).text(); - jSONObject2.put("vod_id", group); - jSONObject2.put("vod_name", trim); - jSONObject2.put("vod_pic", trim2); - jSONObject2.put("vod_remarks", remark); - jSONArray.put(jSONObject2); - } - } - } - } - jSONObject.put("list", jSONArray); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } -} diff --git a/TVBox_Java/spider/Ddrk.java b/TVBox_Java/spider/Ddrk.java deleted file mode 100644 index 826da15..0000000 --- a/TVBox_Java/spider/Ddrk.java +++ /dev/null @@ -1,581 +0,0 @@ -package com.github.catvod.spider; - -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.AES; -import com.github.catvod.utils.CBC; -import com.github.catvod.utils.gZip; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.StringReader; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Response; -import okhttp3.ResponseBody; - -/** - * Demo for self study - *

- * Source from Author: CatVod - */ - -public class Ddrk extends Spider { - - private static final String siteUrl = "https://ddrk.tv"; - private static final String siteHost = "ddrk.tv"; - - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/category/(\\S+)/"); - protected Pattern regexVid = Pattern.compile("https://ddrk.tv/(\\S+)/"); - - protected Pattern regexPage = Pattern.compile("\\S+/page/(\\S+)\\S+"); - protected Pattern m = Pattern.compile("\\S+(http\\S+g)"); - protected Pattern mark = Pattern.compile("\\S+(.*)"); - - // protected Pattern t = Pattern.compile("(\\S+)"); - - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", "https://ddrk.tv/"); - return headers; - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Referer", "https://ddrk.tv/"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements elements = doc.select("li.menu-item a"); - JSONArray classes = new JSONArray(); - ArrayList allClass = new ArrayList<>(); - for (Element ele : elements) { - String name = ele.attr("title"); - boolean show = !filter || (name.equals("热映中") - || name.equals("欧美剧") - || name.equals("日剧") - || name.equals("韩剧") - || name.equals("华语剧") - || name.equals("其他地区") - || name.equals("全部") - || name.equals("欧美电影") - || name.equals("日韩电影") - || name.equals("华语电影") - || name.equals("新番") - || name.equals("动画") - || name.equals("纪录片") - || name.equals("综艺")); - if (allClass.contains(name)) - show = false; - if (show) { - allClass.add(name); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div.post-box-container"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String a = vod.selectFirst(".post-box-title a").text(); - if (a.contains("(")) { - String[] item = a.split("\\("); - String title = item[0]; - String remark = item[1].replace(")", ""); - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } else { - String title = a; - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - String remark = doReplaceRegex(mark, vod.selectFirst(".post-box-title a").text()); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - String url = ""; - try { - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value != null && value.length() != 0 && value != " ") { - url = siteUrl + "/category/" + tid + "/" + value; - } else { - url = siteUrl + "/category/" + tid; - } - ; - } - } else { - url = siteUrl + "/category/" + tid; - } - ; - if (pg.equals("1")) { - url = url + "/"; - } else { - url = url + "/page/" + pg + "/"; - } - //System.out.println(url); - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div.nav-links"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String wy = doc.select("div.nav-links a").last().attr("href"); - String span = doc.select("span.current").text().trim(); - if (page == -1) { - page = Integer.parseInt(span); - } else { - - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - //System.out.println("尾页" + matcher.group(1)); - pageCount = Integer.parseInt(matcher.group(1)); - } else { - pageCount = 0; - } - break; - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.post-box-container"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String a = vod.selectFirst(".post-box-title a").text(); - if (a.contains("(")) { - String[] item = a.split("\\("); - String title = item[0]; - String remark = item[1].replace(")", ""); - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } else { - String title = a; - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - String remark = doReplaceRegex(mark, vod.selectFirst(".post-box-title a").text()); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 24); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 24); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/" + ids.get(0) + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.select("div.post img").attr("src"); - String ab = doc.select("h1.post-title").text(); - if (ab.contains("(")) { - String[] b = ab.split("\\("); - String title = b[0]; - String remark = b[1].replace("(", ""); - vodList.put("vod_name", title); - vodList.put("vod_remarks", remark); - } else { - vodList.put("vod_name", ab); - String remark = doc.select("time").text().trim(); - vodList.put("vod_remarks", "全"); - } - String str2 = doc.select("div.abstract").text().replace(" ", ""); - String replace = str2.replace("
", ""); - String text = replace.replace("

", ""); - Pattern categorys = Pattern.compile("类型:(.*)制"); - String category = doReplaceRegex(categorys, text); - Pattern a = Pattern.compile("年份:(.*)简"); - String year = doReplaceRegex(a, text); - Pattern b = Pattern.compile("地区:(.*)年份"); - String area = doReplaceRegex(b, text); - Pattern c = Pattern.compile("演员:(.*)类"); - String actor = doReplaceRegex(c, text); - Pattern d = Pattern.compile("导演:(.*)演"); - String director = doReplaceRegex(d, text); - Pattern e = Pattern.compile("简介:(.*)"); - String desc = doReplaceRegex(e, text); - - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - List vodItems = new ArrayList<>(); - List vodItems2 = new ArrayList<>(); - Map vod_play = new LinkedHashMap<>(); - - Elements allScript = doc.select(".wp-playlist-script"); - String sourceName = "第1季"; - for (int j = 0; j < allScript.size(); j++) { - String scContent = allScript.get(j).html().trim(); - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject UJson = new JSONObject(json); - JSONArray Track = UJson.getJSONArray("tracks"); - for (int k = 0; k < Track.length(); k++) { - JSONObject src = Track.getJSONObject(k); - String adk = src.getString("src1"); - String vodName = src.getString("caption"); - String playURL = "https://ddrk.tv/getvddr/video?id=" + adk + "&type=mix"; - String zm = "https://ddrk.tv/subddr/" + src.getString("subsrc"); - String pzm = playURL + "|" + zm; - vodItems.add(vodName + "$" + pzm); - } - vod_play.put(sourceName, TextUtils.join("#", vodItems)); - } - Elements sources = doc.select(".post-page-numbers"); - if (!sources.isEmpty()) - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - sourceName = "第" + source.text() + "季"; - String Purl = siteUrl + "/" + ids.get(0) + "/" + source.text() + "/"; - Document docs = Jsoup.parse(OkHttpUtil.string(Purl, getHeaders(Purl))); - Elements allScripts = docs.select(".wp-playlist-script"); - for (int j = 0; j < allScripts.size(); j++) { - String scContent = allScripts.get(j).html().trim(); - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject UJson = new JSONObject(json); - JSONArray Track = UJson.getJSONArray("tracks"); - for (int k = 0; k < Track.length(); k++) { - JSONObject src = Track.getJSONObject(k); - String adk = src.getString("src1"); - String vodName = src.getString("caption"); - String playURL = "https://ddrk.tv/getvddr/video?id=" + adk + "&type=mix"; - String zm = "https://ddrk.tv/subddr/" + src.getString("subsrc"); - String pzm = playURL + "|" + zm; - vodItems2.add(vodName + "$" + pzm); - } - vod_play.put(sourceName, TextUtils.join("#", vodItems2)); - } - vodItems2.removeAll(vodItems2); - } - - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public static Object[] loadsub(String sub) { - try { - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(Response response) { - - } - }; - OkHttpClient YM = OkHttpUtil.defaultClient(); - OkHttpUtil.get(YM, sub, null, Headers(), callBack); - Response result = callBack.getResult(); - int code = result.code(); - if (code == 404) { - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())}; - } - ResponseBody body = result.body(); - byte[] bytes = body.bytes(); - byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16); - byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length); - byte[] KS = CBC.CBC(data, tokenkey, tokenkey); - String vtt = gZip.KS(KS); - - - vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1"); - vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3"); - BufferedReader br = new BufferedReader(new StringReader(vtt)); - ArrayList lines = new ArrayList<>(); - int captionNumber = 1; - String line = br.readLine(); - while (line != null) { - if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) { - if (lines.get(lines.size() - 1).trim().isEmpty()) { - lines.add(captionNumber + ""); - captionNumber++; - } - } - lines.add(line); - line = br.readLine(); - } - String join = TextUtils.join("\n", lines); - - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())}; - } catch (Exception e) { - e.printStackTrace(); - SpiderDebug.log(e); - return null; - } - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String[] item = id.split("\\|"); - String playUrl = item[0]; - String ZiMu = item[1]; - - String content = OkHttpUtil.string(playUrl, getHeaders(playUrl)); - JSONObject obj = new JSONObject(content); - String RealUrl = obj.optString("url"); - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", RealUrl); - result.put("header", ""); - // if (!TextUtils.isEmpty(str4)) { - result.put("subf", "/vtt/utf-8"); - result.put("subt", Proxy.localProxyUrl() + "?do=ddrk&url=" + URLEncoder.encode(ZiMu)); - // result.put("subt", ZiMu); - // } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = "https://www.google.com/search?q=site%3Addrk.tv+" + URLEncoder.encode(key); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - String sourceName = doc.select("div.yuRUbf a h3").text(); - if (sourceName.contains(key)) { - String list1 = doc.select("div.yuRUbf a").attr("href"); - Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1))); - String DDlink = ddrklink.select("link[rel=canonical]").attr("href"); - Matcher matcher = regexVid.matcher(DDlink); - if (matcher.find()) { - JSONObject v = new JSONObject(); - String group = matcher.group(1); - String ab = ddrklink.select("h1.post-title").text(); - String cover = ddrklink.select("div.post img").attr("src"); - if (ab.contains("(")) { - String[] b = ab.split("\\("); - String title = b[0]; - String remark = b[1].replace("(", ""); - v.put("vod_name", title); - v.put("vod_remarks", remark); - } else { - v.put("vod_name", ab); - String remark = "全"; - v.put("vod_remarks", remark); - } - v.put("vod_id", group); - v.put("vod_pic", cover); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - - -} diff --git a/TVBox_Java/spider/Ddys.java b/TVBox_Java/spider/Ddys.java deleted file mode 100644 index 784637b..0000000 --- a/TVBox_Java/spider/Ddys.java +++ /dev/null @@ -1,627 +0,0 @@ -package com.github.catvod.spider; - -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.AES; -import com.github.catvod.utils.CBC; -import com.github.catvod.utils.gZip; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.StringReader; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Response; -import okhttp3.ResponseBody; - -/** - * Demo for self study - *

- * Source from Author: CatVod - */ - -public class Ddys extends Spider { - - private static final String siteUrl = "https://ddys.tv"; - private static final String siteHost = "ddys.tv"; - private String cookie=""; - - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/category/(\\S+)/"); - protected Pattern regexVid = Pattern.compile("https://ddys.tv/(\\S+)/"); - - protected Pattern regexPage = Pattern.compile("\\S+/page/(\\S+)\\S+"); - protected Pattern m = Pattern.compile("\\S+(http\\S+g)"); - protected Pattern mark = Pattern.compile("\\S+(.*)"); - - // protected Pattern t = Pattern.compile("(\\S+)"); - - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", "https://ddys.tv/"); - if(cookie.length()>0 && !url.contains(("google"))){ - headers.put("Cookie", cookie); - } - return headers; - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Referer", "https://ddys.tv/"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - cookie=""; - Map> cookies = new HashMap<>(); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url),cookies)); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = TextUtils.join(";",entry.getValue()); - break; - } - } - Elements elements = doc.select("li.menu-item a"); - JSONArray classes = new JSONArray(); - ArrayList allClass = new ArrayList<>(); - for (Element ele : elements) { - String name = ele.attr("title"); - boolean show = !filter || (name.equals("热映中") - || name.equals("欧美剧") - || name.equals("日剧") - || name.equals("韩剧") - || name.equals("华语剧") - || name.equals("其他地区") - || name.equals("全部") - || name.equals("欧美电影") - || name.equals("日韩电影") - || name.equals("华语电影") - || name.equals("新番") - || name.equals("动画") - || name.equals("纪录片") - || name.equals("综艺")); - if (allClass.contains(name)) - show = false; - if (show) { - allClass.add(name); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div.post-box-container"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String a = vod.selectFirst(".post-box-title a").text(); - if (a.contains("(")) { - String[] item = a.split("\\("); - String title = item[0]; - String remark = item[1].replace(")", ""); - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } else { - String title = a; - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - String remark = doReplaceRegex(mark, vod.selectFirst(".post-box-title a").text()); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - String url = ""; - try { - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value != null && value.length() != 0 && value != " ") { - url = siteUrl + "/category/" + tid + "/" + value; - } else { - url = siteUrl + "/category/" + tid; - } - ; - } - } else { - url = siteUrl + "/category/" + tid; - } - ; - if (pg.equals("1")) { - url = url + "/"; - } else { - url = url + "/page/" + pg + "/"; - } - //System.out.println(url); - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div.nav-links"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String wy = doc.select("div.nav-links a").last().attr("href"); - String span = doc.select("span.current").text().trim(); - if (page == -1) { - page = Integer.parseInt(span); - } else { - - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - //System.out.println("尾页" + matcher.group(1)); - pageCount = Integer.parseInt(matcher.group(1)); - } else { - pageCount = 0; - } - break; - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.post-box-container"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String a = vod.selectFirst(".post-box-title a").text(); - if (a.contains("(")) { - String[] item = a.split("\\("); - String title = item[0]; - String remark = item[1].replace(")", ""); - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } else { - String title = a; - String cover = doReplaceRegex(m, vod.selectFirst(".post-box-image").attr("style")); - String remark = doReplaceRegex(mark, vod.selectFirst(".post-box-title a").text()); - Matcher matcher = regexVid.matcher(vod.selectFirst(".post-box-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 24); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 24); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/" + ids.get(0) + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.select("div.post img").attr("src"); - String ab = doc.select("h1.post-title").text(); - if (ab.contains("(")) { - String[] b = ab.split("\\("); - String title = b[0]; - String remark = b[1].replace("(", ""); - vodList.put("vod_name", title); - vodList.put("vod_remarks", remark); - } else { - vodList.put("vod_name", ab); - String remark = doc.select("time").text().trim(); - vodList.put("vod_remarks", "全"); - } - String str2 = doc.select("div.abstract").text().replace(" ", ""); - String replace = str2.replace("
", ""); - String text = replace.replace("

", ""); - Pattern categorys = Pattern.compile("类型:(.*)制"); - String category = doReplaceRegex(categorys, text); - Pattern a = Pattern.compile("年份:(.*)简"); - String year = doReplaceRegex(a, text); - Pattern b = Pattern.compile("地区:(.*)年份"); - String area = doReplaceRegex(b, text); - Pattern c = Pattern.compile("演员:(.*)类"); - String actor = doReplaceRegex(c, text); - Pattern d = Pattern.compile("导演:(.*)演"); - String director = doReplaceRegex(d, text); - Pattern e = Pattern.compile("简介:(.*)"); - String desc = doReplaceRegex(e, text); - - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - List vodItems = new ArrayList<>(); - List vodItems2 = new ArrayList<>(); - List vodItemsos = new ArrayList<>(); - List vodItems2os = new ArrayList<>(); - Map vod_play = new LinkedHashMap<>(); - - Elements allScript = doc.select(".wp-playlist-script"); - String sourceName = "第1季"; - for (int j = 0; j < allScript.size(); j++) { - String scContent = allScript.get(j).html().trim(); - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject UJson = new JSONObject(json); - JSONArray Track = UJson.getJSONArray("tracks"); - for (int k = 0; k < Track.length(); k++) { - JSONObject src = Track.getJSONObject(k); - String adk = src.getString("src1"); - String vodName = src.getString("caption"); - String playURL = "https://ddys.tv/getvddr/video?id=" + adk +"&dim=1080P+&type=mix"; - String zm = "https://ddys.tv/subddr/" + src.getString("subsrc"); - String pzm = playURL + "|" + zm; - vodItems.add(vodName + "$" + pzm); - } - for (int k = 0; k < Track.length(); k++) { - JSONObject src = Track.getJSONObject(k); - String adksrc0 = src.getString("src0"); - String adksrc2 = src.getString("src2"); - String vodName = src.getString("caption"); - String playURL = "https://w.ddys.tv" + adksrc0 +"?ddrkey=" + adksrc2; - String zm = "https://ddys.tv/subddr/" + src.getString("subsrc"); - String pzm = playURL + "|" + zm; - vodItemsos.add(vodName + "$" + pzm); - } - vod_play.put(sourceName, TextUtils.join("#", vodItems)); - vod_play.put(sourceName+":海外", TextUtils.join("#", vodItemsos)); - } - - - Elements sources = doc.select(".post-page-numbers"); - if (!sources.isEmpty()) - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - sourceName = "第" + source.text() + "季"; - String Purl = siteUrl + "/" + ids.get(0) + "/" + source.text() + "/"; - Document docs = Jsoup.parse(OkHttpUtil.string(Purl, getHeaders(Purl))); - Elements allScripts = docs.select(".wp-playlist-script"); - for (int j = 0; j < allScripts.size(); j++) { - String scContent = allScripts.get(j).html().trim(); - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject UJson = new JSONObject(json); - JSONArray Track = UJson.getJSONArray("tracks"); - for (int k = 0; k < Track.length(); k++) { - JSONObject src = Track.getJSONObject(k); - String adk = src.getString("src1"); - String vodName = src.getString("caption"); - String playURL = "https://ddys.tv/getvddr/video?id=" + adk +"&dim=1080P+&type=mix"; - String zm = "https://ddys.tv/subddr/" + src.getString("subsrc"); - String pzm = playURL + "|" + zm; - vodItems2.add(vodName + "$" + pzm); - } - for (int k = 0; k < Track.length(); k++) { - JSONObject src = Track.getJSONObject(k); - String adksrc0 = src.getString("src0"); - String adksrc2 = src.getString("src2"); - String vodName = src.getString("caption"); - String playURL = "https://w.ddys.tv" + adksrc0 +"?ddrkey=" + adksrc2; - String zm = "https://ddys.tv/subddr/" + src.getString("subsrc"); - String pzm = playURL + "|" + zm; - vodItems2os.add(vodName + "$" + pzm); - } - vod_play.put(sourceName, TextUtils.join("#", vodItems2)); - vod_play.put(sourceName+":海外", TextUtils.join("#", vodItems2os)); - } - vodItems2.removeAll(vodItems2); - vodItems2os.removeAll(vodItems2os); - } - - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public static Object[] loadsub(String sub) { - try { - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(Response response) { - - } - }; - OkHttpClient YM = OkHttpUtil.defaultClient(); - OkHttpUtil.get(YM, sub, null, Headers(), callBack); - Response result = callBack.getResult(); - int code = result.code(); - if (code == 404) { - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())}; - } - ResponseBody body = result.body(); - byte[] bytes = body.bytes(); - byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16); - byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length); - byte[] KS = CBC.CBC(data, tokenkey, tokenkey); - String vtt = gZip.KS(KS); - - - vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1"); - vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3"); - BufferedReader br = new BufferedReader(new StringReader(vtt)); - ArrayList lines = new ArrayList<>(); - int captionNumber = 1; - String line = br.readLine(); - while (line != null) { - if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) { - if (lines.get(lines.size() - 1).trim().isEmpty()) { - lines.add(captionNumber + ""); - captionNumber++; - } - } - lines.add(line); - line = br.readLine(); - } - String join = TextUtils.join("\n", lines); - - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())}; - } catch (Exception e) { - e.printStackTrace(); - SpiderDebug.log(e); - return null; - } - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject result = new JSONObject(); - String[] item = id.split("\\|"); - String playUrl = item[0]; - String ZiMu = item[1]; - String RealUrl=""; - if(playUrl.contains("ddrkey")){ - Map> respHeaders = new HashMap<>(); - OkHttpUtil.stringNoRedirect(playUrl, getHeaders(playUrl),respHeaders); - RealUrl = OkHttpUtil.getRedirectLocation(respHeaders); - } else { - String content = OkHttpUtil.string(playUrl, getHeaders(playUrl)); - JSONObject obj = new JSONObject(content); - RealUrl = obj.optString("url"); - } - - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", RealUrl); - result.put("header", ""); - // if (!TextUtils.isEmpty(str4)) { - result.put("subf", "/vtt/utf-8"); - result.put("subt", Proxy.localProxyUrl() + "?do=ddys&url=" + URLEncoder.encode(ZiMu)); - // result.put("subt", ZiMu); - // } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = "https://www.google.com/search?q=site%3Addys.tv+" + URLEncoder.encode(key); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - String sourceName = doc.select("div.yuRUbf a h3").text(); - if (sourceName.contains(key)) { - String list1 = doc.select("div.yuRUbf a").attr("href"); - Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1))); - String DDlink = ddrklink.select("link[rel=canonical]").attr("href"); - Matcher matcher = regexVid.matcher(DDlink); - if (matcher.find()) { - JSONObject v = new JSONObject(); - String group = matcher.group(1); - String ab = ddrklink.select("h1.post-title").text(); - String cover = ddrklink.select("div.post img").attr("src"); - if (ab.contains("(")) { - String[] b = ab.split("\\("); - String title = b[0]; - String remark = b[1].replace("(", ""); - v.put("vod_name", title); - v.put("vod_remarks", remark); - } else { - v.put("vod_name", ab); - String remark = "全"; - v.put("vod_remarks", remark); - } - v.put("vod_id", group); - v.put("vod_pic", cover); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - - -} diff --git a/TVBox_Java/spider/Dy555.java b/TVBox_Java/spider/Dy555.java deleted file mode 100644 index f44470b..0000000 --- a/TVBox_Java/spider/Dy555.java +++ /dev/null @@ -1,568 +0,0 @@ -package com.github.catvod.spider; - - -import static java.lang.System.*; - -import okhttp3.*; -import okio.ByteString; - -import java.security.spec.AlgorithmParameterSpec; -import java.util.concurrent.TimeUnit; -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; - -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.security.Key; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; - -import okhttp3.OkHttpClient; -import okhttp3.Response; - - - - -public class Dy555 extends Spider { - - private static final String siteUrl = "https://www.555dianying.cc"; - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - protected Pattern regexVoddetail = Pattern.compile("/voddetail/(\\d+).html"); - protected Pattern regexPlay = Pattern.compile("/vodplay/(\\S+).html"); - protected Pattern regexPage = Pattern.compile("\\d+/(\\d+)"); - - - private final String filterString = "{\"1\":[{\"name\":\"年份\",\"key\":\"year\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"name\":\"地区\",\"key\":\"area\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"name\":\"类型\",\"key\":\"class\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"动画\",\"v\":\"动画\"}]},{\"name\":\"排序\",\"key\":\"by\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"name\":\"年份\",\"key\":\"year\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"name\":\"地区\",\"key\":\"area\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"name\":\"类型\",\"key\":\"class\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"name\":\"排序\",\"key\":\"by\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"name\":\"年份\",\"key\":\"year\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"name\":\"地区\",\"key\":\"area\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"name\":\"排序\",\"key\":\"by\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"5\":[{\"name\":\"年份\",\"key\":\"year\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"name\":\"类型\",\"key\":\"class\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"番剧\",\"v\":\"番剧\"},{\"n\":\"国创\",\"v\":\"国创\"},{\"n\":\"动画片\",\"v\":\"动画片\"}]},{\"name\":\"排序\",\"key\":\"by\",\"value\":[{\"n\":\"最新\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"; - private final String playerString = "{\"xg_app_player\":{\"show\":\"app全局解析\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://www.x-n.cc/api.php?url=\"},\"duoduozy\":{\"show\":\"555蓝光\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newduoduo/555tZ4pvzHE3BpiO838.php\",\"parse\":\"https://zyz.sdljwomen.com/server_player/?url=\"},\"bilibili\":{\"show\":\"bilibili\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"youku\":{\"show\":\"优酷\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"qiyi\":{\"show\":\"爱奇艺\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"mgtv\":{\"show\":\"芒果\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"qq\":{\"show\":\"腾讯\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"sohu\":{\"show\":\"搜狐\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"pptv\":{\"show\":\"PPTV\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"m1905\":{\"show\":\"m1905\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"xigua\":{\"show\":\"西瓜视频\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"fuckapp\":{\"show\":\"独家线路\",\"des\":\"555自建资源\",\"ps\":\"0\",\"parse\":\"https://dp.dd520.cc/p.php?url=\"},\"letv\":{\"show\":\"乐视\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://jhpc.021huaying.com/newplayer/5348837768203767939.php\",\"parse\":\"https://jhpc.021huaying.com/newplayer/?url=\"},\"yemao\":{\"show\":\"优质线路1\",\"des\":\"极速蓝光\",\"ps\":\"0\",\"parse\":\"https://jx.manduhu.com/?url=\"},\"sdm3u8\":{\"show\":\"闪电线路\",\"des\":\"闪电\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"},\"fsm3u8\":{\"show\":\"飞速线路\",\"des\":\"飞速\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"},\"wjm3u8\":{\"show\":\"无尽线路\",\"des\":\"无尽\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"},\"dbm3u8\":{\"show\":\"百度线路\",\"des\":\"百度\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"},\"tkm3u8\":{\"show\":\"天空线路\",\"des\":\"天空\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"},\"kbm3u8\":{\"show\":\"快播线路\",\"des\":\"快播\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"},\"zhibo\":{\"show\":\"直播\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"http://suoyou.live/dplay/zb.php?url=\"},\"dujia\":{\"show\":\"独家专线\",\"des\":\"\",\"ps\":\"0\",\"api\":\"https://zyz.sdljwomen.com/newm3u8/5348837768203767939.php\",\"parse\":\"https://zyz.sdljwomen.com/newm3u8/?url=\"}}"; - private String rs=""; - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject(playerString); - filterConfig = new JSONObject(filterString); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param refererUrl - * @return - */ - protected HashMap getHeaders(String refererUrl) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - if (!TextUtils.isEmpty(refererUrl)) { - headers.put("Referer", refererUrl); - } - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl))); - Elements elements = doc.select("ul.navbar-items > li > a[href*='vodtype']"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - String href = ele.attr("href"); - Matcher mather = regexCategory.matcher(href); - if (!mather.find() || name.contains("福利")) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div.module-items> a[href*='voddetail']"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.selectFirst("img").attr("data-original"); - String remark = vod.selectFirst("div.module-item-note").text(); - Matcher matcher = regexVoddetail.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - int page = 1; - if (!TextUtils.isEmpty(pg) && Integer.parseInt(pg.trim()) > 1) { - page = Integer.parseInt(pg.trim()); - } - Map ext = new HashMap<>(); - ext.put("id", tid); - ext.put("pg", "" + page); - if (extend != null && extend.size() > 0) { - ext.putAll(extend); - } -// 13-内地-hits-古装-国语-A------2022.html - String id = ext.get("id") == null ? "" : ext.get("id"); - String area = ext.get("area") == null ? "" : ext.get("area"); - String by = ext.get("by") == null ? "" : ext.get("by"); - String clazz = ext.get("class") == null ? "" : ext.get("class"); - String lang = ext.get("lang") == null ? "" : ext.get("lang"); - String spg = ext.get("pg") == null ? "" : ext.get("pg"); - String year = ext.get("year") == null ? "" : ext.get("year"); - String url = siteUrl + String.format("/vodshow/%s-%s-%s-%s-%s----%s---%s.html", id, area, by, clazz, lang, spg, year); - SpiderDebug.log(url); - - String html = OkHttpUtil.string(url, getHeaders(siteUrl)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id='page'] > a:last-child"); - if (pageInfo.size() > 0) { - String href = pageInfo.attr("href"); - href = href.substring(9, href.length() - 4); - String pageCountNum = href.split("-")[9]; - if (!TextUtils.isEmpty(pageCountNum)) { - pageCount = Integer.parseInt(pageCountNum); - } - } - - JSONArray videos = new JSONArray(); - // 取当前分类页的视频列表 - Elements list = doc.select("div.module-items > a[href*='voddetail']"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.selectFirst("img").attr("data-original"); - String remark = vod.selectFirst("div.module-item-note").text(); - Matcher matcher = regexVoddetail.matcher(vod.attr("href")); - if (matcher.find()) { - String vodId = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", vodId); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 40); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 40); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.module-main img").attr("data-original"); - String title = doc.selectFirst("div.module-main h1").text(); - String desc = doc.selectFirst("div.module-main div.module-info-introduction-content >p").text(); - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("vod_content", desc); - - Map vod_play = new LinkedHashMap<>(); - - // 取播放列表数据 - Elements sources = doc.select("div[id='y-playList'] span"); - Elements sourceList = doc.select("div.module-play-list"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { -// sourceName = flag; - found = true; - break; - } - } - if (found) { - String playList = ""; - Elements playListA = sourceList.get(i).select("a.module-play-list-link"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (matcher.find()) { - String playURL = matcher.group(1); - String playUrlName = vod.text(); - vodItems.add(playUrlName + "$" + playURL); - } - } - if (vodItems.size() > 0) { - playList = TextUtils.join("#", vodItems); - vod_play.put(sourceName, playList); - } - } - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - - - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/vodplay/" + id + ".html"; - JSONObject result = new JSONObject(); - rs=""; - SpiderDebug.log(url ); - - String htmlsrc = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(htmlsrc); - Elements allScript = doc.select("script"); - String urlsrc=""; //加密url - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).toString(); - if (scContent.contains("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - urlsrc = player.getString("url"); - break; - } - } - String key="55ca5c48a943afdc"; - String iv ="d11424dcecfe16c0"; - String salt="55ca5c4d11424dcecfe16c08a943afdc"; - String wssreqsrc="{\"type\":\"getUrl\",\"url\":\"\",\"sign\":\"\"}"; - byte[] sasBytes = salt.getBytes(); - Key hmacKey = new SecretKeySpec(sasBytes, "HmacSHA256"); - Mac hmacSHA256 = Mac.getInstance("HmacSHA256"); - hmacSHA256.init(hmacKey); - byte [] macData = hmacSHA256.doFinal(urlsrc.getBytes()); - String sign = bytesToHexStr(macData) ; - JSONObject wssreq =new JSONObject(wssreqsrc); - wssreq.put("url",urlsrc); - wssreq.put("sign",sign); - String wssreqeny = encrypt(wssreq.toString(), key, iv); - String wss1="wss://player.sakurot.com:3458/wss"; - String wss2="wss://player2.lscsfw.com:6723/wss"; - int[] items = new int[]{1,2}; - Random rand = new Random(); - int wssurlint = items[rand.nextInt(items.length)]; - String wssurl =""; - if( wssurlint==2 ){ - wssurl =wss2; - }else{ - wssurl =wss1; - } - - wssClient(wssurl,wssreqeny); - Thread.sleep(100); - String wssrsp=rs; - String m3u8link = decrypt(wssrsp,key,iv); - JSONObject m3u8obj= new JSONObject(m3u8link); - String reallink = m3u8obj.getString("url"); - if (reallink.length()>0){ - result.put("parse", 0); - result.put("url", reallink); - result.put("header", new JSONObject(getHeaders2(url)).toString()); - }else{ - result.put("parse", 1); - result.put("url", url); - } - result.put("playUrl", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public boolean manualVideoCheck() { - return true; - } - - private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv"}; - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(siteUrl))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String decrypt(String src, String KEY, String IV) { - try { - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); - cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); - return new String(cipher.doFinal(hex2byte(src))); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - protected String encrypt(String src, String KEY, String IV) { - try { - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); - cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec); - return bytesToHexStr(cipher.doFinal(src.getBytes())).toUpperCase(); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - - protected byte[] hex2byte(String hex) throws IllegalArgumentException { - if (hex.length() % 2 != 0){ - throw new IllegalArgumentException("invalid hex string"); - } - char[] arr = hex.toCharArray(); - byte[] b = new byte[hex.length() / 2]; - for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { - String swap ="" + arr[i++] + arr[i]; - int byteint = Integer.parseInt(swap, 16) & 0xFF; - b[j] = new Integer(byteint).byteValue(); - } - return b; - } - - protected String bytesToHexStr(byte[] bytes) { - StringBuilder hexStr = new StringBuilder(); - for (byte b : bytes) { - String hex = Integer.toHexString(b & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - hexStr.append(hex); - } - return hexStr.toString(); - } - - protected void wssClient(String url,String sendmsg) { - try { - OkHttpClient client; - client = new OkHttpClient.Builder() - .pingInterval(10, TimeUnit.SECONDS) - .writeTimeout(5, TimeUnit.SECONDS) - .readTimeout(5, TimeUnit.SECONDS) - .connectTimeout(10, TimeUnit.SECONDS) - .build(); - Request request = new Request.Builder() - .addHeader("origin","https://player.sakurot.com:3458") - .addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36") - .url(url) - .build(); - final WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() { - @Override - public void onOpen(WebSocket webSocket, Response response) { - super.onOpen(webSocket, response); - webSocket.send(sendmsg); - } - @Override - public void onMessage(WebSocket webSocket, String text) { - super.onMessage(webSocket, text); - rs =text; - webSocket.close(1000, null); - } - @Override - public void onMessage(WebSocket webSocket, ByteString bytes) { - super.onMessage(webSocket, bytes); - } - @Override - public void onClosing(WebSocket webSocket, int code, String reason) { - super.onClosing(webSocket, code, reason); - webSocket.close(1000, null); - } - @Override - public void onClosed(WebSocket webSocket, int code, String reason) { - super.onClosed(webSocket, code, reason); - } - @Override - public void onFailure(WebSocket webSocket, Throwable t, Response response) { - super.onFailure(webSocket, t, response); - webSocket.close(1000, null); - }}); - - - } catch (Exception exception) { - SpiderDebug.log(exception); - } - } - - protected HashMap getHeaders2(String url) { - HashMap headers = new HashMap<>(); - headers.put("Origin","https://player.sakurot.com:3458"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - return headers; - } -} diff --git a/TVBox_Java/spider/Dy6080.java b/TVBox_Java/spider/Dy6080.java deleted file mode 100644 index e6abe8c..0000000 --- a/TVBox_Java/spider/Dy6080.java +++ /dev/null @@ -1,546 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; -import okhttp3.Headers; - -public class Dy6080 extends Spider { - private static final String siteUrl = "https://www.6080dy1.com"; - private static final String siteHost = "www.6080dy1.com"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/video/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/vplay/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{ \"BYGA\": { \"show\": \"蓝光专线①\", \"or\": 999, \"sn\": 0, \"pu\": \"\", \"parse\": \"https://jx1.bw66.xyz/m3u8/?url=\" }}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧\",\"v\":\"7\"},{\"n\":\"爱情\",\"v\":\"8\"},{\"n\":\"科幻\",\"v\":\"9\"},{\"n\":\"恐怖\",\"v\":\"10\"},{\"n\":\"剧情\",\"v\":\"11\"},{\"n\":\"战争\",\"v\":\"12\"},{\"n\":\"动画\",\"v\":\"23\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"港台剧\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"纪录片\",\"v\":\"21\"},{\"n\":\"泰国剧\",\"v\":\"24\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国\",\"v\":\"中国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - protected static HashMap postHeaders() { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - hashMap.put("Origin", " siteUrl"); - return hashMap; - } - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.nav-menu-items>li.nav-menu-item>a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("动漫") || - name.equals("综艺"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.module-items").get(0); - Elements list = homeList.select("div.module-item"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("div.module-item-titlebox a").attr("title"); - String cover = vod.select("img.lazy lazyloaded").attr("data-src"); - String remark = vod.select("div.module-item-text").text(); - Matcher matcher = regexVid.matcher(vod.select("div.module-item-titlebox a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id=page]"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = doc.select("span.page-current").text(); - String wy = doc.select("div[id=page] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.module-items>div"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("div.module-item-cover > div.module-item-pic > a").attr("title"); - String cover = vod.selectFirst("div.module-item-cover > div.module-item-pic > img").attr("data-src"); - String remark = ""; - Element remarkElement = vod.selectFirst("div.module-item-text"); - if (remarkElement != null) { - remark = remarkElement.text(); - } - Matcher matcher = regexVid.matcher(vod.selectFirst("div.module-item-cover > div.module-item-pic > a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/video/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - // 取基本数据 - String cover = doc.selectFirst("div.module-item-pic > img").attr("data-src"); - String title = doc.selectFirst("div.video-info-header > h1.page-title").text(); - String desc = doc.select("div.video-info-content span").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.video-info-main span.video-info-itemtitle"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("上映:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-content div span"); - Elements sourceList = doc.select("div.module-player-list"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("div a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - String vodName = vod.select("span").text(); - vodItems.add(vodName + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - private final Pattern urlt = Pattern.compile("\"url\": *\"([^\"]*)\","); - private final Pattern token = Pattern.compile("\"token\": *\"([^\"]*)\""); - private final Pattern key = Pattern.compile("\"key\": *\"([^\"]*)\","); - private final Pattern time = Pattern.compile("\"time\": *\"([^\"]*)\","); - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - // JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - // headers.put("origin", " https://www.jpys.me"); - // headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - // headers.put("Accept", " */*"); - // headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - // headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/vplay/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String show = pCfg.getString("show"); - System.out.println("yx" + show); - if (show.contains("蓝光专线①")) { - String jxurl = "https://jx1.bw66.xyz/m3u8/?url=" + videoUrl; - System.out.println("BYGA" + jxurl); - HashMap headers = new HashMap<>(); - headers.put("referer", url); - Document doc1 = Jsoup.parse(OkHttpUtil.string(jxurl,Headers())); - - Elements script = doc1.select("body>script"); - for (int j = 0; j < script.size(); j++) { - String content = script.get(j).html().trim(); - System.out.println("nr" + content); - if (content.contains("var config =")) { - Matcher matcher1 = urlt.matcher(content); - if (!matcher1.find()) - continue; - System.out.println("urt" + matcher1); - Matcher matcher2 = time.matcher(content); - if (!matcher2.find()) - continue; - Matcher matcher3 = key.matcher(content); - if (!matcher3.find()) - continue; - System.out.println("urt1" + matcher3); - String video_url = matcher1.group(1); - System.out.println("vr" +video_url); - String key = matcher3.group(1); - System.out.println("k" + key); - // String video_sign = "F4penExTGogdt6U8"; - String video_tm = matcher2.group(1); - System.out.println("t" + video_tm); - HashMap hashMap = new HashMap(); - // hashMap.put("token", video_token); - hashMap.put("url", video_url); - hashMap.put("time", video_tm); - hashMap.put("key", key); - // hashMap.put("sign", video_sign); - OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://jx1.bw66.xyz/m3u8/API.php", hashMap, postHeaders(),new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - String url = new JSONObject(str).getString("url"); - System.out.println("bf" + url); - result.put("url", url); - - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - } - } - result.put("parse", 0); - result.put("playUrl", ""); - } - else { - if (videoUrl.contains(".m3u8")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videoUrl); - } - } - // result.put("header", headers.toString()); - - // result.put("header", headers.toString()); - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected static HashMap sHeaders() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headers.put("Accept-encoding", "gzip, deflate, br"); - headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6"); - return headers; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=35×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/EEEDY.java b/TVBox_Java/spider/EEEDY.java deleted file mode 100644 index 93a961d..0000000 --- a/TVBox_Java/spider/EEEDY.java +++ /dev/null @@ -1,407 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -public class EEEDY extends Spider { - - private Pattern B = Pattern.compile("/vodtype/(\\d+).html"); - private Pattern Pd = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern W = Pattern.compile("/voddetail/(\\d+).html"); - private JSONObject u; - private Pattern u6 = Pattern.compile("/vodshow/(\\S+).html"); - private JSONObject ue; - - /* renamed from: com.github.catvod.spider.EEEDY$1 reason: invalid class name */ - class AnonymousClass1 implements Comparator { - public int compare(String str, String str2) { - String $2 = "or"; - try { - int i = EEEDY.this.ue.getJSONObject(str).getInt($2); - int i2 = EEEDY.this.ue.getJSONObject(str2).getInt($2); - if (i != i2 && i - i2 <= 0) { - return -1; - } - return 1; - } catch (JSONException e) { - SpiderDebug.log(e); - return 1; - } - } - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - int i; - int i2; - String $2 = "h4 > a"; - String $3 = "-"; - try { - int i3 = 1; - String[] strArr = {"", "", "", "", "", "", "", "", "", "", "", ""}; - strArr[0] = str; - strArr[8] = str2; - if (hashMap != null && hashMap.size() > 0) { - for (String str3 : hashMap.keySet()) { - strArr[Integer.parseInt(str3)] = URLEncoder.encode(hashMap.get(str3)); - } - } - String str4 = "https://www.3edy.com/vodshow/" + TextUtils.join($3, strArr) + ".html"; - String h = OkHttpUtil.string(str4, u(str4)); - Document ue2 = Jsoup.parse(h); - JSONObject jSONObject = new JSONObject(); - Elements B1 = ue2.select("ul.pagination-lg>li"); - int size = B1.size(); - String $4 = "href"; - if (size == 0) { - i2 = Integer.parseInt(str2); - i = i2; - } else { - int i4 = -1; - int i5 = -1; - int i6 = 0; - while (true) { - if (i6 >= B1.size()) { - i = i5; - break; - } - Element hq = (Element) B1.get(i6); - Element O = hq.selectFirst("a"); - if (O != null) { - String pE = O.text(); - if (i5 != i4 || !hq.hasClass("disabled")) { - i = i5; - } else { - Matcher matcher = this.u6.matcher(O.attr($4)); - i = matcher.find() ? Integer.parseInt(matcher.group(1).split($3)[8]) : 0; - } - if (pE.contains("...")) { - Matcher matcher2 = this.u6.matcher(O.attr($4)); - if (matcher2.find()) { - i2 = Integer.parseInt(matcher2.group(1).split($3)[8]); - } - } else { - i5 = i; - } - } - i6++; - i4 = -1; - } - i2 = 0; - } - JSONArray jSONArray = new JSONArray(); - if (!h.contains("没有找到您想要的结果哦")) { - Elements B12 = ue2.select("ul.list-unstyled>li"); - int i7 = 0; - while (i7 < B12.size()) { - Element hq2 = (Element) B12.get(i7); - String ue3 = hq2.select($2).attr("title"); - String Pd2 = hq2.selectFirst("img").attr("data-original"); - String jw = hq2.select("em.littplus").text(); - Matcher matcher3 = this.W.matcher(hq2.select($2).attr($4)); - if (matcher3.find()) { - String group = matcher3.group(i3); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", group); - jSONObject2.put("vod_name", ue3); - jSONObject2.put("vod_pic", Pd2); - jSONObject2.put("vod_remarks", jw); - jSONArray.put(jSONObject2); - } - i7++; - i3 = 1; - } - } - jSONObject.put("page", i); - jSONObject.put("pagecount", i2); - jSONObject.put("limit", 24); - jSONObject.put("total", i2 <= 1 ? jSONArray.length() : i2 * 24); - jSONObject.put("list", jSONArray); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String detailContent(List list) { - String str; - Exception e; - Elements exVar; - String str2; - String $2 = "-"; - String $3 = ","; - String $4 = "a"; - try { - String str3 = "https://www.3edy.com/voddetail/" + list.get(0) + ".html"; - Document ue2 = Jsoup.parse(OkHttpUtil.string(str3, u(str3))); - JSONObject jSONObject = new JSONObject(); - JSONObject jSONObject2 = new JSONObject(); - Elements B1 = ue2.select("ul.vod-infos>li"); - String ue3 = ((Element) B1.get(0)).select("img").attr("data-original"); - String jw = ((Element) B1.get(1)).select("h4 > a").text(); - Elements B12 = ue2.select("dl.dl-horizontal dd"); - String jw2 = ((Element) B12.get(1)).select($4).text(); - String pE = ((Element) B12.get(3)).text(); - String pE2 = ((Element) B12.get(4)).text(); - String pE3 = ((Element) B12.get(4)).text(); - str = ""; - try { - ArrayList arrayList = new ArrayList(); - Elements B13 = ((Element) B12.get(0)).select($4); - String str4 = $2; - for (int i = 0; i < B13.size(); i++) { - arrayList.add(((Element) B13.get(i)).text()); - } - String join = TextUtils.join($3, arrayList); - ArrayList arrayList2 = new ArrayList(); - Elements B14 = ((Element) B12.get(2)).select($4); - String str5 = $4; - for (int i2 = 0; i2 < B14.size(); i2++) { - arrayList2.add(((Element) B14.get(i2)).text()); - } - String join2 = TextUtils.join($3, arrayList2); - String pE4 = ((Element) B12.get(5)).text(); - jSONObject2.put("vod_id", list.get(0)); - jSONObject2.put("vod_name", jw); - jSONObject2.put("vod_pic", ue3); - jSONObject2.put("type_name", jw2); - jSONObject2.put("vod_year", pE2); - jSONObject2.put("vod_area", pE); - jSONObject2.put("vod_remarks", pE3); - jSONObject2.put("vod_actor", join); - jSONObject2.put("vod_director", join2); - jSONObject2.put("vod_content", pE4); - new TreeMap(new AnonymousClass1()); - Elements u62 = ue2.select("ul#ff-tab").select("li"); - String str6 = str; - String str7 = str6; - int i3 = 0; - while (i3 < u62.size()) { - str6 = ((Element) u62.get(i3)).selectFirst(str5).text().trim(); - Elements B15 = ue2.select("ul.play-list > li > a"); - ArrayList arrayList3 = new ArrayList(); - int i4 = 0; - while (i4 < B15.size()) { - Element hq = (Element) B15.get(i4); - Matcher matcher = this.Pd.matcher(hq.attr("href")); - if (!matcher.find()) { - exVar = u62; - str2 = str4; - } else { - StringBuilder sb = new StringBuilder(); - sb.append(matcher.group(1)); - str2 = str4; - sb.append(str2); - exVar = u62; - sb.append(matcher.group(2)); - sb.append(str2); - sb.append(matcher.group(3)); - arrayList3.add(hq.text() + "$" + sb.toString()); - } - i4++; - u62 = exVar; - str4 = str2; - } - if (arrayList3.size() > 0) { - str7 = TextUtils.join("#", arrayList3); - } - str7.length(); - i3++; - u62 = u62; - str5 = str5; - str4 = str4; - } - if(str6.isEmpty() || str7.isEmpty())str6="暂无播放源"; - jSONObject2.put("vod_play_from", str6); - jSONObject2.put("vod_play_url", str7); - JSONArray jSONArray = new JSONArray(); - jSONArray.put(jSONObject2); - jSONObject.put("list", jSONArray); - return jSONObject.toString(); - } catch (Exception e2) { - e = e2; - SpiderDebug.log(e); - return str; - } - } catch (Exception e3) { - e = e3; - str = ""; - SpiderDebug.log(e); - return str; - } - } - - public String homeContent(boolean z) { - int i; - String $2; - String $3 = "h4 > a"; - String $4 = "https://www.3edy.com"; - try { - Document ue2 = Jsoup.parse(OkHttpUtil.string($4, u($4))); - Elements B1 = ue2.select("ul.navbar-left>li a"); - JSONArray jSONArray = new JSONArray(); - Iterator it = B1.iterator(); - while (true) { - boolean hasNext = it.hasNext(); - i = 0; - $2 = "href"; - if (!hasNext) { - break; - } - Element hq = (Element) it.next(); - String pE = hq.text(); - if (pE.equals("电影") || pE.equals("美剧") || pE.equals("韩剧") || pE.equals("国产剧") || pE.equals("日剧") || pE.equals("泰剧") || pE.equals("动漫") || pE.equals("综艺")) { - i = 1; - } - if (i != 0) { - Matcher matcher = this.B.matcher(hq.attr($2)); - if (matcher.find()) { - String trim = matcher.group(1).trim(); - JSONObject jSONObject = new JSONObject(); - jSONObject.put("type_id", trim); - jSONObject.put("type_name", pE); - jSONArray.put(jSONObject); - } - } - } - JSONObject jSONObject2 = new JSONObject(); - if (z) { - jSONObject2.put("filters", this.u); - } - jSONObject2.put("class", jSONArray); - try { - Elements B12 = ((Element) ue2.select("ul.list-unstyled-index").get(3)).select("li"); - JSONArray jSONArray2 = new JSONArray(); - while (i < B12.size()) { - Element hq2 = (Element) B12.get(i); - String ue3 = hq2.select($3).attr("title"); - String Pd2 = hq2.selectFirst("img").attr("src"); - String jw = hq2.select("em.littplus").text(); - Matcher matcher2 = this.W.matcher(hq2.select($3).attr($2)); - if (matcher2.find()) { - String group = matcher2.group(1); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", group); - jSONObject3.put("vod_name", ue3); - jSONObject3.put("vod_pic", Pd2); - jSONObject3.put("vod_remarks", jw); - jSONArray2.put(jSONObject3); - } - i++; - } - jSONObject2.put("list", jSONArray2); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject2.toString(); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public void init(Context context) { - EEEDY.super.init(context); - try { - this.ue = new JSONObject("{\"789pan\":{\"sh\":\" 飘花速播\",\"pu\":\"https://dp.jiexi.work/jsonno.php?url=\",\"sn\":1,\"or\":999}}"); - this.u = new JSONObject(""); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - public String playerContent(String str, String str2, List list) { - String $2 = "url"; - try { - String str3 = "https://www.3edy.com/vodplay/" + str2 + ".html"; - Elements B1 = Jsoup.parse(OkHttpUtil.string(str3, u(str3))).select("div.ff-player script"); - JSONObject jSONObject = new JSONObject(); - System.out.println("scriptnum: "+B1.size()); - for (int i = 0; i < B1.size(); i++) { - String trim = B1.get(i).html().trim(); -// System.out.println("trim: "+trim); - if (trim.startsWith("var player_")) { - JSONObject jSONObject2 = new JSONObject(trim.substring(trim.indexOf(123), trim.lastIndexOf(125) + 1)); - String str4 = "https://dp.jiexi.work/jsonno.php?url=" + jSONObject2.getString($2); -// System.out.println(str4); - String string = new JSONObject(OkHttpUtil.string(str4, u(str3))).getString($2); - jSONObject.put("parse", 0); - jSONObject.put("playUrl", ""); - jSONObject.put($2, string); - } - } - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String searchContent(String str, boolean z) { - if (z) { - return ""; - } - try { - String str2 = "https://www.3edy.com/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(str) + "&limit=10×tamp=" + System.currentTimeMillis(); - JSONObject jSONObject = new JSONObject(OkHttpUtil.string(str2, u(str2))); - JSONObject jSONObject2 = new JSONObject(); - JSONArray jSONArray = new JSONArray(); - int i = jSONObject.getInt("total"); - String $2 = "list"; - if (i > 0) { - JSONArray jSONArray2 = new JSONArray(jSONObject.getString($2)); - for (int i2 = 0; i2 < jSONArray2.length(); i2++) { - JSONObject jSONObject3 = jSONArray2.getJSONObject(i2); - String string = jSONObject3.getString("id"); - String string2 = jSONObject3.getString("name"); - String string3 = jSONObject3.getString("pic"); - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("vod_id", string); - jSONObject4.put("vod_name", string2); - jSONObject4.put("vod_pic", string3); - jSONObject4.put("vod_remarks", ""); - jSONArray.put(jSONObject4); - } - } - jSONObject2.put($2, jSONArray); - return jSONObject2.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - /* access modifiers changed from: protected */ - public HashMap u(String str) { - HashMap hashMap = new HashMap<>(); - hashMap.put("method", "GET"); - String $2 = "Upgrade-Insecure-Requests"; - String $3 = "1"; - hashMap.put($2, $3); - hashMap.put("DNT", $3); - hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - hashMap.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - hashMap.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return hashMap; - } -} diff --git a/TVBox_Java/spider/EPang.java b/TVBox_Java/spider/EPang.java deleted file mode 100644 index a17f834..0000000 --- a/TVBox_Java/spider/EPang.java +++ /dev/null @@ -1,463 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.crawler.SpiderReq; -import com.github.catvod.crawler.SpiderReqResult; -import com.github.catvod.crawler.SpiderUrl; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 阿房影视 - *

- * Author: 小黄瓜 - */ -public class EPang extends Spider { - private static final String siteUrl = "https://www.bwl87.com"; - private static final String siteHost = "www.bwl87.com"; - private static final String ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - private Pattern regexCategory = Pattern.compile("/type/(\\w+)/"); - private Pattern regexVid = Pattern.compile("/detail/(\\w+)/"); - private Pattern regexPlay = Pattern.compile("/play/(\\w+)-(\\d+)-(\\d+)/"); - private Pattern regexPage = Pattern.compile("/show/(\\S+)/"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"m3u8\":{\"sh\":\"大明宫\",\"pu\":\"\",\"sn\":0,\"or\":999},\"xin\":{\"sh\":\"阿房宫\",\"pu\":\"https://player.90mm.me/play.php?url=\",\"sn\":1,\"or\":999},\"mx771\":{\"sh\":\"未央宫\",\"pu\":\"\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"奇幻片\",\"v\":\"22\"},{\"n\":\"悬疑片\",\"v\":\"23\"},{\"n\":\"犯罪片\",\"v\":\"24\"},{\"n\":\"动漫电影\",\"v\":\"26\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"韩日剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"21\"},{\"n\":\"日本剧\",\"v\":\"27\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"20\":[{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", ua); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - SpiderUrl su = new SpiderUrl(siteUrl, getHeaders(siteUrl)); - SpiderReqResult srr = SpiderReq.get(su); - Document doc = Jsoup.parse(srr.content); - // 分类节点 - Elements elements = doc.select("ul.nav-list > li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show; - if (filter) { - show = name.equals("电影") || - name.equals("连续剧") || - name.equals("动漫") || - name.equals("综艺") || - name.equals("纪录片"); - } else { - show = !(name.equals("首页") || - name.equals("资讯") || - name.equals("公告") || - name.equals("头条") || - name.equals("专题") || - name.equals("APP")); - } - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - Elements list = doc.select("div.col-lg-wide-75 > ul.myui-vodlist li div.myui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/show/" + TextUtils.join("-", urlParams) + "/"; - SpiderUrl su = new SpiderUrl(url, getHeaders(url)); - // 发起http请求 - SpiderReqResult srr = SpiderReq.get(su); - String html = srr.content; - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - Elements pageInfo = doc.select(".myui-page li a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("ul.myui-vodlist li div.myui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/detail/" + ids.get(0) + "/"; - SpiderUrl su = new SpiderUrl(url, getHeaders(url)); - SpiderReqResult srr = SpiderReq.get(su); - Document doc = Jsoup.parse(srr.content); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("span.mac_hits").attr("data-id"); - - String cover = doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("div.myui-content__detail h1.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - Elements sources = doc.select("a[data-toggle=tab]"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - String tabHref = source.attr("href"); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = doc.select("div" + tabHref + " ul > li a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/play/" + id + "/"; - SpiderUrl su = new SpiderUrl(url, getHeaders(url)); - SpiderReqResult srr = SpiderReq.get(su); - Document doc = Jsoup.parse(srr.content); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - if (playUrl.contains("bwl87.com")) { - try { - JSONObject headers = new JSONObject(); - headers.put("User-Agent", " " + ua); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headers.put("Accept-Encoding", " gzip, deflate, br"); - result.put("header", headers.toString()); - } catch (Exception e) { - SpiderDebug.log(e); - } - } else { - result.put("header", ""); - } - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - // 搜索有验证码 不支持 - return ""; - } -} diff --git a/TVBox_Java/spider/Enlienli.java b/TVBox_Java/spider/Enlienli.java deleted file mode 100644 index a273cd4..0000000 --- a/TVBox_Java/spider/Enlienli.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -/** - * 嗯哩嗯哩 - *

- * Author: 群友 不负此生 - */ -public class Enlienli extends Spider { - - private String siteUrl = "https://api.app.kongbuya.com"; - - @Override - public void init(Context context) { - super.init(context); - } - - private HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("Connection", "Keep-Alive"); - headers.put("User-Agent", "okhttp/4.0.1"); - return headers; - } - - @Override - public String homeContent(boolean filter) { - try { - JSONArray jsonArray = new JSONArray(OkHttpUtil.string(siteUrl + "/api.php/provide/home_nav?", getHeaders(siteUrl))); - JSONArray classes = new JSONArray(); - JSONObject filterConfig = new JSONObject(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - String typeName = jObj.getString("name"); - String typeId = jObj.getString("id"); - if (typeName.equals("推荐")) { - continue; - } - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - classes.put(newCls); - try { - JSONArray typeExtend = jObj.getJSONArray("msg"); - JSONArray extendsAll = new JSONArray(); - for (int j = 0; j < typeExtend.length(); j++) { - JSONObject typeExtendObj = typeExtend.getJSONObject(j); - String typeExtendKey = typeExtendObj.getString("name"); - JSONArray newTypeExtendKeys = typeExtendObj.getJSONArray("data"); - if (newTypeExtendKeys.length() <= 1) - continue; - String typeExtendName = newTypeExtendKeys.getString(0); - JSONObject newTypeExtend = new JSONObject(); - newTypeExtend.put("key", typeExtendKey); - newTypeExtend.put("name", typeExtendName); - JSONArray newTypeExtendKV = new JSONArray(); - { - JSONObject kvAll = new JSONObject(); - kvAll.put("n", "全部"); - kvAll.put("v", ""); - newTypeExtendKV.put(kvAll); - } - for (int k = 1; k < newTypeExtendKeys.length(); k++) { - JSONObject kv = new JSONObject(); - kv.put("n", newTypeExtendKeys.getString(k)); - kv.put("v", newTypeExtendKeys.getString(k)); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - } - filterConfig.put(typeId, extendsAll); - } catch (Exception e) { - SpiderDebug.log(e); - } - - } - JSONObject result = new JSONObject(); - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - String url = siteUrl + "/api.php/provide/home_data?page=1&id=0"; - JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONArray jsonArray = new JSONArray(); - if (jsonObject.has("tv")) { - JSONArray data = jsonObject.getJSONObject("tv").getJSONArray("data"); - for (int i = 0; i < data.length(); i++) { - jsonArray.put(data.getJSONObject(i)); - } - } - - if (jsonObject.has("video")) { - JSONArray vs = jsonObject.getJSONArray("video"); - for (int i = 0; i < vs.length(); i++) { - JSONArray data = vs.getJSONObject(i).getJSONArray("data"); - for (int j = 0; j < data.length(); j++) { - jsonArray.put(data.getJSONObject(j)); - } - } - } - - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("name")); - v.put("vod_pic", vObj.getString("img")); - v.put("vod_remarks", vObj.getString("qingxidu")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/api.php/provide/vod_list?page=" + pg + "&id=" + tid; - Set keys = extend.keySet(); - for (String key : keys) { - url += "&" + key + "=" + URLEncoder.encode(extend.get(key)); - } - JSONArray jsonArray = new JSONArray(OkHttpUtil.string(url, getHeaders(url))); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("name")); - v.put("vod_pic", vObj.getString("img")); - v.put("vod_remarks", vObj.getString("qingxidu")); - videos.put(v); - } - JSONObject result = new JSONObject(); - int limit = 20; - int page = Integer.parseInt(pg); - int total = Integer.MAX_VALUE; - int pageCount = videos.length() < 20 ? page : page + 1; - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", total); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + "/api.php/provide/vod_detail?token=&id=" + ids.get(0) + "&ac=vod_detail"; - JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject vodList = new JSONObject(); - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", jsonObject.getString("name")); - vodList.put("vod_pic", jsonObject.getString("img")); - vodList.put("type_name", jsonObject.getString("type")); - vodList.put("vod_year", ""); - vodList.put("vod_area", ""); - vodList.put("vod_remarks", jsonObject.getString("remarks")); - vodList.put("vod_actor", jsonObject.getString("actor")); - vodList.put("vod_director", jsonObject.getString("director")); - vodList.put("vod_content", jsonObject.getString("info")); - - vodList.put("vod_play_from", jsonObject.getString("playcode")); - vodList.put("vod_play_url", jsonObject.getString("playlist")); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - if (quick) - return ""; - try { - String url = siteUrl + "/api.php/provide/search_result?video_name=" + URLEncoder.encode(key); - JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONArray jsonArray = jsonObject.getJSONObject("result").getJSONArray("search_result"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("video_name")); - v.put("vod_pic", vObj.getString("img")); - //v.put("vod_remarks", vObj.getString("")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Fuli.java b/TVBox_Java/spider/Fuli.java deleted file mode 100644 index 76bf5cf..0000000 --- a/TVBox_Java/spider/Fuli.java +++ /dev/null @@ -1,489 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Log; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import com.github.catvod.xpath.XPathRule; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.nodes.Element; -import org.seimicrawler.xpath.JXDocument; -import org.seimicrawler.xpath.JXNode; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -public class Fuli extends XPath { - - @Override - public void init(Context context) { - super.init(context); - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - fetchRule(); - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - if (rule.getCateManual().size() > 0) { - Set keys = rule.getCateManual().keySet(); - for (String k : keys) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_name", k); - jsonObject.put("type_id", rule.getCateManual().get(k)); - classes.put(jsonObject); - } - } - try { - String webUrl = rule.getHomeUrl(); - JXDocument doc = JXDocument.create(fetch(webUrl)); - if (rule.getCateManual().size() == 0) { - List navNodes = doc.selN(rule.getCateNode()); - for (int i = 0; i < navNodes.size(); i++) { - String name = navNodes.get(i).selOne(rule.getCateName()).asString().trim(); - name = rule.getCateNameR(name); - String id = navNodes.get(i).selOne(rule.getCateId()).asString().trim(); - id = rule.getCateIdR(id); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - if (!rule.getHomeVodNode().isEmpty()) { - try { - JSONArray videos = new JSONArray(); - List vodNodes = doc.selN(rule.getHomeVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getHomeVodName()).asString().trim(); - name = rule.getHomeVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getHomeVodId()).asString().trim(); - id = rule.getHomeVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getHomeVodImg()).asString().trim(); - pic = rule.getHomeVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getHomeVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getHomeVodMark()).asString().trim(); - mark = rule.getHomeVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log("homeContent"+e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log("homeContent"+e); - } - } - } catch (Exception e) { - SpiderDebug.log("homeContent"+e); - } - result.put("class", classes); - if (filter && rule.getFilter() != null) { - result.put("filters", rule.getFilter()); - } - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log("homeContent"+e); - } - return ""; - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", rule.getUa().isEmpty() - ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36" - : rule.getUa()); - return headers; - } - - @Override - public String homeVideoContent() { - try { - fetchRule(); - } catch (Exception e) { - SpiderDebug.log("homeVideoContent"+e); - } - return ""; - } - - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - String url = rule.getCateUrl().replace("{cateId}", tid).replace("{catePg}", pg); - if(extend!=null) { - Set keys = extend.keySet(); - for (String key : keys) { - url = url.replace(String.format("{%s}", key), extend.get(key)); - } - } - SpiderDebug.log("categoryUrl"+String.format("categoryUrl -> url: %s", url)); - return url; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - fetchRule(); - String webUrl = categoryUrl(tid, pg, filter, extend); - JSONArray videos = new JSONArray(); - JXDocument doc = JXDocument.create(fetch(webUrl)); - List vodNodes = doc.selN(rule.getCateVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getCateVodName()).asString().trim(); - name = rule.getCateVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getCateVodId()).asString().trim(); - id = rule.getCateVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getCateVodImg()).asString().trim(); - pic = rule.getCateVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getCateVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getCateVodMark()).asString().trim(); - mark = rule.getCateVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log("categoryContent:"+e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log("categoryContent:"+e); - } - return ""; - } - - protected void detailContentExt(String content, JSONObject vod) { - - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0)); - String webContent = fetch(webUrl); - JXDocument doc = JXDocument.create(webContent); - JXNode vodNode = doc.selNOne(rule.getDetailNode()); - - String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = ""; - - title = vodNode.selOne(rule.getDetailName()).asString().trim(); - title = rule.getDetailNameR(title); - - cover = vodNode.selOne(rule.getDetailImg()).asString().trim(); - cover = rule.getDetailImgR(cover); - cover = Misc.fixUrl(webUrl, cover); - - if (!rule.getDetailCate().isEmpty()) { - try { - category = vodNode.selOne(rule.getDetailCate()).asString().trim(); - category = rule.getDetailCateR(category); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailYear().isEmpty()) { - try { - year = vodNode.selOne(rule.getDetailYear()).asString().trim(); - year = rule.getDetailYearR(year); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailArea().isEmpty()) { - try { - area = vodNode.selOne(rule.getDetailArea()).asString().trim(); - area = rule.getDetailAreaR(area); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailMark().isEmpty()) { - try { - remark = vodNode.selOne(rule.getDetailMark()).asString().trim(); - remark = rule.getDetailMarkR(remark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailActor().isEmpty()) { - try { - actor = vodNode.selOne(rule.getDetailActor()).asString().trim(); - actor = rule.getDetailActorR(actor); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDirector().isEmpty()) { - try { - director = vodNode.selOne(rule.getDetailDirector()).asString().trim(); - director = rule.getDetailDirectorR(director); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDesc().isEmpty()) { - try { - desc = vodNode.selOne(rule.getDetailDesc()).asString().trim(); - desc = rule.getDetailDescR(desc); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - JSONObject vod = new JSONObject(); - vod.put("vod_id", ids.get(0)); - vod.put("vod_name", title); - vod.put("vod_pic", cover); - vod.put("type_name", category); - vod.put("vod_year", year); - vod.put("vod_area", area); - vod.put("vod_remarks", remark); - vod.put("vod_actor", actor); - vod.put("vod_director", director); - vod.put("vod_content", desc); - - ArrayList playFrom = new ArrayList<>(); - - List fromNodes = doc.selN(rule.getDetailFromNode()); - for (int i = 0; i < fromNodes.size(); i++) { - String name = fromNodes.get(i).selOne(rule.getDetailFromName()).asString().trim(); - name = rule.getDetailFromNameR(name); - playFrom.add(name); - } - ArrayList playList = new ArrayList<>(); - if (webUrl.contains("wzk666.xyz")) { - playFrom.add("自定义"); - playList.add(String.format("正片$%s", ids.get(0))); - }else { - List urlListNodes = doc.selN(rule.getDetailUrlNode()); - for (int i = 0; i < urlListNodes.size(); i++) { - List urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode()); - List vodItems = new ArrayList<>(); - for (int j = 0; j < urlNodes.size(); j++) { - String name = urlNodes.get(j).selOne(rule.getDetailUrlName()).asString().trim(); - name = rule.getDetailUrlNameR(name); - String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim(); - id = rule.getDetailUrlIdR(id); - vodItems.add(name + "$" + id); - } - // 排除播放列表为空的播放源 - if (vodItems.size() == 0 && playFrom.size() > i) { - playFrom.set(i, ""); - } - playList.add(TextUtils.join("#", vodItems)); - } - } - // 排除播放列表为空的播放源 - for (int i = playFrom.size() - 1; i >= 0; i--) { - if (playFrom.get(i).isEmpty()) - playFrom.remove(i); - } - for (int i = playList.size() - 1; i >= 0; i--) { - if (playList.get(i).isEmpty()) - playList.remove(i); - } - for (int i = playList.size() - 1; i >= 0; i--) { - if (i >= playFrom.size()) - playList.remove(i); - } - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - - detailContentExt(webContent, vod); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - SpiderDebug.log("detailContent: "+result.toString()); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id); - SpiderDebug.log("playerContent: "+ webUrl); - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - if (!rule.getPlayUa().isEmpty()) { - result.put("ua", rule.getPlayUa()); - } - result.put("url", webUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log("playerContent: "+e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - fetchRule(); - if (rule.getSearchUrl().isEmpty()) { - return ""; - } - String webUrl = rule.getSearchUrl().replace("{wd}", URLEncoder.encode(key)); - String webContent = fetch(webUrl); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - // add maccms suggest search api support - if (rule.getSearchVodNode().startsWith("json:")) { - String[] node = rule.getSearchVodNode().substring(5).split(">"); - JSONObject data = new JSONObject(webContent); - for (int i = 0; i < node.length; i++) { - if (i == node.length - 1) { - JSONArray vodArray = data.getJSONArray(node[i]); - for (int j = 0; j < vodArray.length(); j++) { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(rule.getSearchVodName()).trim(); - name = rule.getSearchVodNameR(name); - String id = vod.optString(rule.getSearchVodId()).trim(); - id = rule.getSearchVodIdR(id); - String pic = vod.optString(rule.getSearchVodImg()).trim(); - pic = rule.getSearchVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = vod.optString(rule.getSearchVodMark()).trim(); - mark = rule.getSearchVodMarkR(mark); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - } else { - data = data.getJSONObject(node[i]); - } - } - } else { - JXDocument doc = JXDocument.create(webContent); - List vodNodes = doc.selN(rule.getSearchVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getSearchVodName()).asString().trim(); - name = rule.getSearchVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getSearchVodId()).asString().trim(); - id = rule.getSearchVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getSearchVodImg()).asString().trim(); - pic = rule.getSearchVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getCateVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getSearchVodMark()).asString().trim(); - mark = rule.getSearchVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log("searchContent: "+e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log("searchContent: "+e); - } - return ""; - } - - @Override - public boolean manualVideoCheck() { - return false; - } - - private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv"}; - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } - - protected String ext = null; - protected XPathRule rule = null; - - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - if (ext.startsWith("http")) { - String json = OkHttpUtil.string(ext, null); - rule = XPathRule.fromJson(json); - loadRuleExt(json); - } else { - rule = XPathRule.fromJson(ext); - loadRuleExt(ext); - } - } - } - } - - protected void loadRuleExt(String json) { - - } - - protected String fetch(String webUrl) { - SpiderDebug.log("fetch: "+webUrl); - return OkHttpUtil.string(webUrl, getHeaders(webUrl)); - } -} diff --git a/TVBox_Java/spider/Gitcafe.java b/TVBox_Java/spider/Gitcafe.java deleted file mode 100644 index d90ba7a..0000000 --- a/TVBox_Java/spider/Gitcafe.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.util.TimeUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.json.JSONArray; -import org.json.JSONObject; - -public class Gitcafe extends Spider { - private Map a; - private List b; - private PushAgent pushAgent; - private JSONObject d; - private JSONObject Home; - - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - pushAgent = new PushAgent(); - pushAgent.init(context, extend); - try { - d = new JSONObject("{\"hyds\":\"华语电视\",\"rhds\":\"日韩电视\",\"omds\":\"欧美电视\",\"qtds\":\"其他电视\",\"hydy\":\"华语电影\",\"rhdy\":\"日韩电影\",\"omdy\":\"欧美电影\",\"qtdy\":\"其他电影\",\"hydm\":\"华语动漫\",\"rhdm\":\"日韩动漫\",\"omdm\":\"欧美动漫\",\"jlp\":\"纪录片\",\"zyp\":\"综艺片\",\"jypx\":\"教育培训\",\"qtsp\":\"其他视频\",\"hyyy\":\"华语音乐\",\"rhyy\":\"日韩音乐\",\"omyy\":\"欧美音乐\",\"qtyy\":\"其他音乐\",\"kfrj\":\"娱乐软件\",\"xtrj\":\"系统软件\",\"wlrj\":\"网络软件\",\"bgrj\":\"办公软件\",\"qtrj\":\"其他软件\",\"mh\":\"漫画\",\"xs\":\"小说\",\"cbs\":\"出版书\",\"zspx\":\"知识培训\",\"qtwd\":\"其他文档\",\"bz\":\"壁纸\",\"rw\":\"人物\",\"fj\":\"风景\",\"qttp\":\"其他图片\",\"qt\":\"其他\"}"); - } catch (Exception e) { - e.printStackTrace(); - } - - ArrayList arrayList = new ArrayList(); - this.b = arrayList; - arrayList.add("hydm"); - List list = this.b; - list.add("hyds"); - List list2 = this.b; - list2.add("hydy"); - List list3 = this.b; - list3.add("omdm"); - List list4 = this.b; - list4.add("omds"); - List list5 = this.b; - list5.add("omdy"); - List list6 = this.b; - list6.add("rhdm"); - List list7 = this.b; - list7.add("rhds"); - List list8 = this.b; - list8.add("rhdy"); - List list9 = this.b; - list9.add("qtds"); - List list10 = this.b; - list10.add("qtdy"); - List list11 = this.b; - list11.add("qtsp"); - List list12 = this.b; - list12.add("jlp"); - List list13 = this.b; - list13.add("zyp"); - } - - protected HashMap LT() { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - return hashMap; - } - - @Override - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - try { - Map allData = getAllData(this, this, this); - JSONArray jSONArray = new JSONArray(); - Set keySet = allData.keySet(); - for (String str3 : keySet) { - JSONObject jSONObject = (JSONObject) allData.get(str3); - if (jSONObject.has("cat")) { - String string = jSONObject.getString("cat"); - if (string.equals(str)) { - JSONObject jSONObject2 = new JSONObject(); - String sb2 = "https://www.aliyundrive.com/s/" + jSONObject.getString("key"); - jSONObject2.put("vod_id", sb2); - String string2 = jSONObject.getString("title"); - jSONObject2.put("vod_name", string2); - jSONObject2.put("vod_pic", "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg"); - jSONArray.put(jSONObject2); - } - } - } - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("page", 1); - jSONObject3.put("pagecount", 1); - int length = jSONArray.length(); - jSONObject3.put("limit", length); - TimeUtils.getTimeZoneDatabaseVersion(); - int length2 = jSONArray.length(); - jSONObject3.put("total", length2); - jSONObject3.put("list", jSONArray); - return jSONObject3.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - @Override - public String detailContent(List list) { - try { - Map allData = getAllData(this, this, this); - JSONObject jSONObject = new JSONObject(pushAgent.detailContent(list)); - JSONArray jSONArray = jSONObject.getJSONArray("list"); - int i = 0; - while (true) { - if (i >= list.size()) { - break; - } - if (i >= jSONArray.length()) { - break; - } - JSONObject jSONObject2 = jSONArray.getJSONObject(i); - Pattern pattern = PushAgent.Folder; - Matcher matcher = pattern.matcher(list.get(i)); - if (matcher.find()) { - String group = matcher.group(1); - if (allData.containsKey(group)) { - JSONObject jSONObject3 = (JSONObject) allData.get(group); - jSONObject2.put("vod_pic", "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg"); - - } - } - i++; - } - return jSONObject.toString(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public synchronized Map getAllData(Object obj, Object obj2, Object obj3) { - Map map; - obj.getClass(); - obj2.getClass(); - obj3.getClass(); - synchronized (this) { - try { - if (a == null) { - HashMap hashMap = new HashMap(); - HashMap LT = LT(); - for (Iterator iter = b.iterator(); iter.hasNext(); ) { - String element = iter.next(); - String content = OkHttpUtil.string("https://gitcafe.net/alipaper/data/" + element + ".json", LT); -// JSONObject data = new JSONObject(content); - JSONArray jSONArray = new JSONArray(content); - // data.getJSONArray("data"); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject = jSONArray.getJSONObject(i); - hashMap.put(jSONObject.getString("key"), jSONObject); - } - } - a = hashMap; - } - } catch (Exception e) { - e.printStackTrace(); - } - map = a; - } - return map; - } - - public JSONObject getHomeData(Object obj) { - obj.getClass(); - try { - if (Home == null) { - HashMap LT = LT(); - Home = new JSONObject(OkHttpUtil.string("https://gitcafe.net/alipaper/home.json", LT)); - } - } catch (Exception e) { - e.printStackTrace(); - } - return Home; - } - - @Override - public String homeContent(boolean z) { - String str = "https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg"; - - try { - JSONObject homeData = getHomeData(this); - JSONObject jSONObject = homeData.getJSONObject("info"); - JSONArray jSONArray = jSONObject.getJSONArray("new"); - JSONArray jSONArray2 = new JSONArray(); - List list = b; - Iterator it = list.iterator(); - while (true) { - if (!it.hasNext()) { - break; - } - String next = it.next(); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("type_id", next); - JSONObject jSONObject3 = d; - String string = jSONObject3.getString(next); - jSONObject2.put("type_name", string); - jSONArray2.put(jSONObject2); - } - Map allData = getAllData(this, this, this); - JSONArray jSONArray3 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject4 = jSONArray.getJSONObject(i); - String string2 = jSONObject4.getString("cat"); - List list2 = b; - if (list2.contains(string2)) { - String string3 = jSONObject4.getString("key"); - if (allData.containsKey(string3)) { - JSONObject jSONObject5 = (JSONObject) allData.get(string3); - JSONObject jSONObject6 = new JSONObject(); - StringBuilder sb = new StringBuilder(); - sb.append("https://www.aliyundrive.com/s/"); - String string4 = jSONObject4.getString("key"); - sb.append(string4); - String sb2 = sb.toString(); - jSONObject6.put("vod_id", sb2); - String string5 = jSONObject4.getString("title"); - jSONObject6.put("vod_name", string5); - jSONObject6.put("vod_pic", str); - String string6 = jSONObject4.getString("date"); - jSONObject6.put("vod_remarks", string6); - jSONArray3.put(jSONObject6); - - } - JSONObject jSONObject62 = new JSONObject(); - StringBuilder sb3 = new StringBuilder(); - sb3.append("https://www.aliyundrive.com/s/"); - String string42 = jSONObject4.getString("key"); - sb3.append(string42); - String sb22 = sb3.toString(); - jSONObject62.put("vod_id", sb22); - String string52 = jSONObject4.getString("title"); - jSONObject62.put("vod_name", string52); - jSONObject62.put("vod_pic", str); - String string62 = jSONObject4.getString("date"); - jSONObject62.put("vod_remarks", string62); - jSONArray3.put(jSONObject62); - } - } - JSONObject jSONObject7 = new JSONObject(); - jSONObject7.put("class", jSONArray2); - jSONObject7.put("list", jSONArray3); - return jSONObject7.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - @Override - public String playerContent(String str, String str2, List list) { - return pushAgent.playerContent(str, str2, list); - } - - @Override - public String searchContent(String str, boolean z) { - try { - Map allData = getAllData(this, this, this); - JSONArray jSONArray = new JSONArray(); - Set keySet = allData.keySet(); - Iterator it = keySet.iterator(); - while (true) { - if (it.hasNext()) { - Object next = it.next(); - JSONObject jSONObject = (JSONObject) allData.get(next); - if (jSONObject.has("cat")) { - String string = jSONObject.getString("cat"); - List list = b; - if (list.contains(string)) { - String string2 = jSONObject.getString("title"); - if (string2.contains(str)) { - JSONObject jSONObject2 = new JSONObject(); - StringBuilder sb = new StringBuilder(); - sb.append("https://www.aliyundrive.com/s/"); - String string3 = jSONObject.getString("key"); - sb.append(string3); - String sb2 = sb.toString(); - jSONObject2.put("vod_id", sb2); - jSONObject2.put("vod_name", string2); - jSONArray.put(jSONObject2); - } - } - } - } else { - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("list", jSONArray); - return jSONObject3.toString(); - } - } - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/IKan.java b/TVBox_Java/spider/IKan.java deleted file mode 100644 index 6a43855..0000000 --- a/TVBox_Java/spider/IKan.java +++ /dev/null @@ -1,234 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.content.SharedPreferences; -import android.util.Base64; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.TreeMap; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; -import okhttp3.Cookie; -import okhttp3.CookieJar; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; - -public class IKan extends AppYsV2 { - private final OkHttpClient y; - private boolean K = false; - private Context cccc = null; - - public IKan() { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - TimeUnit timeUnit = TimeUnit.SECONDS; - y = builder.readTimeout(15L, timeUnit).writeTimeout(15L, timeUnit).connectTimeout(15L, timeUnit).cookieJar(new CookieJar() { - final List Mf = new ArrayList(); - - public List loadForRequest(HttpUrl httpUrl) { - ArrayList arrayList = new ArrayList(); - ArrayList arrayList2 = new ArrayList(); - for (Cookie cookie : Mf) { - if (cookie.expiresAt() < System.currentTimeMillis()) { - arrayList.add(cookie); - } else if (cookie.matches(httpUrl)) { - arrayList2.add(cookie); - } - } - Mf.removeAll(arrayList); - return arrayList2; - } - - public void saveFromResponse(HttpUrl httpUrl, List list) { - Mf.addAll(list); - } - }).retryOnConnectionFailure(true).build(); - } - - private void S(final String str, final String str2) { - HashMap hashMap = new HashMap(); - hashMap.put("user_name", str); - hashMap.put("user_pwd", str2); - hashMap.put("user_pwd2", str2); - try { - HashMap hashMap2 = new HashMap(); - hashMap2.put("Host", "tvcms.ikan6.vip"); - hashMap2.put("User-Agent", "okhttp/3.11.0"); - OkHttpUtil.post(this.y, "http://tvcms.ikan6.vip/api.php/gctvapi.auth/register", hashMap, hashMap2, new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str3) { - try { - if (new JSONObject(str3).optInt("code", 0) == 200) { - cccc.getSharedPreferences("spider_IKan", 0).edit().putString("user", str).putString("pwd", str2).commit(); - login(str, str2); - } - } catch (JSONException unused) { - } - } - }); - } catch (Throwable unused) { - } - } - - private void iq() { - SharedPreferences sharedPreferences = cccc.getSharedPreferences("spider_IKan", 0); - try { - String string = sharedPreferences.getString("user", null); - String string2 = sharedPreferences.getString("pwd", null); - if (!(string == null || string2 == null)) { - login(string, string2); - return; - } - } catch (Throwable unused) { - } - S(random(18), random(8)); - } - - public static String random(int i) { - Random random = new Random(); - StringBuffer stringBuffer = new StringBuffer(); - for (int i2 = 0; i2 < i; i2++) { - stringBuffer.append("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456".charAt(random.nextInt(59))); - } - return stringBuffer.toString(); - } - - - public void init(Context context) { - cccc = context; - } - - public void login(String str, String str2) { - HashMap headers = new HashMap(); - headers.put("user_name", str); - headers.put("user_pwd", str2); - try { - HashMap hashMap2 = new HashMap(); - hashMap2.put("Host", "tvcms.ikan6.vip"); - hashMap2.put("User-Agent", "okhttp/3.11.0"); - OkHttpUtil.post(y, "http://tvcms.ikan6.vip/api.php/gctvapi.auth/login", headers, hashMap2, new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str3) { - try { - if (new JSONObject(str3).optInt("code", 0) == 200) { - K = true; - } - } catch (JSONException unused) { - } - } - }); - } catch (Throwable unused) { - } - } - - private HashMap getHeaders(String URL) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Mobile Safari/537.36"); - return headers; - } - - @Override - public String homeVideoContent() { - try { - String url = "http://tvcms.ikan6.vip/api.php/gctvapi.vod"; - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject obj = new JSONObject(json); - JSONArray videos = new JSONArray(); - JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("list"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - String vid = vObj.getString("vod_id"); - JSONObject v = new JSONObject(); - v.put("vod_id", vid); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String str, String str2, List list) { - try { - if (str.equals("lekanzyw")) { - if (!K) { - iq(); - } - - JSONObject headers = new JSONObject(); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - headers.put("Connection", " Keep-Alive"); - - String parseUrl = "https://player.4kan.top/?url=" + str2; - Document doc = Jsoup.parse(OkHttpUtil.string(parseUrl, null)); - Pattern pattern = Pattern.compile("(?<=getrandom\\S\").*?(?=\")"); - Elements allScripts = doc.select("body script"); - for (int j = 0; j < allScripts.size(); j++) { - String scContents = allScripts.get(j).html().trim(); - Matcher matcher = pattern.matcher(scContents); - if (!matcher.find()) - continue; - String players = new String(Base64.decode(matcher.group(0), Base64.DEFAULT)); - int start = players.indexOf("http"); - int end = players.lastIndexOf("key=") + 36; - String url = players.substring(start, end); - Map> respHeaders = new TreeMap<>(); - OkHttpUtil.stringNoRedirect(url, null, respHeaders); - String redLoc = OkHttpUtil.getRedirectLocation(respHeaders); - - - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", redLoc); - result.put("header", headers.toString()); - return result.toString(); - - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public void init(Context context, String str) { - super.init(context, "http://tvcms.ikan6.vip/api.php/gctvapi.vod"); - } - -} \ No newline at end of file diff --git a/TVBox_Java/spider/IQIYI.java b/TVBox_Java/spider/IQIYI.java deleted file mode 100644 index a69082a..0000000 --- a/TVBox_Java/spider/IQIYI.java +++ /dev/null @@ -1,324 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.net.Uri; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import rxhttp.wrapper.annotations.NonNull; - -public class IQIYI extends Spider { - protected JSONObject a; - protected JSONArray xr; - protected JSONObject q = new JSONObject(); - protected HashMap dn = new HashMap<>(); - - private String q(String str, String str2) { - String str3; - try { - if (str2.startsWith("//")) { - Uri parse = Uri.parse(str); - str3 = parse.getScheme() + ":" + str2; - } else if (str2.contains("://")) { - return str2; - } else { - Uri parse2 = Uri.parse(str); - str3 = parse2.getScheme() + "://" + parse2.getHost() + str2; - } - return str3; - } catch (Exception e) { - SpiderDebug.log(e); - return str2; - } - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - IQIYI iqiyi = this; - try { - String str3 = "https://pcw-api.iqiyi.com/search/video/videolists?channel_id=" + str + "&is_purchase=&mode=24&pageNum=" + str2 + "&pageSize=24"; - if (hashMap != null) { - Set keySet = hashMap.keySet(); - ArrayList arrayList = new ArrayList(); - for (String str4 : keySet) { - String trim = hashMap.get(str4).trim(); - if (str4.matches("\\d+")) { - arrayList.add(trim + ";must"); - } else { - str3 = str3 + "&" + str4 + "=" + trim; - } - } - str3 = str3 + "&three_category_id=" + iqiyi.join(",", arrayList); - } - String h = OkHttpUtil.string(str3, getHeaders(str3)); - JSONObject jSONObject = new JSONObject(); - try { - JSONArray optJSONArray = new JSONObject(h).optJSONObject("data").optJSONArray("list"); - JSONArray jSONArray = new JSONArray(); - int i = 0; - while (i < optJSONArray.length()) { - JSONObject optJSONObject = optJSONArray.optJSONObject(i); - String optString = optJSONObject.optString("name"); - String q = iqiyi.q(str3, optJSONObject.optString("imageUrl")); - String optString2 = optJSONObject.optString("score"); - String optString3 = optJSONObject.optString("playUrl"); - if (!optJSONObject.optString("albumId").equals("")) { - if (optJSONObject.optInt("sourceId") != 0) { - optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39"; - } else { - optString3 = "/albums/album/avlistinfo?aid=" + optJSONObject.optString("albumId") + "&size=5000&page=1&url=" + optString3; - } - } else if (optJSONObject.optLong("tvId") != 0) { - optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39"; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", optString3); - jSONObject2.put("vod_name", optString); - jSONObject2.put("vod_pic", q); - jSONObject2.put("vod_remarks", optString2); - jSONArray.put(jSONObject2); - i++; - iqiyi = this; - optJSONArray = optJSONArray; - str3 = str3; - } - jSONObject.put("page", str2); - jSONObject.put("pagecount", Integer.MAX_VALUE); - jSONObject.put("limit", 90); - jSONObject.put("total", Integer.MAX_VALUE); - jSONObject.put("list", jSONArray); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(4); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String detailContent(List list) { - try { - String url = "https://pcw-api.iqiyi.com" + list.get(0); - JSONObject jSONObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))).getJSONObject("data"); - JSONObject jSONObject2 = new JSONObject(); - JSONObject optJSONObject = jSONObject.optJSONArray("epsodelist") != null ? jSONObject.optJSONArray("epsodelist").optJSONObject(0) : jSONObject; - jSONObject2.put("vod_id", list.get(0)); - jSONObject2.put("vod_name", optJSONObject.optString("name").replaceAll("第\\d+(?:集|期)", "")); - jSONObject2.put("vod_pic", q(url, optJSONObject.optString("imageUrl"))); - JSONObject optJSONObject2 = optJSONObject.optJSONObject("people"); - JSONArray optJSONArray = optJSONObject2.optJSONArray("main_charactor"); - if (optJSONArray == null) { - optJSONArray = optJSONObject2.optJSONArray("producer"); - } - if (optJSONArray == null) { - optJSONArray = optJSONObject2.optJSONArray("guest"); - } - if (optJSONArray == null) { - optJSONArray = optJSONObject2.optJSONArray("singer"); - } - ArrayList arrayList = new ArrayList(); - if (optJSONArray != null) { - for (int i = 0; i < optJSONArray.length(); i++) { - arrayList.add(optJSONArray.optJSONObject(i).optString("name")); - } - } - JSONArray optJSONArray2 = optJSONObject2.optJSONArray("director"); - if (optJSONArray2 == null) { - optJSONArray2 = optJSONObject2.optJSONArray("screen_writer"); - } - if (optJSONArray2 == null) { - optJSONArray2 = optJSONObject2.optJSONArray("host"); - } - ArrayList arrayList2 = new ArrayList(); - if (optJSONArray2 != null) { - for (int i2 = 0; i2 < optJSONArray2.length(); i2++) { - arrayList2.add(optJSONArray2.optJSONObject(i2).optString("name")); - } - } - jSONObject2.put("vod_remarks", optJSONObject.optString("duration")); - jSONObject2.put("vod_actor", join(",", arrayList)); - jSONObject2.put("vod_director", join(",", arrayList2)); - jSONObject2.put("vod_content", optJSONObject.optString("description")); - JSONArray optJSONArray3 = jSONObject.optJSONArray("epsodelist"); - if (optJSONArray3 == null) { - optJSONArray3 = new JSONArray(); - optJSONArray3.put(jSONObject); - } - ArrayList arrayList3 = new ArrayList(); - for (int i3 = 0; i3 < optJSONArray3.length(); i3++) { - JSONObject optJSONObject3 = optJSONArray3.optJSONObject(i3); - arrayList3.add(optJSONObject3.optString("order") + " " + optJSONObject3.optString("subtitle") + "$" + optJSONObject3.optString("playUrl")); - } - jSONObject2.put("vod_play_from", "iqiyi"); - jSONObject2.put("vod_play_url", join("#", arrayList3)); - JSONObject jSONObject3 = new JSONObject(); - JSONArray jSONArray = new JSONArray(); - jSONArray.put(jSONObject2); - jSONObject3.put("list", jSONArray); - return jSONObject3.toString(4); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - protected HashMap getHeaders(String str) { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - return hashMap; - } - - public String homeContent(boolean z) { - IQIYI iqiyi = this; - try { - String str = "https://pcw-api.iqiyi.com/search/video/videolists?channel_id=2&is_purchase=&mode=24&pageNum=1&pageSize=24&data_type=1&site=iqiyi"; - String h = OkHttpUtil.string(str, iqiyi.getHeaders(str)); - JSONObject jSONObject = new JSONObject(); - jSONObject.put("class", iqiyi.xr); - if (z) { - jSONObject.put("filters", iqiyi.a); - } - try { - JSONArray optJSONArray = new JSONObject(h).optJSONObject("data").optJSONArray("list"); - JSONArray jSONArray = new JSONArray(); - int i = 0; - while (i < optJSONArray.length()) { - JSONObject optJSONObject = optJSONArray.optJSONObject(i); - String optString = optJSONObject.optString("name"); - String q = iqiyi.q(str, optJSONObject.optString("imageUrl")); - String optString2 = optJSONObject.optString("score"); - String optString3 = optJSONObject.optString("playUrl"); - if (!optJSONObject.optString("albumId").equals("")) { - if (optJSONObject.optInt("sourceId") != 0) { - optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39"; - } else { - optString3 = "/albums/album/avlistinfo?aid=" + optJSONObject.optString("albumId") + "&size=5000&page=1&url=" + optString3; - } - } else if (optJSONObject.optLong("tvId") != 0) { - optString3 = "/video/video/baseinfo/" + optJSONObject.optString("tvId") + "?userInfo=verify&jsonpCbName=videoInfo39"; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", optString3); - jSONObject2.put("vod_name", optString); - jSONObject2.put("vod_pic", q); - jSONObject2.put("vod_remarks", optString2); - jSONArray.put(jSONObject2); - i++; - iqiyi = this; - str = str; - } - jSONObject.put("list", jSONArray); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(4); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String homeVideoContent() { - try { - JSONArray jSONArray = new JSONObject(OkHttpUtil.string("https://pcw-api.iqiyi.com/api.php/app/index_video?token=", getHeaders("https://pcw-api.iqiyi.com/api.php/app/index_video?token="))).getJSONArray("list"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONArray jSONArray3 = jSONArray.getJSONObject(i).getJSONArray("vlist"); - int i2 = 0; - while (i2 < jSONArray3.length() && i2 < 6) { - JSONObject jSONObject = jSONArray3.getJSONObject(i2); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", jSONObject.optString("vod_id")); - jSONObject2.put("vod_name", jSONObject.optString("vod_name")); - jSONObject2.put("vod_pic", jSONObject.optString("vod_pic")); - jSONObject2.put("vod_remarks", jSONObject.optString("vod_remarks")); - jSONArray2.put(jSONObject2); - i2++; - } - } - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public void init(Context context) { - IQIYI.super.init(context); - try { - this.xr = new JSONArray("[{\"type_name\":\"电视\",\"type_id\":\"2\"},{\"type_name\":\"电影\",\"type_id\":\"1\"},{\"type_name\":\"综艺\",\"type_id\":\"6\"},{\"type_name\":\"动漫\",\"type_id\":\"4\"},{\"type_name\":\"纪录\",\"type_id\":\"3\"},{\"type_name\":\"教育\",\"type_id\":\"12\"},{\"type_name\":\"游戏\",\"type_id\":\"8\"},{\"type_name\":\"资讯\",\"type_id\":\"25\"},{\"type_name\":\"娱乐\",\"type_id\":\"7\"},{\"type_name\":\"财经\",\"type_id\":\"24\"},{\"type_name\":\"网络\",\"type_id\":\"1\"},{\"type_name\":\"片花\",\"type_id\":\"10\"},{\"type_name\":\"音乐\",\"type_id\":\"5\"},{\"type_name\":\"军事\",\"type_id\":\"28\"},{\"type_name\":\"体育\",\"type_id\":\"17\"},{\"type_name\":\"儿童\",\"type_id\":\"15\"},{\"type_name\":\"旅游\",\"type_id\":\"9\"},{\"type_name\":\"时尚\",\"type_id\":\"13\"},{\"type_name\":\"生活\",\"type_id\":\"21\"},{\"type_name\":\"汽车\",\"type_id\":\"26\"},{\"type_name\":\"搞笑\",\"type_id\":\"22\"},{\"type_name\":\"广告\",\"type_id\":\"20\"},{\"type_name\":\"原创\",\"type_id\":\"27\"},{\"type_name\":\"母婴\",\"type_id\":\"29\"},{\"type_name\":\"科技\",\"type_id\":\"30\"},{\"type_name\":\"健康\",\"type_id\":\"32\"}]"); - this.a = new JSONObject("{\"22\":[{\"name\":\"分类\",\"value\":[{\"v\":\"22169\",\"n\":\"欢乐精选\"},{\"v\":\"29115\",\"n\":\"娱乐八卦\"},{\"v\":\"29116\",\"n\":\"搞笑短片\"},{\"v\":\"29139\",\"n\":\"影视剧吐槽\"},{\"v\":\"22172\",\"n\":\"雷人囧事\"},{\"v\":\"22171\",\"n\":\"爆笑节目\"},{\"v\":\"1905\",\"n\":\"萌宠\"},{\"v\":\"1909\",\"n\":\"童趣\"},{\"v\":\"1900\",\"n\":\"奇闻趣事\"},{\"v\":\"1902\",\"n\":\"恶搞配音\"},{\"v\":\"22170\",\"n\":\"猎奇\"}],\"key\":\"18074\"},{\"name\":\"地域\",\"value\":[{\"v\":\"1907\",\"n\":\"国内\"},{\"v\":\"1908\",\"n\":\"国外\"}],\"key\":\"18075\"}],\"24\":[{\"name\":\"分类\",\"value\":[{\"v\":\"2233\",\"n\":\"宏观\"},{\"v\":\"2234\",\"n\":\"民生\"},{\"v\":\"2235\",\"n\":\"产经\"},{\"v\":\"2236\",\"n\":\"市场\"},{\"v\":\"2237\",\"n\":\"理财\"},{\"v\":\"2238\",\"n\":\"访谈\"}],\"key\":\"18079\"}],\"25\":[{\"name\":\"类型\",\"value\":[{\"v\":\"20031\",\"n\":\"社会\"},{\"v\":\"20321\",\"n\":\"科技\"},{\"v\":\"21314\",\"n\":\"军事\"},{\"v\":\"21315\",\"n\":\"评论\"},{\"v\":\"21739\",\"n\":\"国内\"},{\"v\":\"21740\",\"n\":\"国际\"}],\"key\":\"20030\"}],\"26\":[{\"name\":\"内容\",\"value\":[{\"v\":\"20529\",\"n\":\"资讯\"},{\"v\":\"20530\",\"n\":\"专访\"},{\"v\":\"20531\",\"n\":\"新车\"},{\"v\":\"20532\",\"n\":\"试驾\"},{\"v\":\"20533\",\"n\":\"用车\"},{\"v\":\"20534\",\"n\":\"赛事\"},{\"v\":\"20535\",\"n\":\"交通\"},{\"v\":\"20536\",\"n\":\"娱乐\"},{\"v\":\"20537\",\"n\":\"车模\"},{\"v\":\"20538\",\"n\":\"改装\"},{\"v\":\"20539\",\"n\":\"车微剧\"},{\"v\":\"20540\",\"n\":\"爱汽车制造\"},{\"v\":\"28463\",\"n\":\"品牌\"},{\"v\":\"28464\",\"n\":\"车展\"},{\"v\":\"28534\",\"n\":\"航空\"},{\"v\":\"28535\",\"n\":\"游艇\"},{\"v\":\"28536\",\"n\":\"轨道\"}],\"key\":\"20528\"},{\"name\":\"车型\",\"value\":[{\"v\":\"20542\",\"n\":\"微型车\"},{\"v\":\"20543\",\"n\":\"小型车\"},{\"v\":\"20544\",\"n\":\"紧凑型车\"},{\"v\":\"20545\",\"n\":\"中型车\"},{\"v\":\"20546\",\"n\":\"中高型车\"},{\"v\":\"20547\",\"n\":\"豪华车\"},{\"v\":\"20548\",\"n\":\"MPV\"},{\"v\":\"20549\",\"n\":\"SUV\"},{\"v\":\"20550\",\"n\":\"跑车\"},{\"v\":\"20551\",\"n\":\"皮卡\"},{\"v\":\"20552\",\"n\":\"微客\"},{\"v\":\"22179\",\"n\":\"新概念\"},{\"v\":\"28465\",\"n\":\"电动车\"},{\"v\":\"28466\",\"n\":\"摩托车\"}],\"key\":\"20541\"},{\"name\":\"地区\",\"value\":[{\"v\":\"20554\",\"n\":\"自主品牌\"},{\"v\":\"20555\",\"n\":\"欧洲品牌\"},{\"v\":\"20556\",\"n\":\"亚洲品牌\"},{\"v\":\"20557\",\"n\":\"北美品牌\"}],\"key\":\"20553\"}],\"27\":[{\"name\":\"分类\",\"value\":[{\"v\":\"21317\",\"n\":\"动画\"},{\"v\":\"27986\",\"n\":\"短片\"},{\"v\":\"28034\",\"n\":\"网络剧\"},{\"v\":\"28053\",\"n\":\"创意广告\"},{\"v\":\"21318\",\"n\":\"微电影\"}],\"key\":\"21316\"}],\"28\":[{\"name\":\"分类\",\"value\":[{\"v\":\"21789\",\"n\":\"军情\"},{\"v\":\"21790\",\"n\":\"深度\"},{\"v\":\"21791\",\"n\":\"兵器\"},{\"v\":\"21792\",\"n\":\"战史\"},{\"v\":\"21793\",\"n\":\"人物\"},{\"v\":\"30090\",\"n\":\"航空航天\"}],\"key\":\"21788\"}],\"29\":[{\"name\":\"类型\",\"value\":[{\"v\":\"24083\",\"n\":\"萌宝乐园\"},{\"v\":\"24084\",\"n\":\"孕期\"},{\"v\":\"24085\",\"n\":\"分娩\"},{\"v\":\"24086\",\"n\":\"妈咪饮食\"},{\"v\":\"24087\",\"n\":\"宝宝饮食\"},{\"v\":\"24088\",\"n\":\"早教课堂\"},{\"v\":\"24089\",\"n\":\"婴幼儿常见疾病\"},{\"v\":\"27345\",\"n\":\"时尚辣妈圈\"},{\"v\":\"27350\",\"n\":\"亲子生活馆\"},{\"v\":\"29619\",\"n\":\"宝宝养育\"},{\"v\":\"29746\",\"n\":\"趣味玩具\"},{\"v\":\"30086\",\"n\":\"行业动态\"}],\"key\":\"24082\"},{\"name\":\"年龄段\",\"value\":[{\"v\":\"24121\",\"n\":\"0-1岁\"},{\"v\":\"24122\",\"n\":\"1-3岁\"},{\"v\":\"24123\",\"n\":\"3-6岁\"},{\"v\":\"24124\",\"n\":\"6岁以上\"}],\"key\":\"24120\"}],\"30\":[{\"name\":\"类型\",\"value\":[{\"v\":\"27936\",\"n\":\"评测\"},{\"v\":\"27937\",\"n\":\"教程\"},{\"v\":\"27938\",\"n\":\"活动\"},{\"v\":\"27939\",\"n\":\"广告\"},{\"v\":\"27974\",\"n\":\"资讯\"},{\"v\":\"28522\",\"n\":\"专访\"},{\"v\":\"27975\",\"n\":\"其他\"}],\"key\":\"24125\"},{\"name\":\"地区\",\"value\":[{\"v\":\"24132\",\"n\":\"国内\"},{\"v\":\"24133\",\"n\":\"国际\"}],\"key\":\"24131\"},{\"name\":\"内容\",\"value\":[{\"v\":\"27972\",\"n\":\"IT业界\"},{\"v\":\"27973\",\"n\":\"互联网\"},{\"v\":\"28521\",\"n\":\"APP\"},{\"v\":\"27942\",\"n\":\"手机\"},{\"v\":\"27943\",\"n\":\"笔记本\"},{\"v\":\"27944\",\"n\":\"智能硬件\"},{\"v\":\"27945\",\"n\":\"平板电脑\"},{\"v\":\"27946\",\"n\":\"数码相机\"},{\"v\":\"27948\",\"n\":\"PC\"},{\"v\":\"27949\",\"n\":\"家电\"},{\"v\":\"27950\",\"n\":\"游戏机\"},{\"v\":\"27951\",\"n\":\"前沿技术\"},{\"v\":\"27952\",\"n\":\"科学探索\"},{\"v\":\"27953\",\"n\":\"爱科技出品\"}],\"key\":\"27940\"}],\"31\":[{\"name\":\"语言\",\"value\":[{\"v\":\"27515\",\"n\":\"普通话\"},{\"v\":\"27516\",\"n\":\"英语\"},{\"v\":\"27517\",\"n\":\"韩语\"},{\"v\":\"27518\",\"n\":\"日语\"}],\"key\":\"27499\"},{\"name\":\"类型\",\"value\":[{\"v\":\"27507\",\"n\":\"文化\"},{\"v\":\"27508\",\"n\":\"娱乐\"},{\"v\":\"27509\",\"n\":\"访谈\"},{\"v\":\"27510\",\"n\":\"社会\"},{\"v\":\"27511\",\"n\":\"搞笑\"},{\"v\":\"27512\",\"n\":\"财经\"},{\"v\":\"27513\",\"n\":\"时尚\"},{\"v\":\"27514\",\"n\":\"历史\"},{\"v\":\"29117\",\"n\":\"电台\"},{\"v\":\"30290\",\"n\":\"科技\"},{\"v\":\"31318\",\"n\":\"相声评书\"},{\"v\":\"31319\",\"n\":\"演讲\"}],\"key\":\"27500\"},{\"name\":\"地区\",\"value\":[{\"v\":\"27502\",\"n\":\"内地\"},{\"v\":\"27503\",\"n\":\"台湾地区\"},{\"v\":\"27504\",\"n\":\"香港地区\"},{\"v\":\"27505\",\"n\":\"日本\"},{\"v\":\"27506\",\"n\":\"韩国\"},{\"v\":\"27824\",\"n\":\"美国\"}],\"key\":\"27501\"}],\"10\":[{\"name\":\"内容分类\",\"value\":[{\"v\":\"1007\",\"n\":\"电影\"},{\"v\":\"1006\",\"n\":\"电视剧\"}],\"key\":\"18031\"},{\"name\":\"电影地区\",\"value\":[{\"v\":\"29801\",\"n\":\"华语\"},{\"v\":\"29802\",\"n\":\"美国\"},{\"v\":\"29811\",\"n\":\"印度\"},{\"v\":\"29805\",\"n\":\"其它\"}],\"key\":\"18032\"},{\"name\":\"电视剧地区\",\"value\":[{\"v\":\"29927\",\"n\":\"内地\"},{\"v\":\"29929\",\"n\":\"韩剧\"},{\"v\":\"29930\",\"n\":\"美剧\"},{\"v\":\"29932\",\"n\":\"日剧\"},{\"v\":\"29934\",\"n\":\"台湾地区\"}],\"key\":\"21260\"},{\"name\":\"电视剧类型\",\"value\":[{\"v\":\"29973\",\"n\":\"网剧\"}],\"key\":\"21238\"}],\"32\":[{\"name\":\"类型\",\"value\":[{\"v\":\"28068\",\"n\":\"资讯\"},{\"v\":\"28069\",\"n\":\"医疗\"},{\"v\":\"28081\",\"n\":\"两性\"},{\"v\":\"28082\",\"n\":\"养生\"},{\"v\":\"28441\",\"n\":\"健身\"},{\"v\":\"28449\",\"n\":\"美容\"},{\"v\":\"28450\",\"n\":\"心理\"},{\"v\":\"28451\",\"n\":\"常识\"},{\"v\":\"28452\",\"n\":\"儿科\"},{\"v\":\"28456\",\"n\":\"老年\"},{\"v\":\"28459\",\"n\":\"宠物\"},{\"v\":\"28462\",\"n\":\"交流分享\"}],\"key\":\"28067\"}],\"11\":[{\"name\":\"类型\",\"value\":[{\"v\":\"990\",\"n\":\"经济\"},{\"v\":\"991\",\"n\":\"人文\"},{\"v\":\"992\",\"n\":\"艺术\"},{\"v\":\"994\",\"n\":\"科技\"},{\"v\":\"995\",\"n\":\"社会\"},{\"v\":\"996\",\"n\":\"哲学\"},{\"v\":\"997\",\"n\":\"心理\"},{\"v\":\"998\",\"n\":\"其它\"}],\"key\":\"18030\"}],\"33\":[{\"name\":\"类型\",\"value\":[{\"v\":\"28900\",\"n\":\"资讯\"},{\"v\":\"28541\",\"n\":\"娱乐\"},{\"v\":\"28542\",\"n\":\"体育\"},{\"v\":\"28543\",\"n\":\"电影\"},{\"v\":\"28544\",\"n\":\"微电影\"},{\"v\":\"28545\",\"n\":\"纪录片\"},{\"v\":\"28546\",\"n\":\"综艺\"},{\"v\":\"28547\",\"n\":\"脱口秀\"},{\"v\":\"28548\",\"n\":\"片花\"},{\"v\":\"28549\",\"n\":\"广告\"},{\"v\":\"28550\",\"n\":\"音乐\"},{\"v\":\"28551\",\"n\":\"动漫\"},{\"v\":\"28552\",\"n\":\"少儿\"},{\"v\":\"28553\",\"n\":\"游戏\"},{\"v\":\"28554\",\"n\":\"教育\"},{\"v\":\"28555\",\"n\":\"生活\"},{\"v\":\"28556\",\"n\":\"原创\"},{\"v\":\"28557\",\"n\":\"搞笑\"},{\"v\":\"28558\",\"n\":\"旅游\"},{\"v\":\"28559\",\"n\":\"时尚\"},{\"v\":\"28560\",\"n\":\"财经\"},{\"v\":\"28561\",\"n\":\"科技\"},{\"v\":\"28562\",\"n\":\"健康\"},{\"v\":\"28563\",\"n\":\"母婴\"},{\"v\":\"28564\",\"n\":\"汽车\"}],\"key\":\"28537\"},{\"name\":\"性质\",\"value\":[{\"v\":\"28895\",\"n\":\"其他\"},{\"v\":\"28565\",\"n\":\"环保\"},{\"v\":\"28566\",\"n\":\"捐款\"},{\"v\":\"28567\",\"n\":\"大病救助\"},{\"v\":\"28568\",\"n\":\"救灾\"},{\"v\":\"28569\",\"n\":\"动物保护\"},{\"v\":\"28570\",\"n\":\"社会关注\"}],\"key\":\"28538\"},{\"name\":\"分类\",\"value\":[{\"v\":\"28595\",\"n\":\"公益资讯\"},{\"v\":\"28596\",\"n\":\"公益人物\"},{\"v\":\"28597\",\"n\":\"公益活动\"},{\"v\":\"28598\",\"n\":\"公益作品\"},{\"v\":\"28599\",\"n\":\"公益影像\"},{\"v\":\"28600\",\"n\":\"公益组织\"}],\"key\":\"28539\"},{\"name\":\"国家/地区\",\"value\":[{\"v\":\"28601\",\"n\":\"国内\"},{\"v\":\"28602\",\"n\":\"国外\"}],\"key\":\"28540\"}],\"12\":[{\"name\":\"分类\",\"value\":[{\"v\":\"32641\",\"n\":\"中小学\"},{\"v\":\"32655\",\"n\":\"大学\"},{\"v\":\"32659\",\"n\":\"职业考证\"},{\"v\":\"32669\",\"n\":\"外语\"},{\"v\":\"32674\",\"n\":\"职场\"},{\"v\":\"32684\",\"n\":\"IT/互联网\"},{\"v\":\"32692\",\"n\":\"财经\"},{\"v\":\"32697\",\"n\":\"文史\"},{\"v\":\"32704\",\"n\":\"艺术\"},{\"v\":\"32712\",\"n\":\"运动健身\"},{\"v\":\"32718\",\"n\":\"健康\"},{\"v\":\"32722\",\"n\":\"心理\"},{\"v\":\"32725\",\"n\":\"亲子\"},{\"v\":\"32732\",\"n\":\"生活\"},{\"v\":\"32890\",\"n\":\"党政\"}],\"key\":\"32640\"}],\"13\":[{\"name\":\"行业\",\"value\":[{\"v\":\"1208\",\"n\":\"服饰\"},{\"v\":\"1209\",\"n\":\"美容\"},{\"v\":\"1210\",\"n\":\"生活\"},{\"v\":\"1211\",\"n\":\"其它\"}],\"key\":\"18051\"},{\"name\":\"季节\",\"value\":[{\"v\":\"1224\",\"n\":\"早春\"},{\"v\":\"1225\",\"n\":\"春夏\"},{\"v\":\"1226\",\"n\":\"早秋\"},{\"v\":\"1227\",\"n\":\"秋冬\"},{\"v\":\"1228\",\"n\":\"其它\"}],\"key\":\"18053\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1229\",\"n\":\"公告牌\"},{\"v\":\"1230\",\"n\":\"奇艺自制\"},{\"v\":\"1231\",\"n\":\"热门综艺\"},{\"v\":\"1232\",\"n\":\"名利场\"},{\"v\":\"1233\",\"n\":\"趋势报道\"},{\"v\":\"1234\",\"n\":\"本季流行\"},{\"v\":\"1235\",\"n\":\"秀场\"},{\"v\":\"1236\",\"n\":\"广告大片\"},{\"v\":\"1237\",\"n\":\"街拍\"},{\"v\":\"1238\",\"n\":\"人物\"},{\"v\":\"1240\",\"n\":\"乐活\"},{\"v\":\"1241\",\"n\":\"其它\"}],\"key\":\"18054\"}],\"14\":[{\"name\":\"地区\",\"value\":[{\"v\":\"1278\",\"n\":\"内地\"},{\"v\":\"1279\",\"n\":\"港台\"},{\"v\":\"1280\",\"n\":\"日韩\"},{\"v\":\"1281\",\"n\":\"欧美\"},{\"v\":\"1282\",\"n\":\"其它\"}],\"key\":\"18055\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1247\",\"n\":\"播报\"},{\"v\":\"1248\",\"n\":\"访谈\"},{\"v\":\"1249\",\"n\":\"搞笑\"},{\"v\":\"1250\",\"n\":\"游戏\"},{\"v\":\"1251\",\"n\":\"选秀\"},{\"v\":\"1252\",\"n\":\"时尚\"},{\"v\":\"1253\",\"n\":\"杂谈\"},{\"v\":\"1254\",\"n\":\"情感\"},{\"v\":\"1255\",\"n\":\"盛会\"},{\"v\":\"1256\",\"n\":\"曲艺\"},{\"v\":\"1257\",\"n\":\"美食\"},{\"v\":\"1258\",\"n\":\"粤语\"},{\"v\":\"1276\",\"n\":\"时尚综艺\"}],\"key\":\"18056\"}],\"15\":[{\"name\":\"地区\",\"value\":[{\"v\":\"1261\",\"n\":\"欧美\"},{\"v\":\"1259\",\"n\":\"大陆\"},{\"v\":\"1260\",\"n\":\"港台\"},{\"v\":\"28933\",\"n\":\"韩国\"},{\"v\":\"1263\",\"n\":\"其它\"}],\"key\":\"18057\"},{\"name\":\"年龄段\",\"value\":[{\"v\":\"4489\",\"n\":\"0-3岁\"},{\"v\":\"28929\",\"n\":\"4-6岁\"},{\"v\":\"4493\",\"n\":\"7-10岁\"},{\"v\":\"4494\",\"n\":\"11-13岁\"}],\"key\":\"20288\"},{\"name\":\"课程类型\",\"value\":[{\"v\":\"28983\",\"n\":\"儿歌\"},{\"v\":\"28984\",\"n\":\"故事\"},{\"v\":\"28985\",\"n\":\"学英语\"},{\"v\":\"28986\",\"n\":\"百科\"},{\"v\":\"28987\",\"n\":\"国学\"},{\"v\":\"28988\",\"n\":\"手工\"},{\"v\":\"28989\",\"n\":\"识字\"},{\"v\":\"28990\",\"n\":\"数学\"},{\"v\":\"28991\",\"n\":\"美术\"},{\"v\":\"28993\",\"n\":\"舞蹈\"},{\"v\":\"30918\",\"n\":\"音乐\"},{\"v\":\"30919\",\"n\":\"诗词\"},{\"v\":\"28994\",\"n\":\"其他\"}],\"key\":\"28982\"}],\"16\":[{\"name\":\"类型\",\"value\":[{\"v\":\"1296\",\"n\":\"喜剧\"},{\"v\":\"1297\",\"n\":\"爱情\"},{\"v\":\"1298\",\"n\":\"动作\"}],\"key\":\"18061\"}],\"17\":[{\"name\":\"大项\",\"value\":[{\"v\":\"1673\",\"n\":\"足球\"},{\"v\":\"1688\",\"n\":\"篮球\"},{\"v\":\"1700\",\"n\":\"网球\"},{\"v\":\"1707\",\"n\":\"高尔夫\"},{\"v\":\"1708\",\"n\":\"赛车\"},{\"v\":\"1712\",\"n\":\"台球\"},{\"v\":\"32632\",\"n\":\"街舞\"},{\"v\":\"22178\",\"n\":\"健身\"},{\"v\":\"1715\",\"n\":\"综合\"}],\"key\":\"18067\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1724\",\"n\":\"集锦\"},{\"v\":\"1725\",\"n\":\"花絮\"},{\"v\":\"1727\",\"n\":\"整场\"},{\"v\":\"1728\",\"n\":\"节目\"},{\"v\":\"1729\",\"n\":\"纪录片\"},{\"v\":\"1730\",\"n\":\"教学\"},{\"v\":\"1837\",\"n\":\"资讯\"},{\"v\":\"22180\",\"n\":\"瞬间\"},{\"v\":\"22182\",\"n\":\"球星\"},{\"v\":\"1731\",\"n\":\"其它\"}],\"key\":\"18066\"}],\"18\":[{\"name\":\"大项\",\"value\":[{\"v\":\"1322\",\"n\":\"足球\"},{\"v\":\"1323\",\"n\":\"网球\"},{\"v\":\"1324\",\"n\":\"曲棍球\"},{\"v\":\"1325\",\"n\":\"羽毛球\"},{\"v\":\"1326\",\"n\":\"手球\"},{\"v\":\"1327\",\"n\":\"排球\"},{\"v\":\"1328\",\"n\":\"乒乓球\"},{\"v\":\"1329\",\"n\":\"篮球\"},{\"v\":\"1330\",\"n\":\"游泳\"},{\"v\":\"1331\",\"n\":\"花样游泳\"},{\"v\":\"1332\",\"n\":\"跳水\"},{\"v\":\"1333\",\"n\":\"水球\"},{\"v\":\"1334\",\"n\":\"田径\"},{\"v\":\"1335\",\"n\":\"自行车\"},{\"v\":\"1336\",\"n\":\"体操\"},{\"v\":\"1337\",\"n\":\"马术\"},{\"v\":\"1338\",\"n\":\"射箭\"},{\"v\":\"1339\",\"n\":\"射击\"},{\"v\":\"1340\",\"n\":\"击剑\"},{\"v\":\"1341\",\"n\":\"举重\"},{\"v\":\"1342\",\"n\":\"拳击\"},{\"v\":\"1343\",\"n\":\"柔道\"},{\"v\":\"1344\",\"n\":\"摔跤\"},{\"v\":\"1345\",\"n\":\"跆拳道\"},{\"v\":\"1346\",\"n\":\"皮划艇\"},{\"v\":\"1347\",\"n\":\"赛艇\"},{\"v\":\"1348\",\"n\":\"帆船\"},{\"v\":\"1349\",\"n\":\"现代五项\"},{\"v\":\"1350\",\"n\":\"铁人三项\"}],\"key\":\"18062\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1316\",\"n\":\"比赛\"},{\"v\":\"1317\",\"n\":\"花絮\"},{\"v\":\"1318\",\"n\":\"节目\"},{\"v\":\"1319\",\"n\":\"访谈\"},{\"v\":\"1320\",\"n\":\"资讯\"},{\"v\":\"1321\",\"n\":\"历史\"}],\"key\":\"18064\"}],\"1\":[{\"name\":\"地区\",\"value\":[{\"v\":\"1\",\"n\":\"华语\"},{\"v\":\"2\",\"n\":\"美国\"},{\"v\":\"3\",\"n\":\"欧洲\"},{\"v\":\"4\",\"n\":\"韩国\"},{\"v\":\"308\",\"n\":\"日本\"},{\"v\":\"28999\",\"n\":\"印度\"},{\"v\":\"5\",\"n\":\"其它\"}],\"key\":\"18000\"},{\"name\":\"类型\",\"value\":[{\"v\":\"8\",\"n\":\"喜剧\"},{\"v\":\"6\",\"n\":\"爱情\"},{\"v\":\"11\",\"n\":\"动作\"},{\"v\":\"131\",\"n\":\"枪战\"},{\"v\":\"291\",\"n\":\"犯罪\"},{\"v\":\"128\",\"n\":\"惊悚\"},{\"v\":\"10\",\"n\":\"恐怖\"},{\"v\":\"289\",\"n\":\"悬疑\"},{\"v\":\"12\",\"n\":\"动画\"},{\"v\":\"27356\",\"n\":\"家庭\"},{\"v\":\"1284\",\"n\":\"奇幻\"},{\"v\":\"9\",\"n\":\"科幻\"},{\"v\":\"7\",\"n\":\"战争\"},{\"v\":\"130\",\"n\":\"青春\"}],\"key\":\"18001\"},{\"name\":\"规格\",\"value\":[{\"v\":\"27397\",\"n\":\"巨制\"},{\"v\":\"27815\",\"n\":\"院线\"},{\"v\":\"30149\",\"n\":\"独播\"},{\"v\":\"27401\",\"n\":\"网络电影\"}],\"key\":\"27396\"}],\"2\":[{\"name\":\"地区\",\"value\":[{\"v\":\"15\",\"n\":\"内地\"},{\"v\":\"17\",\"n\":\"韩剧\"},{\"v\":\"18\",\"n\":\"美剧\"},{\"v\":\"309\",\"n\":\"日剧\"},{\"v\":\"1117\",\"n\":\"台湾地区\"}],\"key\":\"18002\"},{\"name\":\"类型\",\"value\":[{\"v\":\"24\",\"n\":\"古装\"},{\"v\":\"20\",\"n\":\"言情\"},{\"v\":\"23\",\"n\":\"武侠\"},{\"v\":\"30\",\"n\":\"偶像\"},{\"v\":\"1654\",\"n\":\"家庭\"},{\"v\":\"1653\",\"n\":\"青春\"},{\"v\":\"24064\",\"n\":\"都市\"},{\"v\":\"135\",\"n\":\"喜剧\"},{\"v\":\"32\",\"n\":\"悬疑\"},{\"v\":\"149\",\"n\":\"罪案\"},{\"v\":\"148\",\"n\":\"穿越\"},{\"v\":\"139\",\"n\":\"宫廷\"},{\"v\":\"21\",\"n\":\"历史\"},{\"v\":\"145\",\"n\":\"神话\"},{\"v\":\"34\",\"n\":\"科幻\"},{\"v\":\"27\",\"n\":\"年代\"},{\"v\":\"140\",\"n\":\"商战\"},{\"v\":\"24063\",\"n\":\"剧情\"},{\"v\":\"24065\",\"n\":\"网剧\"}],\"key\":\"18003\"}],\"3\":[{\"name\":\"地区\",\"value\":[{\"v\":\"20323\",\"n\":\"国内\"},{\"v\":\"20324\",\"n\":\"国外\"}],\"key\":\"20322\"},{\"name\":\"类型\",\"value\":[{\"v\":\"70\",\"n\":\"人文\"},{\"v\":\"33908\",\"n\":\"美食\"},{\"v\":\"33924\",\"n\":\"医疗\"},{\"v\":\"33933\",\"n\":\"自然\"},{\"v\":\"33945\",\"n\":\"萌宠\"},{\"v\":\"33953\",\"n\":\"财经\"},{\"v\":\"33960\",\"n\":\"罪案\"},{\"v\":\"33967\",\"n\":\"竞技\"},{\"v\":\"33974\",\"n\":\"灾难\"},{\"v\":\"74\",\"n\":\"历史\"},{\"v\":\"73\",\"n\":\"探险\"},{\"v\":\"71\",\"n\":\"社会\"},{\"v\":\"28119\",\"n\":\"科技\"},{\"v\":\"310\",\"n\":\"旅游\"}],\"key\":\"18004\"},{\"name\":\"出品方\",\"value\":[{\"v\":\"31283\",\"n\":\"爱奇艺出品\"}],\"key\":\"28467\"},{\"name\":\"片种\",\"value\":[{\"v\":\"29077\",\"n\":\"纪录电影\"},{\"v\":\"29078\",\"n\":\"系列纪录片\"},{\"v\":\"29082\",\"n\":\"网络纪录片\"},{\"v\":\"29083\",\"n\":\"纪实栏目\"}],\"key\":\"29076\"}],\"4\":[{\"name\":\"地区\",\"value\":[{\"v\":\"37\",\"n\":\"中国大陆\"},{\"v\":\"38\",\"n\":\"日本\"},{\"v\":\"30218\",\"n\":\"欧美\"}],\"key\":\"18005\"},{\"name\":\"版本\",\"value\":[{\"v\":\"30220\",\"n\":\"动画\"},{\"v\":\"32784\",\"n\":\"动画电影\"},{\"v\":\"33482\",\"n\":\"轻动画\"},{\"v\":\"33483\",\"n\":\"短剧\"}],\"key\":\"30219\"},{\"name\":\"风格\",\"value\":[{\"v\":\"30230\",\"n\":\"搞笑\"},{\"v\":\"30232\",\"n\":\"热血\"},{\"v\":\"30233\",\"n\":\"催泪\"},{\"v\":\"30234\",\"n\":\"治愈\"},{\"v\":\"30237\",\"n\":\"励志\"},{\"v\":\"30241\",\"n\":\"机战\"},{\"v\":\"30243\",\"n\":\"恋爱\"},{\"v\":\"30245\",\"n\":\"科幻\"},{\"v\":\"30247\",\"n\":\"奇幻\"},{\"v\":\"30248\",\"n\":\"推理\"},{\"v\":\"30249\",\"n\":\"校园\"},{\"v\":\"30252\",\"n\":\"日常\"},{\"v\":\"30255\",\"n\":\"美食\"},{\"v\":\"30256\",\"n\":\"职场\"},{\"v\":\"30258\",\"n\":\"偶像\"},{\"v\":\"30265\",\"n\":\"泡面\"},{\"v\":\"30267\",\"n\":\"冒险\"},{\"v\":\"30268\",\"n\":\"竞技\"},{\"v\":\"30270\",\"n\":\"合家欢\"},{\"v\":\"32792\",\"n\":\"武侠\"},{\"v\":\"32793\",\"n\":\"玄幻\"}],\"key\":\"30225\"},{\"name\":\"新类型\",\"value\":[{\"v\":\"32796\",\"n\":\"轻小说改编\"},{\"v\":\"32797\",\"n\":\"漫画改编\"},{\"v\":\"32798\",\"n\":\"游戏改编\"},{\"v\":\"32799\",\"n\":\"原创\"}],\"key\":\"32795\"}],\"5\":[{\"name\":\"地区\",\"value\":[{\"v\":\"221\",\"n\":\"内地\"},{\"v\":\"220\",\"n\":\"港台\"},{\"v\":\"219\",\"n\":\"欧美\"},{\"v\":\"218\",\"n\":\"日韩\"},{\"v\":\"217\",\"n\":\"拉美\"},{\"v\":\"216\",\"n\":\"亚洲地区\"},{\"v\":\"215\",\"n\":\"非洲\"}],\"key\":\"18008\"},{\"name\":\"语种\",\"value\":[{\"v\":\"91\",\"n\":\"普通话\"},{\"v\":\"92\",\"n\":\"粤语\"},{\"v\":\"93\",\"n\":\"闽南语\"},{\"v\":\"94\",\"n\":\"英语\"},{\"v\":\"95\",\"n\":\"日语\"},{\"v\":\"96\",\"n\":\"韩语\"},{\"v\":\"97\",\"n\":\"其它\"}],\"key\":\"18009\"}],\"6\":[{\"name\":\"地区\",\"value\":[{\"v\":\"151\",\"n\":\"内地\"},{\"v\":\"152\",\"n\":\"港台\"},{\"v\":\"33306\",\"n\":\"韩国\"},{\"v\":\"154\",\"n\":\"欧美\"},{\"v\":\"1113\",\"n\":\"其它\"}],\"key\":\"18013\"},{\"name\":\"类型\",\"value\":[{\"v\":\"155\",\"n\":\"播报\"},{\"v\":\"156\",\"n\":\"访谈\"},{\"v\":\"158\",\"n\":\"游戏\"},{\"v\":\"292\",\"n\":\"晚会\"},{\"v\":\"2118\",\"n\":\"脱口秀\"},{\"v\":\"2224\",\"n\":\"真人秀\"},{\"v\":\"33860\",\"n\":\"竞演\"}],\"key\":\"18014\"}],\"7\":[{\"name\":\"内容类型\",\"value\":[{\"v\":\"169\",\"n\":\"独家\"},{\"v\":\"170\",\"n\":\"热点\"},{\"v\":\"171\",\"n\":\"原创\"},{\"v\":\"175\",\"n\":\"八卦\"},{\"v\":\"176\",\"n\":\"选秀\"},{\"v\":\"180\",\"n\":\"搞笑\"},{\"v\":\"182\",\"n\":\"颁奖\"},{\"v\":\"183\",\"n\":\"活动\"},{\"v\":\"349\",\"n\":\"结婚\"},{\"v\":\"350\",\"n\":\"去世\"},{\"v\":\"351\",\"n\":\"生子\"},{\"v\":\"352\",\"n\":\"探班\"},{\"v\":\"353\",\"n\":\"事故\"},{\"v\":\"637\",\"n\":\"票房\"},{\"v\":\"951\",\"n\":\"纠纷\"},{\"v\":\"1001\",\"n\":\"星座\"},{\"v\":\"1088\",\"n\":\"演唱会\"},{\"v\":\"1658\",\"n\":\"慈善\"},{\"v\":\"32512\",\"n\":\"话剧\"},{\"v\":\"32513\",\"n\":\"舞蹈\"},{\"v\":\"32514\",\"n\":\"戏曲\"},{\"v\":\"32515\",\"n\":\"儿童剧\"},{\"v\":\"32516\",\"n\":\"歌剧\"},{\"v\":\"32517\",\"n\":\"音乐剧\"},{\"v\":\"32518\",\"n\":\"音乐会\"},{\"v\":\"32519\",\"n\":\"相声\"},{\"v\":\"32520\",\"n\":\"马戏\"},{\"v\":\"32521\",\"n\":\"魔术\"},{\"v\":\"32522\",\"n\":\"展览\"},{\"v\":\"32523\",\"n\":\"其它\"}],\"key\":\"18016\"},{\"name\":\"地区\",\"value\":[{\"v\":\"184\",\"n\":\"内地\"},{\"v\":\"185\",\"n\":\"港台\"},{\"v\":\"186\",\"n\":\"韩国\"},{\"v\":\"187\",\"n\":\"海外\"},{\"v\":\"188\",\"n\":\"其它\"}],\"key\":\"18017\"},{\"name\":\"类型\",\"value\":[{\"v\":\"1077\",\"n\":\"电影\"},{\"v\":\"1078\",\"n\":\"电视\"},{\"v\":\"1079\",\"n\":\"音乐\"},{\"v\":\"1080\",\"n\":\"演出\"},{\"v\":\"1081\",\"n\":\"明星\"},{\"v\":\"1082\",\"n\":\"综艺\"},{\"v\":\"1656\",\"n\":\"公益\"},{\"v\":\"32507\",\"n\":\"展览\"},{\"v\":\"32508\",\"n\":\"艺术节\"},{\"v\":\"32538\",\"n\":\"韩娱演出\"},{\"v\":\"1083\",\"n\":\"其它\"}],\"key\":\"18042\"}],\"8\":[{\"name\":\"类型\",\"value\":[{\"v\":\"21276\",\"n\":\"电子竞技\"},{\"v\":\"21275\",\"n\":\"网络游戏\"},{\"v\":\"21277\",\"n\":\"单机游戏\"},{\"v\":\"21278\",\"n\":\"手机游戏\"},{\"v\":\"30902\",\"n\":\"少儿游戏\"},{\"v\":\"21279\",\"n\":\"游戏美女\"}],\"key\":\"18024\"}],\"9\":[{\"name\":\"类型\",\"value\":[{\"v\":\"354\",\"n\":\"风光\"},{\"v\":\"355\",\"n\":\"饮食\"},{\"v\":\"356\",\"n\":\"住宿\"},{\"v\":\"357\",\"n\":\"新闻\"},{\"v\":\"30150\",\"n\":\"钓鱼\"},{\"v\":\"638\",\"n\":\"出行方式\"},{\"v\":\"29134\",\"n\":\"户外\"},{\"v\":\"29135\",\"n\":\"文化\"},{\"v\":\"639\",\"n\":\"奇趣\"}],\"key\":\"18029\"}],\"20\":[{\"name\":\"分类\",\"value\":[{\"v\":\"1859\",\"n\":\"明星\"},{\"v\":\"1860\",\"n\":\"公益\"},{\"v\":\"1861\",\"n\":\"欧美\"},{\"v\":\"1862\",\"n\":\"形象\"},{\"v\":\"1863\",\"n\":\"搞笑\"},{\"v\":\"1864\",\"n\":\"时尚\"},{\"v\":\"1865\",\"n\":\"儿童\"},{\"v\":\"1866\",\"n\":\"生活\"},{\"v\":\"1868\",\"n\":\"热门\"}],\"key\":\"18070\"},{\"name\":\"行业\",\"value\":[{\"v\":\"1883\",\"n\":\"IT数码\"},{\"v\":\"1884\",\"n\":\"汽车\"},{\"v\":\"1885\",\"n\":\"金融\"},{\"v\":\"1886\",\"n\":\"房地产\"},{\"v\":\"1887\",\"n\":\"化妆品\"},{\"v\":\"1888\",\"n\":\"食品饮料\"},{\"v\":\"1889\",\"n\":\"烟酒\"},{\"v\":\"1890\",\"n\":\"运动户外\"},{\"v\":\"1891\",\"n\":\"服装\"},{\"v\":\"1892\",\"n\":\"鞋包配件\"},{\"v\":\"1893\",\"n\":\"家具电器\"},{\"v\":\"1894\",\"n\":\"医药\"},{\"v\":\"1895\",\"n\":\"珠宝手表\"},{\"v\":\"1896\",\"n\":\"日化用品\"},{\"v\":\"28481\",\"n\":\"游戏\"},{\"v\":\"2295\",\"n\":\"其他\"}],\"key\":\"18073\"},{\"name\":\"版块\",\"value\":[{\"v\":\"2291\",\"n\":\"大赏\"},{\"v\":\"2292\",\"n\":\"微短片\"},{\"v\":\"2293\",\"n\":\"创意\"},{\"v\":\"2294\",\"n\":\"经典\"},{\"v\":\"29114\",\"n\":\"特约播映\"}],\"key\":\"18081\"}],\"21\":[{\"name\":\"分类\",\"value\":[{\"v\":\"2218\",\"n\":\"美食\"},{\"v\":\"31322\",\"n\":\"窍门\"},{\"v\":\"1879\",\"n\":\"家居\"},{\"v\":\"2228\",\"n\":\"宠物\"},{\"v\":\"1878\",\"n\":\"健康\"},{\"v\":\"2226\",\"n\":\"舞蹈\"},{\"v\":\"2230\",\"n\":\"情感\"},{\"v\":\"1876\",\"n\":\"奇闻\"},{\"v\":\"2227\",\"n\":\"休闲\"}],\"key\":\"18071\"},{\"name\":\"地域\",\"value\":[{\"v\":\"1881\",\"n\":\"国内\"},{\"v\":\"1882\",\"n\":\"国外\"}],\"key\":\"18072\"}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - public String join(@NonNull CharSequence charSequence, @NonNull Iterable iterable) { - Iterator it = iterable.iterator(); - if (!it.hasNext()) { - return ""; - } - StringBuilder sb = new StringBuilder(); - sb.append(it.next()); - while (it.hasNext()) { - sb.append(charSequence); - sb.append(it.next()); - } - return sb.toString(); - } - - public String playerContent(String str, String str2, List list) { - try { - JSONObject jSONObject = new JSONObject(); - try { - jSONObject.put("parse", 1); - jSONObject.put("jx", "1"); - jSONObject.put("url", str2); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return jSONObject.toString(); - } - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String searchContent(String str, boolean quick) { - try { - String url = "https://search.video.iqiyi.com/o?if=html5&key=" + str + "&pageNum=1&pos=1&pageSize=20"; - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONArray optJSONArray = new JSONObject(json).optJSONObject("data").optJSONArray("docinfos"); - - JSONArray videos = new JSONArray(); - for (int i = 0; i < optJSONArray.length(); i++) { - JSONObject optJSONObject = optJSONArray.getJSONObject(i).optJSONObject("albumDocInfo"); - JSONObject video = new JSONObject(); - String optString = optJSONObject.optString("albumLink"); - video.put("vod_id", "/albums/album/avlistinfo?aid=" + optJSONObject.optString("qipu_id") + "&size=5000&page=1&url=" + optString); - video.put("vod_name", optJSONObject.optString("albumTitle")); - video.put("vod_pic", optJSONObject.optString("albumImg")); - video.put("vod_remarks", optJSONObject.optString("releaseDate")); - videos.put(video); - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("list", videos); - return jSONObject2.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } -} diff --git a/TVBox_Java/spider/If101.java b/TVBox_Java/spider/If101.java deleted file mode 100644 index 4430c40..0000000 --- a/TVBox_Java/spider/If101.java +++ /dev/null @@ -1,482 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class If101 extends Spider { - private static final String siteUrl = "https://oulevod.tv"; - private static final String siteHost = "oulevod.tv"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html"); - private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"if101\":{\"sh\":\"高清蓝光\",\"sn\":0,\"pu\":\"\",\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"冒险\",\"v\":\"6\"},{\"n\":\"剧情\",\"v\":\"7\"},{\"n\":\"动作\",\"v\":\"8\"},{\"n\":\"动画电影\",\"v\":\"9\"},{\"n\":\"同性\",\"v\":\"10\"},{\"n\":\"喜剧\",\"v\":\"11\"},{\"n\":\"奇幻\",\"v\":\"12\"},{\"n\":\"恐怖\",\"v\":\"20\"},{\"n\":\"悬疑\",\"v\":\"21\"},{\"n\":\"惊悚\",\"v\":\"22\"},{\"n\":\"战争\",\"v\":\"23\"},{\"n\":\"歌舞\",\"v\":\"24\"},{\"n\":\"灾难\",\"v\":\"25\"},{\"n\":\"爱情\",\"v\":\"26\"},{\"n\":\"犯罪\",\"v\":\"27\"},{\"n\":\"科幻\",\"v\":\"28\"},{\"n\":\"经典\",\"v\":\"29\"},{\"n\":\"网络电影\",\"v\":\"30\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"高清版\",\"v\":\"高清版\"},{\"n\":\"剧场版\",\"v\":\"剧场版\"},{\"n\":\"抢先版\",\"v\":\"抢先版\"},{\"n\":\"OVA\",\"v\":\"OVA\"},{\"n\":\"TV\",\"v\":\"TV\"},{\"n\":\"影院版\",\"v\":\"影院版\"}]},{\"key\":\"state\",\"name\":\"资源\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"正片\",\"v\":\"正片\"},{\"n\":\"预告片\",\"v\":\"预告片\"},{\"n\":\"花絮\",\"v\":\"花絮\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美剧\",\"v\":\"13\"},{\"n\":\"日剧\",\"v\":\"14\"},{\"n\":\"韩剧\",\"v\":\"15\"},{\"n\":\"国产剧\",\"v\":\"16\"},{\"n\":\"泰剧\",\"v\":\"31\"},{\"n\":\"港剧\",\"v\":\"32\"},{\"n\":\"台剧\",\"v\":\"33\"},{\"n\":\"新马剧\",\"v\":\"34\"},{\"n\":\"其它剧\",\"v\":\"35\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"高清版\",\"v\":\"高清版\"},{\"n\":\"剧场版\",\"v\":\"剧场版\"},{\"n\":\"抢先版\",\"v\":\"抢先版\"},{\"n\":\"OVA\",\"v\":\"OVA\"},{\"n\":\"TV\",\"v\":\"TV\"},{\"n\":\"影院版\",\"v\":\"影院版\"}]},{\"key\":\"state\",\"name\":\"资源\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"正片\",\"v\":\"正片\"},{\"n\":\"预告片\",\"v\":\"预告片\"},{\"n\":\"花絮\",\"v\":\"花絮\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美动漫\",\"v\":\"36\"},{\"n\":\"日本动漫\",\"v\":\"37\"},{\"n\":\"韩国动漫\",\"v\":\"38\"},{\"n\":\"国产动漫\",\"v\":\"39\"},{\"n\":\"新马泰动漫\",\"v\":\"40\"},{\"n\":\"港台动漫\",\"v\":\"41\"},{\"n\":\"其他动漫\",\"v\":\"42\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"欧美综艺\",\"v\":\"43\"},{\"n\":\"日本综艺\",\"v\":\"44\"},{\"n\":\"韩国综艺\",\"v\":\"45\"},{\"n\":\"国产综艺\",\"v\":\"46\"},{\"n\":\"新马泰综艺\",\"v\":\"47\"},{\"n\":\"港台综艺\",\"v\":\"48\"},{\"n\":\"其他综艺\",\"v\":\"49\"}]},{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"version\",\"name\":\"版本\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"真人版\",\"v\":\"真人版\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"50\":[{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}],\"51\":[{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"by\",\"name\":\"By\",\"value\":[{\"n\":\"按最新\",\"v\":\"time\"},{\"n\":\"按最热\",\"v\":\"hits\"},{\"n\":\"按评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("div.conch-nav div ul li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("动漫") || - name.equals("综艺") || - name.equals("纪录片") || - name.equals("体育"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("ul.hl-vod-list").get(0); - Elements list = homeList.select("li.hl-list-item"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("div.hl-item-title a").text(); - String cover = vod.selectFirst(".hl-item-thumb").attr("data-original"); - String remark = vod.selectFirst(".hl-pic-text span").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("div.hl-item-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/index.php/vod/show/id/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.hl-page-wrap"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("li a"); - if (a == null) - continue; - String span = pageInfo.select("li a.active").text(); - String wy = doc.select("ul.hl-page-wrap li a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("li.hl-list-item"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("div.hl-item-title a").text(); - String cover = vod.selectFirst(".hl-item-thumb").attr("data-original"); - String remark = vod.selectFirst(".hl-pic-text span").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("div.hl-item-title a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 24); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 24); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("a.digg_link").attr("data-id"); - - String cover = doc.selectFirst("div.hl-dc-pic span").attr("data-original"); - String title = doc.selectFirst("h2.hl-dc-title").text(); - String desc = doc.selectFirst("span.hl-content-text em").text(); - String category = "", area = "", year = "", director = "", actor = "", remark = ""; - Elements span_text_muted = doc.select("li.hl-col-xs-12 em"); - for (int i = 0; i < span_text_muted.size() - 2; i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.contains("类型")) { - try { - category = text.parent().select("a").text(); - } catch (Exception e) { - category = ""; - } - } else if (info.contains("年份")) { - try { - year = text.parent().text().split(":")[1]; - } catch (Exception e) { - year = ""; - } - } else if (info.contains("地区")) { - try { - area = text.parent().text().split(":")[1]; - } catch (Exception e) { - area = ""; - } - } else if (info.contains("上映")) { - try { - remark = text.text(); - } catch (Exception e) { - remark = ""; - } - } else if (info.contains("导演")) { - try { - director = text.parent().select("a").text(); - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演")) { - try { - actor = text.parent().select("a").text(); - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.hl-plays-from a"); - Elements sourceList = doc.select("div.hl-list-wrap"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - sourceName = sourceName.replaceAll("[^\u4E00-\u9FA5]", ""); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul>li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/index.php/vod/play/id/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - if (title.contains(key)) { - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } -} diff --git a/TVBox_Java/spider/Imaple.java b/TVBox_Java/spider/Imaple.java deleted file mode 100644 index 7779054..0000000 --- a/TVBox_Java/spider/Imaple.java +++ /dev/null @@ -1,465 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Demo for self study - *

- * Source from Author: CatVod - */ - -public class Imaple extends Spider { - - private static final String siteUrl = "https://imaple.co/"; - private static final String siteHost = "imaple.co"; - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/type/(\\S+).html"); - protected Pattern regexVid = Pattern.compile("/vod/(\\d+).html"); - protected Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html"); - protected Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"kbm3u8\":{\"sh\":\"秒播雲\",\"sn\":0,\"pu\":\"\",\"or\":999},\"bjm3u8\":{\"sh\":\"八戒雲\",\"sn\":0,\"pu\":\"\",\"or\":999},\"605m3u8\":{\"sh\":\"光速雲\",\"sn\":0,\"pu\":\"\",\"or\":999},\"mlm3u8\":{\"sh\":\"藍光線一\",\"sn\":0,\"pu\":\"\",\"or\":999},\"alizy\":{\"sh\":\"藍光線三\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"dplayer\":{\"sh\":\"動漫專線\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"qdyun\":{\"sh\":\"驱动云\",\"sn\":0,\"pu\":\"\",\"or\":999},\"wjm3u8\":{\"sh\":\"理想雲\",\"sn\":0,\"pu\":\"\",\"or\":999},\"fanqie\":{\"sh\":\"番茄资源\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"youku\":{\"sh\":\"奇藝雲\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"qq\":{\"sh\":\"騰訊雲\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"mgtv\":{\"sh\":\"芒果雲\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"sohu\":{\"sh\":\"搜狐雲\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"88zym3u8\":{\"sh\":\"優雅雲\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"bilibili\":{\"sh\":\"嗶哩雲\",\"sn\":1,\"pu\":\"https://player.imaple.tv/player/?url=\",\"or\":999},\"dbm3u8\":{\"sh\":\"急速雲\",\"sn\":0,\"pu\":\"\",\"or\":999},\"tkm3u8\":{\"sh\":\"天空雲\",\"sn\":0,\"pu\":\"\",\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"動作片\",\"v\":\"6\"},{\"n\":\"喜劇片\",\"v\":\"7\"},{\"n\":\"愛情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"劇情片\",\"v\":\"11\"},{\"n\":\"戰爭片\",\"v\":\"12\"},{\"n\":\"紀錄片\",\"v\":\"20\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陸\",\"v\":\"大陸\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台灣\",\"v\":\"台灣\"},{\"n\":\"美國\",\"v\":\"美國\"},{\"n\":\"法國\",\"v\":\"法國\"},{\"n\":\"英國\",\"v\":\"英國\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韓國\",\"v\":\"韓國\"},{\"n\":\"德國\",\"v\":\"德國\"},{\"n\":\"泰國\",\"v\":\"泰國\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陸劇\",\"v\":\"13\"},{\"n\":\"港劇\",\"v\":\"14\"},{\"n\":\"台劇\",\"v\":\"15\"},{\"n\":\"日劇\",\"v\":\"16\"},{\"n\":\"韓劇\",\"v\":\"23\"},{\"n\":\"美劇\",\"v\":\"24\"},{\"n\":\"海外劇\",\"v\":\"25\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"港台綜藝\",\"v\":\"29\"},{\"n\":\"日韓綜藝\",\"v\":\"30\"},{\"n\":\"大陸綜藝\",\"v\":\"31\"},{\"n\":\"歐美綜藝\",\"v\":\"32\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"港台動漫\",\"v\":\"33\"},{\"n\":\"日韓動漫\",\"v\":\"34\"},{\"n\":\"大陸動漫\",\"v\":\"35\"},{\"n\":\"歐美動漫\",\"v\":\"36\"},{\"n\":\"海外動漫\",\"v\":\"37\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements elements = doc.select("ul.myui-header__menu>li>a"); - JSONArray classes = new JSONArray(); - ArrayList allClass = new ArrayList<>(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = !filter || (name.equals("電影") || name.equals("電視劇") || name.equals("綜藝") || name.equals("動漫")); - if (allClass.contains(name)) - show = false; - if (show) { - allClass.add(name); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("li.col-lg-6 >div.myui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/show/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select(".myui-page li a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).trim()); - } else { - page = 0; - } - } - if (name.equals("尾頁")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("li.col-lg-6 >div.myui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/vod/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("span.mac_hits").attr("data-id"); - - String cover = doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("div.myui-content__detail h1.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分類:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地區:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("導演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.myui-panel__head>ul").get(0).select("li"); - Elements sourceList = doc.select("div.tab-content>div.tab-pane"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul>li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " https://imaple.co"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Init.java b/TVBox_Java/spider/Init.java deleted file mode 100644 index 3337ace..0000000 --- a/TVBox_Java/spider/Init.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.catvod.spider; - - - - -import android.content.Context; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.demo.MainActivity; - -public class Init { - - - public static void init(Context context) { - SpiderDebug.log("自定义爬虫代码加载成功!"); - } -} diff --git a/TVBox_Java/spider/Juhi.java b/TVBox_Java/spider/Juhi.java deleted file mode 100644 index 8d33a94..0000000 --- a/TVBox_Java/spider/Juhi.java +++ /dev/null @@ -1,472 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Juhi extends Spider { - - private static final String siteUrl = "https://www.juhi.cc/"; - private static final String siteHost = "juhi.cc"; - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/vodtype/(\\d+)/"); - protected Pattern regexVid = Pattern.compile("/voddetail/(\\d+)/"); - protected Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+)/"); - protected Pattern regexPage = Pattern.compile("/vodshow/(\\S+)/"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"tkm3u8\":{\"sh\":\"✦剧嗨专线\",\"pu\":\"https://jx.huishij.com/yun/?url=\",\"sn\":1,\"or\":999},\"if101\":{\"sh\":\"✦蓝光超清\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"北美高清①\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbyun\":{\"sh\":\"北美高清②\",\"pu\":\"\",\"sn\":0,\"or\":999},\"wjm3u8\":{\"sh\":\"北美高清③\",\"pu\":\"\",\"sn\":0,\"or\":999},\"kbm3u8\":{\"sh\":\"全球线路①\",\"pu\":\"\",\"sn\":0,\"or\":999},\"hnyun\":{\"sh\":\"全球线路②\",\"pu\":\"\",\"sn\":0,\"or\":999},\"hnm3u8\":{\"sh\":\"全球线路③\",\"pu\":\"\",\"sn\":0,\"or\":999},\"kbzy\":{\"sh\":\"全球线路④\",\"pu\":\"\",\"sn\":0,\"or\":999},\"fanqie\":{\"sh\":\"全球线路⑤\",\"pu\":\"\",\"sn\":0,\"or\":999},\"kuaiyun\":{\"sh\":\"快速线路\",\"pu\":\"https://qimihe.com/?url=\",\"sn\":1,\"or\":999},\"leyum3u8\":{\"sh\":\"午夜专线1\",\"pu\":\"\",\"sn\":0,\"or\":999},\"lym3u8\":{\"sh\":\"午夜专线2\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dplayer\":{\"sh\":\"DPlayer-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"videojs\":{\"sh\":\"videojs-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"iva\":{\"sh\":\"iva-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"iframe\":{\"sh\":\"iframe外链数据\",\"pu\":\"\",\"sn\":0,\"or\":999},\"link\":{\"sh\":\"外链数据\",\"pu\":\"\",\"sn\":0,\"or\":999},\"swf\":{\"sh\":\"Flash文件\",\"pu\":\"\",\"sn\":0,\"or\":999},\"flv\":{\"sh\":\"Flv文件\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bjyun\":{\"sh\":\"bjyun\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bjm3u8\":{\"sh\":\"bjm3u8\",\"pu\":\"\",\"sn\":0,\"or\":999},\"wasu\":{\"sh\":\"华数直连\",\"pu\":\"\",\"sn\":0,\"or\":999},\"funshion\":{\"sh\":\"风行直连\",\"pu\":\"\",\"sn\":0,\"or\":999},\"pptv\":{\"sh\":\"PPTV直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"letv\":{\"sh\":\"乐视直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"mgtv\":{\"sh\":\"芒果直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"youku\":{\"sh\":\"优酷直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"qiyi\":{\"sh\":\"爱奇艺直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"qq\":{\"sh\":\"腾讯直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"m1905\":{\"sh\":\"M1905直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"sohu\":{\"sh\":\"搜狐直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999}}"); - filterConfig = new JSONObject("{\"20\":[{\"key\":\"0\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"20\"},{\"n\":\"动作片\",\"v\":\"24\"},{\"n\":\"喜剧片\",\"v\":\"25\"},{\"n\":\"愛情片\",\"v\":\"26\"},{\"n\":\"科幻片\",\"v\":\"27\"},{\"n\":\"恐怖片\",\"v\":\"28\"},{\"n\":\"劇情片\",\"v\":\"11\"},{\"n\":\"戰爭片\",\"v\":\"30\"},{\"n\":\"动画电影\",\"v\":\"33\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"21\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"34\"},{\"n\":\"港剧\",\"v\":\"35\"},{\"n\":\"韩剧\",\"v\":\"37\"},{\"n\":\"欧美剧\",\"v\":\"36\"},{\"n\":\"日本剧\",\"v\":\"38\"},{\"n\":\"台湾剧\",\"v\":\"39\"},{\"n\":\"海外剧\",\"v\":\"40\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"22\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"22\"},{\"n\":\"大陆综艺\",\"v\":\"41\"},{\"n\":\"港台综艺\",\"v\":\"42\"},{\"n\":\"日韩综艺\",\"v\":\"43\"},{\"n\":\"欧美综艺\",\"v\":\"44\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"23\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"23\"},{\"n\":\"国产动漫\",\"v\":\"45\"},{\"n\":\"日本动漫\",\"v\":\"46\"},{\"n\":\"欧美动漫\",\"v\":\"47\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.nav-menu > li > a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - //分类名 - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("综艺") || - name.equals("动漫"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("ul.myui-vodlist").get(0); - Elements list = homeList.select("li > div > a"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.myui-page>li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("ul.myui-vodlist > li > div > a"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + "/"; - //System.out.println(url); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.myui-content__thumb > a > img").attr("src"); - String title = doc.selectFirst("div.myui-content__thumb > a").attr("title"); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - //System.out.println(vodList.toString()); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("ul.nav-btn > li > a"); - //System.out.println(sources.size()); - Elements sourceList = doc.select("div.tab-content > div"); - //System.out.println(sourceList.size()); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - //System.out.println(sources.text().split(":")[0].split("』")[1]); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul > li > a"); - //System.out.println(playListA.size()); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - //headers.put("origin", " https://juhi.cc"); - //headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - //headers.put("Accept", " */*"); - //headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - //headers.put("Accept-Encoding", " gzip, deflate, br"); - - - // 播放页 url - String url = siteUrl + "/vodplay/" + id + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - if (Misc.isVip(videoUrl)) { // 使用jx:1 - try { - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", videoUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - //Document doc = Jsoup.parse(srr.content); - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Juhuang.java b/TVBox_Java/spider/Juhuang.java deleted file mode 100644 index 1381ad5..0000000 --- a/TVBox_Java/spider/Juhuang.java +++ /dev/null @@ -1,406 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - - -public class Juhuang extends Spider { - private static final String siteUrl = "https://juhuang.tv"; - private static final String siteHost = "juhuang.tv"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - private Pattern regexCategory = Pattern.compile("/type/(\\d+)_type.html"); - private Pattern regexVid = Pattern.compile("/play/(\\d+)_play_\\d+_\\d+.html"); - private Pattern regexPlay = Pattern.compile("/play/(\\d+)_play_(\\d+)_(\\d+).html"); - private Pattern regexPage = Pattern.compile("/type/\\d+_type_(\\d+).html"); - - public void init(Context context) { - Juhuang.super.init(context); - try { - playerConfig = new JSONObject("{\"xg\":{\"sh\":\"xg播放器\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"dplayer\":{\"sh\":\"dplayer播放器\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"videojs\":{\"sh\":\"videojs-H5播放器\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"iva\":{\"sh\":\"iva-H5播放器\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"iframe\":{\"sh\":\"iframe外链数据\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"link\":{\"sh\":\"外链数据\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"swf\":{\"sh\":\"Flash文件\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"flv\":{\"sh\":\"Flv文件\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"plyr\":{\"sh\":\"plyr\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"H5player\":{\"sh\":\"H5player\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"playerjs\":{\"sh\":\"playerjs\",\"or\":999,\"sn\":0,\"pu\":\"\"},\"aliplayer\":{\"sh\":\"阿里播放器\",\"or\":999,\"sn\":0,\"pu\":\"\"}}"); - filterConfig = new JSONObject("{}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", "juhuang.tv"); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - public String homeContent(boolean filter) { - try{ - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.nav-menu-items > li > a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - //分类名 - String name = ele.text(); - boolean show = name.equals("Youtube精选") || - name.equals("剧集") || - name.equals("电影") || - name.equals("综艺") || - name.equals("动漫") || - name.equals("纪录片"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div[class='module-items']").get(1); - Elements list = homeList.select("div.module-item"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("div.module-item-cover > div.module-item-pic > a").attr("title"); - String cover = vod.selectFirst("div.module-item-cover > div.module-item-pic > img").attr("data-src"); - String remark = vod.selectFirst("div.module-item-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("div.module-item-cover > div.module-item-pic > a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - int pageCount = 0; - int page = -1; - // 获取分类数据的url - String url = siteUrl + "/type/" + tid + "_type.html"; - - if (TextUtils.isEmpty(pg) || Integer.parseInt(pg.trim()) <= 1) { - page = 1; - } else { - url = siteUrl + String.format("/type/%s_type_%s.html", tid, pg); - page = Integer.parseInt(pg.trim()); - } - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - // 取页码相关信息 - Elements pageInfo = doc.select("div.module-footer >div[id=page] > a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1)); - } else { - pageCount = 0; - } - break; - } - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("div.module-items>div"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("div.module-item-cover > div.module-item-pic > a").attr("title"); - String cover = vod.selectFirst("div.module-item-cover > div.module-item-pic > img").attr("data-src"); - String remark = ""; - Element remarkElement = vod.selectFirst("div.module-item-text"); - if (remarkElement != null) { - remark = remarkElement.text(); - } - Matcher matcher = regexVid.matcher(vod.selectFirst("div.module-item-cover > div.module-item-pic > a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/vod/" + ids.get(0) + "_vod.html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - // 取基本数据 - String cover = doc.selectFirst("div.module-item-pic > img").attr("data-src"); - String title = doc.selectFirst("div.video-info-header > h1.page-title").text(); - String desc = doc.select("p.zkjj_a").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - // 取播放列表数据 - Elements sources = doc.select("div.module"); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.select("div.module-heading > h2.module-title").text(); - - String playList = ""; - Elements playListA = source.select("div.module-list > div.module-blocklist > div.scroll-content > a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - String href = vod.attr("href"); - String playURL = href.substring(6, href.indexOf(".html")); - vodItems.add(vod.select("span").text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject headers = new JSONObject(); - //headers.put("Origin", " https://juhuang.tv"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - //headers.put("Accept", " */*"); - //headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - //headers.put("Accept-Encoding", " gzip, deflate"); - //headers.put("Referer", " https://juhuang.tv/"); - - // 播放页 url - String url = siteUrl + "/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_aaaa")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - String jxurl = player.getString("url"); - if (player.has("encrypt")) { - int encrypt = player.getInt("encrypt"); - if (encrypt == 1) { - jxurl = URLDecoder.decode(jxurl); - } else if (encrypt == 2) { - jxurl = URLEncoder.encode(new String(Base64.decode(URLDecoder.decode(new String(Base64.decode(jxurl, 0))),0))); - } - } - String directUrl = "https://web-webapi-tsjqsvyzyx.cn-shenzhen.fcapp.run/?url=" + jxurl; - HashMap hashMap = new HashMap(); - hashMap.put("Referer", " https://juhuang.tv/"); - hashMap.put("Origin", " https://juhuang.tv"); - hashMap.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - result.put("url", new JSONObject(OkHttpUtil.string(directUrl, hashMap)).getString("play_url")); - result.put("parse", "0"); - result.put("playUrl", ""); - result.put("header", headers.toString()); - //result.put("header", "{\"User-Agent\", \" Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36\"}"); - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - String url = "https://so.juhuang.tv/soapi.php?&wd=" + URLEncoder.encode(key); - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("count") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("vod_id"); - String title = vod.getString("vod_name"); - String cover = vod.getString("vod_pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Jumi.java b/TVBox_Java/spider/Jumi.java deleted file mode 100644 index 1f3b010..0000000 --- a/TVBox_Java/spider/Jumi.java +++ /dev/null @@ -1,466 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Demo for self study - *

- * Source from Author: CatVod - */ - -public class Jumi extends Spider { - - private static final String siteUrl = "https://jumi.tv/"; - private static final String siteHost = "jumi.tv"; - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/type/(\\S+).html"); - protected Pattern regexVid = Pattern.compile("/vod/(\\d+).html"); - protected Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html"); - protected Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"mlm3u8\":{\"sh\":\"極速①線\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"alizy\":{\"sh\":\"極速③線\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"weiyun\":{\"sh\":\"1080P\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"dbm3u8\":{\"sh\":\"急速雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"tkm3u8\":{\"sh\":\"天空雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"wjm3u8\":{\"sh\":\"無盡雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"605m3u8\":{\"sh\":\"光速雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"kbm3u8\":{\"sh\":\"秒播雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"bjm3u8\":{\"sh\":\"八戒雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"hnm3u8\":{\"sh\":\"紅牛雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"bdxm3u8\":{\"sh\":\"北鬥雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"youku\":{\"sh\":\"優酷雲\",\"sn\":1,\"pu\":\"https://www.mgtv.com.jumi.tv/player/?url=\",\"or\":999},\"mgtv\":{\"sh\":\"芒果雲\",\"sn\":1,\"pu\":\"https://www.mgtv.com.jumi.tv/player/?url=\",\"or\":999},\"88zym3u8\":{\"sh\":\"88雲\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"qiyi\":{\"sh\":\"奇藝雲\",\"sn\":1,\"pu\":\"https://www.mgtv.com.jumi.tv/player/?url=\",\"or\":999},\"dplayer\":{\"sh\":\"動漫專線\",\"sn\":1,\"pu\":\"https://jx.parwix.com:4433/aliplayer/?url=\",\"or\":999},\"qq\":{\"sh\":\"騰訊雲\",\"sn\":1,\"pu\":\"https://www.mgtv.com.jumi.tv/player/?url=\",\"or\":999},\"bilibili\":{\"sh\":\"嗶哩雲\",\"sn\":1,\"pu\":\"https://www.mgtv.com.jumi.tv/player/?url=\",\"or\":999},\"sohu\":{\"sh\":\"搜狐雲\",\"sn\":1,\"pu\":\"https://www.mgtv.com.jumi.tv/player/?url=\",\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"動作片\",\"v\":\"6\"},{\"n\":\"喜劇片\",\"v\":\"7\"},{\"n\":\"愛情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"劇情片\",\"v\":\"11\"},{\"n\":\"戰爭片\",\"v\":\"12\"},{\"n\":\"紀錄片\",\"v\":\"20\"}]},{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"驚悚\",\"v\":\"驚悚\"},{\"n\":\"懸疑\",\"v\":\"懸疑\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"罪案\",\"v\":\"罪案\"},{\"n\":\"災難\",\"v\":\"災難\"},{\"n\":\"動畫\",\"v\":\"動畫\"},{\"n\":\"古裝\",\"v\":\"古裝\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"文藝\",\"v\":\"文藝\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"歷史\",\"v\":\"歷史\"},{\"n\":\"勵志\",\"v\":\"勵志\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"愛情\",\"v\":\"愛情\"},{\"n\":\"喜劇\",\"v\":\"喜劇\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"動作\",\"v\":\"動作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"劇情\",\"v\":\"劇情\"},{\"n\":\"戰爭\",\"v\":\"戰爭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武俠\",\"v\":\"武俠\"},{\"n\":\"冒險\",\"v\":\"冒險\"},{\"n\":\"經典\",\"v\":\"經典\"},{\"n\":\"兒童\",\"v\":\"兒童\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陸\",\"v\":\"大陸\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台灣\",\"v\":\"台灣\"},{\"n\":\"美國\",\"v\":\"美國\"},{\"n\":\"法國\",\"v\":\"法國\"},{\"n\":\"英國\",\"v\":\"英國\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韓國\",\"v\":\"韓國\"},{\"n\":\"德國\",\"v\":\"德國\"},{\"n\":\"泰國\",\"v\":\"泰國\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"陸劇\",\"v\":\"13\"},{\"n\":\"港劇\",\"v\":\"14\"},{\"n\":\"台劇\",\"v\":\"22\"},{\"n\":\"日劇\",\"v\":\"15\"},{\"n\":\"韓劇\",\"v\":\"23\"},{\"n\":\"美劇\",\"v\":\"16\"},{\"n\":\"海外劇\",\"v\":\"24\"}]},{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"喜劇\",\"v\":\"喜劇\"},{\"n\":\"歷史\",\"v\":\"歷史\"},{\"n\":\"古裝\",\"v\":\"古裝\"},{\"n\":\"武俠\",\"v\":\"武俠\"},{\"n\":\"刑偵\",\"v\":\"刑偵\"},{\"n\":\"戰爭\",\"v\":\"戰爭\"},{\"n\":\"神話\",\"v\":\"神話\"},{\"n\":\"軍旅\",\"v\":\"軍旅\"},{\"n\":\"諜戰\",\"v\":\"諜戰\"},{\"n\":\"商戰\",\"v\":\"商戰\"},{\"n\":\"校園\",\"v\":\"校園\"},{\"n\":\"穿越\",\"v\":\"穿越\"},{\"n\":\"懸疑\",\"v\":\"懸疑\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"愛情\",\"v\":\"愛情\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陸\",\"v\":\"大陸\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台灣\",\"v\":\"台灣\"},{\"n\":\"美國\",\"v\":\"美國\"},{\"n\":\"法國\",\"v\":\"法國\"},{\"n\":\"英國\",\"v\":\"英國\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韓國\",\"v\":\"韓國\"},{\"n\":\"德國\",\"v\":\"德國\"},{\"n\":\"泰國\",\"v\":\"泰國\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements elements = doc.select("ul.nav-menu>li>a"); - JSONArray classes = new JSONArray(); - ArrayList allClass = new ArrayList<>(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = !filter || (name.equals("電影") || name.equals("劇集") || name.equals("綜藝") || name.equals("動漫")); - if (allClass.contains(name)) - show = false; - if (show) { - allClass.add(name); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div.col-lg-wide-75 > ul.myui-vodlist li div.myui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/show/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select(".myui-page li a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).trim()); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("ul.myui-vodlist li div.myui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/vod/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("span.mac_hits").attr("data-id"); - - String cover = doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("div.myui-content__detail h1.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.myui-panel__head>ul").get(0).select("li"); - Elements sourceList = doc.select("div.tab-content>div.tab-pane"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul>li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " https://jumi.tv"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - headers.put("referer", " https://jumi.tv/"); - - - // 播放页 url - String url = siteUrl + "/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Kmys.java b/TVBox_Java/spider/Kmys.java deleted file mode 100644 index 3743625..0000000 --- a/TVBox_Java/spider/Kmys.java +++ /dev/null @@ -1,567 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.content.SharedPreferences; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.net.URLEncoder; -import java.security.KeyFactory; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.X509EncodedKeySpec; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.crypto.Cipher; - -import okhttp3.Call; -import okhttp3.Headers; -import okhttp3.Response; - -/** - * Author: @SDL - */ -public class Kmys extends Spider { - private String apiDomain = ""; - private String staticDomain = ""; - - private String appId = "4"; // 飞瓜 1 酷猫 5 暗影 4 - - private String device = "1a7348ae45f8f6de4d798614fc07e7271657392501986"; - - @Override - public void init(Context context) { - super.init(context); - SharedPreferences sharedPreferences = context.getSharedPreferences("sp_Kmys", Context.MODE_PRIVATE); - try { - device = sharedPreferences.getString("device", null); - } catch (Throwable th) { - } finally { - if (device == null) { - device = Misc.MD5(UUID.randomUUID().toString(), Misc.CharsetUTF8).toLowerCase(); - sharedPreferences.edit().putString("device", device).commit(); - } - } - } - - private HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("versionNumber", "360"); - headers.put("versionName", "3.6.0"); - headers.put("device", device); - headers.put("ed", device); - headers.put("appId", appId); - headers.put("platformId", "7"); - headers.put("User-Agent", "okhttp/3.14.7"); - return headers; - } - - private void checkDomain() { - if (staticDomain.isEmpty()) { - String url = "http://feigua2021.oss-cn-beijing.aliyuncs.com/static/config/video/" + appId + ".json"; - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "okhttp/3.14.7"); - headers.put("ed", device); - String json = OkHttpUtil.string(url, headers); - try { - JSONObject obj = new JSONObject(json); - apiDomain = obj.getString("apiDomain"); - staticDomain = obj.getString("staticDomain"); - } catch (JSONException e) { - e.printStackTrace(); - } - } - } - - @Override - public String homeContent(boolean filter) { - try { - checkDomain(); - String url = staticDomain + "/static/" + appId + "/config/lib-new.json"; - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); - - JSONArray years = jsonObject.getJSONArray("year"); - JSONArray types = jsonObject.getJSONArray("types"); - - JSONArray classes = new JSONArray(); - JSONObject filterConfig = new JSONObject(); - - for (int i = 0; i < types.length(); i++) { - JSONObject item = types.getJSONObject(i); - String typeId = item.getString("typeId").trim(); - if (typeId.isEmpty()) - continue; - String typeName = item.getString("typeName"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - classes.put(newCls); - - JSONArray tags = item.getJSONArray("tags"); - JSONArray extendsAll = new JSONArray(); - // 类型 - JSONObject newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "type"); - newTypeExtend.put("name", "类型"); - JSONArray newTypeExtendKV = new JSONArray(); - JSONObject kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", "-1"); - newTypeExtendKV.put(kv); - for (int j = 0; j < tags.length(); j++) { - JSONObject child = tags.getJSONObject(j); - kv = new JSONObject(); - kv.put("n", child.getString("typeName")); - kv.put("v", child.getString("typeId")); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - // 排序 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "sort"); - newTypeExtend.put("name", "排序"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "最热"); - kv.put("v", "2"); - newTypeExtendKV.put(kv); - kv = new JSONObject(); - kv.put("n", "最新"); - kv.put("v", "1"); - newTypeExtendKV.put(kv); - kv = new JSONObject(); - kv.put("n", "好评"); - kv.put("v", "3"); - newTypeExtendKV.put(kv); - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - // 地区 - JSONArray regions = item.getJSONArray("children"); - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "area"); - newTypeExtend.put("name", "地区"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", "-1"); - newTypeExtendKV.put(kv); - for (int j = 0; j < regions.length(); j++) { - JSONObject child = regions.getJSONObject(j); - kv = new JSONObject(); - kv.put("n", child.getString("typeName")); - kv.put("v", child.getString("typeId")); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - - // 年份 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "year"); - newTypeExtend.put("name", "年份"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", "-1"); - newTypeExtendKV.put(kv); - for (int j = 0; j < years.length(); j++) { - String year = years.getString(j).trim(); - if (year.isEmpty()) - continue; - kv = new JSONObject(); - kv.put("n", year); - kv.put("v", year); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - filterConfig.put(typeId, extendsAll); - } - JSONObject result = new JSONObject(); - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - checkDomain(); - String url = staticDomain + "/static/" + appId + "/index/cloumn/1.json"; - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); - JSONArray list = jsonObject.getJSONArray("list"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.length(); i++) { - JSONArray videoList = list.getJSONObject(i).getJSONArray("videoList"); - for (int j = 0; j < videoList.length(); j++) { - JSONObject vObj = videoList.getJSONObject(j); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("vodName")); - v.put("vod_pic", fixUrl(vObj.getString("vodPicThumb"))); - v.put("vod_remarks", vObj.getString("lastName")); - videos.put(v); - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - checkDomain(); - JSONObject result = new JSONObject(); - - String url = apiDomain + "/videolibrary/v2/" + appId + "/" + tid; - extend = extend == null ? new HashMap<>() : extend; - if (!extend.containsKey("area")) { - extend.put("area", "-1"); - } - if (!extend.containsKey("type")) { - extend.put("type", "-1"); - } - if (!extend.containsKey("sort")) { - extend.put("sort", "2"); - } - if (!extend.containsKey("year")) { - extend.put("year", "-1"); - } - url += "/" + extend.get("area"); - url += "/" + extend.get("type"); - url += "/" + extend.get("sort"); - url += "/-1"; - url += "/" + extend.get("year"); - url += "/-1/" + pg + ".json"; - - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); - JSONArray jsonArray = jsonObject.getJSONArray("list"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("vodName")); - v.put("vod_pic", fixUrl(vObj.getString("vodPicThumb"))); - v.put("vod_remarks", vObj.getString("lastName")); - videos.put(v); - } - - int total = jsonObject.getInt("count"); - int limit = jsonObject.getInt("pageSize"); - int totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1); - result.put("page", jsonObject.getInt("pageIndex")); - result.put("pagecount", totalPg); - result.put("limit", limit); - result.put("total", total); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - checkDomain(); - JSONObject result = new JSONObject(); - String url = staticDomain + "/static/video/detail/" + ids.get(0) + ".json"; - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); - JSONObject vodList = new JSONObject(); - vodList.put("vod_id", jsonObject.getString("id")); - vodList.put("vod_name", jsonObject.getString("vodName")); - vodList.put("vod_pic", fixUrl(jsonObject.getString("vodPic"))); - vodList.put("type_name", jsonObject.getString("typeName")); - vodList.put("vod_year", jsonObject.getString("vodYear")); - vodList.put("vod_area", jsonObject.getString("vodArea")); - vodList.put("vod_remarks", ""); - vodList.put("vod_actor", jsonObject.getString("vodActor")); - vodList.put("vod_director", ""); - vodList.put("vod_content", jsonObject.getString("vodBlurb")); - - String vodPlayUrl = jsonObject.getString("vodPlayUrl"); - vodPlayUrl = rsa(vodPlayUrl.substring(0, 10) + vodPlayUrl.substring(16)); - - ArrayList playFrom = new ArrayList<>(); - ArrayList playList = new ArrayList<>(); - - JSONArray playSource = new JSONArray(vodPlayUrl); - for (int i = 0; i < playSource.length(); i++) { - JSONObject item = playSource.getJSONObject(i); - String srcName = item.getString("name"); - boolean userProxy = srcName.equals("高速线路"); - ArrayList urls = new ArrayList<>(); - JSONArray playUrls = item.getJSONArray("list"); - for (int j = 0; j < playUrls.length(); j++) { - JSONObject urlObj = playUrls.getJSONObject(j); - if (userProxy) - urls.add(urlObj.getString("name") + "$" + Proxy.localProxyUrl() + "?do=kmys&type=m3u8&url=" + Base64.encodeToString(urlObj.getString("url").getBytes(Misc.CharsetUTF8), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + ".." + urlObj.getInt("isParse")); - else - urls.add(urlObj.getString("name") + "$" + urlObj.getString("url") + ".." + urlObj.getInt("isParse")); - } - if (urls.isEmpty()) - continue; - playFrom.add(srcName); - playList.add(TextUtils.join("#", urls)); - } - - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject result = new JSONObject(); - String[] info = id.split("\\.\\."); - String url = info[0]; - int isParse = Integer.parseInt(info[1]); - if (isParse == 2) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", url); - } else { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", url); - } - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - checkDomain(); - JSONObject result = new JSONObject(); - String url = apiDomain + "/api/v2/index/search?pageIndex=1&wd=" + URLEncoder.encode(key) + "&limit=10&type=1"; - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONArray videos = new JSONArray(); - JSONObject jsonObject = new JSONObject(content).getJSONObject("data"); - JSONArray jsonArray = jsonObject.getJSONArray("list"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - String title = vObj.getString("vodName"); - if (!title.contains(key)) - continue; - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", title); - v.put("vod_pic", fixUrl(vObj.getString("vodPicThumb"))); - v.put("vod_remarks", vObj.getString("lastName")); - videos.put(v); - } - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - protected String fixUrl(String src) { - try { - if (src.startsWith("//")) { - Uri parse = Uri.parse(staticDomain); - src = parse.getScheme() + ":" + src; - } else if (!src.contains("://")) { - Uri parse = Uri.parse(staticDomain); - if (!src.startsWith("/")) - src = "/" + src; - src = parse.getScheme() + "://" + parse.getHost() + src; - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - - String rsa(String in) { - try { - RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3VLHgbkFN0ebMaR4e0D\n" + - "z6Z2mFexPBFKGqK0tuRhzu7XOrG92nKWfnublf2p1i22UN81whBLINjMttOuqW6\n" + - "fM9DCnAPTelud1zCXWYWIsv5Z19inJSG8vytJ7xg1dnfuRSRUkx11IE7bm0T/sM\n" + - "0sI4GgcktQJNSizyirHtuJjUUxxQabEhFkFeqQ5r+A69KjB5QkotCc4pG5lENyT\n" + - "ARHGSsfaiJthaiH0yJ/8tUlyMgJ9H6/jbQg0wlLcEUzdfe2KuCPrTRzIzx4Cjm1\n" + - "JogT6JV2byvXpzAMC3O48LDiekJdVztg2Cj7E0cGrOsGs+IK6F7TWsKD/cIELTF\n" + - "hLz6dExQIDAQAB", Base64.DEFAULT))); - Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); - cipher.init(Cipher.DECRYPT_MODE, pubKey); - byte[] inData = Base64.decode(in, Base64.DEFAULT); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - if (inData.length <= 256) { - outputStream.write(cipher.doFinal(inData)); - } else { - for (int i = 0; i < inData.length; i += 256) { - outputStream.write(cipher.doFinal(inData, i, 256)); - } - } - outputStream.flush(); - String result = new String(outputStream.toByteArray(), Misc.CharsetUTF8); - outputStream.close(); - return result; - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } - - private static HashMap kmysPlayerHeaders = null; - private static String signPlayerStr = "700a4cce35"; - private static final Pattern tsRex = Pattern.compile("(\\S+.ts)|(#EXT-X-KEY:\\S+\")(\\S+)(\")"); - - static String subUrl(String url) { - if (url.startsWith("http://")) { - return url.substring(0, url.substring(7).indexOf(47) + 7); - } - String tmp = url.startsWith("https://") ? url.substring(0, url.substring(8).indexOf(47) + 8) : ""; - return url.substring(tmp.length()); - } - - static Object[] getVodContent(String m3u8) { - Uri uri = Uri.parse(m3u8); - String time = String.valueOf(System.currentTimeMillis()); - String key = Misc.MD5(subUrl(m3u8) + signPlayerStr + time, Misc.CharsetUTF8).toLowerCase(); - String realUrl = m3u8 + "?key=" + key + "&v=360&i=5&p=7&ed=1a7348ae45f8f6de4d798614fc07e7271657392501986&time=" + time; - String m3u8Content = OkHttpUtil.string(realUrl, kmysPlayerHeaders); - String tsUrl = m3u8.substring(0, m3u8.indexOf(uri.getLastPathSegment())); - StringBuilder sb = new StringBuilder(); - int start = 0; - Matcher matcher = tsRex.matcher(m3u8Content); - while (matcher.find()) { - sb.append(m3u8Content, start, matcher.start()); - if (matcher.group().contains("EXT-X-KEY")) { - String keyRealUrl = Proxy.localProxyUrl() + "?do=kmys&type=key&url=" + Base64.encodeToString((tsUrl + matcher.group(3)).getBytes(Misc.CharsetUTF8), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); - sb.append(matcher.group(2) + keyRealUrl + matcher.group(4)); - } else { - String tsRealUrl = Proxy.localProxyUrl() + "?do=kmys&type=ts&url=" + Base64.encodeToString((tsUrl + matcher.group(1)).getBytes(Misc.CharsetUTF8), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); - sb.append(tsRealUrl); - } - start = matcher.end(); - } - sb.append(m3u8Content, start, m3u8Content.length()); - String type = "application/octet-stream"; - Object[] result = new Object[3]; - result[0] = 200; - result[1] = type; - ByteArrayInputStream baos = new ByteArrayInputStream(sb.toString().getBytes(Misc.CharsetUTF8)); - result[2] = baos; - return result; - } - - static Object[] getKeyContent(String key) { - String time = String.valueOf(System.currentTimeMillis()); - String md5 = Misc.MD5(subUrl(key) + signPlayerStr + time, Misc.CharsetUTF8).toLowerCase(); - String realUrl = key + "?key=" + md5 + "&v=360&i=5&p=7&ed=1a7348ae45f8f6de4d798614fc07e7271657392501986&time=" + time; - String keyContent = OkHttpUtil.string(realUrl, kmysPlayerHeaders); - String type = "application/octet-stream"; - Object[] result = new Object[3]; - result[0] = 200; - result[1] = type; - ByteArrayInputStream baos = new ByteArrayInputStream(keyContent.getBytes(Misc.CharsetUTF8)); - result[2] = baos; - return result; - } - - static Object[] getTsContent(String ts) { - String time = String.valueOf(System.currentTimeMillis()); - String key = Misc.MD5(subUrl(ts) + signPlayerStr + time, Misc.CharsetUTF8).toLowerCase(); - String realUrl = ts + "?key=" + key + "&v=360&i=5&p=7&ed=1a7348ae45f8f6de4d798614fc07e7271657392501986&time=" + time; - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - - - @Override - public void onFailure(Call call, Exception e) { - - } - - @Override - public void onResponse(Response response) { - } - }; - OkHttpUtil.get(OkHttpUtil.defaultClient(), realUrl, null, kmysPlayerHeaders, callBack); - if (callBack.getResult().code() == 200) { - Headers headers = callBack.getResult().headers(); - String type = headers.get("Content-Type"); - if (type == null) { - type = "application/octet-stream"; - } - Object[] result = new Object[3]; - result[0] = 200; - result[1] = type; - result[2] = callBack.getResult().body().byteStream(); - return result; - } - return null; - } - - public static Object[] vod(Map params) { - String type = params.get("type"); - String url = params.get("url"); - url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), Misc.CharsetUTF8); - if (kmysPlayerHeaders == null) { - kmysPlayerHeaders = new HashMap<>(); - kmysPlayerHeaders.put("User-Agent", "okhttp/3.14.7"); - kmysPlayerHeaders.put("ed", "1a7348ae45f8f6de4d798614fc07e7271657392501986"); - kmysPlayerHeaders.put("Connection", "close"); - } - if (type.equals("m3u8")) { - return getVodContent(url); - } else if (type.equals("key")) { - return getKeyContent(url); - } else if (type.equals("ts")) { - return getTsContent(url); - } - return null; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Kuaikan.java b/TVBox_Java/spider/Kuaikan.java deleted file mode 100644 index 2f47a15..0000000 --- a/TVBox_Java/spider/Kuaikan.java +++ /dev/null @@ -1,681 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.content.SharedPreferences; -import android.text.TextUtils; -import android.util.Base64; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.io.ByteArrayOutputStream; -import java.security.KeyFactory; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.UUID; -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; -import okhttp3.Call; -import okhttp3.OkHttpClient; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -public class Kuaikan extends Spider { - private static String Cb; - private static long QH; - private static String dW; - private HashMap> Ji = new HashMap<>(); - - private void Q() { - if (System.currentTimeMillis() > QH) { - try { - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("bf70a456195ae394184b2e0b1b471cae1000300001dc431681b806089dac1153fb13960f87" + currentTimeMillis + "notice"); - jSONObject.put("appId", "1000300001"); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - String O = Decrypt("bf70a456195ae394", "184b2e0b1b471cae", jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", "bf70a456195ae394184b2e0b1b471cae"); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/login.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject jSONObject3 = new JSONObject(str); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket")); - JSONObject jSONObject4 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))); - long unused = Kuaikan.QH = jSONObject4.getLong("duration") * 1000; - String unused2 = Kuaikan.Cb = jSONObject4.getString("data"); - Kuaikan.this.Uf(); - } catch (JSONException e) { - } - } - }); - } catch (Throwable th) { - th.printStackTrace(); - } - } - } - - public void Uf() { - try { - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f8700" + dW + currentTimeMillis + "notice"); - jSONObject.put("adv", 0); - jSONObject.put("appId", "1000300001"); - jSONObject.put("nav", 0); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - jSONObject.put("umId", dW); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/config.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.1 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject jSONObject3 = new JSONObject(str); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket")); - JSONArray jSONArray = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))).getJSONObject("data").getJSONArray("newAnalysis"); - Kuaikan.this.Ji.clear(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject4 = jSONArray.getJSONObject(i); - ArrayList arrayList = new ArrayList(); - Kuaikan.this.Ji.put(jSONObject4.getString("id"), arrayList); - JSONArray jSONArray2 = jSONObject4.getJSONArray("analyses"); - for (int i2 = 0; i2 < jSONArray2.length(); i2++) { - arrayList.add(jSONArray2.getJSONObject(i2).getString("url")); - } - } - } catch (JSONException e) { - } - } - }); - } catch (Throwable th) { - th.printStackTrace(); - } - } - - public HashMap j(long j) { - HashMap hashMap = new HashMap<>(); - hashMap.put("appId", "1000300001"); - hashMap.put("version", "4"); - hashMap.put("timestamp", j + ""); - hashMap.put("token", f("1000300001dc431681b806089dac1153fb13960f874" + j + "notice")); - hashMap.put("User-Agent", "okhttp/5.0.0-alpha.2"); - return hashMap; - } - - String Decrypt(String str, String str2, String str3) { - try { - SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "AES"); - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - cipher.init(1, secretKeySpec, new IvParameterSpec(str2.getBytes())); - return Base64.encodeToString(cipher.doFinal(str3.getBytes()), 2); - } catch (Throwable th) { - th.printStackTrace(); - return ""; - } - } - - String UO(String str, String str2, String str3) { - try { - SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "AES"); - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - cipher.init(2, secretKeySpec, new IvParameterSpec(str2.getBytes())); - return new String(cipher.doFinal(Base64.decode(str3, 0)), "UTF-8"); - } catch (Throwable th) { - th.printStackTrace(); - return ""; - } - } - - public String categoryContent(String str, final String str2, boolean z, HashMap hashMap) { - try { - Q(); - int parseInt = hashMap.containsKey("areaId") ? Integer.parseInt(hashMap.get("areaId")) : 0; - int parseInt2 = hashMap.containsKey("tagId") ? Integer.parseInt(hashMap.get("tagId")) : 0; - int parseInt3 = hashMap.containsKey("yearId") ? Integer.parseInt(hashMap.get("yearId")) : 0; - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f87" + str2 + 18 + str + parseInt2 + parseInt + parseInt3 + currentTimeMillis + "notice"); - jSONObject.put("appId", "1000300001"); - jSONObject.put("typeId", str); - jSONObject.put("areaId", parseInt); - jSONObject.put("tagId", parseInt2); - jSONObject.put("yearId", parseInt3); - jSONObject.put("page", Integer.parseInt(str2)); - jSONObject.put("pageSize", 18); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - final JSONObject jSONObject3 = new JSONObject(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/video.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.5 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str3) { - try { - JSONObject jSONObject4 = new JSONObject(str3); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket")); - JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))); - JSONArray jSONArray = new JSONArray(); - JSONArray jSONArray2 = jSONObject5.getJSONArray("results"); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONObject jSONObject6 = jSONArray2.getJSONObject(i); - JSONObject jSONObject7 = new JSONObject(); - jSONObject7.put("vod_id", jSONObject6.getString("id")); - jSONObject7.put("vod_name", jSONObject6.getString("name")); - jSONObject7.put("vod_pic", jSONObject6.getString("pic")); - jSONObject7.put("vod_remarks", jSONObject6.getString("progress")); - jSONArray.put(jSONObject7); - } - jSONObject3.put("page", Integer.parseInt(str2)); - int i2 = jSONObject5.getInt("count"); - int i3 = 20; - jSONObject3.put("pagecount", i2 % i3 == 0 ? i2 / i3 : (i2 / i3) + 1); - jSONObject3.put("limit", i3); - jSONObject3.put("total", i2); - jSONObject3.put("list", jSONArray); - } catch (JSONException e) { - } - } - }); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String detailContent(final List list) { - try { - Q(); - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f87" + list.get(0) + currentTimeMillis + "notice"); - jSONObject.put("appId", "1000300001"); - jSONObject.put("id", list.get(0)); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - final JSONObject jSONObject3 = new JSONObject(); - OkHttpClient QH2 = OkHttpUtil.defaultClient(); - OkHttpUtil.postJson(QH2, "http://ctlook.facaishiyi.com/api/v1/video/play/" + list.get(0) + ".do ", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.6 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject jSONObject4 = new JSONObject(str); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket")); - JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))).getJSONObject("data"); - JSONArray jSONArray = new JSONArray(); - JSONObject jSONObject6 = new JSONObject(); - jSONObject6.put("vod_id", jSONObject5.getString("id")); - jSONObject6.put("vod_name", jSONObject5.getString("name")); - jSONObject6.put("vod_pic", jSONObject5.getString("pic")); - jSONObject6.put("vod_year", jSONObject5.getString("year")); - jSONObject6.put("vod_remarks", jSONObject5.getString("progress")); - jSONObject6.put("vod_actor", jSONObject5.getString("actor")); - jSONObject6.put("vod_director", jSONObject5.getString("director")); - jSONObject6.put("vod_content", jSONObject5.getString("content").trim()); - JSONArray jSONArray2 = new JSONArray(Kuaikan.this.UO("5551e2a82a21a9a1", "a586c5236206a2cb", jSONObject5.getString("newPlayback"))); - LinkedHashMap linkedHashMap = new LinkedHashMap(); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONObject jSONObject7 = jSONArray2.getJSONObject(i); - String string = jSONObject7.getString("name"); - String string2 = jSONObject7.getString("id"); - JSONArray jSONArray3 = jSONObject7.getJSONArray("episodes"); - ArrayList arrayList = new ArrayList(); - for (int i2 = 0; i2 < jSONArray3.length(); i2++) { - JSONObject jSONObject8 = jSONArray3.getJSONObject(i2); - String string3 = jSONObject8.getString("title"); - StringBuilder sb = new StringBuilder(); - sb.append(string3); - sb.append("|"); - sb.append((String) list.get(0)); - sb.append("|"); - sb.append(string2); - sb.append("|"); - sb.append(jSONObject8.getString("url")); - String encodeToString = Base64.encodeToString(sb.toString().getBytes("UTF-8"), 10); - arrayList.add(string3 + "$" + encodeToString); - } - linkedHashMap.put(string, TextUtils.join("#", arrayList)); - } - String join = TextUtils.join("$$$", linkedHashMap.keySet()); - String join2 = TextUtils.join("$$$", linkedHashMap.values()); - jSONObject6.put("vod_play_from", join); - jSONObject6.put("vod_play_url", join2); - jSONArray.put(jSONObject6); - jSONObject3.put("list", jSONArray); - } catch (Throwable th) { - } - } - }); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - String f(String str) { - try { - byte[] digest = MessageDigest.getInstance("MD5").digest(str.getBytes()); - StringBuilder sb = new StringBuilder(); - for (byte b : digest) { - String hexString = Integer.toHexString(b & 255); - if (hexString.length() < 2) { - sb.append(0); - } - sb.append(hexString); - } - return sb.toString().toLowerCase(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - return ""; - } - } - - public String homeContent(boolean z) { - try { - Q(); - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f87" + currentTimeMillis + "notice"); - jSONObject.put("appId", "1000300001"); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - final JSONObject jSONObject3 = new JSONObject(); - final JSONArray jSONArray = new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/user/genres.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.3 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject jSONObject4 = new JSONObject(str); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket")); - JSONArray jSONArray2 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))).getJSONArray("genres"); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONObject jSONObject5 = jSONArray2.getJSONObject(i); - String string = jSONObject5.getString("name"); - final int i2 = jSONObject5.getInt("typeId"); - if (i2 > 0) { - JSONObject jSONObject6 = new JSONObject(); - jSONObject6.put("type_id", i2 + ""); - jSONObject6.put("type_name", string); - jSONArray.put(jSONObject6); - JSONObject jSONObject7 = new JSONObject(); - long currentTimeMillis2 = System.currentTimeMillis() / 1000; - Kuaikan kuaikan = Kuaikan.this; - String f2 = kuaikan.f("1000300001dc431681b806089dac1153fb13960f87" + i2 + currentTimeMillis2 + "notice"); - jSONObject7.put("appId", "1000300001"); - jSONObject7.put("tid", i2); - jSONObject7.put("sign", f2); - jSONObject7.put("timestamp", currentTimeMillis2); - String O2 = Kuaikan.this.Decrypt(Kuaikan.Cb.substring(0, 16), Kuaikan.Cb.substring(16, 32), jSONObject7.toString()); - String tg2 = Kuaikan.this.tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Kuaikan.Cb); - JSONObject jSONObject8 = new JSONObject(); - jSONObject8.put("body", O2); - jSONObject8.put("ticket", tg2); - new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/category.do", jSONObject8.toString(), Kuaikan.this.j(currentTimeMillis2), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.3.1 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str2) { - try { - JSONObject jSONObject9 = new JSONObject(str2); - String lX2 = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject9.getString("ticket")); - JSONObject jSONObject10 = new JSONObject(Kuaikan.this.UO(lX2.substring(0, 16), lX2.substring(16, 32), jSONObject9.getString("body"))); - JSONArray jSONArray3 = jSONObject10.getJSONArray("areas"); - JSONArray jSONArray4 = jSONObject10.getJSONArray("years"); - JSONArray jSONArray5 = jSONObject10.getJSONArray("tags"); - JSONArray jSONArray6 = new JSONArray(); - JSONObject jSONObject11 = new JSONObject(); - jSONObject11.put("key", "tagId"); - jSONObject11.put("name", "类型"); - JSONArray jSONArray7 = new JSONArray(); - for (int i3 = 0; i3 < jSONArray5.length(); i3++) { - JSONObject jSONObject12 = jSONArray5.getJSONObject(i3); - JSONObject jSONObject13 = new JSONObject(); - jSONObject13.put("n", jSONObject12.getString("name")); - jSONObject13.put("v", jSONObject12.getString("id")); - jSONArray7.put(jSONObject13); - } - jSONObject11.put("value", jSONArray7); - jSONArray6.put(jSONObject11); - JSONObject jSONObject14 = new JSONObject(); - jSONObject14.put("key", "areaId"); - jSONObject14.put("name", "地区"); - JSONArray jSONArray8 = new JSONArray(); - for (int i4 = 0; i4 < jSONArray3.length(); i4++) { - JSONObject jSONObject15 = jSONArray3.getJSONObject(i4); - JSONObject jSONObject16 = new JSONObject(); - jSONObject16.put("n", jSONObject15.getString("name")); - jSONObject16.put("v", jSONObject15.getString("id")); - jSONArray8.put(jSONObject16); - } - jSONObject14.put("value", jSONArray8); - jSONArray6.put(jSONObject14); - JSONObject jSONObject17 = new JSONObject(); - jSONObject17.put("key", "yearId"); - jSONObject17.put("name", "年份"); - JSONArray jSONArray9 = new JSONArray(); - for (int i5 = 0; i5 < jSONArray4.length(); i5++) { - JSONObject jSONObject18 = jSONArray4.getJSONObject(i5); - JSONObject jSONObject19 = new JSONObject(); - jSONObject19.put("n", jSONObject18.getString("name")); - jSONObject19.put("v", jSONObject18.getString("id")); - jSONArray9.put(jSONObject19); - } - jSONObject17.put("value", jSONArray9); - jSONArray6.put(jSONObject17); - jSONObject3.put(i2 + "", jSONArray6); - } catch (JSONException e) { - } - } - }); - } - } - } catch (JSONException e) { - } - } - }); - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("class", jSONArray); - if (z) { - jSONObject4.put("filters", jSONObject3); - } - return jSONObject4.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String homeVideoContent() { - try { - Q(); - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f87115" + currentTimeMillis + "notice"); - jSONObject.put("appId", "1000300001"); - jSONObject.put("id", 115); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - final JSONArray jSONArray = new JSONArray(); - OkHttpClient QH2 = OkHttpUtil.defaultClient(); - OkHttpUtil.postJson(QH2, "http://ctlook.facaishiyi.com/api/v1/user/genre/115.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.4 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject jSONObject3 = new JSONObject(str); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject3.getString("ticket")); - JSONArray jSONArray2 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject3.getString("body"))).getJSONArray("subGenres"); - for (int i = 0; i < jSONArray2.length(); i++) { - if (jSONArray2.getJSONObject(i).getInt("template") == 1) { - JSONArray jSONArray3 = jSONArray2.getJSONObject(i).getJSONArray("video"); - for (int i2 = 0; i2 < jSONArray3.length(); i2++) { - JSONObject jSONObject4 = jSONArray3.getJSONObject(i2); - JSONObject jSONObject5 = new JSONObject(); - jSONObject5.put("vod_id", jSONObject4.getString("id")); - jSONObject5.put("vod_name", jSONObject4.getString("name")); - jSONObject5.put("vod_pic", jSONObject4.getString("pic")); - jSONObject5.put("vod_remarks", jSONObject4.getString("progress")); - jSONArray.put(jSONObject5); - } - } - } - } catch (JSONException e) { - } - } - }); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("list", jSONArray); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public void init(Context context, String str) { - Kuaikan.super.init(context, str); - SharedPreferences sharedPreferences = context.getSharedPreferences("spider_Kuaikan", 0); - try { - String string = sharedPreferences.getString("umId", null); - dW = string; - if (string != null) { - return; - } - } catch (Throwable th) { - if (dW != null) { - return; - } - } - dW = f(UUID.randomUUID().toString()).toLowerCase(); - sharedPreferences.edit().putString("umId", dW).commit(); - } - - String lX(String str, String str2) { - int i = 0; - try { - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(2, (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(str, 0)))); - byte[] decode = Base64.decode(str2, 0); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - if (decode.length <= 256) { - byteArrayOutputStream.write(cipher.doFinal(decode)); - } else { - int length = decode.length; - while (i < length) { - int i2 = i + 256; - byteArrayOutputStream.write(cipher.doFinal(decode, i, i2 > length ? length - i : 256)); - i = i2; - } - } - byteArrayOutputStream.flush(); - byteArrayOutputStream.close(); - return new String(byteArrayOutputStream.toByteArray(), "UTF-8"); - } catch (Exception e) { - return ""; - } - } - - public String playerContent(String str, String str2, List list) { - try { - Q(); - String[] split = new String(Base64.decode(str2, 10), "UTF-8").split("\\|"); - ArrayList arrayList = this.Ji.get(split[2]); - final JSONObject jSONObject = new JSONObject(); - if (arrayList != null && arrayList.size() > 0) { - Iterator it = arrayList.iterator(); - while (it.hasNext()) { - String next = it.next(); - if (jSONObject.has("url")) { - break; - } - JSONObject jSONObject2 = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f87" + split[1] + split[0] + split[3] + currentTimeMillis + "notice"); - jSONObject2.put("appId", "1000300001"); - jSONObject2.put("id", split[1]); - jSONObject2.put("title", split[0]); - jSONObject2.put("url", split[3]); - jSONObject2.put("sign", f); - jSONObject2.put("timestamp", currentTimeMillis); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject2.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("body", O); - jSONObject3.put("ticket", tg); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), next, jSONObject3.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.7 - @Override // com.github.catvod.spider.merge.OKCallBack - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str3) { - try { - JSONObject jSONObject4 = new JSONObject(str3); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket")); - JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))); - if (jSONObject5.optString("msg", "").equals("success") && jSONObject5.optInt("code", -1) == 0) { - jSONObject.put("parse", 0); - jSONObject.put("header", ""); - jSONObject.put("playUrl", ""); - jSONObject.put("url", jSONObject5.getString("url")); - } - } catch (JSONException e) { - } - } - }); - } - } - if (jSONObject.has("url")) { - return jSONObject.toString(); - } - if (!Misc.isVideoFormat(split[3])) { - return ""; - } - jSONObject.put("parse", 0); - jSONObject.put("header", ""); - jSONObject.put("playUrl", ""); - jSONObject.put("url", split[3]); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String searchContent(String str, boolean z) { - try { - Q(); - JSONObject jSONObject = new JSONObject(); - long currentTimeMillis = System.currentTimeMillis() / 1000; - String f = f("1000300001dc431681b806089dac1153fb13960f87112" + str + currentTimeMillis + "notice"); - jSONObject.put("appId", "1000300001"); - jSONObject.put("keyword", str); - jSONObject.put("page", 1); - jSONObject.put("pageSize", 12); - jSONObject.put("sign", f); - jSONObject.put("timestamp", currentTimeMillis); - String O = Decrypt(Cb.substring(0, 16), Cb.substring(16, 32), jSONObject.toString()); - String tg = tg("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDitX/rWP6WWc3h\nDzUcfD8Hbw79yCB7rz18GEkjDapjlUVIa3P8FEQFoOchu7N+vdK6HQNsl2Bql4lv\nWOYuzRWNbLGQ7mNtMca28iCuPHck0AcJzOs9F6qruPL73eY7Ai7yvzs2IfEdyXSz\nHP/yXgEOi5ZEBfsBZEPMJw6vfHJVueuD/lh/LkoJ/gXEKMCM/pkIzGpBPd2TsIg8\nZdvOGMPy+MOnJb1Qfe0y3QQdc5VPVdZFWoWsM9RAenHmE3d1THb+uNZZZcnM1tV7\nxYgBbIhgHtXAZnWDWDRBM3xJPR3O9dfBHHt/tbyrZrSwK1IgwFgqfYm/tRbmp4y/\n1DhIF6mDAgMBAAECggEAIzDjS2gEFNiZ0a6nouVSb1f47sHq8OgR1jp619seMNkR\n6Rzs4xtON8VzO1REl47lsAgi6O9SgxlEtykIiglBqDNQGNw4SNHqM6nAEuvF3sv/\n27CYb2JGFuPdq+UVAOHk4b93dH6uS95ipA8DV97psRVP3P1EqkGjGISTjf/2S4IG\n10Q0UhP4xxiRS2iCtaIq0fbvnrChqYRlYQYpkkRCCH+Q4FNKquSsqmWyCu5yfeQM\nMek+aT9KgvmCh05UCeqC1x7xPtSneNbpJpLD5zW8CcG7EYFDtIP8b9BPDlud47ZH\n5Y4/wyQQFHHLOaniTJVvEJZ7cIoXy2gOhvgcHpNryQKBgQDxNNtXnCfVK0JYNhnU\n5WCOX9NeW9Q79HldhTM5/EqsjA5H21j5S7A/duBSRfX7iou1hyXaa2p+J7rxF9sj\nNlwHPsKhprskxXaHJ7qU84gSmwORsTQQPmtTsizGwVsM330+Q2ZROaSEfDoUqH9+\nKBKs6K+FOldcTOrCZ+ILk8werwKBgQDwnQUrKATzRThVdD6Hcgt/F/SAizDmvtiT\nVvRcGkiV3EtB5Rx8zFNJ9GWrqSAArwIxTWgfYCYsvpUjbJW02Mg0Ufj2+YhjT713\nO9yViwUq996St9eLwGQO5FDMD8FYi7bRAiZEAeAeIEeveDRsNK15++8VVJVo7b2l\nzcapp5k3bQKBgQDSiJNHRhqSet6+xgIIDGoZ+1Qv0TFPX5UrZt8OpsK7FshEOhXQ\nCxt8WZN03HHXK9fEC4GjwwxBrwYB+BOjCYiMHmCd3j0M3HoXgDrgViyYKMuVuDk8\nUG83r5ZbqVuCwfO8i/HbxddueEvtyiD2CZ47ZCIHxKOKAe0K4Mex2UBaKwKBgQDi\nrEouOelP9Kn5dyVhHENQXBTu9DIBb1FAnO5fxjMTWxFa5qhLuYHNbfxKF24atsRu\nBepNhJryFCkT0jvGv2L8Ry0wHiwqwvhO14obJ3ia3iBEQAVDlt+sV9L2KvGOpTB4\n/nlmIA4u02I1IBziw02aWYkGo0SOMUo0ZQL+2PEykQKBgAV1uqiJlWuA9uPdFFJP\nZPL2YoOuTWdWfIwIb/UdsbUuTckCgqPIqUPi3HhiVSunOgcO7HWK3GD3j8k4XEbW\nG4y+Ik0lLrWzBl728tZe1GENzTf8aapElHlUfFSM4OlrTRBsbMOsQBcJNh7QbyoZ\nBHiZZTbRUY6xUR4DGYkCOksF", Cb); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("body", O); - jSONObject2.put("ticket", tg); - final JSONObject jSONObject3 = new JSONObject(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "http://ctlook.facaishiyi.com/api/v1/search/page.do", jSONObject2.toString(), j(currentTimeMillis), new OKCallBack.OKCallBackString() { // from class: com.github.catvod.spider.Kuaikan.8 - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str2) { - try { - JSONObject jSONObject4 = new JSONObject(str2); - String lX = Kuaikan.this.lX("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiYJ5UFjeEgeUi5ynLKhj5EMF0\n3sawTyAKoPbfUCSZZQ5QdrHhrINggrYxDtB/TWXoqSF+BJP85F0vq8B6gOqFWhK/\n1PIKe2wKlRRuZSOdUzK/3vzRHmR3J3KGrvNzvwARH8gg8xZjbsalc/gBkcVxSxGd\n8j8rJ4QhOSFh9F8B2wIDAQAB", jSONObject4.getString("ticket")); - JSONObject jSONObject5 = new JSONObject(Kuaikan.this.UO(lX.substring(0, 16), lX.substring(16, 32), jSONObject4.getString("body"))); - JSONArray jSONArray = new JSONArray(); - JSONArray jSONArray2 = jSONObject5.getJSONArray("results"); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONObject jSONObject6 = jSONArray2.getJSONObject(i); - JSONObject jSONObject7 = new JSONObject(); - jSONObject7.put("vod_id", jSONObject6.getString("id")); - jSONObject7.put("vod_name", jSONObject6.getString("name")); - jSONObject7.put("vod_pic", jSONObject6.getString("pic")); - jSONArray.put(jSONObject7); - } - jSONObject3.put("list", jSONArray); - } catch (JSONException e) { - } - } - }); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - String tg(String str, String str2) { - int i = 0; - try { - PrivateKey generatePrivate = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(str, 0))); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(1, generatePrivate); - byte[] bytes = str2.getBytes(); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - if (bytes.length <= 256) { - byteArrayOutputStream.write(cipher.doFinal(bytes)); - } else { - int length = bytes.length; - while (i < bytes.length) { - int i2 = i + 256; - byteArrayOutputStream.write(cipher.doFinal(bytes, i, i2 > length ? length - i : 256)); - i = i2; - } - } - byteArrayOutputStream.flush(); - byteArrayOutputStream.close(); - return Base64.encodeToString(byteArrayOutputStream.toByteArray(), 2); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Kunyu77.java b/TVBox_Java/spider/Kunyu77.java deleted file mode 100644 index 6c5eb28..0000000 --- a/TVBox_Java/spider/Kunyu77.java +++ /dev/null @@ -1,399 +0,0 @@ -package com.github.catvod.spider; - -import android.os.Build; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Set; - - -/** - * Author: @SDL - */ -public class Kunyu77 extends Spider { - private static final String siteUrl = "http://api.kunyu77.com"; - - private String uAgent = "Dalvik/2.1.0 (Linux; U; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")"; - private HashMap getHeaders(String url,String key) { - HashMap headers = new HashMap<>(); - headers.put("user-agent", uAgent); - String TK=Misc.MD5(url, Misc.CharsetUTF8); - headers.put("TK",TK); - headers.put("t",key); - return headers; - } - - - @Override - public String homeContent(boolean filter) { - try { - String t = String.valueOf(System.currentTimeMillis()/ 1000); - String url = siteUrl + "/api.php/provide/filter"; - String urlQ = "/api.php/provide/filter"; - String content = OkHttpUtil.string(url, getHeaders(urlQ,t)); - JSONObject jsonObject = new JSONObject(decryptResponse(content)).getJSONObject("data"); - Iterator keys = jsonObject.keys(); - JSONArray classes = new JSONArray(); - JSONObject filterConfig = new JSONObject(); - JSONArray extendsAll = null; - while (keys.hasNext()) { - String typeId = keys.next(); - String typeName = jsonObject.getJSONArray(typeId).getJSONObject(0).getString("cat"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - classes.put(newCls); - try { - if (extendsAll == null) { - t = String.valueOf(System.currentTimeMillis()/ 1000); - String filterUrl = siteUrl + "/api.php/provide/searchFilter"; - String filterUrlQ = "/api.php/provide/searchFilter"; - String filterUrls = filterUrl+"?type_id=0&pagenum=1&pagesize=1"; - String filterContent = OkHttpUtil.string(filterUrls, getHeaders(filterUrlQ,t)); - JSONObject filterObj = new JSONObject(filterContent).getJSONObject("data").getJSONObject("conditions"); - extendsAll = new JSONArray(); - // 年份 - JSONObject newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "year"); - newTypeExtend.put("name", "年份"); - JSONArray newTypeExtendKV = new JSONArray(); - JSONObject kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", ""); - newTypeExtendKV.put(kv); - kv = new JSONObject(); - kv.put("n", "2022"); - kv.put("v", "2022"); - newTypeExtendKV.put(kv); - kv = new JSONObject(); - kv.put("n", "2021"); - kv.put("v", "2021"); - newTypeExtendKV.put(kv); - JSONArray years = filterObj.getJSONArray("y"); - for (int j = 0; j < years.length(); j++) { - JSONObject child = years.getJSONObject(j); - kv = new JSONObject(); - kv.put("n", child.getString("name")); - kv.put("v", child.getString("value")); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - // 地区 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "area"); - newTypeExtend.put("name", "地区"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", ""); - newTypeExtendKV.put(kv); - JSONArray areas = filterObj.getJSONArray("a"); - for (int j = 0; j < areas.length(); j++) { - JSONObject child = areas.getJSONObject(j); - kv = new JSONObject(); - kv.put("n", child.getString("name")); - kv.put("v", child.getString("value")); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - // 类型 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "category"); - newTypeExtend.put("name", "类型"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", ""); - newTypeExtendKV.put(kv); - JSONArray scat = filterObj.getJSONArray("scat"); - for (int j = 0; j < scat.length(); j++) { - JSONObject child = scat.getJSONObject(j); - kv = new JSONObject(); - kv.put("n", child.getString("name")); - kv.put("v", child.getString("value")); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - } - if (extendsAll != null && extendsAll.length() > 0) { - filterConfig.put(typeId, extendsAll); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject result = new JSONObject(); - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - JSONArray videos = new JSONArray(); - try { - String t = String.valueOf(System.currentTimeMillis()/ 1000); - String url = siteUrl + "/api.php/provide/homeBlock"; - String urls = url+"?type_id=0&pcode=010110002&version=2.0.4&devid=4ac3fe96a6133de96904b8d3c8cfe16d&package=com.sevenVideo.app.android&sys=android&sysver=7.1.2&brand=realme&model=RMX1931&sj="+t; - String urlm ="/api.php/provide/homeBlockrealme4ac3fe96a6133de96904b8d3c8cfe16dRMX1931com.sevenVideo.app.android010110002"+t+"android7.1.22.0.4"+t+"XSpeUFjJ"; - String content = OkHttpUtil.string(urls, getHeaders(urlm,t)); - JSONObject jsonObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("blocks"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject blockObj = jsonArray.getJSONObject(i); - String blockName = blockObj.getString("block_name"); - if (!blockName.startsWith("热播")) { - continue; - } - JSONArray contents = blockObj.getJSONArray("contents"); - for (int j = 0; j < contents.length() && j < 3; j++) { - JSONObject vObj = contents.getJSONObject(j); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("videoCover")); - v.put("vod_remarks", vObj.getString("msg")); - videos.put(v); - } - } - } catch (Exception e) { - - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String t = String.valueOf(System.currentTimeMillis()/ 1000); - String url = siteUrl + "/api.php/provide/searchFilter?type_id=" + tid + "&pagenum=" + pg + "&pagesize=24"; - Set keys = extend.keySet(); - for (String key : keys) { - String val = extend.get(key).trim(); - if (val.length() == 0) - continue; - url += "&" + key + "=" + URLEncoder.encode(val); - } - String content = OkHttpUtil.string(url, getHeaders(url,t)); - JSONObject dataObject = new JSONObject(decryptResponse(content)).getJSONObject("data"); - JSONArray jsonArray = dataObject.getJSONArray("result"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("videoCover")); - v.put("vod_remarks", vObj.getString("msg")); - videos.put(v); - } - JSONObject result = new JSONObject(); - int limit = 24; - int page = Integer.parseInt(dataObject.getString("page")); - int total = dataObject.getInt("total"); - int pageCount = dataObject.getInt("pagesize"); - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", total); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String t = String.valueOf(System.currentTimeMillis()/ 1000); - String url = siteUrl + "/api.php/provide/videoDetail"; - String urlx=url+"?ids=" + ids.get(0)+"&pcode=010110002&version=2.0.4&devid=4ac3fe96a6133de96904b8d3c8cfe16d&package=com.sevenVideo.app.android&sys=android&sysver=7.1.2&brand=realme&model=RMX1931&sj="+t; - String urlp = "/api.php/provide/videoDetailrealme4ac3fe96a6133de96904b8d3c8cfe16d"+ids.get(0)+"RMX1931com.sevenVideo.app.android010110002"+t+"android7.1.22.0.4"+t+"XSpeUFjJ"; - String content = OkHttpUtil.string(urlx, getHeaders(urlp,t)); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONObject vObj = dataObject.getJSONObject("data"); - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - String title = vObj.getString("videoName"); - vodAtom.put("vod_id", vObj.getString("id")); - vodAtom.put("vod_name", title); - vodAtom.put("vod_pic", vObj.getString("videoCover")); - vodAtom.put("type_name", vObj.getString("subCategory")); - vodAtom.put("vod_year", vObj.getString("year")); - vodAtom.put("vod_area", vObj.getString("area")); - vodAtom.put("vod_remarks", vObj.getString("msg")); - vodAtom.put("vod_actor", vObj.getString("actor")); - vodAtom.put("vod_director", vObj.getString("director")); - vodAtom.put("vod_content", vObj.getString("brief").trim()); - t = String.valueOf(System.currentTimeMillis()/ 1000) ; - url = siteUrl + "/api.php/provide/videoPlaylist"; - urlx =url+"?ids=" + ids.get(0)+"&pcode=010110002&version=2.0.4&devid=4ac3fe96a6133de96904b8d3c8cfe16d&package=com.sevenVideo.app.android&sys=android&sysver=7.1.2&brand=realme&model=RMX1931&sj="+t; - urlp = "/api.php/provide/videoPlaylistrealme4ac3fe96a6133de96904b8d3c8cfe16d"+ids.get(0)+"RMX1931com.sevenVideo.app.android010110002"+t+"android7.1.22.0.4"+t+"XSpeUFjJ"; - content = OkHttpUtil.string(urlx, getHeaders(urlp,t)); - JSONArray episodes = new JSONObject(content).getJSONObject("data").getJSONArray("episodes"); - LinkedHashMap> playlist = new LinkedHashMap<>(); - for (int i = 0; i < episodes.length(); i++) { - JSONArray playurls = episodes.getJSONObject(i).getJSONArray("playurls"); - for (int j = 0; j < playurls.length(); j++) { - JSONObject purl = playurls.getJSONObject(j); - String from = purl.getString("playfrom"); - ArrayList urls = playlist.get(from); - if (urls == null) { - urls = new ArrayList<>(); - playlist.put(from, urls); - } - String name = purl.getString("title").replace(title, "").trim(); - if (name.isEmpty()) { - name = (i + 1) + ""; - } - String pid = purl.getString("playurl"); - urls.add(name + "$" + pid); - } - } - String vod_play_from = TextUtils.join("$$$", playlist.keySet()); - StringBuilder sb = new StringBuilder(); - Iterator> iter = playlist.values().iterator(); - short fromSize = (short) playlist.size(); - while (iter.hasNext()) { - fromSize--; - ArrayList urls = iter.next(); - sb.append(TextUtils.join("#", urls)); - if (fromSize > 0) - sb.append("$$$"); - } - vodAtom.put("vod_play_from", vod_play_from); - vodAtom.put("vod_play_url", sb.toString()); - list.put(vodAtom); - result.put("list", list); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String videoUrl = id; - try { - String t = String.valueOf(System.currentTimeMillis()/ 1000); - String url = siteUrl + "/api.php/provide/parserUrl"; - String urls=url+"?url=" + id+"&retryNum=0&pcode=010110002&version=2.0.4&devid=4ac3fe96a6133de96904b8d3c8cfe16d&package=com.sevenVideo.app.android&sys=android&sysver=7.1.2&brand=realme&model=RMX1931&sj="+t; - String urlm = "/api.php/provide/parserUrlrealme4ac3fe96a6133de96904b8d3c8cfe16dRMX1931com.sevenVideo.app.android010110002"+id+"android7.1.2"+id+"2.0.4"+t+"XSpeUFjJ"; - String content = OkHttpUtil.string(urls, getHeaders(urlm,t)); - JSONObject dataObj = new JSONObject(decryptResponse(content)).getJSONObject("data"); - JSONObject playHeader = dataObj.optJSONObject("playHeader"); - String jxUrl = dataObj.getString("url"); - content = OkHttpUtil.string(jxUrl, getHeaders(jxUrl,"")); - JSONObject result = Misc.jsonParse(jxUrl, content); - if (result != null) { - result.put("parse", 0); - result.put("playUrl", ""); - if (playHeader != null) { - JSONObject header = result.getJSONObject("header"); - Iterator iter = playHeader.keys(); - while (iter.hasNext()) { - String key = iter.next(); - header.put(key, " " + playHeader.getString(key)); - } - result.put("header", header.toString()); - } - return result.toString(); - } - } catch (Throwable th) { - - } - if (Misc.isVip(videoUrl)) { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", videoUrl); - return result.toString(); - } - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String t = String.valueOf(System.currentTimeMillis()/ 1000); - String url = siteUrl + "/api.php/provide/searchVideo"; - String urls=url+"?pcode=010110002&version=2.0.4&devid=4ac3fe96a6133de96904b8d3c8cfe16d&package=com.sevenVideo.app.android&sys=android&sysver=7.1.2&brand=realme&model=RMX1931&sj="+t+"&searchName="+ key+"&pg=1"; - - String urlm = "/api.php/provide/searchVideorealme4ac3fe96a6133de96904b8d3c8cfe16dRMX1931com.sevenVideo.app.android0101100021"+key+t+"android7.1.202.0.4"+t+"XSpeUFjJ"; - HashMap hashMap = new HashMap(); - hashMap.put("User-Agent", "okhttp/3.12.0"); - String Ks=Misc.MD5(urlm, Misc.CharsetUTF8); - hashMap.put("TK",Ks); - hashMap.put("t",t); - String content = OkHttpUtil.string(urls, hashMap); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = dataObject.getJSONArray("data"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - String title = vObj.getString("videoName"); - if (!title.contains(key)) - continue; - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", title); - v.put("vod_pic", vObj.getString("videoCover")); - v.put("vod_remarks", vObj.getString("msg")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Throwable th) { - - } - return ""; - } - - protected String decryptResponse(String src) { - return src; - } - -} diff --git a/TVBox_Java/spider/Lgyy.java b/TVBox_Java/spider/Lgyy.java deleted file mode 100644 index 27dce33..0000000 --- a/TVBox_Java/spider/Lgyy.java +++ /dev/null @@ -1,521 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.LinkedHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Headers; - -public class Lgyy extends Spider { - private static final String siteUrl = "https://www.lgyy.cc"; - private static final String siteHost = "www.lgyy.cc"; - private String cookie=""; - private String referer=""; - - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/voddetail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"duoduozy\":{\"sh\":\"自建蓝光\",\"pu\":\"https://www.lgyy.cc/static/player/dplayer.php?url=\",\"sn\":1,\"or\":999},\"qq\":{\"sh\":\"腾讯\",\"pu\":\"https://www.lgyy.cc/static/player/qq.php?url=\",\"sn\":1,\"or\":999},\"qiyi\":{\"sh\":\"爱奇艺\",\"pu\":\"https://www.lgyy.cc/static/player/qiyi.php?url=\",\"sn\":1,\"or\":999},\"youku\":{\"sh\":\"优酷\",\"pu\":\"https://www.lgyy.cc/static/player/youku.php?url=\",\"sn\":1,\"or\":999},\"mgtv\":{\"sh\":\"芒果\",\"pu\":\"https://www.lgyy.cc/static/player/mgtv.php?url=\",\"sn\":1,\"or\":999},\"bilibili\":{\"sh\":\"哔哩\",\"pu\":\"https://www.lgyy.cc/static/player/bilibili.php?url=\",\"sn\":1,\"or\":999},\"xigua\":{\"sh\":\"西瓜\",\"pu\":\"https://player.lgyyapp.com/?url=\",\"sn\":1,\"or\":999},\"sohu\":{\"sh\":\"搜狐\",\"pu\":\"https://www.lgyy.cc/static/player/sohu.php?url=\",\"sn\":1,\"or\":999},\"pptv\":{\"sh\":\"PPTV\",\"pu\":\"https://player.lgyyapp.com/?url=\",\"sn\":1,\"or\":999},\"wjm3u8\":{\"sh\":\"无尽资源\",\"pu\":\"https://www.lgyy.cc/static/player/wujin.php?url=\",\"sn\":1,\"or\":999}}"); - filterConfig = new JSONObject("{\"5\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜劇\"},{\"n\":\"爱情\",\"v\":\"愛情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"動作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"劇情\"},{\"n\":\"战争\",\"v\":\"戰爭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"動畫\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"悬疑\",\"v\":\"懸疑\"},{\"n\":\"微电影\",\"v\":\"微電影\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"國語\"},{\"n\":\"英语\",\"v\":\"英語\"},{\"n\":\"粤语\",\"v\":\"粵語\"},{\"n\":\"闽南语\",\"v\":\"閩南語\"},{\"n\":\"韩语\",\"v\":\"韓語\"},{\"n\":\"日语\",\"v\":\"日語\"},{\"n\":\"法语\",\"v\":\"法語\"},{\"n\":\"德语\",\"v\":\"德語\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"大陆剧\",\"v\":\"13\"},{\"n\":\"香港剧\",\"v\":\"14\"},{\"n\":\"韩国剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"日本剧\",\"v\":\"20\"},{\"n\":\"台湾剧\",\"v\":\"21\"},{\"n\":\"泰国剧\",\"v\":\"22\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"1\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"犯罪片\",\"v\":\"23\"},{\"n\":\"奇幻片\",\"v\":\"24\"},{\"n\":\"悬疑片\",\"v\":\"25\"},{\"n\":\"记录片\",\"v\":\"27\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"动画电影\",\"v\":\"41\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders2(siteUrl,referer))); - // 分类节点 - Elements elements = doc.select("ul[class='navbar-items swiper-wrapper'] >li a"); - System.out.println("shouye" + elements); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("综艺") || - name.equals("动漫"); - - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.module-main").get(0); - Elements list = homeList.select("div.module-items>a"); - System.out.println("list..." + list); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.selectFirst("img.lazyload").attr("data-original"); - String remark = vod.selectFirst("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + ".html"; - System.out.println("url+++" + url); - String html = OkHttpUtil.string(url, getHeaders2(url,referer)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id=page]"); - System.out.println("pg++" + pageInfo); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = doc.select("span.page-current").text(); - String wy = doc.select("div[id=page] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div[class='module-items module-poster-items-base'] >a"); - System.out.print("list++f" + list); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - System.out.print("title++" + title); - String cover = vod.selectFirst("img.lazyload").attr("data-original"); - System.out.print("cover++" + cover); - String remark = vod.selectFirst("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders2(url,referer))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.module-item-cover div.module-item-pic > img").attr("data-original"); - String title = doc.selectFirst("div.module-info-main div.module-info-heading > h1").text(); - String desc = doc.selectFirst("div.module-info-item div.module-info-introduction-content > p").text().trim(); - - - String category = "", area = "", year = "", director = "", actor = ""; - category = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(2).text(); - area = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(1).text(); - year = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(0).text(); - - Elements span_text_muted = doc.select("div.module-info-content div.module-info-items div.module-info-item"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.select("span").text(); - if (info.contains("导演")) { - try { - director = text.select("div > a").text(); - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演")) { - try { - actor = text.select("div > a").text(); - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new LinkedHashMap<>(); - /* Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - });*/ - - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-items-box>div>span"); - System.out.print("sor++" + sources); - Elements sourceList = doc.select("div.module-list>div.module-play-list"); - System.out.print("sor1++" + sourceList); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - // boolean found = false; - boolean found = true; - // for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - // String flag = it.next(); - // if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - // sourceName = playerConfig.getJSONObject(flag).getString("sh"); - // found = true; - // break; - // } - // } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("div.module-play-list-content>a"); - System.out.print("pl++" + playList); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " https://www.lgyy.cc"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/vodplay/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders2(String url,String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(!ref.equals("google")){ - headers.put("Authority", "www.lgyy.cc"); - if(ref.length()>0){ - if(ref.equals("origin")){ - headers.put("Origin", "https://www.lgyy.cc"); - } else { - headers.put("Referer", ref); - } - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - protected void getCookie(){ - cookie=""; - String cookieurl="https://www.lgyy.cc/zzzzz"; - Map> cookies = new HashMap<>(); - OkHttpUtil.string(cookieurl,getHeaders2(cookieurl,""),cookies); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = TextUtils.join(";",entry.getValue()); - break; - } - } - } - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} - // private static String doReplaceRegex(Pattern pattern, String src) { -// if (pattern == null) -// return src; -// try { - // Matcher matcher = pattern.matcher(src); -// if (matcher.find()) { -// return matcher.group(1).trim(); -// } - // } catch (Exception e) { - // SpiderDebug.log(e); -// } - // return src; -// } -//} diff --git a/TVBox_Java/spider/Lib.java b/TVBox_Java/spider/Lib.java deleted file mode 100644 index 28efabd..0000000 --- a/TVBox_Java/spider/Lib.java +++ /dev/null @@ -1,516 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Lib extends Spider { - private static final String siteUrl = "https://www.libvio.fun"; - private static final String siteHost = "www.libvio.fun"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/type/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/detail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/show/(\\S+).html"); - - protected String ext = null; - - @Override - public void init(Context context) { - super.init(context); - try { - String DataExt = OkHttpUtil.string("http://box.qinglin.tk/live/Lib.json", null); - JSONObject Config = new JSONObject(DataExt); - playerConfig = Config.getJSONObject("player"); - filterConfig = Config.getJSONObject("filter"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.stui-header__menu li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("剧集") || - name.equals("动漫") || - name.equals("日韩剧") || - name.equals("欧美剧"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("ul.stui-vodlist").get(0); - Elements list = homeList.select("div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("a").attr("data-original"); - String remark = vod.select("a .pic-text").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/show/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.stui-page__item li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - //System.out.println("哈哈"+matcher.group(1)); - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - //System.out.println("尾页" + matcher.group(1)); - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("a").attr("data-original"); - String remark = vod.select("a .pic-text").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String content) { - if (pattern == null) { - return content; - } - try { - Matcher matcher = pattern.matcher(content); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return content; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/detail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.select("div.stui-content__thumb a img").attr("data-original"); - String title = doc.select("div.stui-content__detail h1").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = ""; - Elements data = doc.select("p.data"); - Pattern cate = Pattern.compile("类型:(\\S+)"); - category = doReplaceRegex(cate, data.get(0).text()); - Pattern areas = Pattern.compile("地区:(\\S+)"); - area = doReplaceRegex(areas, data.get(0).text()); - Pattern years = Pattern.compile("年份:(\\S+)"); - year = doReplaceRegex(years, data.get(0).text()); - Pattern rms = Pattern.compile("更新:(\\S+)"); - remark = doReplaceRegex(rms, data.get(3).text()); - Pattern acs = Pattern.compile("主演:(\\S+)"); - actor = doReplaceRegex(acs, data.get(1).text()); - Pattern dis = Pattern.compile("导演:(\\S+)"); - director = doReplaceRegex(dis, data.get(1).text()); - - desc = doc.selectFirst("span.detail-content").text().trim(); - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.stui-vodlist__head h3"); - Elements sourceList = doc.select("ul.stui-content__playlist"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("li a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - headers.put("origin", " https://www.libvio.fun"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - headers.put("referer", " https://www.libvio.fun"); - // 播放页 url - String url = siteUrl + "/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - - Elements allScript = doc.select("script"); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - if (player.getString("from").contains("LINE")) { - String videoUrl = pCfg.getString("pu") + player.getString("url"); - Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, Headers())); - Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')"); - Elements allScripts = docs.select("body script"); - for (int j = 0; j < allScripts.size(); j++) { - String scContents = allScripts.get(j).html().trim(); - Matcher matcher = pattern.matcher(scContents); - if (matcher.find()) { - JSONObject result = new JSONObject(); - String players = matcher.group(0); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", players); - return result.toString(); - } - } - } - else { - SpiderDebug.log(url); - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", url); - // result.put("header", "{\"Referer\", \"https://www.libvio.me/\"}"); - return result.toString(); - } - break; - } - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - // protected static HashMap sHeaders(String url) { - // HashMap headers = new HashMap<>(); -// headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"); - // headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - // headers.put("Accept-encoding", "gzip, deflate, br"); - // headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6"); - // return headers; - // } - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} - // private static String doReplaceRegex(Pattern pattern, String src) { -// if (pattern == null) -// return src; -// try { - // Matcher matcher = pattern.matcher(src); -// if (matcher.find()) { -// return matcher.group(1).trim(); -// } - // } catch (Exception e) { - // SpiderDebug.log(e); -// } - // return src; -// } -//} \ No newline at end of file diff --git a/TVBox_Java/spider/LiteApple.java b/TVBox_Java/spider/LiteApple.java deleted file mode 100644 index 452b824..0000000 --- a/TVBox_Java/spider/LiteApple.java +++ /dev/null @@ -1,466 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Build; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.UnsupportedEncodingException; -import java.math.BigInteger; -import java.net.URLEncoder; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Random; -import java.util.Set; - -import okhttp3.Call; - -public class LiteApple extends Spider { - private static final String siteUrl = "http://ht.grelighting.cn/api.php"; - - private HashMap getHeaders(String url, String data) { - HashMap headers = new HashMap<>(); - if (data != null) { - String token = ""; - try { - token = Base64.encodeToString(b(fakeDevice.getBytes("UTF-8"), tokenKey == null ? "XPINGGUO" : tokenKey), 2); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - int currentTimeMillis = (int) (System.currentTimeMillis() / ((long) 1000)); - String hash = md5(fakeDevice + data + currentTimeMillis).substring(8, 12); - headers.put("token", token); - headers.put("hash", hash); - headers.put("timestamp", currentTimeMillis + ""); - if (tokenKey == null) { - headers.put("version", "ANDROID cn.grelighting.xpg1.1.5"); - } - } - headers.put("User-Agent", "okhttp/4.9.1"); - return headers; - } - - private String fakeDevice = null; - private String tokenKey = null; - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - SharedPreferences sharedPreferences = context.getSharedPreferences("spider_LiteApple", Context.MODE_PRIVATE); - try { - fakeDevice = sharedPreferences.getString("didd", null); - } catch (Throwable th) { - } finally { - if (fakeDevice == null) { - fakeDevice = fakeDid(); - sharedPreferences.edit().putString("didd", fakeDevice).commit(); - } - } - } - - void getTokenKey() { - if (tokenKey != null) - return; - String url = siteUrl + "/v2.user/tokenlogin"; - OkHttpUtil.post(OkHttpUtil.defaultClient(), url, null, getHeaders(url, "ANDROID cn.grelighting.xpg1.1.5"), new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - try { - tokenKey = new JSONObject(response).getJSONObject("data").getString("user_title"); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - } - - @Override - public String homeContent(boolean filter) { - try { - getTokenKey(); - String url = siteUrl + "/v2.vod/androidtypes"; - String content = OkHttpUtil.string(url, getHeaders(url, null)); - JSONObject jsonObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - - JSONObject filterConfig = new JSONObject(); - JSONArray classes = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - String typeName = jObj.getString("type_name"); - String typeId = jObj.getString("type_id"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - classes.put(newCls); - - JSONArray clses = jObj.getJSONArray("classes"); - JSONArray areas = jObj.getJSONArray("areas"); - JSONArray years = jObj.getJSONArray("years"); - - JSONArray extendsAll = new JSONArray(); - // 类型 - JSONObject newTypeExtend; - JSONArray newTypeExtendKV; - JSONObject kv; - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "class"); - newTypeExtend.put("name", "类型"); - newTypeExtendKV = new JSONArray(); - for (int j = 0; j < clses.length(); j++) { - String v = clses.getString(j); - kv = new JSONObject(); - kv.put("n", v); - kv.put("v", v); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - // 地区 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "area"); - newTypeExtend.put("name", "地区"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", ""); - newTypeExtendKV.put(kv); - for (int j = 0; j < areas.length(); j++) { - String area = areas.getString(j); - kv = new JSONObject(); - kv.put("n", area); - kv.put("v", area); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - // 年份 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "year"); - newTypeExtend.put("name", "年份"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", ""); - newTypeExtendKV.put(kv); - for (int j = 0; j < years.length(); j++) { - String year = years.getString(j); - kv = new JSONObject(); - kv.put("n", year); - kv.put("v", year); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - filterConfig.put(typeId, extendsAll); - // 排序 - newTypeExtend = new JSONObject(); - newTypeExtend.put("key", "sortby"); - newTypeExtend.put("name", "排序"); - newTypeExtendKV = new JSONArray(); - kv = new JSONObject(); - kv.put("n", "时间"); - kv.put("v", "updatetime"); - newTypeExtendKV.put(kv); - kv = new JSONObject(); - kv.put("n", "人气"); - kv.put("v", "hits"); - newTypeExtendKV.put(kv); - kv = new JSONObject(); - kv.put("n", "评分"); - kv.put("v", "score"); - newTypeExtendKV.put(kv); - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - } - - JSONObject result = new JSONObject(); - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - JSONArray videos = new JSONArray(); - for (int id = 1; id < 5; id++) { - if (videos.length() > 30) - break; - try { - String url = siteUrl + "/v2.main/androidhome"; - String content = OkHttpUtil.string(url, getHeaders(url, null)); - JSONObject jsonObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("list"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONArray jsonArraySub = jsonArray.getJSONObject(i).getJSONArray("list"); - for (int j = 0; j < jsonArraySub.length() && j < 4; j++) { - JSONObject vObj = jsonArraySub.getJSONObject(j); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("name")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("updateInfo")); - videos.put(v); - } - } - } catch (Exception e) { - - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - getTokenKey(); - String area = extend.containsKey("area") ? extend.get("area") : ""; - String year = extend.containsKey("year") ? extend.get("year") : ""; - String url = siteUrl + "/v2.vod/androidfilter?page=" + pg + "&type=" + tid; - Set keys = extend.keySet(); - for (String key : keys) { - String val = extend.get(key).trim(); - if (val.length() == 0) - continue; - url += "&" + key + "=" + URLEncoder.encode(val); - } - String content = OkHttpUtil.string(url, getHeaders(url, area + year)); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = dataObject.getJSONArray("data"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("name")); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("updateInfo")); - videos.put(v); - } - JSONObject result = new JSONObject(); - int limit = 20; - int page = Integer.parseInt(pg); - result.put("page", page); - int pageCount = videos.length() == limit ? page + 1 : page; - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + "/v2.vod/androiddetail?vod_id=" + ids.get(0); - String content = OkHttpUtil.string(url, getHeaders(url, ids.get(0))); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONObject vObj = dataObject.getJSONObject("data"); - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - vodAtom.put("vod_id", vObj.getString("id")); - vodAtom.put("vod_name", vObj.getString("name")); - vodAtom.put("vod_pic", vObj.getString("pic")); - vodAtom.put("type_name", vObj.getString("className")); - vodAtom.put("vod_year", vObj.getString("year")); - vodAtom.put("vod_area", vObj.getString("area")); - vodAtom.put("vod_remarks", vObj.getString("updateInfo")); - vodAtom.put("vod_actor", vObj.getString("actor")); - vodAtom.put("vod_content", vObj.getString("content").trim()); - - ArrayList playUrls = new ArrayList<>(); - - JSONArray urls = vObj.getJSONArray("urls"); - for (int i = 0; i < urls.length(); i++) { - JSONObject u = urls.getJSONObject(i); - playUrls.add(u.getString("key") + "$" + u.getString("url")); - } - - vodAtom.put("vod_play_from", "LiteApple"); - vodAtom.put("vod_play_url", TextUtils.join("#", playUrls)); - list.put(vodAtom); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - if (Misc.isVideoFormat(id)) { - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("header", ""); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } - return ""; - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - getTokenKey(); - String url = siteUrl + "/v2.vod/androidsearch?page=1&wd=" + URLEncoder.encode(key); - String content = OkHttpUtil.string(url, getHeaders(url, key)); - JSONObject dataObject = new JSONObject(decryptResponse(content)); - JSONArray jsonArray = dataObject.getJSONArray("data"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - String title = vObj.getString("name"); - if (!title.contains(key)) - continue; - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", title); - v.put("vod_pic", vObj.getString("pic")); - v.put("vod_remarks", vObj.getString("updateInfo")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String decryptResponse(String src) { - return src; - } - - byte[] a(String str) { - byte[] bytes = str.getBytes(); - byte[] bArr = new byte[333]; - for (int i9 = 0; i9 < 333; i9++) { - bArr[i9] = (byte) i9; - } - if (bytes.length == 0) { - return null; - } - int i10 = 0; - int i11 = 0; - for (int i12 = 0; i12 < 333; i12++) { - i11 = (((bytes[i10] & 255) + (bArr[i12] & 255)) + i11) % 333; - byte b = bArr[i12]; - bArr[i12] = bArr[i11]; - bArr[i11] = b; - i10 = (i10 + 1) % bytes.length; - } - return bArr; - } - - byte[] b(byte[] bArr, String str) { - byte[] a = a(str); - byte[] bArr2 = new byte[bArr.length]; - int i9 = 0; - int i10 = 0; - for (int i11 = 0; i11 < bArr.length; i11++) { - i9 = (i9 + 1) % 333; - i10 = ((a[i9] & 255) + i10) % 333; - byte b = a[i9]; - a[i9] = a[i10]; - a[i10] = b; - bArr2[i11] = (byte) (a[((a[i9] & 255) + (a[i10] & 255)) % 333] ^ bArr[i11]); - } - return bArr2; - } - - String randomString(int length) { - String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456"; - Random random = new Random(); - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < length; i++) { - int number = random.nextInt(str.length()); - sb.append(str.charAt(number)); - } - return sb.toString(); - } - - String randomMACAddress() { - Random rand = new Random(); - byte[] macAddr = new byte[6]; - rand.nextBytes(macAddr); - macAddr[0] = (byte) (macAddr[0] & (byte) 254); //zeroing last 2 bytes to make it unicast and locally adminstrated - StringBuilder sb = new StringBuilder(18); - for (byte b : macAddr) { - sb.append(String.format("%02X", b)); - } - return sb.toString(); - } - - String fakeDid() { - String i = ""; - String f = ""; - String d = "N/A"; - try { - d = Build.class.getField("SERIAL").get((Object) null).toString(); - } catch (Exception unused) { - } - String e = ""; - try { - e = (String) Class.forName("android.os.SystemProperties").getDeclaredMethod("get", new Class[]{String.class}).invoke((Object) null, new Object[]{"ro.build.fingerprint"}); - } catch (Exception unused) { - return ""; - } - return (((((((((("" + i) + "||") + f) + "||") + randomMACAddress()) + "||") + randomString(16)) + "||") + d) + "||") + e; - } - - String md5(String str) { - try { - MessageDigest instance = MessageDigest.getInstance("MD5"); - instance.update(str.getBytes()); - return new BigInteger(1, instance.digest()).toString(16); - } catch (Exception e9) { - e9.printStackTrace(); - return str; - } - } - -} diff --git a/TVBox_Java/spider/LocalFile.java b/TVBox_Java/spider/LocalFile.java deleted file mode 100644 index 7d3c4fd..0000000 --- a/TVBox_Java/spider/LocalFile.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.os.Environment; - -import com.github.catvod.crawler.Spider; - -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONObject; - -public class LocalFile extends Spider { - - public String categoryContent(String tid, String pg, boolean filter, HashMap hashMap) { - try { - - File file = new File(tid); - File[] list = file.listFiles(); - JSONArray jSONArray2 = new JSONArray(); - for (File f : list) { - String filename = f.getName(); - if(filename.indexOf('.') ==0){ - continue; - } - String pic = "https://img.tukuppt.com/png_preview/00/18/23/GBmBU6fHo7.jpg!/fw/260"; - if(!f.isDirectory()){ - pic = "https://img.tukuppt.com/png_preview/00/42/50/3ySGW7mvyY.jpg!/fw/260"; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", f.getAbsolutePath()); - jSONObject2.put("vod_name", f.getName()); - jSONObject2.put("vod_pic", pic); - // 当vod_tag为folder时会点击该item会把当前vod_id当成新的类型ID重新进 - jSONObject2.put("vod_tag",f.isDirectory() ? "folder" : "file" ); - jSONObject2.put("vod_remarks", fileTime(f.lastModified(), "yyyy/MM/dd aHH:mm:ss")); - jSONArray2.put(jSONObject2); - } - - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("page", 1); - jSONObject3.put("pagecount", 1); - jSONObject3.put("limit", jSONArray2.length()); - jSONObject3.put("total", jSONArray2.length()); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public String detailContent(List ids) { - try - { - JSONObject jSONObject; - String filename = ids.get(0); - File f = new File(filename); - JSONObject vod = new JSONObject(); - vod.put("vod_id", filename); - vod.put("vod_name", f.getName()); - vod.put("vod_pic", ""); - vod.put("type_name", ""); - vod.put("vod_play_from", "播放"); - vod.put("vod_play_url", f.getName()+"$"+filename); - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } - catch (Exception e){ - e.printStackTrace(); - } - return ""; - - } - - - String fileTime(long time, String fmt) { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(time); - Date date = calendar.getTime(); - SimpleDateFormat sdf = new SimpleDateFormat(fmt); - return sdf.format(date); - } - - public String homeContent(boolean z) { - try { - JSONObject filterConfig = new JSONObject(); - JSONArray classes = new JSONArray(); - JSONObject newCls = new JSONObject(); - String root = Environment.getExternalStorageDirectory().getAbsolutePath(); - newCls.put("type_id", root); - newCls.put("type_name", "本地文件"); - // type_flag 是扩展字段,目前可取值0、1、2,该字段不存在时表示正常模式 - newCls.put("type_flag", "1"); // 1、列表形式的文件夹 2、缩略图 0或者不存在表示正常模式 - classes.put(newCls); - - JSONArray jSONArray3 = new JSONArray(); - - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("class", classes); - if(z) { - jSONObject4.put("filters", new JSONObject("{}")); - } - return jSONObject4.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public void init(Context context) { - LocalFile.super.init(context); - } - - public String playerContent(String str, String str2, List list) { - try{ - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", str2); - return result.toString(); - }catch (Exception e){ - e.printStackTrace(); - } - return ""; - } - - public String searchContent(String str, boolean z) { - try { - return ""; - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - -} \ No newline at end of file diff --git a/TVBox_Java/spider/MGTV.java b/TVBox_Java/spider/MGTV.java deleted file mode 100644 index 8a5e85a..0000000 --- a/TVBox_Java/spider/MGTV.java +++ /dev/null @@ -1,314 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.net.Uri; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import rxhttp.wrapper.annotations.NonNull; - -public class MGTV extends Spider { - protected JSONObject a; - protected JSONObject q = new JSONObject(); - - private String q(String str, String str2) { - String str3; - try { - if (str2.startsWith("//")) { - Uri parse = Uri.parse(str); - str3 = parse.getScheme() + ":" + str2; - } else if (str2.contains("://")) { - return str2; - } else { - Uri parse2 = Uri.parse(str); - str3 = parse2.getScheme() + "://" + parse2.getHost() + str2; - } - return str3; - } catch (Exception e) { - SpiderDebug.log(e); - return str2; - } - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - try { - String str3 = "https://pianku.api.mgtv.com/rider/list/msite/v2?platform=msite&channelId=" + str + "&pn=" + str2 + "&chargeInfo=&sort=c2"; - if (hashMap != null) { - for (String str4 : hashMap.keySet()) { - String trim = hashMap.get(str4).trim(); - if (trim.length() != 0) { - str3 = str3 + "&" + str4 + "=" + URLEncoder.encode(trim); - } - } - } - String content = OkHttpUtil.string(str3, getHeaders(str3)); - JSONObject jSONObject = new JSONObject(); - try { - JSONArray optJSONArray = new JSONObject(content).optJSONObject("data").optJSONArray("hitDocs"); - JSONArray jSONArray = new JSONArray(); - for (int i = 0; i < optJSONArray.length(); i++) { - JSONObject optJSONObject = optJSONArray.optJSONObject(i); - String optString = optJSONObject.optString("title"); - String q = q(str3, optJSONObject.optString("img")); - String optString2 = optJSONObject.optString("updateInfo"); - if (optString2.equals("")) { - optString2 = optJSONObject.optString("subtitle"); - } - String vodId = optJSONObject.optString("playPartId"); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", vodId); - jSONObject2.put("vod_name", optString); - jSONObject2.put("vod_pic", q); - jSONObject2.put("vod_remarks", optString2); - jSONArray.put(jSONObject2); - } - jSONObject.put("list", jSONArray); - jSONObject.put("page", str2); - jSONObject.put("pagecount", Integer.MAX_VALUE); - jSONObject.put("limit", 90); - jSONObject.put("total", Integer.MAX_VALUE); - jSONObject.put("list", jSONArray); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(4); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String detailContent(List list) { - try { - String vodId = list.get(0); - String infoUrl = "https://pcweb.api.mgtv.com/player/vinfo?video_id=" + vodId; - String infoJson = OkHttpUtil.string(infoUrl, getHeaders(infoUrl)); - JSONObject info = new JSONObject(infoJson).getJSONObject("data"); - String pic = info.getString("clip_imgurl2"); - - int pageSize = 30; - int page = 1; - String url = "https://pcweb.api.mgtv.com/episode/list?_support=10000000&version=5.5.35&video_id="+vodId+"&page="+page+"&size="+pageSize+"&allowedRC=1&_support=10000000"; - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jSONObject = new JSONObject(json).getJSONObject("data"); - JSONObject jSONObject2 = new JSONObject(); - JSONObject optJSONObject = jSONObject.optJSONObject("info"); - jSONObject2.put("vod_id", vodId); - jSONObject2.put("vod_name", optJSONObject.optString("title")); - jSONObject2.put("vod_pic", pic); - jSONObject2.put("vod_content", optJSONObject.optString("desc")); - JSONArray optJSONArray = jSONObject.optJSONArray("list"); - ArrayList arrayList = new ArrayList(); - - for (int i = 0; i < optJSONArray.length(); i++) { - JSONObject optJSONObject2 = optJSONArray.optJSONObject(i); - String viewName = optJSONObject2.optString("t1") + " " + optJSONObject2.optString("t2"); - arrayList.add(viewName + "$" + optJSONObject2.optString("url")); - } - - int totalPage = jSONObject.getInt("total_page"); - int count = jSONObject.getInt("count"); - int total = jSONObject.getInt("total"); - ArrayList blocks = new ArrayList(); - ArrayList blockList = new ArrayList(); - if (totalPage == 1) { - blocks.add("mgtv"); - } else if (totalPage > 1) { - blocks.add("1-" + pageSize); - } - blockList.add(join("#", arrayList)); - if (totalPage > page) { - for (int curPage = 2; curPage<=totalPage; curPage++) { - String listUrl = "https://pcweb.api.mgtv.com/episode/list?_support=10000000&version=5.5.35&video_id="+vodId+"&page="+curPage+"&size="+pageSize+"&allowedRC=1&_support=10000000"; - String resultJson = OkHttpUtil.string(listUrl, getHeaders(listUrl)); - JSONObject dataObj = new JSONObject(resultJson).getJSONObject("data"); - JSONArray dataList = dataObj.getJSONArray("list"); - int first = (curPage - 1) * pageSize + 1; - int last = 0; - if (totalPage == curPage) { - last = total; - } else { - last = curPage * pageSize; - } - blocks.add(first + "-" + last); - ArrayList curArrayList = new ArrayList(); - for (int i = 0; i < dataList.length(); i++) { - JSONObject item = dataList.optJSONObject(i); - String viewThisName = item.optString("t1") + " " + item.optString("t2"); - curArrayList.add(viewThisName + "$" + item.optString("url")); - } - blockList.add(join("#", curArrayList)); - } - } - - jSONObject2.put("vod_play_from", join("$$$", blocks)); - jSONObject2.put("vod_play_url", join("$$$", blockList)); - JSONObject result = new JSONObject(); - JSONArray jSONArray = new JSONArray(); - jSONArray.put(jSONObject2); - result.put("list", jSONArray); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - protected HashMap getHeaders(String str) { - HashMap hashMap = new HashMap<>(); - hashMap.put("referer", "https://so.mgtv.com"); - hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - return hashMap; - } - - public String homeContent(boolean z) { - try { - JSONArray optJSONArray = new JSONObject(OkHttpUtil.string("https://pianku.api.mgtv.com/rider/config/platformChannels/v1?platform=msite&abroad=0&_support=10000000", getHeaders("https://pianku.api.mgtv.com/rider/config/platformChannels/v1?platform=msite&abroad=0&_support=10000000"))).optJSONArray("data"); - JSONArray jSONArray = new JSONArray(); - for (int i = 0; i < optJSONArray.length(); i++) { - JSONObject optJSONObject = optJSONArray.optJSONObject(i); - JSONObject jSONObject = new JSONObject(); - jSONObject.put("type_name", optJSONObject.optString("channelName")); - jSONObject.put("type_id", optJSONObject.optString("channelId")); - jSONArray.put(jSONObject); - } - JSONObject jSONObject2 = new JSONObject(); - if (z) { - jSONObject2.put("filters", this.a); - } - jSONObject2.put("class", jSONArray); - try { - JSONArray optJSONArray2 = new JSONObject(OkHttpUtil.string("https://pianku.api.mgtv.com/rider/list/pcweb/v3?platform=pcweb&channelId=2&pn=1&chargeInfo=&sort=c2", getHeaders("https://pianku.api.mgtv.com/rider/list/pcweb/v3?platform=pcweb&channelId=2&pn=1&chargeInfo=&sort=c2"))).optJSONObject("data").optJSONArray("hitDocs"); - JSONArray jSONArray2 = new JSONArray(); - for (int i2 = 0; i2 < optJSONArray2.length(); i2++) { - JSONObject optJSONObject2 = optJSONArray2.optJSONObject(i2); - String optString = optJSONObject2.optString("title"); - String q = optJSONObject2.optString("imgUrlH"); - String optString2 = optJSONObject2.optString("updateInfo"); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", optJSONObject2.optString("playPartId")); - jSONObject3.put("vod_name", optString); - jSONObject3.put("vod_pic", q); - jSONObject3.put("vod_remarks", optString2); - jSONArray2.put(jSONObject3); - } - jSONObject2.put("list", jSONArray2); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject2.toString(4); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String homeVideoContent() { - try { - JSONArray jSONArray = new JSONObject(OkHttpUtil.string("https://www.mgtv.com/api.php/app/index_video?token=", getHeaders("https://www.mgtv.com/api.php/app/index_video?token="))).getJSONArray("list"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONArray jSONArray3 = jSONArray.getJSONObject(i).getJSONArray("vlist"); - int i2 = 0; - while (i2 < jSONArray3.length() && i2 < 6) { - JSONObject jSONObject = jSONArray3.getJSONObject(i2); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", jSONObject.optString("vod_id")); - jSONObject2.put("vod_name", jSONObject.optString("vod_name")); - jSONObject2.put("vod_pic", jSONObject.optString("vod_pic")); - jSONObject2.put("vod_remarks", jSONObject.optString("vod_remarks")); - jSONArray2.put(jSONObject2); - i2++; - } - } - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public void init(Context context) { - MGTV.super.init(context); - try { - this.a = new JSONObject("{\"1\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"4\",\"n\":\"王牌综艺\"},{\"v\":\"5\",\"n\":\"大咖秀场\"},{\"v\":\"6\",\"n\":\"搞笑\"},{\"v\":\"7\",\"n\":\"情感\"},{\"v\":\"8\",\"n\":\"音乐\"},{\"v\":\"9\",\"n\":\"生活\"},{\"v\":\"179\",\"n\":\"亲子\"},{\"v\":\"170\",\"n\":\"旅游\"},{\"v\":\"171\",\"n\":\"时尚\"},{\"v\":\"173\",\"n\":\"真人秀\"},{\"v\":\"174\",\"n\":\"竞技\"},{\"v\":\"172\",\"n\":\"访谈\"},{\"v\":\"180\",\"n\":\"脱口秀\"}],\"key\":\"kind\"},{\"name\":\"地区\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"内地\"},{\"v\":\"2\",\"n\":\"港台\"},{\"v\":\"3\",\"n\":\"其他\"}],\"key\":\"area\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c4\",\"n\":\"知乎高分\"}],\"key\":\"sort\"}],\"2\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"14\",\"n\":\"甜蜜互宠\"},{\"v\":\"15\",\"n\":\"虐恋情深\"},{\"v\":\"16\",\"n\":\"青涩校园\"},{\"v\":\"17\",\"n\":\"仙侠玄幻\"},{\"v\":\"19\",\"n\":\"都市职场\"},{\"v\":\"148\",\"n\":\"古装\"},{\"v\":\"20\",\"n\":\"快意江湖\"},{\"v\":\"147\",\"n\":\"偶像\"},{\"v\":\"21\",\"n\":\"悬疑推理\"},{\"v\":\"22\",\"n\":\"家长里短\"},{\"v\":\"23\",\"n\":\"芒果出品\"},{\"v\":\"24\",\"n\":\"轻松搞笑\"},{\"v\":\"25\",\"n\":\"铁血战争\"},{\"v\":\"26\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"地区\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"10\",\"n\":\"内地\"},{\"v\":\"11\",\"n\":\"日韩\"},{\"v\":\"12\",\"n\":\"港台\"}],\"key\":\"area\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c4\",\"n\":\"知乎高分\"}],\"key\":\"sort\"},{\"name\":\"版本\",\"value\":[{\"v\":\"all\",\"n\":\"全部\"},{\"v\":\"2037\",\"n\":\"TV版\"},{\"v\":\"2038\",\"n\":\"特别版\"},{\"v\":\"2040\",\"n\":\"精华版\"},{\"v\":\"2036\",\"n\":\"未删减版\"}],\"key\":\"edition\"}],\"3\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"34\",\"n\":\"院线大片\"},{\"v\":\"175\",\"n\":\"爱情\"},{\"v\":\"176\",\"n\":\"喜剧\"},{\"v\":\"177\",\"n\":\"动作\"},{\"v\":\"178\",\"n\":\"科幻\"},{\"v\":\"39\",\"n\":\"青春\"},{\"v\":\"43\",\"n\":\"恐怖悬疑\"},{\"v\":\"44\",\"n\":\"战争\"},{\"v\":\"45\",\"n\":\"警匪\"},{\"v\":\"46\",\"n\":\"历史\"},{\"v\":\"47\",\"n\":\"歌舞\"},{\"v\":\"48\",\"n\":\"动画\"},{\"v\":\"50\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"资费\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"b1\",\"n\":\"免费\"},{\"v\":\"b2\",\"n\":\"VIP\"},{\"v\":\"b3\",\"n\":\"VIP用券\"},{\"v\":\"b4\",\"n\":\"付费点播\"}],\"key\":\"chargeInfo\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c4\",\"n\":\"知乎高分\"}],\"key\":\"sort\"}],\"106\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"106\",\"n\":\"时事\"},{\"v\":\"107\",\"n\":\"社会\"},{\"v\":\"108\",\"n\":\"文娱\"},{\"v\":\"109\",\"n\":\"军事\"}],\"key\":\"kind\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c2\",\"n\":\"最热\"}],\"key\":\"sort\"}],\"91\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"119\",\"n\":\"吐槽\"},{\"v\":\"120\",\"n\":\"恶搞\"},{\"v\":\"121\",\"n\":\"爆笑\"},{\"v\":\"122\",\"n\":\"奇趣\"},{\"v\":\"123\",\"n\":\"饭制\"},{\"v\":\"124\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"}],\"key\":\"sort\"}],\"50\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"60\",\"n\":\"恋爱少女\"},{\"v\":\"86\",\"n\":\"热血\"},{\"v\":\"62\",\"n\":\"搞笑\"},{\"v\":\"63\",\"n\":\"青春\"},{\"v\":\"64\",\"n\":\"魔幻仙侠\"},{\"v\":\"65\",\"n\":\"激燃运动\"},{\"v\":\"66\",\"n\":\"特摄\"},{\"v\":\"67\",\"n\":\"推理\"},{\"v\":\"68\",\"n\":\"亲子幼教\"},{\"v\":\"69\",\"n\":\"芒果出品\"},{\"v\":\"70\",\"n\":\"动漫音乐\"},{\"v\":\"71\",\"n\":\"经典\"},{\"v\":\"72\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"地区\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"52\",\"n\":\"内地\"},{\"v\":\"53\",\"n\":\"欧美\"},{\"v\":\"54\",\"n\":\"日韩\"},{\"v\":\"55\",\"n\":\"其他\"}],\"key\":\"area\"},{\"name\":\"版本\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"165\",\"n\":\"剧场版\"},{\"v\":\"57\",\"n\":\"TV版\"},{\"v\":\"166\",\"n\":\"OVA版\"},{\"v\":\"167\",\"n\":\"真人版\"}],\"key\":\"edition\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"}],\"key\":\"sort\"}],\"51\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"97\",\"n\":\"美食\"},{\"v\":\"98\",\"n\":\"文化\"},{\"v\":\"99\",\"n\":\"社会\"},{\"v\":\"100\",\"n\":\"历史\"},{\"v\":\"101\",\"n\":\"军事\"},{\"v\":\"102\",\"n\":\"人物\"},{\"v\":\"103\",\"n\":\"探索\"},{\"v\":\"104\",\"n\":\"自然\"},{\"v\":\"105\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c2\",\"n\":\"最热\"},{\"v\":\"c1\",\"n\":\"最新\"}],\"key\":\"sort\"}],\"20\":[{\"name\":\"类型\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"150\",\"n\":\"MV\"},{\"v\":\"151\",\"n\":\"影视原声\"},{\"v\":\"152\",\"n\":\"音乐节目\"},{\"v\":\"153\",\"n\":\"演唱会\"},{\"v\":\"154\",\"n\":\"颁奖礼\"},{\"v\":\"155\",\"n\":\"音乐现场\"},{\"v\":\"156\",\"n\":\"其他\"}],\"key\":\"kind\"},{\"name\":\"风格\",\"value\":[{\"v\":\"a1\",\"n\":\"全部\"},{\"v\":\"157\",\"n\":\"流行\"},{\"v\":\"158\",\"n\":\"Hip-hop\"},{\"v\":\"159\",\"n\":\"R&B\"},{\"v\":\"160\",\"n\":\"摇滚\"},{\"v\":\"161\",\"n\":\"民谣\"},{\"v\":\"162\",\"n\":\"爵士\"},{\"v\":\"163\",\"n\":\"古典\"},{\"v\":\"164\",\"n\":\"其他\"}],\"key\":\"musicStyle\"},{\"name\":\"排序\",\"value\":[{\"v\":\"c1\",\"n\":\"最新\"},{\"v\":\"c2\",\"n\":\"最热\"}],\"key\":\"sort\"}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - public String join(@NonNull CharSequence charSequence, @NonNull Iterable iterable) { - Iterator it = iterable.iterator(); - if (!it.hasNext()) { - return ""; - } - StringBuilder sb = new StringBuilder(); - sb.append(it.next()); - while (it.hasNext()) { - sb.append(charSequence); - sb.append(it.next()); - } - return sb.toString(); - } - - public String playerContent(String str, String str2, List list) { - try { - JSONObject jSONObject = new JSONObject(); - try { - jSONObject.put("parse", 1); - jSONObject.put("jx", "1"); - jSONObject.put("url", "https://www.mgtv.com" + str2); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return jSONObject.toString(); - } - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String searchContent(String str, boolean quick) { - try { - String url = "https://mobileso.bz.mgtv.com/pc/search/v1?allowedRC=1&q=" + str + "&pn=1&pc=10&uid=&corr=1&_support=10000000"; - String json = OkHttpUtil.string(url, getHeaders(url)); - JSONObject data = new JSONObject(json).getJSONObject("data"); - JSONArray contents = data.getJSONArray("contents"); - JSONArray items = new JSONArray(); - for (int i = 0; i < contents.length(); i++) { - JSONObject jSONObject = contents.getJSONObject(i).getJSONObject("data"); - if (!jSONObject.has("sourceList")) { - continue; - } - JSONArray sourceList = jSONObject.getJSONArray("sourceList"); - String vodUrl = sourceList.getJSONObject(0).getString("url"); - String vodId = sourceList.getJSONObject(0).getString("vid"); - String pic = jSONObject.optString("pic"); - JSONObject item = new JSONObject(); - item.put("vod_id", vodId); - item.put("vod_name", jSONObject.optString("title")); - item.put("vod_pic", pic); - item.put("vod_remarks", jSONObject.optString("playTime")); - items.put(item); - } - JSONObject result = new JSONObject(); - result.put("list", items); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } -} diff --git a/TVBox_Java/spider/MixWeb.java b/TVBox_Java/spider/MixWeb.java deleted file mode 100644 index 45d31f9..0000000 --- a/TVBox_Java/spider/MixWeb.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.github.catvod.parser; - -import android.util.Base64; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; - -public class MixWeb { - - /* - "parses": [ - { - "name": "聚合", - "type": 3, - "url": "Demo" - }, - { - "name": "解析", - "type": 1, - "url": "https://192.168.10.88/jx.php?url=", - "ext": { - "flag": [ - "qq", - "iqiyi", - "qiyi", - "爱奇艺", - "腾讯", - "letv", - "sohu", - "tudou", - "pptv", - "mgtv", - "wasu", - "bilibili" - ] - } - }] - */ - - public static HashMap> flagWebJx = new HashMap<>(); - - static HashMap> configs = null; - - public static JSONObject parse(LinkedHashMap> jx, String nameMe, String flag, String url) { - try { - if (configs == null) { - configs = new HashMap<>(); - Iterator keys = jx.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next(); - HashMap parseBean = jx.get(key); - String type = parseBean.get("type"); - if (type.equals("0")) { - try { - //取出单个解析的flags列表 - JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag"); - for (int j = 0; j < flags.length(); j++) { - //获取单个flags - String flagKey = flags.getString(j); - //取出configs中对应flags的解析 - ArrayList flagJx = configs.get(flagKey); - //如果configs中没有这个flags,则插入一个空的值 - if (flagJx == null) { - flagJx = new ArrayList<>(); - configs.put(flagKey, flagJx); - } - //如果有就在flagJx中增加解析 - flagJx.add(key); - } - } catch (Throwable th) { - - } - } - } - } - // 通过上面的配置获得解析列表 - ArrayList webJx = new ArrayList<>(); - ArrayList flagJx = configs.get(flag); - //如果flagJx不为空 - if (flagJx != null && !flagJx.isEmpty()) { - for (int i = 0; i < flagJx.size(); i++) { - String key = flagJx.get(i); - HashMap parseBean = jx.get(key); - String type = parseBean.get("type"); - if (type.equals("0")) { - //将json解析放入webJx - webJx.add(parseBean.get("url")); - } - } - } else { - Iterator keys = jx.keySet().iterator(); - while (keys.hasNext()) { - String key = keys.next(); - HashMap parseBean = jx.get(key); - String type = parseBean.get("type"); - if (type.equals("0")) { - webJx.add(parseBean.get("url")); - } - } - } - if (!webJx.isEmpty()) { - flagWebJx.put(flag, webJx); - } - - // json解析没有得到结果 用webview解析 - if (!webJx.isEmpty()) { - JSONObject webResult = new JSONObject(); - webResult.put("url", "proxy://do=MixWeb&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP)); - webResult.put("parse", 1); - webResult.put("ua", Misc.UaWinChrome); - return webResult; - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - return new JSONObject(); - } - - - public static Object[] loadHtml(String flag, String url) { - try { - url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); - String html = "\n" + - "\n" + - "\n" + - "\n" + - "解析\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - ""; - - StringBuilder jxs = new StringBuilder(); - if (flagWebJx.containsKey(flag)) { - ArrayList jxUrls = flagWebJx.get(flag); - for (int i = 0; i < jxUrls.size(); i++) { - jxs.append("\""); - jxs.append(jxUrls.get(i)); - jxs.append("\""); - if (i < jxUrls.size() - 1) { - jxs.append(","); - } - } - } - html = html.replace("#url#", url).replace("#jxs#", jxs.toString()); - Object[] result = new Object[3]; - result[0] = 200; - result[1] = "text/html; charset=\"UTF-8\""; - ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8")); - result[2] = baos; - return result; - } catch (Throwable th) { - th.printStackTrace(); - } - return null; - } -} diff --git a/TVBox_Java/spider/N0ys.java b/TVBox_Java/spider/N0ys.java deleted file mode 100644 index 4e63721..0000000 --- a/TVBox_Java/spider/N0ys.java +++ /dev/null @@ -1,471 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.net.Uri; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 90影视 - *

- * Author: 小黄瓜 - */ -public class N0ys extends Spider { - private static final String siteUrl = "http://1090ys8.com"; - private static final String siteHost = "1090ys8.com"; - private static final String ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - - private Pattern regexCategory = Pattern.compile("/whole/(\\w+).html"); - private Pattern regexVid = Pattern.compile("/show/(\\w+).html"); - private Pattern regexPlay = Pattern.compile("/play/(\\w+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/whole/\\d+/page/(\\d+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"youbo\":{\"sh\":\"高速1\",\"sn\":\"0\",\"pu\":\"http://jx1090ys5.hongfanedu.top/x2.php?id=\",\"or\":999},\"wanpan\":{\"sh\":\"高速备用\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"niuxyun\":{\"sh\":\"高速2\",\"sn\":\"1\",\"pu\":\"http://1090ys2.com/nxjx/jx.php?id=\",\"or\":999},\"bjm3u8\":{\"sh\":\"备用2\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"dbm3u8\":{\"sh\":\"备用3\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"nfmp4\":{\"sh\":\"高速3\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"tkm3u8\":{\"sh\":\"备用1\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"wjm3u8\":{\"sh\":\"备用4\",\"sn\":\"0\",\"pu\":\"\",\"or\":999}}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", ua); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.type-slide > li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - JSONObject result = new JSONObject(); - result.put("class", classes); - try { - Elements list = doc.select("div.stui-pannel_bd ul.stui-vodlist li div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - // 获取分类数据的url - String url = siteUrl + "/whole/" + tid + "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - Elements pageInfo = doc.select(".stui-page li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1)); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1)); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("ul.stui-vodlist li div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 30); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 30); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/show/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("a.stui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("a.stui-vodlist__thumb").attr("title"); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.stui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("类型:")) { - category = text.nextSibling().outerHtml().trim(); - } else if (info.equals("年份:")) { - year = text.nextSibling().outerHtml().trim(); - } else if (info.equals("地区:")) { - area = text.nextSibling().outerHtml().trim(); - } else if (info.equals("更新:")) { - remark = text.nextSibling().outerHtml().trim(); - } else if (info.equals("导演:")) { - director = text.nextSibling().outerHtml().trim(); - } else if (info.equals("主演:")) { - actor = text.nextSibling().outerHtml().trim(); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - Elements sources = doc.select("div.playlist"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.selectFirst("h3.title").text().trim(); - String tabHref = source.attr("href"); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = source.select("ul.stui-content__playlist > li > a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = "http://1090ys8.com/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - String from = player.getString("from"); - if (from.equals("youbo")) { - // 感谢猫大神的直连解密代码 - HashMap hds = getHeaders(url); - hds.put("Host", "jx1090ys5.hongfanedu.top"); - hds.put("Referer", url); - String content1 = OkHttpUtil.string(playUrl + videoUrl, hds); - Document doc1 = Jsoup.parse(content1); - String url2 = doc1.selectFirst("iframe#WANG").attr("src"); - String url2host = Uri.parse(url2).getHost(); - hds.put("Host", url2host); - hds.put("Referer", "http://jx1090ys5.hongfanedu.top/"); - String content2 = OkHttpUtil.string(url2, hds); - String finder = "var id=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String vvid = content2.substring(start, end); - finder = "var sk=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String skey = content2.substring(start, end); - finder = "var pt=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String pt = content2.substring(start, end); - finder = "var ti=\""; - start = content2.indexOf(finder) + finder.length(); - end = content2.indexOf('\"', start); - String time = content2.substring(start, end); - int bkn = 0x195c; - for (int j = 0x0, all = skey.length(); all > j; ++j) { - bkn += ((bkn << 5) + (byte) skey.charAt(j)); - } - bkn = 0x7fffffff & bkn; - int gtk1 = 0x0; - for (int j = 0x0; j < pt.length(); j += 0x4) { - gtk1 += Integer.parseInt(String.format("%c%c%c%c", pt.charAt(j), pt.charAt(j + 0x1), pt.charAt(j + 0x2), pt.charAt(j + 0x3)), 0x10); - gtk1 %= 0x400a; - } - int offset = gtk1 % 10; - int gtk = 0x0; - for (int j = 0x0; j < pt.length(); j++) { - gtk += ((byte) pt.charAt(j)) * (j + offset); - gtk %= gtk1; - } - String finalVideoUrl = "http://" + url2host + "/hls/play/" + vvid + "%7C" + time + "%7C" + skey + "%7C" + pt + "%7C" + bkn + "%7C" + gtk + ".m3u8"; - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", ""); - result.put("url", finalVideoUrl); - result.put("header", "{\"Referer\":\" " + url2 + "\"}"); - } else { - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Nekk.java b/TVBox_Java/spider/Nekk.java deleted file mode 100644 index 1c21002..0000000 --- a/TVBox_Java/spider/Nekk.java +++ /dev/null @@ -1,489 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; -import okhttp3.Headers; -import okhttp3.Response; - - -public class Nekk extends Spider { - - private static final String siteUrl = "https://www.9ela.com"; - private static final String siteHost = "www.9ela.com"; - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/vodshow/(\\S+).html"); - protected Pattern regexVid = Pattern.compile("/voddetail/(\\d+).html"); - protected Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html"); - protected Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"9ekk\":{\"sh\":\"手机线路\",\"sn\":0,\"pu\":\"\",\"or\":999},\"ttee\":{\"sh\":\"9亿超清\",\"sn\":0,\"pu\":\"\",\"or\":999},\"9999ku\":{\"sh\":\"手机线路2\",\"sn\":0,\"pu\":\"\",\"or\":999},\"gsyun\":{\"sh\":\"九亿超清\",\"sn\":0,\"pu\":\"\",\"or\":999},\"kkyun\":{\"sh\":\"HD超清线路\",\"sn\":0,\"pu\":\"\",\"or\":999},\"ty01\":{\"sh\":\"超清线路\",\"sn\":0,\"pu\":\"\",\"or\":999},\"ppayun\":{\"sh\":\"九亿线路\",\"sn\":0,\"pu\":\"https://wy.mlkioiy.cn/api/GetDownUrlWy/d91ea50eb7eb4932b92aa8bb3c61560d/\",\"or\":999},\"8kdm\":{\"sh\":\"九亿动漫\",\"sn\":0,\"pu\":\"\",\"or\":999},\"jsyun\":{\"sh\":\"九亿备用\",\"sn\":0,\"pu\":\"\",\"or\":999},\"9evip\":{\"sh\":\"九亿解析-弃用\",\"sn\":0,\"pu\":\"\",\"or\":999},\"189pan\":{\"sh\":\"九亿超清11\",\"sn\":0,\"pu\":\"http://1987s.com/api/dp.php?url=\",\"or\":999},\"VIP\":{\"sh\":\"VIP线路\",\"sn\":0,\"pu\":\"\",\"or\":999},\"qq\":{\"sh\":\"九亿解析\",\"sn\":1,\"pu\":\"\",\"or\":999},\"mgtv\":{\"sh\":\"九亿解析\",\"sn\":1,\"pu\":\"\",\"or\":999},\"bjm3u8\":{\"sh\":\"线路三\",\"sn\":0,\"pu\":\"\",\"or\":999},\"dbm3u8\":{\"sh\":\"线路四\",\"sn\":0,\"pu\":\"\",\"or\":999},\"ckm3u8\":{\"sh\":\"线路二\",\"sn\":0,\"pu\":\"\",\"or\":999},\"mahua\":{\"sh\":\"线路四\",\"sn\":0,\"pu\":\"\",\"or\":999},\"123kum3u8\":{\"sh\":\"123kum3u8\",\"sn\":1,\"pu\":\"https://jx.123ku.com/123kudpbfq/?url=\",\"or\":999},\"pqc\":{\"sh\":\"测试\",\"sn\":1,\"pu\":\"https://jx.qiuzeqi.top/jx1/dp/index.php?url=\",\"or\":999},\"test\":{\"sh\":\"test\",\"sn\":1,\"pu\":\"https//1987s.com/api/dp.php?url=\",\"or\":999}}"); - filterConfig = new JSONObject("{\"dianying\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语配音电影\",\"v\":\"gypy\"},{\"n\":\"最近热播电影\",\"v\":\"zuijinrebodianying\"},{\"n\":\"动作片\",\"v\":\"dongzuopian\"},{\"n\":\"喜剧片\",\"v\":\"xijupian\"},{\"n\":\"爱情片\",\"v\":\"aiqingpian\"},{\"n\":\"科幻片\",\"v\":\"kehuanpian\"},{\"n\":\"恐怖片\",\"v\":\"kongbupian\"},{\"n\":\"剧情片\",\"v\":\"juqingpian\"},{\"n\":\"战争片\",\"v\":\"zhanzhengpian\"}]},{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"},{\"n\":\"热门\",\"v\":\"热门\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"lianxuju\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"最近热播电视剧\",\"v\":\"zuijinrebodianshiju\"},{\"n\":\"国语配音剧集\",\"v\":\"guoyupeiyinhanju\"},{\"n\":\"热播美剧\",\"v\":\"rebomeiju\"},{\"n\":\"电视剧\",\"v\":\"guochanju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"日韩剧\",\"v\":\"rihanju\"},{\"n\":\"欧美剧\",\"v\":\"oumeiju\"}]},{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"zongyi\":[{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"dongman\":[{\"key\":\"class\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements elements = doc.select("ul.nav-list > li a"); - JSONArray classes = new JSONArray(); - ArrayList allClass = new ArrayList<>(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = !filter || (name.equals("电影") || name.equals("连续剧") || name.equals("综艺") || name.equals("动漫")); - if (allClass.contains(name)) - show = false; - if (show) { - allClass.add(name); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - Elements list = doc.select("div.col-lg-wide-75 > ul.myui-vodlist li div.myui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = fixCover(vod.selectFirst(".myui-vodlist__thumb").attr("data-original")); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/vodshow/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - Elements pageInfo = doc.select(".myui-page li a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).trim()); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("ul.myui-vodlist li div.myui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = fixCover(vod.selectFirst(".myui-vodlist__thumb").attr("data-original")); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + "/voddetail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - String vid = doc.selectFirst("span.mac_hits").attr("data-id"); - - String cover = fixCover(doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original")); - String title = doc.selectFirst("div.myui-content__detail h1.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - Elements sources = doc.select("a[data-toggle=tab]"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - String tabHref = source.attr("href"); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = doc.select("div" + tabHref + " ul > li a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String url = siteUrl + "/vodplay/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - if (player.has("encrypt")) { - int encrypt = player.getInt("encrypt"); - if (encrypt == 1) { - videoUrl = URLDecoder.decode(videoUrl); - } else if (encrypt == 2) { - videoUrl = new String(Base64.decode(videoUrl, Base64.DEFAULT)); - videoUrl = URLDecoder.decode(videoUrl); - } - } - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - if (flag.equals("9ekk")) { - JSONObject headers = new JSONObject(); - headers.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Connection", " keep-alive"); - result.put("header", headers.toString()); - } else { - result.put("header", ""); - } - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = fixCover(vod.getString("pic")); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String fixCover(String cover) { - try { - return "proxy://do=nekk&pic=" + Base64.encodeToString(cover.getBytes("UTF-8"), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return cover; - } - - private static HashMap nekkPicHeader = null; - - public static Object[] loadPic(String pic) { - try { - pic = new String(Base64.decode(pic, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); - - if (nekkPicHeader == null) { - nekkPicHeader = new HashMap<>(); - nekkPicHeader.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - nekkPicHeader.put("referer", siteUrl + "/"); - } - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(Response response) { - - } - }; - OkHttpUtil.get(OkHttpUtil.defaultClient(), pic, null, nekkPicHeader, callBack); - if (callBack.getResult().code() == 200) { - Headers headers = callBack.getResult().headers(); - String type = headers.get("Content-Type"); - if (type == null) { - type = "application/octet-stream"; - } - Object[] result = new Object[3]; - result[0] = 200; - result[1] = type; - System.out.println(pic); - System.out.println(type); - result[2] = callBack.getResult().body().byteStream(); - return result; - } - } catch (Throwable th) { - th.printStackTrace(); - } - return null; - } -} diff --git a/TVBox_Java/spider/NewXPath.java b/TVBox_Java/spider/NewXPath.java deleted file mode 100644 index f8e4555..0000000 --- a/TVBox_Java/spider/NewXPath.java +++ /dev/null @@ -1,474 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import com.github.catvod.xpath.XPathRule; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.seimicrawler.xpath.JXDocument; -import org.seimicrawler.xpath.JXNode; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -public class NewXPath extends Spider { - - - @Override - public void init(Context context) { - super.init(context); - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - fetchRule(); - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - if (rule.getCateManual().size() > 0) { - Set keys = rule.getCateManual().keySet(); - for (String k : keys) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_name", k); - jsonObject.put("type_id", rule.getCateManual().get(k)); - classes.put(jsonObject); - } - } - try { - String webUrl = rule.getHomeUrl(); - JXDocument doc = JXDocument.create(fetch(webUrl)); - if (rule.getCateManual().size() == 0) { - List navNodes = doc.selN(rule.getCateNode()); - for (int i = 0; i < navNodes.size(); i++) { - String name = navNodes.get(i).selOne(rule.getCateName()).asString().trim(); - name = rule.getCateNameR(name); - String id = navNodes.get(i).selOne(rule.getCateId()).asString().trim(); - id = rule.getCateIdR(id); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - if (!rule.getHomeVodNode().isEmpty()) { - try { - JSONArray videos = new JSONArray(); - List vodNodes = doc.selN(rule.getHomeVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getHomeVodName()).asString().trim(); - name = rule.getHomeVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getHomeVodId()).asString().trim(); - id = rule.getHomeVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getHomeVodImg()).asString().trim(); - pic = rule.getHomeVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getHomeVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getHomeVodMark()).asString().trim(); - mark = rule.getHomeVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - result.put("class", classes); - if (filter && rule.getFilter() != null) { - result.put("filters", rule.getFilter()); - } - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", rule.getUa().isEmpty() - ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36" - : rule.getUa()); - return headers; - } - - @Override - public String homeVideoContent() { - try { - fetchRule(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - return rule.getCateUrl().replace("{cateId}", tid).replace("{catePg}", pg); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - fetchRule(); - String webUrl = categoryUrl(tid, pg, filter, extend); - JSONArray videos = new JSONArray(); - JXDocument doc = JXDocument.create(fetch(webUrl)); - List vodNodes = doc.selN(rule.getCateVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getCateVodName()).asString().trim(); - name = rule.getCateVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getCateVodId()).asString().trim(); - id = rule.getCateVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getCateVodImg()).asString().trim(); - pic = rule.getCateVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getCateVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getCateVodMark()).asString().trim(); - mark = rule.getCateVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected void detailContentExt(String content, JSONObject vod) { - - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - String[] idInfo = ids.get(0).split("\\$\\$\\$"); - System.out.println(ids.get(0)); - String webUrl = rule.getDetailUrl().replace("{vid}", idInfo[2]); - - String webContent = fetch(webUrl); - JXDocument doc = JXDocument.create(webContent); - JXNode vodNode = doc.selNOne(rule.getDetailNode()); - - String cover = idInfo[1], title = idInfo[0], desc = "", category = "", area = "", year = "", remark = "", director = "", actor = ""; - - - if (!rule.getDetailCate().isEmpty()) { - try { - category = vodNode.selOne(rule.getDetailCate()).asString().trim(); - category = rule.getDetailCateR(category); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailYear().isEmpty()) { - try { - year = vodNode.selOne(rule.getDetailYear()).asString().trim(); - year = rule.getDetailYearR(year); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailArea().isEmpty()) { - try { - area = vodNode.selOne(rule.getDetailArea()).asString().trim(); - area = rule.getDetailAreaR(area); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailMark().isEmpty()) { - try { - remark = vodNode.selOne(rule.getDetailMark()).asString().trim(); - remark = rule.getDetailMarkR(remark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailActor().isEmpty()) { - try { - actor = vodNode.selOne(rule.getDetailActor()).asString().trim(); - actor = rule.getDetailActorR(actor); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDirector().isEmpty()) { - try { - director = vodNode.selOne(rule.getDetailDirector()).asString().trim(); - director = rule.getDetailDirectorR(director); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDesc().isEmpty()) { - try { - desc = vodNode.selOne(rule.getDetailDesc()).asString().trim(); - desc = rule.getDetailDescR(desc); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - JSONObject vod = new JSONObject(); - vod.put("vod_id", idInfo[2]); - vod.put("vod_name", title); - vod.put("vod_pic", cover); - vod.put("type_name", category); - vod.put("vod_year", year); - vod.put("vod_area", area); - vod.put("vod_remarks", remark); - vod.put("vod_actor", actor); - vod.put("vod_director", director); - vod.put("vod_content", desc); - - ArrayList playFrom = new ArrayList<>(); - - List fromNodes = doc.selN(rule.getDetailFromNode()); - for (int i = 0; i < fromNodes.size(); i++) { - String name = fromNodes.get(i).selOne(rule.getDetailFromName()).asString().trim(); - name = rule.getDetailFromNameR(name); - playFrom.add(name); - } - - ArrayList playList = new ArrayList<>(); - List urlListNodes = doc.selN(rule.getDetailUrlNode()); - for (int i = 0; i < urlListNodes.size(); i++) { - List urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode()); - List vodItems = new ArrayList<>(); - for (int j = 0; j < urlNodes.size(); j++) { - String name = urlNodes.get(j).selOne(rule.getDetailUrlName()).asString().trim(); - name = rule.getDetailUrlNameR(name); - String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim(); - id = rule.getDetailUrlIdR(id); - vodItems.add(name + "$" + id); - } - // 排除播放列表为空的播放源 - if (vodItems.size() == 0 && playFrom.size() > i) { - playFrom.set(i, ""); - } - playList.add(TextUtils.join("#", vodItems)); - } - // 排除播放列表为空的播放源 - for (int i = playFrom.size() - 1; i >= 0; i--) { - if (playFrom.get(i).isEmpty()) - playFrom.remove(i); - } - for (int i = playList.size() - 1; i >= 0; i--) { - if (playList.get(i).isEmpty()) - playList.remove(i); - } - for (int i = playList.size() - 1; i >= 0; i--) { - if (i >= playFrom.size()) - playList.remove(i); - } - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - - detailContentExt(webContent, vod); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id); - SpiderDebug.log(webUrl); - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - if (!rule.getPlayUa().isEmpty()) { - result.put("ua", rule.getPlayUa()); - } - result.put("url", webUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - fetchRule(); - if (rule.getSearchUrl().isEmpty()) { - return ""; - } - String webUrl = rule.getSearchUrl().replace("{wd}", URLEncoder.encode(key)); - String webContent = fetch(webUrl); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - // add maccms suggest search api support - if (rule.getSearchVodNode().startsWith("json:")) { - String[] node = rule.getSearchVodNode().substring(5).split(">"); - JSONObject data = new JSONObject(webContent); - for (int i = 0; i < node.length; i++) { - if (i == node.length - 1) { - JSONArray vodArray = data.getJSONArray(node[i]); - for (int j = 0; j < vodArray.length(); j++) { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(rule.getSearchVodName()).trim(); - name = rule.getSearchVodNameR(name); - String id = vod.optString(rule.getSearchVodId()).trim(); - id = rule.getSearchVodIdR(id); - String pic = vod.optString(rule.getSearchVodImg()).trim(); - pic = rule.getSearchVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = vod.optString(rule.getSearchVodMark()).trim(); - mark = rule.getSearchVodMarkR(mark); - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - } else { - data = data.getJSONObject(node[i]); - } - } - } else { - JXDocument doc = JXDocument.create(webContent); - List vodNodes = doc.selN(rule.getSearchVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getSearchVodName()).asString().trim(); - name = rule.getSearchVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getSearchVodId()).asString().trim(); - id = rule.getSearchVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getSearchVodImg()).asString().trim(); - pic = rule.getSearchVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getCateVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getSearchVodMark()).asString().trim(); - mark = rule.getSearchVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public boolean manualVideoCheck() { - return false; - } - - private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv", ".mp3", ".m4a"}; - - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } - - protected String ext = null; - protected XPathRule rule = null; - - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - if (ext.startsWith("http")) { - String json = OkHttpUtil.string(ext, null); - rule = XPathRule.fromJson(json); - loadRuleExt(json); - } else { - rule = XPathRule.fromJson(ext); - loadRuleExt(ext); - } - } - } - } - - protected void loadRuleExt(String json) { - - } - - protected String fetch(String webUrl) { - SpiderDebug.log(webUrl); - return OkHttpUtil.string(webUrl, getHeaders(webUrl)); - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Nfx.java b/TVBox_Java/spider/Nfx.java deleted file mode 100644 index ed70d51..0000000 --- a/TVBox_Java/spider/Nfx.java +++ /dev/null @@ -1,449 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Demo for self study - *

- * Source from Author: CatVod - */ - -public class Nfx extends Spider { - - private static final String siteUrl = "https://nfxhd.com/"; - private static final String siteHost = "nfxhd.com"; - - protected JSONObject playerConfig; - - protected Pattern regexCategory = Pattern.compile("/vodtype/(\\w+)/"); - protected Pattern regexVid = Pattern.compile("/voddetail/(\\w+)/"); - protected Pattern regexPlay = Pattern.compile("/vodplay/(\\w+)-(\\d+)-(\\d+)/"); - protected Pattern regexPage = Pattern.compile("/vodshow/(\\S+)/"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"adaplay\":{\"sh\":\"菜逼播放器\",\"sn\":\"1\",\"pu\":\"https://nfxhd.com/dp.php/?url=\",\"or\":999},\"xigua\":{\"sh\":\"手动点播放才能播放的播放器\",\"sn\":\"1\",\"pu\":\"https://nfxhd.com/dp.php/?url=\",\"or\":999},\"danmuku\":{\"sh\":\"海王播放器\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"dplayer\":{\"sh\":\"冥王星播放器\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"bdxm3u8\":{\"sh\":\"北斗星m3u8\",\"sn\":\"1\",\"pu\":\"https://player.bdxzym3u8.com/dplayer/?url=\",\"or\":999},\"bdxyun\":{\"sh\":\"北斗星云播放\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"gangtiexia\":{\"sh\":\"土星播放器\",\"sn\":\"1\",\"pu\":\"https://wy.bigmao.top/api/ShowVideoWy/3bb24322f78b47dfb8723c13d46d45ee/\",\"or\":999},\"tt10\":{\"sh\":\"木星播放器\",\"sn\":\"1\",\"pu\":\"https://wy.bigmao.top/api/ShowVideoMu/3bb24322f78b47dfb8723c13d46d45ee/\",\"or\":999},\"docker\":{\"sh\":\"彗星播放器\",\"sn\":\"1\",\"pu\":\"https://wy.bigmao.top/api/ShowVideoDoc/3bb24322f78b47dfb8723c13d46d45ee/\",\"or\":999},\"qq\":{\"sh\":\"腾讯视频\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"youku\":{\"sh\":\"优酷\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"qiyi\":{\"sh\":\"爱奇艺\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"mgtv\":{\"sh\":\"仅限APP播放\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"m3u8\":{\"sh\":\"m3u8\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"mx771\":{\"sh\":\"站长采集的播放器\",\"sn\":\"0\",\"pu\":\"\",\"or\":999},\"ppayun2\":{\"sh\":\"白鸟座播放器\",\"sn\":\"1\",\"pu\":\"https://wy.bigmao.top/api/ShowVideoMu/3bb24322f78b47dfb8723c13d46d45ee/\",\"or\":999},\"sohu\":{\"sh\":\"搜狐\",\"sn\":\"1\",\"pu\":\"\",\"or\":999},\"iframe\":{\"sh\":\"iframe外链数据\",\"sn\":\"0\",\"pu\":\"\",\"or\":999}}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements elements = doc.select("ul.nav-menu>li>a"); - JSONArray classes = new JSONArray(); - ArrayList allClass = new ArrayList<>(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = !filter || (name.equals("电影") || name.equals("美剧") || name.equals("日韩") || name.equals("动漫")); - if (allClass.contains(name)) - show = false; - if (show) { - allClass.add(name); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("ul.myui-vodlist>li>div"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - // 获取分类数据的url - String url = siteUrl + "/vodtype/" + tid + "-" + pg + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.myui-page>li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.myui-panel_bd>ul>li>div"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("span.mac_hits").attr("data-id"); - - String cover = doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("div.myui-content__detail h1.title").text(); - String desc = doc.selectFirst("div.col-pd>span.sketch").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.myui-panel__head").get(1).select("h3"); - Elements sourceList = doc.select("ul.myui-content__list"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " https://nfxhd.com"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/vodplay/" + id + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Nfyun.java b/TVBox_Java/spider/Nfyun.java deleted file mode 100644 index 857644f..0000000 --- a/TVBox_Java/spider/Nfyun.java +++ /dev/null @@ -1,503 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Nfyun extends Spider { - private static final String siteUrl = "https://yanaifei.cn"; - private static final String siteHost = "yanaifei.cn"; - private static Pattern pic = Pattern.compile("(?<=url=).*"); - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vod/type/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/vod/detail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/vod/play/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/vod/show/(\\S+).html"); - - protected String ext = null; - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"VIP\":{\"sh\":\"VIP\",\"pu\":\"https://yanaifei.cn/player/?url=\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"动画片\",\"v\":\"32\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"20\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"3\"},{\"n\":\"大陆综艺\",\"v\":\"22\"},{\"n\":\"港台综艺\",\"v\":\"23\"},{\"n\":\"日韩综艺\",\"v\":\"24\"},{\"n\":\"欧美综艺\",\"v\":\"25\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"大陆动漫\",\"v\":\"26\"},{\"n\":\"港台动漫\",\"v\":\"27\"},{\"n\":\"日韩动漫\",\"v\":\"28\"},{\"n\":\"欧美动漫\",\"v\":\"29\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - JSONObject result = new JSONObject(); - Pattern redL = Pattern.compile("(?<=location.href =\").*?(?=\")"); - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - /* Elements X = A.select("script"); - String url = ""; - for (int i = 0; i < X.size(); i++) { - String finalUrl = X.get(i).html().trim(); - Matcher matcher3 = redL.matcher(finalUrl); - if (matcher3.find()) { - url = siteUrl + matcher3.group(0); - } else { - url = siteUrl; - } - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); */ - // 分类节点 - Elements elements = doc.select("ul.navbar-items li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.attr("title"); - boolean show = name.equals("电影") || - name.equals("连续剧") || - name.equals("综艺") || - name.equals("动漫"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - - - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.module").get(0); - Elements list = homeList.select("div.module-main div.module-items a"); - JSONArray videos = new JSONArray(); - for (int j = 0; j < list.size(); j++) { - Element vod = list.get(j); - String title = vod.attr("title"); - String cover = FixUrl(pic, vod.select("div.module-item-pic img").attr("data-original")); - String remark = vod.select("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - // } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vod/show/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id=page]"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = doc.select("span.page-current").text(); - String wy = doc.select("div[id=page] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.module-main div.module-items a"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = FixUrl(pic, vod.select("div.module-item-pic img").attr("data-original")); - String remark = vod.select("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/vod/detail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - String cover = FixUrl(pic, doc.selectFirst("div.module-info-poster div div img").attr("data-original")); - String title = doc.selectFirst("div.module-info-heading h1").text(); - - String category = "", area = "", year = "", director = "", actor = "", remark = "", desc = ""; - - category = doc.select("div.module-info-tag-link").get(2).text(); - year = doc.select("div.module-info-tag-link a").get(0).text(); - area = doc.select("div.module-info-tag-link a").get(1).text(); - desc = doc.select("div.module-info-introduction-content p").text(); - - Elements span_text_muted = doc.select("div.module-info-item span"); - for (int i = 0; i < span_text_muted.size() - 2; i++) { - Element Spantext = span_text_muted.get(i); - String info = Spantext.text(); - if (info.contains("更新:")) { - try { - remark = Spantext.parent().select("div").text(); - } catch (Exception e) { - remark = ""; - } - } else if (info.contains("导演:")) { - try { - director = Spantext.parent().select("div a").text(); - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演:")) { - try { - actor = Spantext.parent().select("div a").text(); - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-items-box div span"); - Elements sourceList = doc.select("div.module-play-list"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("div a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - String vodName = vod.select("span").text(); - vodItems.add(vodName + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", siteUrl); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/vod/play/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = pCfg.getString("pu") + player.getString("url"); - Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, getHeaders(videoUrl))); - Pattern pattern = Pattern.compile("(?<=url\"\\S\").*?(?=\")"); - Elements allScripts = docs.select("body script"); - for (int j = 0; j < allScripts.size(); j++) { - String scContents = allScripts.get(j).html().trim(); - Matcher matcher = pattern.matcher(scContents); - if (matcher.find()) { - String players = matcher.group(0); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", players); - result.put("header", headers.toString()); - } - break; - } - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String FixUrl(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(0).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } -} diff --git a/TVBox_Java/spider/Olevod.java b/TVBox_Java/spider/Olevod.java deleted file mode 100644 index 82e4bbb..0000000 --- a/TVBox_Java/spider/Olevod.java +++ /dev/null @@ -1,503 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Olevod extends Spider { - private static final String siteUrl = "https://olevod.com"; - private static final String siteHost = "olevod.com"; - - - boolean pron = false; - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html"); - private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - if (extend != null && extend.trim().equals("ojbkporn")) { - pron = true; - } - } - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"plyr\":{\"sh\":\"欧乐官方播放器\",\"sn\":0,\"pu\":\"\",\"or\":999},\"openplayer\":{\"sh\":\"欧乐影院\",\"sn\":0,\"pu\":\"\",\"or\":999},\"videojs\":{\"sh\":\"欧乐直播播放\",\"sn\":0,\"pu\":\"\",\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动作片\",\"v\":\"101\"},{\"n\":\"喜剧片\",\"v\":\"102\"},{\"n\":\"爱情片\",\"v\":\"103\"},{\"n\":\"科幻片\",\"v\":\"104\"},{\"n\":\"恐怖片\",\"v\":\"105\"},{\"n\":\"剧情片\",\"v\":\"106\"},{\"n\":\"战争片\",\"v\":\"107\"},{\"n\":\"动画片\",\"v\":\"108\"},{\"n\":\"悬疑片\",\"v\":\"109\"},{\"n\":\"惊悚片\",\"v\":\"110\"},{\"n\":\"纪录片\",\"v\":\"111\"},{\"n\":\"奇幻片\",\"v\":\"112\"},{\"n\":\"犯罪片\",\"v\":\"113\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"202\"},{\"n\":\"欧美剧\",\"v\":\"201\"},{\"n\":\"港台剧\",\"v\":\"203\"},{\"n\":\"日韩剧\",\"v\":\"204\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"3\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"真人秀\",\"v\":\"305\"},{\"n\":\"音乐\",\"v\":\"302\"},{\"n\":\"搞笑\",\"v\":\"304\"},{\"n\":\"家庭\",\"v\":\"301\"},{\"n\":\"曲艺\",\"v\":\"303\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"4\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"日本\",\"v\":\"401\"},{\"n\":\"国产\",\"v\":\"402\"},{\"n\":\"欧美\",\"v\":\"403\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"西语\",\"v\":\"西语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印地语\",\"v\":\"印地语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}],\"5\":[{\"key\":\"tid\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"AV女优\",\"v\":\"505\"},{\"n\":\"日韩\",\"v\":\"502\"},{\"n\":\"欧美\",\"v\":\"501\"},{\"n\":\"动漫\",\"v\":\"503\"},{\"n\":\"国产\",\"v\":\"504\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"letter\",\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"}]},{\"key\":\"ifvip\",\"name\":\"权限\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"免费\",\"v\":\"2\"},{\"n\":\"会员\",\"v\":\"3\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.top_nav li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("连续剧") || - name.equals("动漫") || - name.equals("综艺") || - name.equals("午夜影院"); - - if (name.equals("午夜影院") && !pron) { - continue; - } - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.cbox1").get(0); - Elements list = homeList.select("ul.vodlist li.vodlist_item"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("a.vodlist_thumb").attr("title"); - String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original"); - String remark = ""; - try { - remark = vod.select("span.pic_text em").text(); - } catch (Exception e) { - remark = vod.select("span.text_dy").get(0).text(); - } - Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/index.php/vod/show/id/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.page"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("li a"); - if (a == null) - continue; - String span = pageInfo.select("li.active a").text(); - String wy = doc.select("ul.page li a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("ul.vodlist li.vodlist_item"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("a.vodlist_thumb").attr("title"); - String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original"); - String remark = ""; - try { - remark = vod.select("span.pic_text em").text(); - } catch (Exception e) { - remark = vod.select("span.text_dy").get(0).text(); - } - Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 20); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 20); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("a.digg_link").attr("data-id"); - - String cover = siteUrl + doc.selectFirst("div.content_thumb a").attr("data-original"); - String title = doc.selectFirst("div.content_thumb a").attr("title"); - String desc = doc.selectFirst("div.context span").text(); - String category = "", area = "", year = "", director = "", actor = "", remark = ""; - remark = doc.select("span.data_style").text(); - Elements span_text_muted = doc.select("li.data span"); - for (int i = 0; i < span_text_muted.size() - 2; i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.contains("类型")) { - try { - category = text.parent().select("a").get(2).text(); - } catch (Exception e) { - category = ""; - } - } else if (info.contains("年份")) { - try { - year = text.parent().select("a").get(0).text(); - } catch (Exception e) { - year = ""; - } - } else if (info.contains("地区")) { - try { - area = text.parent().select("a").get(1).text(); - } catch (Exception e) { - area = ""; - } - } - } - List actors = new ArrayList<>(); - Elements aa = doc.select("li.data").get(3).select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - List directors = new ArrayList<>(); - Elements bb = doc.select("li.data").get(2).select("a"); - for (int j = 0; j < bb.size(); j++) { - directors.add(bb.get(j).text()); - } - director = TextUtils.join(",", directors); - - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.play_source_tab a"); - Elements sourceList = doc.select("div.playlist_full"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.attr("alt"); - sourceName = sourceName.replaceAll("[^\u4E00-\u9FA5]", ""); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul>li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/index.php/vod/play/id/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - if (title.contains(key)) { - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - -} diff --git a/TVBox_Java/spider/Proxy.java b/TVBox_Java/spider/Proxy.java deleted file mode 100644 index bf67c71..0000000 --- a/TVBox_Java/spider/Proxy.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.github.catvod.spider; - -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.live.TxtSubscribe; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.io.ByteArrayInputStream; -import java.util.Map; - -public class Proxy extends Spider { - - public static int localPort = -1; - - static void adjustLocalPort() { - if (localPort > 0) - return; - int port = 9978; - while (port < 10000) { - String resp = OkHttpUtil.string("http://127.0.0.1:" + port + "/proxy?do=ck", null); - if (resp.equals("ok")) { - SpiderDebug.log("Found local server port " + port); - localPort = port; - break; - } - port++; - } - } - - public static String localProxyUrl() { - adjustLocalPort(); - return "http://127.0.0.1:" + Proxy.localPort + "/proxy"; - } - - public static Object[] proxy(Map params) { - try { - String what = params.get("do"); - if (what.equals("live")) { - String type = params.get("type"); - if (type.equals("txt")) { - String ext = params.get("ext"); - if (!ext.startsWith("http")) { - ext = new String(Base64.decode(ext, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); - } - return TxtSubscribe.load(ext); - } - } else if (what.equals("ck")) { - Object[] result = new Object[3]; - result[0] = 200; - result[1] = "text/plain; charset=utf-8"; - ByteArrayInputStream baos = new ByteArrayInputStream("ok".getBytes("UTF-8")); - result[2] = baos; - return result; - } else if (what.equals("ali")) { - return PushAgent.vod(params); - } else if (what.equals("czspp")) { - return Czsapp.loadsub(params.get("url")); - } else if (what.equals("kmys")) { - return Kmys.vod(params); - } - - } catch (Throwable th) { - - } - return null; - } - -} diff --git a/TVBox_Java/spider/PushAgent.java b/TVBox_Java/spider/PushAgent.java deleted file mode 100644 index 5c66218..0000000 --- a/TVBox_Java/spider/PushAgent.java +++ /dev/null @@ -1,656 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.net.UrlQuerySanitizer; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.locks.ReentrantLock; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Response; -import okhttp3.ResponseBody; - -public class PushAgent extends Spider { - - private static String j = ""; - private static long StopRefresh; - private static final Map l = new HashMap(); - private static final Map q = new HashMap(); - private static final Map> dizz = new HashMap(); - private static final ReentrantLock ReentrantLock = new ReentrantLock(); - private static final long n = 0; - private static final String SiteUrl = "https://api.aliyundrive.com"; - private static final Pattern AliPLink = Pattern.compile("(https://www.aliyundrive.com/s/[^\"]+)"); - public static Pattern Folder = Pattern.compile("www.aliyundrive.com/s/([^/]+)(/folder/([^/]+))?"); - public static String Token; - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - if (extend.startsWith("http")) { - Token = OkHttpUtil.string(extend, null); - } else { - Token = extend; - } - } - - protected static long Time() { - return (System.currentTimeMillis() / 1000) + n; - } - - public static Object[] ProxyMedia(Map map) { - try { - String ShareId = map.get("share_id"); - String FileId = map.get("file_id"); - String MediaId = map.get("media_id"); - String Token = getShareTk(ShareId, ""); - ReentrantLock.lock(); - String str4 = dizz.get(FileId).get(MediaId); - UrlQuerySanitizer urlQuerySanitizer = new UrlQuerySanitizer(str4); - Long l2 = new Long(urlQuerySanitizer.getValue("x-oss-expires")); - long longValue = l2.longValue(); - if (longValue - Time() <= 60) { - VideoDetail(ShareId, Token, FileId); - Map> map3 = dizz; - str4 = map3.get(FileId).get(MediaId); - } - ReentrantLock.unlock(); - new HashMap(); - OKCallBack.OKCallBackDefault abVar = new OKCallBack.OKCallBackDefault() { - public void onResponse(Response response) { - } - - @Override - protected void onFailure(Call call, Exception exc) { - } - }; - OkHttpClient YM = OkHttpUtil.defaultClient(); - HashMap t = Headers(); - OkHttpUtil.get(YM, str4, null, t, abVar); - ResponseBody body = abVar.getResult().body(); - return new Object[]{200, "video/MP2T", body.byteStream()}; - } catch (Exception e) { - SpiderDebug.log(e); - return null; - } - } - - public static Object[] vod(Map map) { - String str = map.get("type"); - if (str.equals("m3u8")) { - return getFile(map); - } - if (str.equals("media")) { - return ProxyMedia(map); - } - return null; - } - - - public static Object[] getFile(Map map) { - try { - String ShareId = map.get("share_id"); - String ShareTK = getShareTk(ShareId, ""); - return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(VideoDetail(ShareId, ShareTK, map.get("file_id")).getBytes())}; - } catch (Exception e) { - SpiderDebug.log(e); - return null; - } - } - - private static String Post(String str, String str2, Map map) { - OKCallBack.OKCallBackString acVar = new OKCallBack.OKCallBackString() { - - public void onResponse(String r) { - } - - @Override - protected void onFailure(Call call, Exception exc) { - } - }; - OkHttpClient YM = OkHttpUtil.defaultClient(); - OkHttpUtil.postJson(YM, str, str2, map, acVar); - return acVar.getResult(); - } - - private static synchronized String getShareTk(String str, String str2) { - - try { - long b = Time(); - Map map = l; - String str3 = map.get(str); - Long l2 = q.get(str); - if (!TextUtils.isEmpty(str3)) { - if (l2 - b > 600) { - return str3; - } - } - JSONObject jSONObject = new JSONObject(); - jSONObject.put("share_id", str); - jSONObject.put("share_pwd", str2); - String jSONObject2 = jSONObject.toString(); - JSONObject jSONObject3 = new JSONObject(Post("https://api.aliyundrive.com/v2/share_link/get_share_token", jSONObject2, Headers())); - String string = jSONObject3.getString("share_token"); - Long valueOf = Long.valueOf(b + jSONObject3.getLong("expires_in")); - Map map2 = q; - map2.put(str, valueOf); - Map map3 = l; - map3.put(str, string); - return string; - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - - } - - - private static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - headers.put("Referer", "https://www.aliyundrive.com/"); - return headers; - } - - private static HashMap sHeaders() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - return headers; - } - - - private static void refreshTk() { - long b = Time(); - String str = j; - if (str.isEmpty() || StopRefresh - b <= 600) { - try { - JSONObject jSONObject = new JSONObject(); - jSONObject.put("refresh_token", Token); - String jSONObject2 = jSONObject.toString(); - HashMap t = Headers(); - JSONObject jSONObject3 = new JSONObject(Post("https://api.aliyundrive.com/token/refresh", jSONObject2, t)); - StringBuilder sb = new StringBuilder(); - String string = jSONObject3.getString("token_type"); - sb.append(string); - sb.append(" "); - String string2 = jSONObject3.getString("access_token"); - sb.append(string2); - j = sb.toString(); - long j2 = jSONObject3.getLong("expires_in"); - StopRefresh = b + j2; - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } - - - private static String VideoDetail(String shareid, String token, String fileid) { - int i; - try { - String url = SiteUrl + "/v2/file/get_share_link_video_preview_play_info"; - JSONObject Data = new JSONObject(); - Data.put("share_id", shareid); - Data.put("category", "live_transcoding"); - Data.put("file_id", fileid); - Data.put("template_id", ""); - HashMap headers = Headers(); - headers.put("x-share-token", token); - String str5 = j; - headers.put("authorization", str5); - String jSONObject2 = Data.toString(); - JSONObject jSONObject3 = new JSONObject(Post(url, jSONObject2, headers)); - ArrayList arrayList = new ArrayList(); - arrayList.add("FHD"); - arrayList.add("HD"); - arrayList.add("SD"); - JSONObject jSONObject4 = jSONObject3.getJSONObject("video_preview_play_info"); - JSONArray jSONArray = jSONObject4.getJSONArray("live_transcoding_task_list"); - Iterator it = arrayList.iterator(); - String objectUrl = ""; - while (true) { - boolean hasNext = it.hasNext(); - i = 0; - if (!hasNext) { - break; - } - String str7 = (String) it.next(); - if (!objectUrl.isEmpty()) { - break; - } - while (true) { - if (i < jSONArray.length()) { - JSONObject jSONObject5 = jSONArray.getJSONObject(i); - String string = jSONObject5.getString("template_id"); - if (string.equals(str7)) { - objectUrl = jSONObject5.getString("url"); - break; - } - i++; - } - } - } - if (TextUtils.isEmpty(objectUrl)) { - JSONObject jSONObject6 = jSONArray.getJSONObject(0); - objectUrl = jSONObject6.getString("url"); - } - HashMap hashMap = new HashMap(); - HashMap header = Headers(); - OkHttpUtil.stringNoRedirect(objectUrl, header, hashMap); - String d = OkHttpUtil.getRedirectLocation(hashMap); - String i2 = OkHttpUtil.string(d, Headers()); - String substring = d.substring(0, d.lastIndexOf("/")) + "/"; - ArrayList arrayList2 = new ArrayList(); - HashMap hashMap2 = new HashMap(); - String[] split = i2.split("\n"); - int length = split.length; - int i3 = 0; - while (i < length) { - String str8 = split[i]; - if (str8.contains("x-oss-expires")) { - i3++; - String sb6 = substring + str8; - String sb8 = "" + i3; - hashMap2.put(sb8, sb6); - str8 = Proxy.localProxyUrl() + "?do=push&type=media&share_id=" + shareid + "&file_id=" + fileid + "&media_id=" + i3; - } - arrayList2.add(str8); - i++; - } - dizz.put(fileid, hashMap2); - return TextUtils.join("\n", arrayList2); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public void listFiles(Map map, String str, String str2, String str3) { - String str4; - try { - String str5 = "https://api.aliyundrive.com/adrive/v3/file/list"; - HashMap Y2 = Headers(); - Y2.put("x-share-token", str2); - JSONObject jSONObject = new JSONObject(); - jSONObject.put("image_thumbnail_process", "image/resize,w_160/format,jpeg"); - jSONObject.put("image_url_process", "image/resize,w_1920/format,jpeg"); - jSONObject.put("limit", 200); - jSONObject.put("order_by", "updated_at"); - jSONObject.put("order_direction", "DESC"); - jSONObject.put("parent_file_id", str3); - jSONObject.put("share_id", str); - jSONObject.put("video_thumbnail_process", "video/snapshot,t_1000,f_jpg,ar_auto,w_300"); - String str6 = ""; - ArrayList arrayList = new ArrayList(); - for (int i = 1; i <= 50 && (i < 2 || !TextUtils.isEmpty(str6)); i++) { - jSONObject.put("marker", str6); - JSONObject jSONObject2 = new JSONObject(Post(str5, jSONObject.toString(), Y2)); - JSONArray jSONArray = jSONObject2.getJSONArray("items"); - int i2 = 0; - while (i2 < jSONArray.length()) { - JSONObject jSONObject3 = jSONArray.getJSONObject(i2); - if (jSONObject3.getString("type").equals("folder")) { - arrayList.add(jSONObject3.getString("file_id")); - str4 = str5; - } else { - str4 = str5; - if (jSONObject3.getString("mime_type").contains("video")) { - String replace = jSONObject3.getString("name").replace("#", "_").replace("$", "_"); - if (replace.length() > 20) { - replace = replace.substring(0, 10) + "..." + replace.substring(replace.length() - 10); - } - String fileIds = jSONObject3.getString("file_id"); - map.put(replace, str + "+" + str2 + "+" + fileIds); - } - } - i2++; - str5 = str4; - } - str6 = jSONObject2.getString("next_marker"); - } - for (String str7 : arrayList) { - try { - listFiles(map, str, str2, str7); - } catch (Exception e) { - SpiderDebug.log(e); - return; - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - public String getAliContent(List list) { - String str; - try { - String url = list.get(0).trim(); - Pattern pattern = Folder; - Matcher matcher = pattern.matcher(url); - if (!matcher.find()) { - return ""; - } - String group = matcher.group(1); - if (matcher.groupCount() == 3) { - str = matcher.group(3); - } else { - str = ""; - } - String AnonymousUrl = SiteUrl + "/adrive/v3/share_link/get_share_by_anonymous"; - JSONObject Data = new JSONObject(); - Data.put("share_id", group); - HashMap headers = Headers(); - JSONObject jSONObject3 = new JSONObject(Post(AnonymousUrl, Data.toString(), headers)); - JSONArray jSONArray = jSONObject3.getJSONArray("file_infos"); - if (jSONArray.length() == 0) { - return ""; - } - JSONObject jSONObject4 = null; - boolean isEmpty = TextUtils.isEmpty(str); - if (!isEmpty) { - int i = 0; - while (true) { - if (i >= jSONArray.length()) { - break; - } - JSONObject jSONObject5 = jSONArray.getJSONObject(i); - String string = jSONObject5.getString("file_id"); - String string2 = jSONObject5.getString("file_id"); - if (string.equals(string2)) { - jSONObject4 = jSONObject5; - break; - } - i++; - } - if (jSONObject4 == null) { - return ""; - } - } else { - jSONObject4 = jSONArray.getJSONObject(0); - str = jSONObject4.getString("file_id"); - } - JSONObject jSONObject6 = new JSONObject(); - jSONObject6.put("vod_id", url); - String string3 = jSONObject3.getString("share_name"); - jSONObject6.put("vod_name", string3); - jSONObject6.put("vod_pic", jSONObject3.getString("avatar")); - jSONObject6.put("vod_content", url); - jSONObject6.put("vod_play_from", "AliYun"); - ArrayList arrayList = new ArrayList(); - String string4 = jSONObject4.getString("type"); - if (!string4.equals("folder")) { - String string5 = jSONObject4.getString("type"); - if (string5.equals("file")) { - String string6 = jSONObject4.getString("category"); - if (string6.equals("video")) { - str = "root"; - } - } - return ""; - } - - String s = getShareTk(group, ""); - Map hashMap = new HashMap<>(); - listFiles(hashMap, group, s, str); - ArrayList arrayList2 = new ArrayList(hashMap.keySet()); - Collections.sort(arrayList2); - Iterator it = arrayList2.iterator(); - while (true) { - if (!it.hasNext()) { - break; - } - String str3 = (String) it.next(); - String sb4 = str3 + "$" + hashMap.get(str3); - arrayList.add(sb4); - } - ArrayList arrayList3 = new ArrayList(); - for (int i2 = 0; i2 < 4; i2++) { - String join = TextUtils.join("#", arrayList); - arrayList3.add(join); - } - String join2 = TextUtils.join("$$$", arrayList3); - jSONObject6.put("vod_play_url", join2); - JSONObject result = new JSONObject(); - JSONArray jSONArray2 = new JSONArray(); - jSONArray2.put(jSONObject6); - result.put("list", jSONArray2); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - @Override - public String detailContent(List list) { - try { - String url = list.get(0); - Pattern pattern = Folder; - Pattern pattern2 = AliPLink; - Matcher matcher2 = pattern2.matcher(url); - Matcher matcher = pattern.matcher(url); - if (Misc.isVip(url) && !url.contains("qq.com") && !url.contains("mgtv.com")) { - Document doc = Jsoup.parse(OkHttpUtil.string(url, null)); - String VodName = doc.select("head > title").text(); - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - vodAtom.put("vod_id", url); - vodAtom.put("vod_name", VodName); - vodAtom.put("vod_pic", "https://img.zcool.cn/community/0123545c74c5aea801213f261297df.png"); - vodAtom.put("type_name", "官源"); - vodAtom.put("vod_year", ""); - vodAtom.put("vod_area", ""); - vodAtom.put("vod_remarks", ""); - vodAtom.put("vod_actor", ""); - vodAtom.put("vod_director", ""); - vodAtom.put("vod_content", ""); - vodAtom.put("vod_play_from", "jx"); - vodAtom.put("vod_play_url", "立即播放$" + url); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } else if (Misc.isVip(url) && url.contains("qq.com")) { - List vodItems = new ArrayList<>(); - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - Document doc = Jsoup.parse(OkHttpUtil.string(url, sHeaders())); - String VodName = doc.select("head > title").text(); - Elements playListA = doc.select("div.episode-list-rect__item"); - if (!playListA.isEmpty()) { - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - String a = vod.select("div").attr("data-vid"); - String b = vod.select("div").attr("data-cid"); - String id = "https://v.qq.com/x/cover/" + b + "/" + a; - String name = vod.select("div span").text(); - vodItems.add(name + "$" + id); - } - String playList = TextUtils.join("#", vodItems); - vodAtom.put("vod_play_url", playList); - } else { - vodAtom.put("vod_play_url", "立即播放$" + url); - } - vodAtom.put("vod_id", url); - vodAtom.put("vod_name", VodName); - vodAtom.put("vod_pic", "https://img2.baidu.com/it/u=2655029475,2190949369&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=593"); - vodAtom.put("type_name", "腾讯TV"); - vodAtom.put("vod_year", ""); - vodAtom.put("vod_area", ""); - vodAtom.put("vod_remarks", ""); - vodAtom.put("vod_actor", ""); - vodAtom.put("vod_director", ""); - vodAtom.put("vod_content", url); - vodAtom.put("vod_play_from", "jx"); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } else if (Misc.isVip(url) && url.contains("mgtv.com")) { - List vodItems = new ArrayList<>(); - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - Pattern mgtv = Pattern.compile("https://\\S+mgtv.com/b/(\\d+)/(\\d+).html.*"); - Matcher mgtv1 = mgtv.matcher(url); - String VodNames = ""; - if (mgtv1.find()) { - String Ep = "https://pcweb.api.mgtv.com/episode/list?video_id=" + mgtv1.group(2); - JSONObject Data = new JSONObject(OkHttpUtil.string(Ep, Headers())); - VodNames = Data.getJSONObject("data").getJSONObject("info").getString("title"); - JSONArray a = new JSONArray(Data.getJSONObject("data").getString("list")); - if (a.length() > 0) { - for (int i = 0; i < a.length(); i++) { - JSONObject jObj = a.getJSONObject(i); - if (jObj.getString("isIntact").equals("1")) { - String VodName = jObj.getString("t4"); - String id = jObj.getString("video_id"); - String VodId = "https://www.mgtv.com/b/" + mgtv1.group(1) + "/" + id + ".html"; - vodItems.add(VodName + "$" + VodId); - } - } - String playList = TextUtils.join("#", vodItems); - vodAtom.put("vod_play_url", playList); - } else { - vodAtom.put("vod_play_url", "立即播放$" + url); - } - } - vodAtom.put("vod_id", url); - vodAtom.put("vod_name", VodNames); - vodAtom.put("vod_pic", "https://img2.baidu.com/it/u=2562822927,704100654&fm=253&fmt=auto&app=138&f=JPEG?w=600&h=380"); - vodAtom.put("type_name", "芒果TV"); - vodAtom.put("vod_year", ""); - vodAtom.put("vod_area", ""); - vodAtom.put("vod_remarks", ""); - vodAtom.put("vod_actor", ""); - vodAtom.put("vod_director", ""); - vodAtom.put("vod_content", url); - vodAtom.put("vod_play_from", "jx"); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } else if (Misc.isVideoFormat(url)) { - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - vodAtom.put("vod_id", url); - vodAtom.put("vod_name", url); - vodAtom.put("vod_pic", "https://img.zcool.cn/community/0123545c74c5aea801213f261297df.png"); - vodAtom.put("type_name", "直连"); - vodAtom.put("vod_play_from", "player"); - vodAtom.put("vod_play_url", "立即播放$" + url); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } else if (url.startsWith("magnet")) { - String VodName = url; - if (url.length() > 100) { - VodName = url.substring(0, 30) + "..." + url.substring(url.length() - 10); - } - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - vodAtom.put("vod_id", url); - vodAtom.put("vod_name", VodName); - vodAtom.put("vod_pic", "https://img2.baidu.com/it/u=1609185522,4130752057&fm=253&f=JPEG"); - vodAtom.put("type_name", "磁力"); - vodAtom.put("vod_play_from", "磁力测试"); - vodAtom.put("vod_play_url", "立即播放$" + url); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } else if (url.startsWith("http") && (matcher2.find())) { - return getAliContent(list); - } else if (url.startsWith("http") && (!matcher.find()) && (!matcher2.find())) { - Document doc = Jsoup.parse(OkHttpUtil.string(url, null)); - String VodName = doc.select("head > title").text(); - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - JSONObject vodAtom = new JSONObject(); - vodAtom.put("vod_id", url); - vodAtom.put("vod_name", VodName); - vodAtom.put("vod_pic", "https://pic.rmb.bdstatic.com/bjh/1d0b02d0f57f0a42201f92caba5107ed.jpeg"); - vodAtom.put("type_name", "嗅探"); - vodAtom.put("vod_content", url); - vodAtom.put("vod_play_from", "嗅探"); - vodAtom.put("vod_play_url", "立即播放嗅探$" + url); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } - } catch (Throwable throwable) { - - } - return ""; - } - - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - switch (flag) { - case "jx": { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", id); - return result.toString(); - } - case "player": { - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } - case "嗅探": { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } - case "AliYun": - refreshTk(); - String[] split = id.split("\\+"); - String str3 = split[0]; - String str5 = split[2]; - String url = Proxy.localProxyUrl() + "?do=push&type=m3u8&share_id=" + str3 + "&file_id=" + str5; - JSONObject jSONObject = new JSONObject(); - jSONObject.put("parse", "0"); - jSONObject.put("playUrl", ""); - jSONObject.put("url", url); - jSONObject.put("header", ""); - return jSONObject.toString(); - } - } catch (Exception e) { - e.printStackTrace(); - SpiderDebug.log(e); - } - return ""; - } - -} diff --git a/TVBox_Java/spider/QQ.java b/TVBox_Java/spider/QQ.java deleted file mode 100644 index 1c38906..0000000 --- a/TVBox_Java/spider/QQ.java +++ /dev/null @@ -1,331 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.net.Uri; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import rxhttp.wrapper.annotations.NonNull; - -public class QQ extends Spider { - protected JSONObject dn; - protected JSONObject q = new JSONObject(); - - private String q(String str, String str2) { - String str3; - try { - if (str2.startsWith("//")) { - Uri parse = Uri.parse(str); - str3 = parse.getScheme() + ":" + str2; - } else if (str2.contains("://")) { - return str2; - } else { - Uri parse2 = Uri.parse(str); - str3 = parse2.getScheme() + "://" + parse2.getHost() + str2; - } - return str3; - } catch (Exception e) { - SpiderDebug.log(e); - return str2; - } - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - String str3; - try { - String str4 = "https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=" + str + "&listpage=1&offset=" + ((Integer.parseInt(str2) - 1) * 21) + "&pagesize=21&sort=18"; - if (hashMap != null) { - for (String str5 : hashMap.keySet()) { - String trim = hashMap.get(str5).trim(); - if (trim.length() != 0) { - str4 = str4 + "&" + str5 + "=" + URLEncoder.encode(trim); - } - } - } - String content = OkHttpUtil.string(str4, getHeaders(str4)); - JSONObject jSONObject = new JSONObject(); - try { - Elements listItems = Jsoup.parse(content).select(".list_item"); - JSONArray jSONArray = new JSONArray(); - for (int i = 0; i < listItems.size(); i++) { - Element item = listItems.get(i); - String Pd = item.select("a").attr("title"); - String q = q(str4, item.select("img").attr("src")); - if (item.select(".figure_caption") == null) { - str3 = ""; - } else { - str3 = item.select(".figure_caption").text(); - } - String Pd2 = item.select("a").attr("data-float"); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", Pd2); - jSONObject2.put("vod_name", Pd); - jSONObject2.put("vod_pic", q); - jSONObject2.put("vod_remarks", str3); - jSONArray.put(jSONObject2); - } - jSONObject.put("page", str2); - jSONObject.put("pagecount", Integer.MAX_VALUE); - jSONObject.put("limit", 90); - jSONObject.put("total", Integer.MAX_VALUE); - jSONObject.put("list", jSONArray); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(4); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String detailContent(List list) { - JSONArray jSONArray; - CharSequence charSequence; - JSONArray jSONArray2; - CharSequence charSequence2; - CharSequence charSequence3 = ","; - try { - String str = "https://node.video.qq.com/x/api/float_vinfo2?cid=" + list.get(0); - JSONObject jSONObject = new JSONObject(OkHttpUtil.string(str, getHeaders(str))); - JSONObject optJSONObject = jSONObject.optJSONObject("c"); - if (optJSONObject == null) { - return ""; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", list.get(0)); - jSONObject2.put("vod_name", optJSONObject.optString("title")); - jSONObject2.put("vod_pic", q(str, optJSONObject.optString("pic"))); - jSONObject2.put("type_name", jSONObject.optJSONArray("typ").opt(0)); - jSONObject2.put("vod_year", optJSONObject.optString("year")); - jSONObject.optJSONObject("people"); - JSONArray optJSONArray = jSONObject.optJSONArray("nam").optJSONArray(0); - ArrayList arrayList = new ArrayList(); - if (optJSONArray != null) { - for (int i = 0; i < optJSONArray.length(); i++) { - arrayList.add(optJSONArray.opt(i)); - } - } - jSONObject2.put("vod_actor", join(charSequence3, arrayList)); - jSONObject2.put("vod_content", optJSONObject.optString("description")); - JSONArray jSONArray3 = optJSONObject.getJSONArray("video_ids"); - ArrayList arrayList2 = new ArrayList(); - ArrayList arrayList3 = new ArrayList(); - int i2 = 1; - while (i2 <= jSONArray3.length()) { - arrayList2.add(jSONArray3.optString(i2 - 1)); - if (!(i2 % 30 == 0 || i2 == jSONArray3.length())) { - charSequence = charSequence3; - jSONArray = jSONArray3; - i2++; - charSequence3 = charSequence; - jSONArray3 = jSONArray; - } - String str2 = "https://union.video.qq.com/fcgi-bin/data?otype=json&tid=682&appid=20001238&appkey=6c03bbe9658448a4&union_platform=1&idlist=" + join(charSequence3, arrayList2); - String h = OkHttpUtil.string(str2, getHeaders(str2)); - JSONArray jSONArray4 = new JSONObject(h.substring(13, h.length() - 1)).getJSONArray("results"); - int i3 = 0; - while (i3 < jSONArray4.length()) { - JSONObject jSONObject3 = jSONArray4.getJSONObject(i3).getJSONObject("fields"); - if (!jSONObject3.optString("title").contains("预告")) { - StringBuilder sb = new StringBuilder(); - String optString = jSONObject3.optString("title"); - charSequence2 = charSequence3; - StringBuilder sb2 = new StringBuilder(); - jSONArray2 = jSONArray3; - sb2.append(optJSONObject.optString("title")); - sb2.append("_"); - sb.append(optString.replace(sb2.toString(), "")); - sb.append("$https://v.qq.com/x/cover/"); - sb.append(list.get(0)); - sb.append("/"); - sb.append(jSONObject3.optString("vid")); - sb.append(".html"); - arrayList3.add(sb.toString()); - } else { - charSequence2 = charSequence3; - jSONArray2 = jSONArray3; - } - i3++; - charSequence3 = charSequence2; - jSONArray3 = jSONArray2; - } - charSequence = charSequence3; - jSONArray = jSONArray3; - arrayList2.clear(); - i2++; - charSequence3 = charSequence; - jSONArray3 = jSONArray; - } - jSONObject2.put("vod_play_from", "qq"); - jSONObject2.put("vod_play_url", join("#", arrayList3)); - JSONObject jSONObject4 = new JSONObject(); - JSONArray jSONArray5 = new JSONArray(); - jSONArray5.put(jSONObject2); - jSONObject4.put("list", jSONArray5); - return jSONObject4.toString(4); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - protected HashMap getHeaders(String str) { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - return hashMap; - } - - public String homeContent(boolean z) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string("https://v.qq.com/channel/tv?listpage=1&channel=tv&sort=18&_all=1", getHeaders("https://v.qq.com/channel/tv?listpage=1&channel=tv&sort=18&_all=1"))); - JSONArray jSONArray = new JSONArray(); - Iterator it = doc.select(".nav_cell").iterator(); - while (it.hasNext()) { - Element next = it.next(); - JSONObject jSONObject = new JSONObject(); - String Pd = next.select("a").attr("href"); - if (!Pd.contains("/art") && !Pd.contains("feeds_hotspot") && !Pd.contains("wwe") && !Pd.contains("choice") && !Pd.contains("sports_new") && !Pd.contains("games") && !Pd.contains("lols11") && !Pd.contains("ent") && !Pd.contains("news") && !Pd.contains("fashion") && !Pd.contains("tech") && !Pd.contains("auto") && !Pd.contains("house") && !Pd.contains("finance") && !Pd.contains("astro") && !Pd.contains("nba") && !Pd.contains("fun") && !Pd.contains("baby") && !Pd.contains("music") && !Pd.contains("life") && !Pd.contains("travel") && Pd.contains("/channel/")) { - jSONObject.put("type_name", next.select("a").text()); - jSONObject.put("type_id", Pd.split("/channel/")[1]); - jSONArray.put(jSONObject); - } - } - String h = OkHttpUtil.string("https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=choice", getHeaders("https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=choice")); - JSONObject jSONObject2 = new JSONObject(); - if (z) { - jSONObject2.put("filters", this.dn); - } - jSONObject2.put("class", jSONArray); - try { - Elements listItem = Jsoup.parse(h).select(".list_item"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < listItem.size(); i++) { - Element item = listItem.get(i); - String title = item.select("a").attr("title"); - String pic = q("https://v.qq.com/x/bu/pagesheet/list?_all=1&append=1&channel=choice", item.select("img").attr("src")); - String remark = item.select(".figure_caption").text(); - String id = item.select("a").attr("data-float"); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", id); - jSONObject3.put("vod_name", title); - jSONObject3.put("vod_pic", pic); - jSONObject3.put("vod_remarks", remark); - jSONArray2.put(jSONObject3); - } - jSONObject2.put("list", jSONArray2); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject2.toString(4); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String homeVideoContent() { - try { - JSONArray jSONArray = new JSONObject(OkHttpUtil.string("https://v.qq.com/api.php/app/index_video?token=", getHeaders("https://v.qq.com/api.php/app/index_video?token="))).getJSONArray("list"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONArray jSONArray3 = jSONArray.getJSONObject(i).getJSONArray("vlist"); - int i2 = 0; - while (i2 < jSONArray3.length() && i2 < 6) { - JSONObject jSONObject = jSONArray3.getJSONObject(i2); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", jSONObject.optString("vod_id")); - jSONObject2.put("vod_name", jSONObject.optString("vod_name")); - jSONObject2.put("vod_pic", jSONObject.optString("vod_pic")); - jSONObject2.put("vod_remarks", jSONObject.optString("vod_remarks")); - jSONArray2.put(jSONObject2); - i2++; - } - } - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public void init(Context context) { - QQ.super.init(context); - try { - this.dn = new JSONObject("{\"tv\":[{\"name\":\"排序\",\"value\":[{\"v\":\"19\",\"n\":\"最新\"},{\"v\":\"18\",\"n\":\"最热\"},{\"v\":\"16\",\"n\":\"好评\"},{\"v\":\"21\",\"n\":\"口碑好剧\"},{\"v\":\"54\",\"n\":\"高分好评\"},{\"v\":\"22\",\"n\":\"知乎高分\"}],\"key\":\"sort\"},{\"name\":\"类型\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"偶像爱情\"},{\"v\":\"2\",\"n\":\"古装历史\"},{\"v\":\"3\",\"n\":\"玄幻史诗\"},{\"v\":\"4\",\"n\":\"都市生活\"},{\"v\":\"14\",\"n\":\"当代主旋律\"},{\"v\":\"5\",\"n\":\"罪案谍战\"},{\"v\":\"6\",\"n\":\"历险科幻\"},{\"v\":\"7\",\"n\":\"军旅抗战\"},{\"v\":\"8\",\"n\":\"喜剧\"},{\"v\":\"9\",\"n\":\"武侠江湖\"},{\"v\":\"10\",\"n\":\"青春校园\"},{\"v\":\"11\",\"n\":\"时代传奇\"},{\"v\":\"12\",\"n\":\"体育电竞\"},{\"v\":\"13\",\"n\":\"真人动漫\"},{\"v\":\"15\",\"n\":\"短剧\"},{\"v\":\"44\",\"n\":\"独播\"}],\"key\":\"feature\"},{\"name\":\"地区\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"814\",\"n\":\"内地\"},{\"v\":\"815\",\"n\":\"美国\"},{\"v\":\"816\",\"n\":\"英国\"},{\"v\":\"818\",\"n\":\"韩国\"},{\"v\":\"9\",\"n\":\"泰国\"},{\"v\":\"10\",\"n\":\"日本\"},{\"v\":\"14\",\"n\":\"中国香港\"},{\"v\":\"817\",\"n\":\"中国台湾\"},{\"v\":\"819\",\"n\":\"其他\"}],\"key\":\"iarea\"},{\"name\":\"年份\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2022\",\"n\":\"2022\"},{\"v\":\"2021\",\"n\":\"2021\"},{\"v\":\"2020\",\"n\":\"2020\"},{\"v\":\"4061\",\"n\":\"2019\"},{\"v\":\"4060\",\"n\":\"2018\"},{\"v\":\"2017\",\"n\":\"2017\"},{\"v\":\"859\",\"n\":\"2016\"},{\"v\":\"860\",\"n\":\"2015\"},{\"v\":\"861\",\"n\":\"2014\"},{\"v\":\"862\",\"n\":\"2013\"},{\"v\":\"863\",\"n\":\"2012\"},{\"v\":\"864\",\"n\":\"2011\"},{\"v\":\"865\",\"n\":\"2010\"},{\"v\":\"866\",\"n\":\"其他\"}],\"key\":\"year\"},{\"name\":\"资费\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"867\",\"n\":\"免费\"},{\"v\":\"6\",\"n\":\"会员\"}],\"key\":\"pay\"}],\"education\":[{\"name\":\"排序\",\"value\":[{\"v\":\"19\",\"n\":\"按更新\"},{\"v\":\"40\",\"n\":\"最热\"}],\"key\":\"sort\"},{\"name\":\"学段\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2\",\"n\":\"小学\"},{\"v\":\"3\",\"n\":\"初中\"},{\"v\":\"4\",\"n\":\"高中\"},{\"v\":\"5\",\"n\":\"大学\"},{\"v\":\"6\",\"n\":\"研究生\"},{\"v\":\"7\",\"n\":\"成人\"}],\"key\":\"section\"},{\"name\":\"学级\",\"value\":[{\"v\":\"1\",\"n\":\"全部\"},{\"v\":\"5\",\"n\":\"一年级\"},{\"v\":\"6\",\"n\":\"二年级\"},{\"v\":\"7\",\"n\":\"三年级\"},{\"v\":\"8\",\"n\":\"四年级\"},{\"v\":\"9\",\"n\":\"五年级\"},{\"v\":\"10\",\"n\":\"六年级\"},{\"v\":\"11\",\"n\":\"初一\"},{\"v\":\"12\",\"n\":\"初二\"},{\"v\":\"13\",\"n\":\"初三\"},{\"v\":\"14\",\"n\":\"高一\"},{\"v\":\"15\",\"n\":\"高二\"},{\"v\":\"16\",\"n\":\"高三\"},{\"v\":\"20\",\"n\":\"大四\"}],\"key\":\"grade\"},{\"name\":\"学科\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"41\",\"n\":\"语文\"},{\"v\":\"42\",\"n\":\"数学\"},{\"v\":\"43\",\"n\":\"英语\"},{\"v\":\"44\",\"n\":\"物理\"},{\"v\":\"45\",\"n\":\"化学\"},{\"v\":\"46\",\"n\":\"生物\"},{\"v\":\"47\",\"n\":\"政治\"},{\"v\":\"50\",\"n\":\"其它\"}],\"key\":\"subject\"}],\"movie\":[{\"name\":\"排序\",\"value\":[{\"v\":\"18\",\"n\":\"最近热播\"},{\"v\":\"19\",\"n\":\"最新上架\"},{\"v\":\"21\",\"n\":\"高分好评\"},{\"v\":\"22\",\"n\":\"知乎高分\"}],\"key\":\"sort\"},{\"name\":\"类型\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"100018\",\"n\":\"剧情\"},{\"v\":\"100004\",\"n\":\"喜剧\"},{\"v\":\"100061\",\"n\":\"动作\"},{\"v\":\"100005\",\"n\":\"爱情\"},{\"v\":\"100010\",\"n\":\"惊悚\"},{\"v\":\"4\",\"n\":\"犯罪\"},{\"v\":\"100009\",\"n\":\"悬疑\"},{\"v\":\"100006\",\"n\":\"战争\"},{\"v\":\"100012\",\"n\":\"科幻\"},{\"v\":\"100015\",\"n\":\"动画\"},{\"v\":\"100007\",\"n\":\"恐怖\"},{\"v\":\"100017\",\"n\":\"家庭\"},{\"v\":\"100022\",\"n\":\"传记\"},{\"v\":\"100003\",\"n\":\"冒险\"},{\"v\":\"100016\",\"n\":\"奇幻\"},{\"v\":\"100011\",\"n\":\"武侠\"},{\"v\":\"100021\",\"n\":\"历史\"},{\"v\":\"2\",\"n\":\"运动\"},{\"v\":\"100014\",\"n\":\"歌舞\"},{\"v\":\"100013\",\"n\":\"音乐\"},{\"v\":\"100020\",\"n\":\"纪录\"},{\"v\":\"100019\",\"n\":\"伦理\"},{\"v\":\"3\",\"n\":\"西部\"}],\"key\":\"itype\"},{\"name\":\"地区\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"100024\",\"n\":\"内地\"},{\"v\":\"100025\",\"n\":\"中国香港\"},{\"v\":\"100029\",\"n\":\"美国\"},{\"v\":\"100032\",\"n\":\"欧洲\"},{\"v\":\"100026\",\"n\":\"中国台湾\"},{\"v\":\"100027\",\"n\":\"日本\"},{\"v\":\"100028\",\"n\":\"韩国\"},{\"v\":\"100030\",\"n\":\"印度\"},{\"v\":\"100031\",\"n\":\"泰国\"},{\"v\":\"15\",\"n\":\"英国\"},{\"v\":\"16\",\"n\":\"法国\"},{\"v\":\"17\",\"n\":\"德国\"},{\"v\":\"18\",\"n\":\"加拿大\"},{\"v\":\"19\",\"n\":\"西班牙\"},{\"v\":\"20\",\"n\":\"意大利\"},{\"v\":\"21\",\"n\":\"澳大利亚\"},{\"v\":\"22\",\"n\":\"北欧\"},{\"v\":\"23\",\"n\":\"拉丁美洲\"},{\"v\":\"100033\",\"n\":\"其它\"}],\"key\":\"iarea\"},{\"name\":\"特色\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"院线\"},{\"v\":\"2\",\"n\":\"自制电影\"},{\"v\":\"5\",\"n\":\"独播\"},{\"v\":\"8\",\"n\":\"原声\"},{\"v\":\"9\",\"n\":\"粤语\"},{\"v\":\"3\",\"n\":\"蓝光\"},{\"v\":\"6\",\"n\":\"奥斯卡\"}],\"key\":\"characteristic\"},{\"name\":\"年份\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2022\",\"n\":\"2022\"},{\"v\":\"2022\",\"n\":\"2022\"},{\"v\":\"2021\",\"n\":\"2021\"},{\"v\":\"2020\",\"n\":\"2020\"},{\"v\":\"20\",\"n\":\"2019\"},{\"v\":\"2018\",\"n\":\"2018\"},{\"v\":\"2017\",\"n\":\"2017\"},{\"v\":\"2016\",\"n\":\"2016\"},{\"v\":\"100063\",\"n\":\"2015\"},{\"v\":\"100034\",\"n\":\"2014\"},{\"v\":\"100035\",\"n\":\"2013-2011\"},{\"v\":\"100036\",\"n\":\"2010-2006\"},{\"v\":\"100037\",\"n\":\"2005-2000\"},{\"v\":\"100038\",\"n\":\"90年代\"},{\"v\":\"100039\",\"n\":\"80年代\"},{\"v\":\"100040\",\"n\":\"其它\"}],\"key\":\"year\"},{\"name\":\"资费\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"免费\"},{\"v\":\"2\",\"n\":\"包月\"},{\"v\":\"3\",\"n\":\"用券\"},{\"v\":\"4\",\"n\":\"付费\"}],\"key\":\"charge\"}],\"variety\":[{\"name\":\"排序\",\"value\":[{\"v\":\"4\",\"n\":\"最热\"},{\"v\":\"5\",\"n\":\"最新\"}],\"key\":\"sort\"},{\"name\":\"独家\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"腾讯自制\"},{\"v\":\"2\",\"n\":\"独播\"}],\"key\":\"exclusive\"},{\"name\":\"地区\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"国内\"},{\"v\":\"2\",\"n\":\"海外\"}],\"key\":\"iarea\"},{\"name\":\"类型\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"10\",\"n\":\"游戏\"},{\"v\":\"11\",\"n\":\"音乐\"},{\"v\":\"24\",\"n\":\"养成\"},{\"v\":\"12\",\"n\":\"情感\"},{\"v\":\"14\",\"n\":\"喜剧\"},{\"v\":\"2\",\"n\":\"脱口秀\"},{\"v\":\"16\",\"n\":\"表演\"},{\"v\":\"25\",\"n\":\"体验\"},{\"v\":\"17\",\"n\":\"亲子\"},{\"v\":\"26\",\"n\":\"文化\"},{\"v\":\"19\",\"n\":\"美食\"},{\"v\":\"20\",\"n\":\"职场\"},{\"v\":\"21\",\"n\":\"体育\"},{\"v\":\"15\",\"n\":\"潮流文化\"},{\"v\":\"3\",\"n\":\"访谈\"},{\"v\":\"22\",\"n\":\"生活服务\"},{\"v\":\"23\",\"n\":\"萌宠\"},{\"v\":\"7\",\"n\":\"资讯\"},{\"v\":\"6\",\"n\":\"晚会\"}],\"key\":\"itype\"},{\"name\":\"年份\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2022\",\"n\":\"2022\"},{\"v\":\"2021\",\"n\":\"2021\"},{\"v\":\"50\",\"n\":\"2020\"},{\"v\":\"7\",\"n\":\"2019\"},{\"v\":\"1\",\"n\":\"2018\"},{\"v\":\"2\",\"n\":\"2017\"},{\"v\":\"3\",\"n\":\"2016\"},{\"v\":\"4\",\"n\":\"2015\"},{\"v\":\"5\",\"n\":\"2014\"},{\"v\":\"6\",\"n\":\"2013\"},{\"v\":\"2012\",\"n\":\"2012\"},{\"v\":\"2011\",\"n\":\"2011\"},{\"v\":\"2010\",\"n\":\"2010\"},{\"v\":\"99\",\"n\":\"更早\"}],\"key\":\"iyear\"},{\"name\":\"付费\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"会员\"}],\"key\":\"ipay\"}],\"cartoon\":[{\"name\":\"排序\",\"value\":[{\"v\":\"40\",\"n\":\"最热\"},{\"v\":\"23\",\"n\":\"最新\"},{\"v\":\"20\",\"n\":\"好评\"},{\"v\":\"22\",\"n\":\"知乎高分\"}],\"key\":\"sort\"},{\"name\":\"类型\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2\",\"n\":\"冒险\"},{\"v\":\"5\",\"n\":\"战斗\"},{\"v\":\"1\",\"n\":\"搞笑\"},{\"v\":\"3\",\"n\":\"经典\"},{\"v\":\"4\",\"n\":\"科幻\"},{\"v\":\"9\",\"n\":\"玄幻\"},{\"v\":\"6\",\"n\":\"魔幻\"},{\"v\":\"13\",\"n\":\"武侠\"},{\"v\":\"7\",\"n\":\"恋爱\"},{\"v\":\"14\",\"n\":\"推理\"},{\"v\":\"11\",\"n\":\"腾讯出品\"},{\"v\":\"15\",\"n\":\"日常\"},{\"v\":\"16\",\"n\":\"校园\"},{\"v\":\"17\",\"n\":\"悬疑\"},{\"v\":\"18\",\"n\":\"真人\"},{\"v\":\"19\",\"n\":\"历史\"},{\"v\":\"20\",\"n\":\"竞技\"},{\"v\":\"12\",\"n\":\"其他\"}],\"key\":\"itype\"},{\"name\":\"地区\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"内地\"},{\"v\":\"2\",\"n\":\"日本\"},{\"v\":\"3\",\"n\":\"欧美\"},{\"v\":\"4\",\"n\":\"其他\"}],\"key\":\"iarea\"},{\"name\":\"时间\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2022\",\"n\":\"2022\"},{\"v\":\"2021\",\"n\":\"2021\"},{\"v\":\"50\",\"n\":\"2020\"},{\"v\":\"11\",\"n\":\"2019\"},{\"v\":\"2018\",\"n\":\"2018\"},{\"v\":\"2017\",\"n\":\"2017\"},{\"v\":\"1\",\"n\":\"2016\"},{\"v\":\"2\",\"n\":\"2015\"},{\"v\":\"3\",\"n\":\"2014\"},{\"v\":\"4\",\"n\":\"2013\"},{\"v\":\"5\",\"n\":\"2012\"},{\"v\":\"6\",\"n\":\"2011\"},{\"v\":\"7\",\"n\":\"00年代\"},{\"v\":\"8\",\"n\":\"90年代\"},{\"v\":\"9\",\"n\":\"80年代\"},{\"v\":\"10\",\"n\":\"更早\"}],\"key\":\"iyear\"},{\"name\":\"资费\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"免费\"},{\"v\":\"2\",\"n\":\"会员\"}],\"key\":\"ipay\"},{\"name\":\"状态\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"46\",\"n\":\"预告片\"},{\"v\":\"44\",\"n\":\"连载\"},{\"v\":\"45\",\"n\":\"完结\"}],\"key\":\"anime_status\"},{\"name\":\"分类\",\"value\":[{\"v\":\"1\",\"n\":\"全部\"},{\"v\":\"2\",\"n\":\"3D动画\"},{\"v\":\"3\",\"n\":\"2D动画\"},{\"v\":\"4\",\"n\":\"特摄\"},{\"v\":\"5\",\"n\":\"其他\"}],\"key\":\"item\"}],\"doco\":[{\"name\":\"排序\",\"value\":[{\"v\":\"19\",\"n\":\"最新\"},{\"v\":\"18\",\"n\":\"最热\"},{\"v\":\"20\",\"n\":\"好评\"},{\"v\":\"22\",\"n\":\"知乎高分\"}],\"key\":\"sort\"},{\"name\":\"出品机构\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"BBC\"},{\"v\":\"4\",\"n\":\"国家地理\"},{\"v\":\"3175\",\"n\":\"HBO\"},{\"v\":\"2\",\"n\":\"NHK\"},{\"v\":\"7\",\"n\":\"历史频道\"},{\"v\":\"3530\",\"n\":\"ITV\"},{\"v\":\"3174\",\"n\":\"探索频道\"},{\"v\":\"3176\",\"n\":\"ZDF\"},{\"v\":\"3172\",\"n\":\"ARTE\"},{\"v\":\"15\",\"n\":\"腾讯自制\"},{\"v\":\"6\",\"n\":\"合作机构\"},{\"v\":\"5\",\"n\":\"其他\"}],\"key\":\"itrailer\"},{\"name\":\"类型\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"4\",\"n\":\"自然\"},{\"v\":\"9\",\"n\":\"美食\"},{\"v\":\"3\",\"n\":\"社会\"},{\"v\":\"5\",\"n\":\"人文\"},{\"v\":\"1\",\"n\":\"历史\"},{\"v\":\"2\",\"n\":\"军事\"},{\"v\":\"7\",\"n\":\"科技\"},{\"v\":\"13\",\"n\":\"财经\"},{\"v\":\"15\",\"n\":\"探险\"},{\"v\":\"6\",\"n\":\"罪案\"},{\"v\":\"11\",\"n\":\"竞技\"},{\"v\":\"10\",\"n\":\"旅游\"}],\"key\":\"itype\"},{\"name\":\"资费\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"免费\"},{\"v\":\"2\",\"n\":\"会员\"}],\"key\":\"pay\"}],\"child\":[{\"name\":\"排序\",\"value\":[{\"v\":\"19\",\"n\":\"最新\"},{\"v\":\"18\",\"n\":\"最热\"},{\"v\":\"20\",\"n\":\"好评\"}],\"key\":\"sort\"},{\"name\":\"地区\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"欧美\"},{\"v\":\"2\",\"n\":\"日韩\"},{\"v\":\"3\",\"n\":\"国内\"}],\"key\":\"iarea\"},{\"name\":\"年龄\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"0-3岁\"},{\"v\":\"2\",\"n\":\"4-6岁\"},{\"v\":\"3\",\"n\":\"7-9岁\"},{\"v\":\"4\",\"n\":\"10岁以上\"}],\"key\":\"iyear\"},{\"name\":\"性别\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"男孩\"},{\"v\":\"2\",\"n\":\"女孩\"}],\"key\":\"gender\"},{\"name\":\"类型\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"儿歌\"},{\"v\":\"2\",\"n\":\"益智\"},{\"v\":\"3\",\"n\":\"手工·绘画\"},{\"v\":\"4\",\"n\":\"玩具\"},{\"v\":\"5\",\"n\":\"英语\"},{\"v\":\"7\",\"n\":\"早教\"},{\"v\":\"6\",\"n\":\"数学\"},{\"v\":\"8\",\"n\":\"国学\"},{\"v\":\"9\",\"n\":\"合家欢\"},{\"v\":\"10\",\"n\":\"冒险\"},{\"v\":\"11\",\"n\":\"交通工具\"},{\"v\":\"12\",\"n\":\"魔幻·科幻\"},{\"v\":\"13\",\"n\":\"动物\"},{\"v\":\"14\",\"n\":\"真人特摄\"},{\"v\":\"15\",\"n\":\"探索\"},{\"v\":\"16\",\"n\":\"其他\"}],\"key\":\"itype\"},{\"name\":\"资费\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"1\",\"n\":\"免费\"},{\"v\":\"2\",\"n\":\"会员\"}],\"key\":\"ipay\"}],\"knowledge\":[{\"name\":\"排序\",\"value\":[{\"v\":\"41\",\"n\":\"最热\"},{\"v\":\"10\",\"n\":\"最新\"}],\"key\":\"sort\"},{\"name\":\"分类\",\"value\":[{\"v\":\"-1\",\"n\":\"全部\"},{\"v\":\"2\",\"n\":\"文化历史\"},{\"v\":\"3\",\"n\":\"亲子育儿\"},{\"v\":\"4\",\"n\":\"职场\"},{\"v\":\"5\",\"n\":\"商业理财\"},{\"v\":\"7\",\"n\":\"生活\"},{\"v\":\"9\",\"n\":\"情感心理\"},{\"v\":\"8\",\"n\":\"运动健身\"},{\"v\":\"6\",\"n\":\"艺术兴趣\"},{\"v\":\"12\",\"n\":\"游戏\"},{\"v\":\"14\",\"n\":\"科学科普\"},{\"v\":\"15\",\"n\":\"健康\"},{\"v\":\"16\",\"n\":\"IT/互联网\"}],\"key\":\"pay_level_one\"}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - public String join(@NonNull CharSequence charSequence, @NonNull Iterable iterable) { - Iterator it = iterable.iterator(); - if (!it.hasNext()) { - return ""; - } - StringBuilder sb = new StringBuilder(); - sb.append(it.next()); - while (it.hasNext()) { - sb.append(charSequence); - sb.append(it.next()); - } - return sb.toString(); - } - - public String playerContent(String str, String str2, List list) { - try { - JSONObject jSONObject = new JSONObject(); - try { - jSONObject.put("parse", 1); - jSONObject.put("jx", "1"); - jSONObject.put("url", str2); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return jSONObject.toString(); - } - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String searchContent(String str, boolean quick) { - try { - String str2 = "http://node.video.qq.com/x/api/msearch?keyWord=" + str; - JSONArray jSONArray = new JSONObject(OkHttpUtil.string(str2, getHeaders(str2))).getJSONArray("uiData"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject = jSONArray.getJSONObject(i).getJSONArray("data").getJSONObject(0); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", jSONObject.optString("id")); - jSONObject2.put("vod_name", jSONObject.optString("title")); - jSONObject2.put("vod_pic", jSONObject.optString("posterPic")); - jSONObject2.put("vod_remarks", jSONObject.optString("publishDate")); - jSONArray2.put(jSONObject2); - } - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } -} diff --git a/TVBox_Java/spider/QXBiubiu.java b/TVBox_Java/spider/QXBiubiu.java deleted file mode 100644 index 1a4f58a..0000000 --- a/TVBox_Java/spider/QXBiubiu.java +++ /dev/null @@ -1,505 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - -public class QXBiubiu extends Spider { - - @Override - public void init(Context context) { - super.init(context); - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - fetchRule(); - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - String[] fenleis = getRuleVal("fenlei", "").split("#"); - for (String fenlei : fenleis) { - String[] info = fenlei.split("\\$"); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_name", info[0]); - jsonObject.put("type_id", info[1]); - classes.put(jsonObject); - } - result.put("class", classes); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - String ua = getRuleVal("ua", Misc.UaWinChrome).trim(); - if (ua.isEmpty()) - ua = Misc.UaWinChrome; - headers.put("User-Agent", ua); - return headers; - } - - @Override - public String homeVideoContent() { - try { - fetchRule(); - if (getRuleVal("shouye").equals("1")) { - JSONArray videos = new JSONArray(); - String[] fenleis = getRuleVal("fenlei", "").split("#"); - for (String fenlei : fenleis) { - String[] info = fenlei.split("\\$"); - JSONObject data = category(info[1], "1", false, new HashMap<>()); - if (data != null) { - JSONArray vids = data.optJSONArray("list"); - if (vids != null) { - for (int i = 0; i < vids.length() && i < 5; i++) { - videos.put(vids.getJSONObject(i)); - } - } - } - if (videos.length() >= 30) - break; - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private JSONObject category(String tid, String pg, boolean filter, HashMap extend) { - try { - fetchRule(); - if (tid.equals("空")) - tid = ""; - String qishiye = rule.optString("qishiye", "nil"); - if (qishiye.equals("空")) - pg = ""; - else if (!qishiye.equals("nil")) { - pg = String.valueOf(Integer.parseInt(pg) - 1 + Integer.parseInt(qishiye)); - } - String webUrl = getRuleVal("url") + tid + pg + getRuleVal("houzhui"); - String html = fetch(webUrl); - html = removeUnicode(html); - String parseContent = html; - boolean shifouercijiequ = getRuleVal("shifouercijiequ").equals("1"); - if (shifouercijiequ) { - String jiequqian = getRuleVal("jiequqian"); - String jiequhou = getRuleVal("jiequhou"); - parseContent = subContent(html, jiequqian, jiequhou).get(0); - } - String jiequshuzuqian = getRuleVal("jiequshuzuqian"); - String jiequshuzuhou = getRuleVal("jiequshuzuhou"); - JSONArray videos = new JSONArray(); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - //try { - String jiequContent = jiequContents.get(i); - String title = removeHtml(subContent(jiequContent, getRuleVal("biaotiqian"), getRuleVal("biaotihou")).get(0)); - String pic = ""; - String tupianqian = getRuleVal("tupianqian").toLowerCase(); - if (tupianqian.startsWith("http://") || tupianqian.startsWith("https://")) { - pic = getRuleVal("tupianqian"); - } else { - pic = subContent(jiequContent, getRuleVal("tupianqian"), getRuleVal("tupianhou")).get(0); - } - pic = Misc.fixUrl(webUrl, pic); - String link = subContent(jiequContent, getRuleVal("lianjieqian"), getRuleVal("lianjiehou")).get(0); - link = getRuleVal("ljqianzhui").isEmpty() ? (link + getRuleVal("ljhouzhui")) : ("x:" + getRuleVal("ljqianzhui")) + link + getRuleVal("ljhouzhui"); - String remark = ""; - if (!getRuleVal("fubiaotiqian").isEmpty() && !getRuleVal("fubiaotihou").isEmpty()) { - try { - remark = subContent(jiequContent, getRuleVal("fubiaotiqian"), getRuleVal("fubiaotihou")).get(0).replaceAll("[\\s\\S]+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", title + "$$$" + pic + "$$$" + link); - v.put("vod_name", title); - v.put("vod_pic", pic); - v.put("vod_remarks", remark); - videos.put(v); - //} catch (Throwable th) { - //th.printStackTrace(); - //break; - //} - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result; - } catch (Exception e) { - SpiderDebug.log(e); - } - return null; - } - - private static String removeUnicode(String str) { - Pattern pattern = Pattern.compile("(\\\\u(\\w{4}))"); - Matcher matcher = pattern.matcher(str); - while (matcher.find()) { - String full = matcher.group(1); - String ucode = matcher.group(2); - char c = (char) Integer.parseInt(ucode, 16); - str = str.replace(full, c + ""); - } - return str; - } - - String removeHtml(String text) { - return Jsoup.parse(text).text(); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - JSONObject obj = category(tid, pg, filter, extend); - return obj != null ? obj.toString() : ""; - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - String[] idInfo = ids.get(0).split("\\$\\$\\$"); - String webUrl = idInfo[2].startsWith("x:") ? idInfo[2] : getRuleVal("url") + idInfo[2]; - String html = fetch(webUrl.startsWith("x:") ? webUrl.substring(2) : webUrl); - String parseContent = html; - boolean bfshifouercijiequ = getRuleVal("bfshifouercijiequ").equals("1"); - if (bfshifouercijiequ) { - String jiequqian = getRuleVal("bfjiequqian"); - String jiequhou = getRuleVal("bfjiequhou"); - parseContent = subContent(html, jiequqian, jiequhou).get(0); - } - - ArrayList playList = new ArrayList<>(); - boolean playDirect = getRuleVal("直接播放").equals("1"); - if (!playDirect) { - String jiequshuzuqian = getRuleVal("bfjiequshuzuqian"); - String jiequshuzuhou = getRuleVal("bfjiequshuzuhou"); - boolean bfyshifouercijiequ = getRuleVal("bfyshifouercijiequ").equals("1"); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String parseJqContent = bfyshifouercijiequ ? subContent(jiequContent, getRuleVal("bfyjiequqian"), getRuleVal("bfyjiequhou")).get(0) : jiequContent; - ArrayList lastParseContents = subContent(parseJqContent, getRuleVal("bfyjiequshuzuqian"), getRuleVal("bfyjiequshuzuhou")); - List vodItems = new ArrayList<>(); - for (int j = 0; j < lastParseContents.size(); j++) { - String title = subContent(lastParseContents.get(j), getRuleVal("bfbiaotiqian"), getRuleVal("bfbiaotihou")).get(0); - String link = subContent(lastParseContents.get(j), getRuleVal("bflianjieqian"), getRuleVal("bflianjiehou")).get(0); - String bfqianzhui = getRuleVal("bfqianzhui"); - if (!bfqianzhui.isEmpty()) { - link = bfqianzhui + link; - } - vodItems.add(title + "$" + link); - } - playList.add(TextUtils.join("#", vodItems)); - } catch (Throwable th) { - th.printStackTrace(); - } - } - } else { - playList.add(idInfo[0] + "$" + idInfo[2]); - } - String cover = idInfo[1], title = idInfo[0], desc = "", category = "", area = "", year = "", remark = "", director = "", actor = ""; - - if (!getRuleVal("leixinqian").isEmpty() && !getRuleVal("leixinhou").isEmpty()) { - try { - category = subContent(html, getRuleVal("leixinqian"), getRuleVal("leixinhou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("niandaiqian").isEmpty() && !getRuleVal("niandaihou").isEmpty()) { - try { - year = subContent(html, getRuleVal("niandaiqian"), getRuleVal("niandaihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("zhuangtaiqian").isEmpty() && !getRuleVal("zhuangtaihou").isEmpty()) { - try { - remark = subContent(html, getRuleVal("zhuangtaiqian"), getRuleVal("zhuangtaihou")).get(0); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("zhuyanqian").isEmpty() && !getRuleVal("zhuyanhou").isEmpty()) { - try { - actor = subContent(html, getRuleVal("zhuyanqian"), getRuleVal("zhuyanhou")).get(0).replaceAll("\\s+", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("daoyanqian").isEmpty() && !getRuleVal("daoyanhou").isEmpty()) { - try { - director = subContent(html, getRuleVal("daoyanqian"), getRuleVal("daoyanhou")).get(0).replaceAll("\\s+", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("juqingqian").isEmpty() && !getRuleVal("juqinghou").isEmpty()) { - try { - desc = subContent(html, getRuleVal("juqingqian"), getRuleVal("juqinghou")).get(0); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject vod = new JSONObject(); - vod.put("vod_id", ids.get(0)); - vod.put("vod_name", title); - vod.put("vod_pic", cover); - vod.put("type_name", category); - vod.put("vod_year", year); - vod.put("vod_area", area); - vod.put("vod_remarks", remark); - vod.put("vod_actor", actor); - vod.put("vod_director", director); - vod.put("vod_content", desc); - - ArrayList playFrom = new ArrayList<>(); - String xlparseContent = html; - if(getRuleVal("xlbiaotiqian").isEmpty() && getRuleVal("xlbiaotihou").isEmpty()){ - - for (int i = 0; i < playList.size(); i++) { - playFrom.add("播放列表" + (i + 1)); - } - }else{ - - boolean xlshifouercijiequ = getRuleVal("xlshifouercijiequ").equals("1"); - if (xlshifouercijiequ) { - String xljiequqian = getRuleVal("xljiequqian"); - String xljiequhou = getRuleVal("xljiequhou"); - xlparseContent = subContent(html, xljiequqian, xljiequhou).get(0); - } - - String xljiequshuzuqian = getRuleVal("xljiequshuzuqian"); - String xljiequshuzuhou = getRuleVal("xljiequshuzuhou"); - ArrayList xljiequContents = subContent(xlparseContent, xljiequshuzuqian, xljiequshuzuhou); - for (int i = 0; i < playList.size(); i++) { - try { - String xltitle = subContent(xljiequContents.get(i), getRuleVal("xlbiaotiqian"), getRuleVal("xlbiaotihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - playFrom.add(xltitle); - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - - } - - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = id.startsWith("x:") ? id.substring(2) : getRuleVal("url") + id; - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", webUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - fetchRule(); - boolean ssmoshiJson = getRuleVal("ssmoshi").equals("0"); - String webUrlTmp = getRuleVal("url") + getRuleVal("sousuoqian") + key + getRuleVal("sousuohou"); - String webUrl = webUrlTmp.split(";")[0]; - String webContent = webUrlTmp.contains(";post") ? fetchPost(webUrl) : fetch(webUrl); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (ssmoshiJson) { - JSONObject data = new JSONObject(webContent); - JSONArray vodArray = data.getJSONArray("list"); - for (int j = 0; j < vodArray.length(); j++) { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(getRuleVal("jsname")).trim(); - String id = vod.optString(getRuleVal("jsid")).trim(); - String pic = vod.optString(getRuleVal("jspic")).trim(); - pic = Misc.fixUrl(webUrl, pic); - String link = getRuleVal("sousuohouzhui") + id; - link = getRuleVal("ssljqianzhui").isEmpty() ? (link + getRuleVal("ssljhouzhui")) : ("x:" + getRuleVal("ssljqianzhui")) + link + getRuleVal("ssljhouzhui"); - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + link); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", ""); - videos.put(v); - } - } else { - String parseContent = webContent; - boolean shifouercijiequ = getRuleVal("sousuoshifouercijiequ").equals("1"); - if (shifouercijiequ) { - String jiequqian = getRuleVal("ssjiequqian"); - String jiequhou = getRuleVal("ssjiequhou"); - parseContent = subContent(webContent, jiequqian, jiequhou).get(0); - } - String jiequshuzuqian = getRuleVal("ssjiequshuzuqian"); - String jiequshuzuhou = getRuleVal("ssjiequshuzuhou"); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String title = subContent(jiequContent, getRuleVal("ssbiaotiqian"), getRuleVal("ssbiaotihou")).get(0); - String pic = subContent(jiequContent, getRuleVal("sstupianqian"), getRuleVal("sstupianhou")).get(0); - pic = Misc.fixUrl(webUrl, pic); - String link = subContent(jiequContent, getRuleVal("sslianjieqian"), getRuleVal("sslianjiehou")).get(0); - link = getRuleVal("ssljqianzhui").isEmpty() ? (link + getRuleVal("ssljhouzhui")) : ("x:" + getRuleVal("ssljqianzhui")) + link + getRuleVal("ssljhouzhui"); - JSONObject v = new JSONObject(); - v.put("vod_id", title + "$$$" + pic + "$$$" + link); - v.put("vod_name", title); - v.put("vod_pic", pic); - v.put("vod_remarks", ""); - videos.put(v); - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String ext = null; - protected JSONObject rule = null; - - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - try { - if (ext.startsWith("http")) { - String json = OkHttpUtil.string(ext, null); - rule = new JSONObject(json); - } else { - rule = new JSONObject(ext); - } - } catch (JSONException e) { - } - } - } - } - - protected String fetch(String webUrl) { - SpiderDebug.log(webUrl); - return OkHttpUtil.string(webUrl, getHeaders(webUrl)).replaceAll("\r|\n", ""); - } - - protected String fetchPost(String webUrl) { - SpiderDebug.log(webUrl); - OKCallBack.OKCallBackString callBack = new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - } - }; - OkHttpUtil.post(OkHttpUtil.defaultClient(), webUrl, callBack); - return callBack.getResult().replaceAll("\r|\n", ""); - } - - private String getRuleVal(String key, String defaultVal) { - String v = rule.optString(key); - if (v.isEmpty() || v.equals("空")) - return defaultVal; - return v; - } - - private String getRuleVal(String key) { - return getRuleVal(key, ""); - } - - private ArrayList subContent(String content, String startFlag, String endFlag) { - ArrayList result = new ArrayList<>(); - if (startFlag.isEmpty() && endFlag.isEmpty()) { - result.add(content); - return result; - } - try { - Pattern pattern = Pattern.compile(escapeExprSpecialWord(startFlag) + "(.*?)" + escapeExprSpecialWord(endFlag)); - Matcher matcher = pattern.matcher(content); - while (matcher.find()) { - result.add(matcher.group(1)); - } - } catch (Throwable th) { - th.printStackTrace(); - } - return result; - } - - String escapeExprSpecialWord(String regexStr) { - if (!regexStr.isEmpty()) { - String[] fbsArr = {"\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|"}; - for (String key : fbsArr) { - if (regexStr.contains(key)) { - regexStr = regexStr.replace(key, "\\" + key); - } - } - } - return regexStr; - } -} diff --git a/TVBox_Java/spider/SP293.java b/TVBox_Java/spider/SP293.java deleted file mode 100644 index 136805a..0000000 --- a/TVBox_Java/spider/SP293.java +++ /dev/null @@ -1,339 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.spider.merge.RSA; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.json.JSONArray; -import org.json.JSONObject; - -public class SP293 extends Spider { - public static String l = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL4cSBLgAtKxA3brZ73KA6/uagCFNBqh3+GVWZGyKlrChUrrqcBHmV/fZcH/oVIwZHCxv0rnOesTE7WZhzgbbUEsBDK8W8+paIwQI3Pvpp3JzEvduOfS/4G4EPYpKiGE3+vK9q7h+9xVv6FS8uzKAe6uS98qDgHad46cMJVkYR0DAgMBAAECgYAZMBAQiCN3nMJTwC63g4tnhNQAi6Vynd3Wun3qgst/yOP2IDEWa6YTgLqvsFnEVOsJz1MD7ozK63UiC1xR/7hCvqTziaV7g0lCB9Gk9ZMRIpS8pPtfnDSMjeYzMCQWvdRMOf8BkFp7SISCtlQRm9VKKRKMZ27zH3BvIvTed4tYoQJBAOw7Gda7L2CXBdKfpRK6KgUVkki/d9qEcm1kS9TFAxrQcEWdijF7l9w8LnaBPC0uaRKmEB4/uiOMXXN89Vo6CnECQQDOBR57KgMAAKDzFIRDyegl1Y6xTpEIi0/YlTlPyZmYpG2vS6czG+OQfJoT/w/vBw7mMGTR3IiQwF2qqYACUNCzAkEA60suwGgvl3i1jwX+iLmu8uN6kkVL3vZ/dyAoO+SD5ChrO5vgMstVBkNXUCgHRUVt2OpZMZfuEkxUJJz5UQZwsQJAUCLFnHrW9+VGtcbBO+0Jk83h1y4MVBp8UG6bAGIWkL1EvO7cdpDej5EoDack94DzVq50SP1TUZrB1GRiGoR86QJAfy9NP2vDtk8MyjIUWjpYTTUhjMk/6WurIBtwEzE56QLFLshm1KwEFh25qrdI4vXChQQKXAgu17b+I7qfYh2IMA=="; - public static String qb = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWHmmu0aFU2m1ZnQb09+/QQRnuy3GmcwnTnFwPLR/CsfbsxiNQLULpdwhC1h1U/3yEyc2kZ549+X3iYFed3tHa0NLntcSw6w6IcEAgiaeHasRlzh98IgEai9XChbhLAy7a/s4HnhFXJCsg5/FqrjZ/FuEOhbCN3gWcc6Aly+OZhwIDAQAB"; - public static String zC = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMNlbdQeVJIW9baQ7qAUYL6gbMfKcfxuwTlt+eh8hf9oC2lcztpjwm1s/MWqHk7/yFpps/vup6p+1inh5gzlKov9Ay5hHa3feYtKsb07jgKyfUJUhAqRIrqAQz+XL96dtDyaGXd2mT2Vo7OLcN6NeDcGR8c5tVG34o3LEDEd9s8dAgMBAAECgYEAvxaGnhc7ZdOGYRDEDVFge4ywVYMqjlBSLzPaXv7InMrHvjbBJNrC3fjkCvsfwOpsqd8N4ae32QlJsJP3Q00qmR9I8beLjUe50zOSk1ExSdKTAHV8iHFlxxQhfP0y9T7pTYuDFMRC8Qcc2J7d6OUVF3Au/GBM6P8yFrKeDx2hXQECQQDjM4V75SmQ+dtPjajzBZt9OctVwAfEVePUX84dioMOS1W7KxaHYYpZMPMC9SkAsCYuGhw2bXIiCRQM+6PDm9aRAkEA3CncsOQTLRgpGOo/Lr5UXybq8EVB5s1ItTd+dCqAH8i220kw5OXH3siMwLJBdv8zUVrAwqocaNRzgjYY1WytzQJBAKAjAEKDEvkMIne/8QTZPu7UfWzDHLZVk29s12oa5qR8lMCHbimdplWXGrFK+stxXHfCD4CNQ5SZsXg1JQgKHwECQFprxvvPcCDBH3/gFPr5qGU78pmjmCFWhloG5KSJH/3tzUvaj34y8ReKfmRV0ZUx0r3C7BAHFYvoVVhRJ3ngHLECQQCC5iTBfTdd51Lb5kwxffk/iw+BRAsZ5SAzUlmwRyB0cvX/9yvton8PPK590yYQqkc6BMmNePzRypVlYNXzhYfe"; - public static String zcC = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAM6T6V5lfKE5miEMR88NalNn6CvzQC+PR8bH0ipUege8D/tFgjh22J3Yh1Ibgl1zsoifz3eF8/IKWZ6Hui7iUeOvbZteCuz7IBLFvnbPsNCP7SbLGPYRasVp3zqwt2NV72aZ/bI9pLczK2+b0R+KJXZ5V6fmVFx/QWWAo+NmkerVAgMBAAECgYA0yBQjm1iptRcNhJ7AZ5QYNX9b424t+LUFND8ds7HuUf3fXNY16R/VzOJed0rq58nhILwYtPAskrptSA6pNghn56dike27vANR6mTaYv+0o1FS/+lGQ1UohSAnzVw30L/tJzrobvvU4joXYjb95typAOiIvcOh8WAuwQRU7I5MAQJBAPh/Ji6mKbllYHAn+sHdE0cGm8QISZz+7dvZQQ8L7MzJG1eUYZXCXQ9Fiqrk3kLNwq6IW+eruBsH4HJa9LNyjwECQQDU0Lvy/EnnQNITryXQ20gxR+x4e9Nak+4GJbL6JFf9kqCUhei2ni8t/RO7wp+jrKUy2kdzGlRL+cv5dgxzv+/VAkBQua2DtgMT8TT0+mfhlpnultz/P9n6IG7Q3rDd3Hfexu4U82UIK43jqimz/omdlg5KeI2yovw5+8MUIywfJ3YBAkBanIVp8AGHdRH9T5XKV5NlaDpHEnHrHxE5jNOnrdHJJaU5l8p99twfuKGuUC+ogNnVzRqe55b8wl8W2Cx1HEQBAkAzWKejO1OWmdf+VwgUwShiRMvlNvzO7iPoyE6B4DrLM5dAMk8BN4Cyk1T/4pDfcj9FCydDk3fCmtPA0DWngU6A"; - private String n8 = ""; - private Map> ug = new HashMap(); - private String v = ""; - private String in = ""; - private String I4 = ""; - - private String l(String str) { - return RSA.l(str, qb); - } - - private HashMap n8() { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 10; PBEM00 Build/QKQ1.190918.001)"); - return hashMap; - } - - private String qb(String str, String str2) { - return RSA.qb(str, str2); - } - - private String zC() { - return String.valueOf(System.currentTimeMillis() / 1000); - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - JSONObject jSONObject = new JSONObject(); - try { - String str3 = this.n8 + "api.php/Videolast/video?class="; - if (hashMap.containsKey("class")) { - str3 = str3 + hashMap.get("class"); - } - String str4 = str3 + "&area="; - if (hashMap.containsKey("area")) { - str4 = str4 + hashMap.get("area"); - } - String str5 = str4 + "&year="; - if (hashMap.containsKey("year")) { - str5 = str5 + hashMap.get("year"); - } - JSONArray jSONArray = new JSONObject(qb(OkHttpUtil.string(str5 + "&tid=" + str + "&pg=" + str2 + "&limit=20&csrf=" + URLEncoder.encode(l(zC())), n8()), l)).getJSONArray("data"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject2 = jSONArray.getJSONObject(i); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", jSONObject2.getString("vod_id")); - jSONObject3.put("vod_name", jSONObject2.getString("vod_name")); - jSONObject3.put("vod_pic", jSONObject2.getString("vod_pic")); - jSONObject3.put("vod_remarks", jSONObject2.getString("vod_remarks")); - jSONArray2.put(jSONObject3); - } - int parseInt = Integer.parseInt(str2); - jSONObject.put("page", parseInt); - if (jSONArray2.length() == 12) { - parseInt++; - } - jSONObject.put("pagecount", parseInt); - jSONObject.put("limit", 12); - jSONObject.put("total", Integer.MAX_VALUE); - jSONObject.put("list", jSONArray2); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(); - } - - public String detailContent(List list) { - JSONObject jSONObject = new JSONObject(); - try { - JSONObject jSONObject2 = new JSONObject(); - String zC2 = zC(); - String l2 = l(zC2); - jSONObject2.put("time", zC2); - String str = new String(RSA.l(l2, qb)); - JSONObject aa = new JSONObject(OkHttpUtil.string(this.n8 + "api.php/Videolast/videoDetail?id=" + list.get(0) + "&ck=" + URLEncoder.encode(str) + "&csrf=" + URLEncoder.encode(l2), n8())); - //String ba = aa.optJSONObject("data").toString(); - JSONObject optJSONObject = new JSONObject(qb(aa.optString("data"), l)).optJSONObject("data").optJSONObject("vod_info"); - //JSONObject optJSONObjects = new JSONObject(qb(OkHttpUtil.string(this.n8 + "api.php/Videolast/videoDetail?id=" + list.get(0) + "&ck=" + URLEncoder.encode(str) + "&csrf=" + URLEncoder.encode(l2), n8()), l)).optJSONObject("data").optJSONObject("vod_info"); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", optJSONObject.getString("vod_id")); - jSONObject3.put("vod_name", optJSONObject.getString("vod_name")); - jSONObject3.put("vod_pic", optJSONObject.getString("vod_pic")); - jSONObject3.put("type_name", optJSONObject.optString("vod_class")); - jSONObject3.put("vod_year", optJSONObject.optString("vod_year")); - jSONObject3.put("vod_area", optJSONObject.optString("vod_area")); - jSONObject3.put("vod_remarks", optJSONObject.optString("vod_remarks")); - jSONObject3.put("vod_actor", optJSONObject.optString("vod_actor")); - jSONObject3.put("vod_content", optJSONObject.optString("vod_content").trim()); - JSONArray jSONArray = aa.getJSONArray("video_list"); - LinkedHashMap linkedHashMap = new LinkedHashMap(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject4 = jSONArray.getJSONObject(i); - String string = jSONObject4.getString("code"); - linkedHashMap.put(string, jSONObject4.optString("url")); - JSONArray optJSONArray = jSONObject4.optJSONArray("parse_api"); - this.I4 = jSONObject4.optString("user_agent"); - if (!this.ug.containsKey(string)) { - HashSet hashSet = new HashSet(); - for (int i2 = 0; i2 < optJSONArray.length(); i2++) { - hashSet.add(optJSONArray.optString(i2)); - } - this.ug.put(string, hashSet); - SpiderDebug.log(this.ug.toString()); - } else { - Set set = this.ug.get(string); - for (int i3 = 0; i3 < optJSONArray.length(); i3++) { - set.add(optJSONArray.optString(i3)); - } - } - } - String join = TextUtils.join("$$$", linkedHashMap.keySet()); - String join2 = TextUtils.join("$$$", linkedHashMap.values()); - jSONObject3.put("vod_play_from", join); - jSONObject3.put("vod_play_url", join2); - JSONArray jSONArray2 = new JSONArray(); - jSONArray2.put(jSONObject3); - jSONObject.put("list", jSONArray2); - } catch (Exception unused) { - } - return jSONObject.toString(); - } - - public String homeContent(boolean z) { - String str = "type_id"; - String str2 = "type_name"; - JSONObject jSONObject = new JSONObject(); - try { - JSONArray jSONArray = new JSONObject(qb(OkHttpUtil.string(this.n8 + "api.php/Videolast/nav?csrf=" + URLEncoder.encode(l(zC())), (Map) null), l)).getJSONArray("data"); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject2 = jSONArray.getJSONObject(i); - String string = jSONObject2.getString(str2); - String string2 = jSONObject2.getString(str); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put(str, string2); - jSONObject3.put(str2, string); - JSONObject optJSONObject = jSONObject2.optJSONObject("type_extend"); - if (!z || optJSONObject == null) { - str = str; - str2 = str2; - jSONArray = jSONArray; - } else { - JSONArray jSONArray3 = new JSONArray(); - LinkedHashMap linkedHashMap = new LinkedHashMap(); - linkedHashMap.put("class", "剧情"); - linkedHashMap.put("area", "地区"); - linkedHashMap.put("lang", "语言"); - linkedHashMap.put("year", "年份"); - Iterator it = linkedHashMap.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = (Map.Entry) it.next(); - String string3 = optJSONObject.getString((String) entry.getKey()); - if (!TextUtils.isEmpty(string3)) { - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("key", entry.getKey()); - jSONObject4.put("name", entry.getValue()); - jSONArray3.put(jSONObject4); - String[] split = string3.split(","); - JSONArray jSONArray4 = new JSONArray(); - JSONObject jSONObject5 = new JSONObject(); - jSONObject5.put("n", "全部"); - jSONObject5.put("v", ""); - jSONArray4.put(jSONObject5); - int length = split.length; - int i2 = 0; - while (i2 < length) { - String str3 = split[i2]; - JSONObject jSONObject6 = new JSONObject(); - jSONObject6.put("n", str3); - jSONObject6.put("v", str3); - jSONArray4.put(jSONObject6); - i2++; - jSONArray = jSONArray; - split = split; - } - jSONObject4.put("value", jSONArray4); - it = it; - str = str; - str2 = str2; - jSONArray = jSONArray; - } - } - str = str; - str2 = str2; - jSONArray = jSONArray; - if (!jSONObject.has("filters")) { - jSONObject.put("filters", new JSONObject()); - } - jSONObject.getJSONObject("filters").put(string2, jSONArray3); - } - jSONArray2.put(jSONObject3); - } - jSONObject.put("class", jSONArray2); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(); - } - - public String homeVideoContent() { - JSONObject jSONObject = new JSONObject(); - try { - JSONArray jSONArray = new JSONArray(); - JSONArray jSONArray2 = new JSONObject(qb(OkHttpUtil.string(this.n8 + "api.php/Videolast/indexVideo?csrf=" + URLEncoder.encode(l(zC())), n8()), l)).getJSONArray("data"); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONArray jSONArray3 = jSONArray2.getJSONObject(i).getJSONArray("vlist"); - for (int i2 = 0; i2 < jSONArray3.length(); i2++) { - JSONObject jSONObject2 = jSONArray3.getJSONObject(i2); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", jSONObject2.getString("vod_id")); - jSONObject3.put("vod_name", jSONObject2.getString("vod_name")); - jSONObject3.put("vod_pic", jSONObject2.getString("vod_pic")); - jSONObject3.put("vod_remarks", jSONObject2.getString("vod_remarks")); - jSONArray.put(jSONObject3); - } - } - jSONObject.put("list", jSONArray); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(); - } - - public void init(Context context) { - SP293.super.init(context); - } - - public boolean isVideoFormat(String str) { - return SP293.super.isVideoFormat(str); - } - - public boolean manualVideoCheck() { - return SP293.super.manualVideoCheck(); - } - - public String playerContent(String str, String str2, List list) { - JSONObject jSONObject = new JSONObject(); - try { - jSONObject.put("parse", "0"); - jSONObject.put("playUrl", ""); - SpiderDebug.log(new JSONObject(this.ug).toString()); - if (this.ug.containsKey(str)) { - Iterator it = this.ug.get(str).iterator(); - while (true) { - if (!it.hasNext()) { - break; - } - HashMap hashMap = new HashMap(); - hashMap.put("User-Agent", "hahaha"); - //hashMap.put("Host", "123.56.222.84:2025"); - JSONObject jSONObject2 = new JSONObject(OkHttpUtil.string(it.next() + str2 + "&appId=1000&version=1.3.3&device_id=b08b45ee1124f23b", hashMap)); - String optString = jSONObject2.optString("data"); - - Integer valueOf = Integer.valueOf(jSONObject2.optInt("encryption")); - if (Integer.valueOf(jSONObject2.optInt("code")).intValue() == 1 || (!optString.equals("") && valueOf.intValue() >= 0)) { - if (valueOf.intValue() == 1) { - JSONObject jSONObject3 = new JSONObject(qb(jSONObject2.optString("data"), zcC)); - String optString2 = jSONObject3.optString("url"); - String optString3 = jSONObject3.optString("header"); - if (!TextUtils.isEmpty(optString2)) { - jSONObject.put("url", optString2); - if (!TextUtils.isEmpty(optString3) && optString2.contains("weiyun")) { - jSONObject.put("header", optString3); - } - } - } else if (valueOf.intValue() == 0) { - String optString4 = new JSONObject(optString).optString("url"); - if (!TextUtils.isEmpty(optString4)) { - jSONObject.put("url", optString4); - break; - } - } else { - continue; - } - } - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(); - } - - public String searchContent(String str, boolean z) { - JSONObject jSONObject = new JSONObject(); - try { - JSONArray optJSONArray = new JSONObject(qb(OkHttpUtil.string(this.n8 + "api.php/Videolast/search?pg=1&text=" + URLEncoder.encode(str) + "&pg=1&csrf=" + URLEncoder.encode(l(zC())), n8()), l)).optJSONArray("data"); - JSONArray jSONArray = new JSONArray(); - for (int i = 0; i < optJSONArray.length(); i++) { - JSONObject jSONObject2 = optJSONArray.getJSONObject(i); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", jSONObject2.getString("vod_id")); - jSONObject3.put("vod_name", jSONObject2.getString("vod_name")); - jSONObject3.put("vod_pic", jSONObject2.getString("vod_pic")); - jSONObject3.put("vod_remarks", jSONObject2.getString("vod_remarks")); - jSONArray.put(jSONObject3); - } - jSONObject.put("list", jSONArray); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject.toString(); - } - - public void init(Context context, String str) { - try { - this.n8 = new JSONObject(qb(OkHttpUtil.string("https://alogin.oss-cn-beijing.aliyuncs.com/iphones.json", n8()), zC)).optJSONObject("data").optString("url"); - JSONObject jSONObject = new JSONObject(OkHttpUtil.string("https://agit.ai/fangzimo/TVBox/raw/branch/main/293.txt", (Map) null)); - this.in = jSONObject.optString("appId"); - this.v = jSONObject.optString("version"); - - } catch (Exception e) { - SpiderDebug.log(e); - } - } -} diff --git a/TVBox_Java/spider/SP360.java b/TVBox_Java/spider/SP360.java deleted file mode 100644 index 674e201..0000000 --- a/TVBox_Java/spider/SP360.java +++ /dev/null @@ -1,345 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URL; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - - -public class SP360 extends Spider { - protected JSONObject ext = null; - private static final String SiteHost = "https://api.web.360kan.com/v1/rank?cat=1"; - private static final String SiteFilter = "https://api.web.360kan.com/v1/filter/list"; - private static final String SiteDetail = "https://api.web.360kan.com/v1/detail"; - private static final String SiteSearch = "https://api.so.360kan.com/index?force_v=1&kw=%s&from=&pageno=1&v_ap=1&tab=all"; - - - @Override - public void init(Context context) { - super.init(context); - try { - ext = new JSONObject("{\"classes\":[{\"type_name\":\"电影\",\"type_id\":\"1\"},{\"type_name\":\"电视剧\",\"type_id\":\"2\"},{\"type_name\":\"综艺\",\"type_id\":\"3\"},{\"type_name\":\"动漫\",\"type_id\":\"4\"}],\"filter\":{\"1\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"纪录\",\"v\":\"纪录\"},{\"n\":\"传记\",\"v\":\"传记\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"2\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"军事\",\"v\":\"军事\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"神话\",\"v\":\"神话\"},{\"n\":\"谍战\",\"v\":\"谍战\"},{\"n\":\"青春\",\"v\":\"青春剧\"},{\"n\":\"家庭\",\"v\":\"家庭剧\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"其他\",\"v\":\"其他\"},{\"n\":\"全部\",\"v\":\"\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"3\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"脱口秀\",\"v\":\"脱口秀\"},{\"n\":\"真人秀\",\"v\":\"真人秀\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"八卦\",\"v\":\"八卦\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"晚会\",\"v\":\"晚会\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"职场\",\"v\":\"职场\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"时尚\",\"v\":\"时尚\"},{\"n\":\"游戏\",\"v\":\"游戏\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"体育\",\"v\":\"体育\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"科教\",\"v\":\"科教\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"汽车\",\"v\":\"汽车\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}],\"4\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"美少女\",\"v\":\"美少女\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"恋爱\",\"v\":\"恋爱\"},{\"n\":\"治愈\",\"v\":\"治愈\"},{\"n\":\"幻想\",\"v\":\"幻想\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动物\",\"v\":\"动物\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"儿歌\",\"v\":\"儿歌\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"怪物\",\"v\":\"怪物\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"童话\",\"v\":\"童话\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"友情\",\"v\":\"友情\"},{\"n\":\"真人版\",\"v\":\"真人版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"新番动画\",\"v\":\"新番动画\"},{\"n\":\"完结动画\",\"v\":\"完结动画\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"更早\",\"v\":\"更早\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}]}}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - return headers; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - String cover; - String remark; - try { - String url = SiteFilter + "?catid=" + tid + "&pageno=" + pg; - Set keys = extend.keySet(); - for (String key : keys) { - String val = extend.get(key).trim(); - if (val.length() == 0) - continue; - url += "&" + key + "=" + URLEncoder.encode(val); - } - String content = OkHttpUtil.string(url, Headers()); - JSONObject dataObject = new JSONObject(content).getJSONObject("data"); - JSONArray jsonArray = dataObject.getJSONArray("movies"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - cover = vObj.getString("cover"); - if (vObj.has("upinfo")) { - remark = vObj.getString("upinfo"); - v.put("vod_id", tid + "_" + vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", "https:" + cover); - v.put("vod_remarks", remark); - } else { - v.put("vod_id", tid + "_" + vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", "https:" + cover); - v.put("vod_remarks", ""); - } - videos.put(v); - } - JSONObject result = new JSONObject(); - int limit = 24; - int page = Integer.parseInt(dataObject.getString("current_page")); - int total = dataObject.getInt("total"); - int pageCount = total % limit == 0 ? (total / limit) : (total / limit + 1); - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", total); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - @Override - public String detailContent(List ids) { - Iterator it; - String str; - String str2; - Exception e2; - ArrayList arrayList = new ArrayList(); - Exception e3; - JSONObject result = new JSONObject(); - try { - String[] split = ids.get(0).split("_"); - String format = String.format("%s?cat=%s&id=%s", SiteDetail, split[0], split[1]); - JSONObject jSONObject6 = new JSONObject(OkHttpUtil.string(format, Headers())).getJSONObject("data"); - JSONArray jSONArray = new JSONArray(); - JSONObject list = new JSONObject(); - jSONArray.put(list); - result.put("list", jSONArray); - list.put("vod_id", split[0] + "_" + jSONObject6.optString("ent_id")); - list.put("vod_name", jSONObject6.optString("title")); - list.put("vod_pic", jSONObject6.optString("cdncover")); - JSONArray optJSONArray = jSONObject6.optJSONArray("moviecategory"); - ArrayList arrayList2 = new ArrayList(); - for (int i = 0; i < optJSONArray.length(); i++) { - arrayList2.add(optJSONArray.getString(i)); - } - list.put("type_name", TextUtils.join("/", arrayList2)); - list.put("vod_year", jSONObject6.optString("pubdate")); - JSONArray optJSONArray2 = jSONObject6.optJSONArray("area"); - ArrayList arrayList3 = new ArrayList(); - for (int i2 = 0; i2 < optJSONArray2.length(); i2++) { - arrayList3.add(optJSONArray2.getString(i2)); - } - list.put("vod_area", TextUtils.join("/", arrayList3)); - list.put("vod_remarks", jSONObject6.optString("doubanscore")); - JSONArray optJSONArray3 = jSONObject6.optJSONArray("actor"); - ArrayList arrayList4 = new ArrayList(); - for (int i3 = 0; i3 < optJSONArray3.length(); i3++) { - arrayList4.add(optJSONArray3.getString(i3)); - } - list.put("vod_actor", TextUtils.join("/", arrayList4)); - JSONArray optJSONArray4 = jSONObject6.optJSONArray("director"); - ArrayList arrayList5 = new ArrayList(); - for (int i4 = 0; i4 < optJSONArray4.length(); i4++) { - arrayList5.add(optJSONArray4.getString(i4)); - } - list.put("vod_director", TextUtils.join("/", arrayList5)); - list.put("vod_content", jSONObject6.optString("description")); - JSONArray optJSONArray5 = jSONObject6.optJSONArray("playlink_sites"); - ArrayList arrayList6 = new ArrayList(); - for (int i5 = 0; i5 < optJSONArray5.length(); i5++) { - arrayList6.add(optJSONArray5.getString(i5)); - } - list.put("vod_play_from", TextUtils.join("$$$", arrayList6)); - JSONObject optJSONObject = jSONObject6.optJSONObject("playlinksdetail"); - JSONObject optJSONObject2 = jSONObject6.optJSONObject("allepidetail"); - JSONArray optJSONArray6 = jSONObject6.optJSONArray("defaultepisode"); - JSONObject optJSONObject3 = jSONObject6.optJSONObject("allupinfo"); - String str7 = "vod_play_url"; - if (optJSONArray6 != null) { - ArrayList arrayList7 = new ArrayList(); - for (int i6 = 0; i6 < optJSONArray6.length(); i6++) { - try { - URL url2 = new URL(optJSONArray6.getJSONObject(i6).optString("url")); - arrayList7.add(optJSONArray6.getJSONObject(i6).optString("sort") + "$" + (url2.getProtocol() + "://" + url2.getHost() + url2.getPath())); - } catch (Exception e4) { - SpiderDebug.log(e4); - } - } - list.put(str7, TextUtils.join("#", arrayList7)); - return result.toString(); - } - if (optJSONObject2 == null) { - ArrayList arrayList8 = new ArrayList(); - for (String str8 : arrayList6) { - try { - URL url3 = new URL(optJSONObject.getJSONObject(str8).optString("default_url")); - arrayList8.add(optJSONObject.getJSONObject(str8).optString("sort") + "$" + (url3.getProtocol() + "://" + url3.getHost() + url3.getPath())); - } catch (Exception e5) { - SpiderDebug.log(e5); - } - } - list.put(str7, TextUtils.join("$$$", arrayList8)); - } else { - ArrayList videos = new ArrayList(); - Iterator it2 = arrayList6.iterator(); - while (it2.hasNext()) { - String str9 = (String) it2.next(); - int parseInt = Integer.parseInt(optJSONObject3.optString(str9, "0")); - if (parseInt > 50 || parseInt == 0) { - it = it2; - str = format + "&start=1&end=50&site=" + str9; - } else { - StringBuilder sb2 = new StringBuilder(); - sb2.append(format); - it = it2; - sb2.append("&start=1&end="); - sb2.append(parseInt); - sb2.append("&site="); - sb2.append(str9); - str = sb2.toString(); - } - JSONObject optJSONObject4 = new JSONObject(OkHttpUtil.string(str, Headers())).getJSONObject("data").optJSONObject("allepidetail"); - ArrayList arrayList10 = new ArrayList(); - JSONArray jSONArray2 = optJSONObject4.getJSONArray(str9); - int i7 = 0; - while (true) { - str2 = str7; - if (i7 >= jSONArray2.length()) { - break; - } - try { - String url5 = jSONArray2.getJSONObject(i7).optString("url"); - arrayList = videos; - arrayList10.add(jSONArray2.getJSONObject(i7).optString("playlink_num") + "$" + url5); - } catch (Exception e7) { - e3 = e7; - SpiderDebug.log(e3); - i7++; - } - i7++; - str7 = str2; - videos = arrayList; - } - ArrayList arrayList11 = videos; - if (parseInt >= jSONArray2.length()) { - int i8 = 51; - while (i8 < parseInt) { - int i9 = i8 + 49; - if (i9 > parseInt) { - i9 = parseInt; - } - JSONObject optJSONObject5 = new JSONObject(OkHttpUtil.string(String.format("%s?cat=%s&id=%s&start=%s&end=%s&site=%s", SiteDetail, split[0], split[1], Integer.valueOf(i8), Integer.valueOf(i9), str9), Headers())).optJSONObject("data"); - if (optJSONObject5 == null) { - break; - } - JSONArray jSONArray3 = optJSONObject5.getJSONObject("allepidetail").getJSONArray(str9); - int i10 = 0; - while (i10 < jSONArray3.length()) { - try { - String url4 = jSONArray3.getJSONObject(i10).optString("url"); - try { - arrayList10.add(jSONArray3.getJSONObject(i10).optString("playlink_num") + "$" + url4); - } catch (Exception e8) { - e2 = e8; - SpiderDebug.log(e2); - i10++; - } - } catch (Exception e9) { - } - i10++; - } - i8 = i9 + 1; - } - } - arrayList11.add(TextUtils.join("#", arrayList10)); - videos = arrayList11; - it2 = it; - str7 = str2; - } - list.put(str7, TextUtils.join("$$$", videos)); - } - return result.toString(); - } catch (Exception e10) { - SpiderDebug.log(e10); - return ""; - } - } - - @Override - public String homeContent(boolean filter) { - JSONObject results = new JSONObject(); - try { - results.put("class", ext.getJSONArray("classes")); - if (filter) { - results.put("filters", ext.getJSONObject("filter")); - } - } catch (JSONException e2) { - SpiderDebug.log(e2); - } - return results.toString(); - } - - @Override - public String homeVideoContent() { - JSONObject list = new JSONObject(); - try { - String str = SiteHost; - String i = OkHttpUtil.string(str, new HashMap()); - SpiderDebug.log("响应请求:" + str); - JSONArray optJSONArray = new JSONObject(i).optJSONArray("data"); - JSONArray jSONArray = new JSONArray(); - for (int j = 0; j < optJSONArray.length(); j++) { - JSONObject jSONObject2 = optJSONArray.getJSONObject(j); - JSONObject VideoAtom = new JSONObject(); - VideoAtom.put("vod_id", jSONObject2.optString("cat") + "_" + jSONObject2.optString("ent_id")); - VideoAtom.put("vod_name", jSONObject2.optString("title")); - VideoAtom.put("vod_pic", jSONObject2.optString("cover")); - VideoAtom.put("vod_remarks", jSONObject2.optString("upinfo")); - jSONArray.put(VideoAtom); - } - list.put("list", jSONArray); - } catch (Exception e2) { - SpiderDebug.log(e2); - } - return list.toString(); - } - - @Override - public String playerContent(String str, String str2, List list) { - JSONObject result = new JSONObject(); - try { - result.put("parse", 1); - result.put("url", str2); - result.put("jx", "1"); - result.put("playUrl", ""); - } catch (Exception e2) { - SpiderDebug.log(e2); - } - return result.toString(); - } - - @Override - public String searchContent(String str, boolean filter) { - JSONObject optJSONObject; - JSONObject list = new JSONObject(); - try { - JSONObject optJSONObject2 = new JSONObject(OkHttpUtil.string(String.format(SiteSearch, str), Headers())).optJSONObject("data"); - if (!(optJSONObject2 == null || (optJSONObject = optJSONObject2.optJSONObject("longData")) == null)) { - JSONArray jSONArray = optJSONObject.getJSONArray("rows"); - JSONArray videos = new JSONArray(); - list.put("list", videos); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject Obj = jSONArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", Obj.optString("cat_id") + "_" + Obj.optString("en_id")); - v.put("vod_name", Obj.optString("titleTxt")); - v.put("vod_pic", Obj.optString("cover")); - v.put("vod_remarks", Obj.optString("score")); - videos.put(v); - } - } - } catch (Exception e2) { - SpiderDebug.log(e2); - } - return list.toString(); - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Smdyy.java b/TVBox_Java/spider/Smdyy.java deleted file mode 100644 index 51fc818..0000000 --- a/TVBox_Java/spider/Smdyy.java +++ /dev/null @@ -1,514 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - - -/** - * 神马影院 - *

- * Author: baddychen - */ -public class Smdyy extends Spider { - private static final String siteUrl = "https://www.smdyy.cc"; - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/list/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/kan/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/show/(\\S+).html"); - - protected String ext = null; - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"duoduozy\":{\"show\":\"高清线路\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"sohu\":{\"show\":\"优选7\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"qq\":{\"show\":\"优选3\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"bilibili\":{\"show\":\"bilibili\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"youku\":{\"show\":\"优选1\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"qiyi\":{\"show\":\"优选2\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"letv\":{\"show\":\"优选6\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"xigua\":{\"show\":\"西瓜视频\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"mgtv\":{\"show\":\"优选4\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"tkm3u8\":{\"show\":\"备用\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"},\"pptv\":{\"show\":\"优选5\",\"or\":999,\"ps\":\"0\",\"parse\":\"https://player.6080kan.cc/player/play.php?url=\"}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"犯罪片\",\"v\":\"20\"},{\"n\":\"惊悚片\",\"v\":\"21\"},{\"n\":\"冒险片\",\"v\":\"22\"},{\"n\":\"悬疑片\",\"v\":\"23\"},{\"n\":\"武侠片\",\"v\":\"24\"},{\"n\":\"奇幻片\",\"v\":\"25\"},{\"n\":\"纪录片\",\"v\":\"26\"},{\"n\":\"动画片\",\"v\":\"27\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"}]}],\"2\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"28\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"3\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - if (!TextUtils.isEmpty(url)) { - headers.put("Referer", url); - } - headers.put("Accept-Encoding", "gzip, deflate, br"); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headers.put("Accept-Language", "zh-CN,zh;q=0.9"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.stui-header__menu > li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = true; - if (filter) { - show = name.equals("电影") || - name.equals("电视剧") || - name.equals("动漫"); - } - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - Elements list = doc.select("div.stui-pannel div.stui-pannel__bd ul.stui-vodlist li div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String title = vod.selectFirst(".stui-vodlist__thumb").attr("title"); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.trim().length() == 0) - continue; - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/show/" + TextUtils.join("-", urlParams) + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - Elements pageInfo = doc.select("ul.stui-page__item li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - String wy = doc.select("ul.stui-page__item li a").last().attr("href"); - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("ul.stui-vodlist li div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".stui-vodlist__thumb").attr("title"); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - private static String Regex(Pattern pattern, String content) { - if (pattern == null) { - return content; - } - try { - Matcher matcher = pattern.matcher(content); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return content; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/kan/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("a.pic img").attr("data-original"); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - String title = doc.selectFirst("div.stui-content__detail h1.title").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = ""; - Elements data = doc.select("p.data"); - desc = doc.selectFirst("span.detail-content").text().trim(); - category = Regex(Pattern.compile("类型:(\\S+)"), data.get(0).text()); - area = Regex(Pattern.compile("地区:(\\S+)"), data.get(0).text()); - year = Regex(Pattern.compile("年份:(\\S+)"), data.get(0).text()); - actor = Regex(Pattern.compile("主演:(\\S+)"), data.get(1).text()); - director = Regex(Pattern.compile("导演:(\\S+)"), data.get(1).text()); - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.stui-vodlist__head"); - //Elements sourceList = doc.select("div.stui-vodlist__head > ul.stui-content__playlist"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.selectFirst("h3").text().trim(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { - //sourceName = flag; - sourceName = playerConfig.getJSONObject(flag).getString("show"); - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = source.select("ul.stui-content__playlist > li > a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - - private final Pattern urlt = Pattern.compile("\"url\": *\"([^\"]*)\","); - private final Pattern token = Pattern.compile("\"token\": *\"([^\"]*)\""); - private final Pattern vkey = Pattern.compile("\"vkey\": *\"([^\"]*)\","); - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject headers = new JSONObject(); - headers.put("Referer", " https://www.smdyy.cc/"); - headers.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); - headers.put("Accept", " text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6"); - headers.put("Accept-Encoding", " gzip, deflate"); - String url = siteUrl + "/play/" + id + ".html"; - Elements allScript = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))).select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - JSONObject player = new JSONObject(scContent.substring(scContent.indexOf('{'), scContent.lastIndexOf('}') + 1)); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - //String jxurl = "https://player.tjomet.com/lgyy/?url=" + player.getString("url"); - String jxurl = pCfg.getString("parse") + player.getString("url"); - Document doc = Jsoup.parse(OkHttpUtil.string(jxurl, getHeaders(jxurl))); - Elements script = doc.select("body>script"); - for (int j = 0; j < script.size(); j++) { - String Content = script.get(j).html().trim(); - Matcher matcher = urlt.matcher(Content); - if (!matcher.find()) { - return ""; - } - String urlt = matcher.group(1); - Matcher matcher1 = token.matcher(Content); - if (!matcher1.find()) { - return ""; - } - String token = matcher1.group(1); - Matcher matcher2 = vkey.matcher(Content); - if (!matcher2.find()) { - return ""; - } - String vkey = matcher2.group(1); - HashMap hashMap = new HashMap(); - hashMap.put("token", token); - hashMap.put("url", urlt); - hashMap.put("vkey", vkey); - hashMap.put("sign", "smdyycc"); - OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://player.6080kan.cc/player/xinapi.php", hashMap, new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - String url = new String(Base64.decode(new JSONObject(str).getString("url").substring(8).getBytes(), 0)); - result.put("url", url.substring(8, url.length() - 8)); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - result.put("header", headers.toString()); - result.put("parse", 0); - result.put("playUrl", ""); - - } - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Tangrenjie.java b/TVBox_Java/spider/Tangrenjie.java deleted file mode 100644 index 45789c7..0000000 --- a/TVBox_Java/spider/Tangrenjie.java +++ /dev/null @@ -1,538 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; -import android.widget.Switch; - -import java.net.URLDecoder; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Tangrenjie extends Spider { - private static final String siteUrl = "https://www.tangrenjie.tv"; - private static final String siteHost = "tangrenjie.tv"; - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vod/type/id/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/vod/detail/id/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html"); - private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"if101\":{\"show\":\"蓝光一\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\",\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"cateId\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2000\",\"v\":\"2000\"},{\"n\":\"1997\",\"v\":\"1997\"},{\"n\":\"1980\",\"v\":\"1980\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"cateId\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"海外剧\",\"v\":\"27\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2000\",\"v\":\"2000\"},{\"n\":\"1997\",\"v\":\"1997\"},{\"n\":\"1980\",\"v\":\"1980\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2000\",\"v\":\"2000\"},{\"n\":\"1997\",\"v\":\"1997\"},{\"n\":\"1980\",\"v\":\"1980\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"cateId\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"纪录片\",\"v\":\"28\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2000\",\"v\":\"2000\"},{\"n\":\"1997\",\"v\":\"1997\"},{\"n\":\"1980\",\"v\":\"1980\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.top_nav li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - Elements b = ele.select("b"); - String name = b.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("动漫") || - name.equals("综艺") ; - - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.cbox1").get(1); - Elements list = homeList.select("ul.vodlist li.vodlist_item"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("a.vodlist_thumb").attr("title"); - String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original"); - String remark = vod.select("span.pic_text b").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href")); - if (!matcher.find()) - continue; - String id = "1="+ matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/vod/show/id/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.page"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("li a"); - if (a == null) - continue; - String span = pageInfo.select("li.active a").text(); - String wy = doc.select("ul.page li a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("ul.vodlist li.vodlist_item"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("a.vodlist_thumb").attr("title"); - String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original"); - String remark = vod.select("span.pic_text b").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href")); - if (!matcher.find()) - continue; - String id = tid + "=" + matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 20); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 20); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String[] idd = ids.get(0).split("="); - String tid =idd[0]; - String detail = idd[1]; - String url = siteUrl + "/vod/detail/id/" + detail + ".html"; - String htmltemp = OkHttpUtil.string(url, getHeaders(url)); - String htmlsrc =""; - if(tid.equals("1")){ - htmlsrc = htmltemp.substring(0,25000); - }else{ - htmlsrc = htmltemp; - } - Document doc = Jsoup.parse(htmlsrc); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - // 取基本数据 - String vid = doc.selectFirst("div.content_thumb a").attr("href"); - String cover = siteUrl + doc.selectFirst("div.content_thumb a").attr("data-original"); - String title = doc.selectFirst("div.content_thumb a").attr("title"); - String desc = doc.selectFirst("div.content > section > font").text(); - String category = "", area = "", year = "", director = "", actor = "", remark = ""; - remark = doc.select("span.data_style b").text(); - Elements span_text_muted = doc.select("li.data span"); - for (int i = 0; i < span_text_muted.size() - 2; i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.contains("类型")) { - try { - String cate = text.parent().text(); - category =cate.substring(3); - } catch (Exception e) { - category = ""; - } - } else if (info.contains("年份")) { - try { - year = text.parent().select("a").get(0).text(); - } catch (Exception e) { - year = ""; - } - } else if (info.contains("地区")) { - try { - area = text.parent().select("a").get(0).text(); - } catch (Exception e) { - area = ""; - } - } - } - List actors = new ArrayList<>(); - Elements aa = doc.select("li.data").get(0).select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - List directors = new ArrayList<>(); - Elements bb = doc.select("li.data").get(1).select("a"); - for (int j = 0; j < bb.size(); j++) { - directors.add(bb.get(j).text()); - } - director = TextUtils.join(",", directors); - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.play_source_tab a"); - Elements sourceList = doc.select("div.playlist_full"); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.attr("alt"); - sourceName = sourceName.replaceAll("[^\u4E00-\u9FA5]", ""); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul>li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3); - vodItems.add( vod.text() + "$" + playURL + "="+ tid); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String[] idd = id.split("="); - String tid =idd[1]; - String detail = idd[0]; - String url = siteUrl + "/vod/play/id/" + detail + ".html"; - String htmltemp = OkHttpUtil.string(url, getHeaders(url)); - String htmlsrc =""; - if(tid.equals("1")){ - htmlsrc = htmltemp.substring(0,25000); - }else{ - htmlsrc = htmltemp; - } - Document doc = Jsoup.parse(htmlsrc); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).toString(); - if (scContent.contains("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - String urlsrc = player.getString("url"); - String urlb64 = new String(Base64.decode(urlsrc.getBytes(), Base64.DEFAULT)); - String urldec = URLDecoder.decode(urlb64,"UTF-8"); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", urldec); - result.put("header", ""); - break; - } - - } - //无直链则嗅探 - String uu = result.getString("url"); - if (!(uu.length() >0)){ - result.put("parse", 1); - result.put("url", url); - } - - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = siteUrl + "/vod/search.html?wd=" + URLEncoder.encode(key) + "&submit="; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("li.searchlist_item"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String classes = vod.selectFirst("h4.vodlist_title > a >span").text(); - String tid=""; - switch (classes) { - case "电影": - tid = "1"; - break; - case "电视剧": - tid = "2"; - break; - case "综艺": - tid = "3"; - break; - case "动漫": - tid = "4"; - break; - } - String title = vod.selectFirst("a.vodlist_thumb").attr("title"); - String cover = siteUrl + vod.selectFirst("a.vodlist_thumb").attr("data-original"); - String remark = vod.select("span.pic_text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst("a.vodlist_thumb").attr("href")); - if (!matcher.find()) - continue; - String id = tid + "=" + matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - - @Override - public boolean manualVideoCheck() { - return true; - } - - private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv"}; - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } - -} diff --git a/TVBox_Java/spider/Upyunso.java b/TVBox_Java/spider/Upyunso.java deleted file mode 100644 index 95e9a5f..0000000 --- a/TVBox_Java/spider/Upyunso.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - - -public class Upyunso extends Spider { - private PushAgent pushAgent; - private static String siteUrl = "https://www.upyunso.com/"; - private static String apiUrl = "https://api.upyunso2.com/"; - private static Pattern aliyun = Pattern.compile("(https:\\/\\/www.aliyundrive.com\\/s\\/[^\\\"]+)"); - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - pushAgent = new PushAgent(); - pushAgent.init(context, extend); - } - - @Override - public String detailContent(List list) { - try { - Pattern pattern = aliyun; - if (pattern.matcher(list.get(0)).find()) { - return pushAgent.detailContent(list); - } - String jqurl=(apiUrl+list.get(0)).replace(".html",""); - String jxUrl=new String(Base64.decode(OkHttpUtil.string(jqurl, sHeaders()), Base64.DEFAULT)); - String realUrl= new JSONObject(jxUrl).getJSONObject("result").getString("res_url"); - Matcher matcher = pattern.matcher(realUrl); - if (!matcher.find()) { - return ""; - } - list.set(0, matcher.group(1).replaceAll("\\\\", "")); - return pushAgent.detailContent(list); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - @Override - public String playerContent(String str, String str2, List list) { - return pushAgent.playerContent(str, str2, list); - } - -// protected static HashMap Headers() { -// HashMap headers = new HashMap<>(); -// headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); -// headers.put("origin", "https://www.upyunso.com"); -// return headers; -// } - - protected static HashMap sHeaders() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - return headers; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - String cover = "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000"; - - String searchurl = apiUrl + "search?keyword=" + URLEncoder.encode(key) + "&page=1&s_type=2"; - String content = new String(Base64.decode(OkHttpUtil.string(searchurl, sHeaders()), Base64.DEFAULT)); - JSONArray playList = new JSONObject(content).getJSONObject("result").getJSONArray("items"); - - - for (int i = 0; i < playList.length(); i++) { - JSONArray source = playList.getJSONObject(i).getJSONArray("content"); - for (int j = 0; j < source.length(); j++) { - JSONObject vid = source.getJSONObject(j); - String sourceName = vid.getString("title"); - String sourceUrl = vid.getString("size"); - if (sourceUrl.contains("download.html")) { - JSONObject v = new JSONObject(); - v.put("vod_name", sourceName); - v.put("vod_id", sourceUrl); - v.put("vod_pic", cover); - videos.put(v); - } else - continue; - - } - - } - result.put("list", videos); - return result.toString(); - - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Vid.java b/TVBox_Java/spider/Vid.java deleted file mode 100644 index 0ca2237..0000000 --- a/TVBox_Java/spider/Vid.java +++ /dev/null @@ -1,503 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.LinkedHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Headers; - -public class Vid extends Spider { - private static final String siteUrl = "http://www.panghuys.com"; - private static final String siteHost = "www.panghuys.com"; - private String cookie=""; - private String referer=""; - - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/v/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/ph/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"cokebb\":{\"sh\":\"極速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"mp4\":{\"sh\":\"藍光路线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cokemv\":{\"sh\":\"高速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cokemv001\":{\"sh\":\"海外線路\",\"pu\":\"\",\"sn\":0,\"or\":999},\"ddzy\":{\"sh\":\"蓝光采集(暂时)\",\"pu\":\"\",\"sn\":0,\"or\":999},\"tkm3u8\":{\"sh\":\"采集路线\",\"pu\":\"\",\"sn\":0,\"or\":999},\"if101\":{\"sh\":\"海外(禁國內)\",\"pu\":\"\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"5\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜劇\"},{\"n\":\"爱情\",\"v\":\"愛情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"動作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"劇情\"},{\"n\":\"战争\",\"v\":\"戰爭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"動畫\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"悬疑\",\"v\":\"懸疑\"},{\"n\":\"微电影\",\"v\":\"微電影\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"國語\"},{\"n\":\"英语\",\"v\":\"英語\"},{\"n\":\"粤语\",\"v\":\"粵語\"},{\"n\":\"闽南语\",\"v\":\"閩南語\"},{\"n\":\"韩语\",\"v\":\"韓語\"},{\"n\":\"日语\",\"v\":\"日語\"},{\"n\":\"法语\",\"v\":\"法語\"},{\"n\":\"德语\",\"v\":\"德語\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"大陆剧\",\"v\":\"13\"},{\"n\":\"香港剧\",\"v\":\"14\"},{\"n\":\"韩国剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"日本剧\",\"v\":\"20\"},{\"n\":\"台湾剧\",\"v\":\"21\"},{\"n\":\"泰国剧\",\"v\":\"22\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"1\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"犯罪片\",\"v\":\"23\"},{\"n\":\"奇幻片\",\"v\":\"24\"},{\"n\":\"悬疑片\",\"v\":\"25\"},{\"n\":\"记录片\",\"v\":\"27\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"动画电影\",\"v\":\"41\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders2(siteUrl,referer))); - // 分类节点 - Elements elements = doc.select("ul.navbar-items>li.navbar-item>a"); - System.out.println("shouye" + elements); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("剧集") || - name.equals("动漫") || - name.equals("综艺"); - - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div[class='module-items module-poster-items-base'] >a"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - Matcher matcher = regexVid.matcher(vod.selectFirst(".module-poster-item").attr("href")); - if (!matcher.find()) - continue; - String title = vod.selectFirst(".module-poster-item").attr("title"); - String cover = vod.selectFirst("div.module-item-cover div.module-item-pic img").attr("data-original"); - String remark = vod.selectFirst("div.module-item-cover div.module-item-note").text(); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/vodshow/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id=page]"); - System.out.println("pg++" + pageInfo); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = doc.select("span.page-current").text(); - String wy = doc.select("div[id=page] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.module-items.module-poster-items-base a "); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("img.lazy.lazyload").attr("data-original"); - String remark = vod.select("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/v/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url,getHeaders2(url,referer))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.module-item-cover div.module-item-pic > img").attr("data-original"); - String title = doc.selectFirst("div.module-info-main div.module-info-heading > h1").text(); - String desc = doc.selectFirst("div.module-info-item div.module-info-introduction-content > p").text().trim(); - - - String category = "", area = "", year = "", director = "", actor = ""; - category = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(2).text(); - area = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(1).text(); - year = doc.select("div.module-info-main div.module-info-heading div.module-info-tag-link").get(0).text(); - - Elements span_text_muted = doc.select("div.module-info-content div.module-info-items div.module-info-item"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.select("span").text(); - if (info.contains("导演")) { - try { - director = text.select("div > a").text(); - } catch (Exception e) { - director = ""; - } - } else if (info.contains("主演")) { - try { - actor = text.select("div > a").text(); - } catch (Exception e) { - actor = ""; - } - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new LinkedHashMap<>(); - /* Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - });*/ - - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-items-box>div>span"); - System.out.print("sor++" + sources); - Elements sourceList = doc.select("div.module-list>div.module-play-list"); - System.out.print("sor1++" + sourceList); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - // boolean found = false; - boolean found = true; - // for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - // String flag = it.next(); - // if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - // sourceName = playerConfig.getJSONObject(flag).getString("sh"); - // found = true; - // break; - // } - // } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("div.module-play-list-content>a"); - System.out.print("pl++" + playList); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " http://www.panghuys.com"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/ph/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders2(String url,String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(!ref.equals("google")){ - headers.put("Authority", "www.panghuys.com"); - if(ref.length()>0){ - if(ref.equals("origin")){ - headers.put("Origin", "http://www.panghuys.com"); - } else { - headers.put("Referer", ref); - } - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - protected void getCookie(){ - cookie=""; - String cookieurl="http://www.panghuys.com/zzzzz"; - Map> cookies = new HashMap<>(); - OkHttpUtil.string(cookieurl,getHeaders2(cookieurl,""),cookies); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = TextUtils.join(";",entry.getValue()); - break; - } - } - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=35×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Voflix.java b/TVBox_Java/spider/Voflix.java deleted file mode 100644 index 43447ed..0000000 --- a/TVBox_Java/spider/Voflix.java +++ /dev/null @@ -1,499 +0,0 @@ - package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; -import okhttp3.Headers; - -public class Voflix extends Spider { - private static final String siteUrl = "https://www.voflix.com"; - private static final String siteHost = "www.voflix.com"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/type/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/detail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/show/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"duoduozy\":{\"show\":\"VOFLIX\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"LINE406\":{\"show\":\"LINE406\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"LINE407\":{\"show\":\"LINE407\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"LINE408\":{\"show\":\"LINE408\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"p300\":{\"show\":\"LINE300\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"p301\":{\"show\":\"LINE301\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"line402-日语\":{\"show\":\"LINE402\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"LINE400\":{\"show\":\"LINE400\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"line401\":{\"show\":\"LINE401\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe268\":{\"show\":\"LINE268\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe290\":{\"show\":\"LINE290\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe291\":{\"show\":\"LINE291\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe296\":{\"show\":\"LINE296\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe297\":{\"show\":\"LINE297\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe307\":{\"show\":\"LINE307\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe308\":{\"show\":\"LINE308\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe309\":{\"show\":\"LINE309\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"line301\":{\"show\":\"LINE333\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"line302\":{\"show\":\"LINE302\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"LINE405\":{\"show\":\"LINE405\",\"des\":\"更多极速线路请访问APP\",\"ps\":\"0\",\"parse\":\"\"},\"LINE409\":{\"show\":\"LINE409\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"banquan\":{\"show\":\"已下架\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe261\":{\"show\":\"LINE261\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe265\":{\"show\":\"LINE265\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe278\":{\"show\":\"LINE278\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe306\":{\"show\":\"LINE306\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe317\":{\"show\":\"LINE317\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"xg_app_player\":{\"show\":\"app全局解析\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"\"},\"iframe257\":{\"show\":\"LINE257\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe263\":{\"show\":\"LINE263\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe258\":{\"show\":\"LINE258\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe267\":{\"show\":\"LINE267\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe\":{\"show\":\"LINE200\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe262\":{\"show\":\"LINE262\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"iframe266\":{\"show\":\"LINE266\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"dplayer3\":{\"show\":\"播放线路3\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"dplayer2\":{\"show\":\"播放线路2\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"dplayer\":{\"show\":\"播放线路1\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"xunlei1\":{\"show\":\"百度云盘\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"if101国外\":{\"show\":\"VOFLIX_海外\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://demo.if101.tv/player/?url=\"},\"aliyun\":{\"show\":\"阿里云盘\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"xunlei2\":{\"show\":\"迅雷云盘\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"\":{\"show\":\"\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"LINE1080\":{\"show\":\"LINE1080\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"app\":{\"show\":\"LINEAPP\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"},\"kuake\":{\"show\":\"夸克网盘\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"\"}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧\",\"v\":\"7\"},{\"n\":\"爱情\",\"v\":\"8\"},{\"n\":\"科幻\",\"v\":\"9\"},{\"n\":\"恐怖\",\"v\":\"10\"},{\"n\":\"剧情\",\"v\":\"11\"},{\"n\":\"战争\",\"v\":\"12\"},{\"n\":\"动画\",\"v\":\"23\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"港台剧\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"纪录片\",\"v\":\"21\"},{\"n\":\"泰国剧\",\"v\":\"24\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"马来西亚\",\"v\":\"马来西亚\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国\",\"v\":\"中国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - protected static HashMap postHeaders() { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - hashMap.put("Origin", " siteUrl"); - return hashMap; - } - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.navbar-items>li.navbar-item>a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("剧集") || - name.equals("动漫") || - name.equals("综艺") || - name.equals("国产剧") || - name.equals("日韩剧") || - name.equals("欧美剧"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.module-main.scroll-box").get(0); - Elements list = homeList.select("div.module-items.module-poster-items-small.scroll-content a"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("img.lazy.lazyload").attr("data-original"); - String remark = vod.select("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/show/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("div[id=page]"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String span = doc.select("span.page-current").text(); - String wy = doc.select("div[id=page] a").last().attr("href"); - if (page == -1) { - page = Integer.parseInt(span); - } else { - page = 0; - } - Matcher matcher = regexPage.matcher(wy); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - - } - } - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.module-items.module-poster-items-base a "); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("img.lazy.lazyload").attr("data-original"); - String remark = vod.select("div.module-item-note").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/video/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - // 取基本数据 - String cover = doc.selectFirst("div.module-item-pic > img").attr("data-src"); - String title = doc.selectFirst("div.video-info-header > h1.page-title").text(); - String desc = doc.select("div.video-info-content").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - // 取播放列表数据 - Elements sources = doc.select("div[id='y-playList'] span"); - - Elements sourceList = doc.select("div.module-play-list"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("a.module-play-list-link "); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - private final Pattern urlt = Pattern.compile("\"url\": *\"([^\"]*)\","); - private final Pattern token = Pattern.compile("\"token\": *\"([^\"]*)\""); - private final Pattern vkey = Pattern.compile("\"vkey\": *\"([^\"]*)\","); -// private final Pattern tm = Pattern.compile("\"tm\": *\"([^\"]*)\","); - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - - String url = siteUrl + "/play/" + id + ".html"; - // JSONObject headers = new JSONObject(); - // headers.put("origin", " https://www.jubaibai.me/"); - // headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - // headers.put("Accept", " */*"); - // headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - // headers.put("Accept-Encoding", " gzip, deflate"); - - // 播放页 url - Elements allScript = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))).select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_aaaa")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - System.out.println("pla" + player); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - System.out.println("pc" + pCfg); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("parse"); - String show = pCfg.getString("show"); - if (show.contains("VOFLIX")) { - String jxurl = "https://play.shcpin.com/xplay/?url=" + videoUrl; - System.out.println("jx" + jxurl); - HashMap headers = new HashMap<>(); - headers.put("referer", siteUrl); - Document doc = Jsoup.parse(OkHttpUtil.string(jxurl,headers)); - System.out.println("zh" + doc); - Elements script = doc.select("body>script"); - for (int j = 0; j < script.size(); j++) { - String content = script.get(j).html().trim(); - if (content.contains("var config =")){ - Matcher matcher1 = urlt.matcher(content); - if (!matcher1.find()) - continue; - Matcher matcher2 = token.matcher(content); - if (!matcher2.find()) - continue; - Matcher matcher3 = vkey.matcher(content); - if (!matcher3.find()) - continue; - String video_url = matcher1.group(1); - String video_token = matcher2.group(1); - String video_key = matcher3.group(1); - String video_sign= "F4penExTGogdt6U8" ; - String video_tm = String.valueOf(System.currentTimeMillis()/ 1000); - HashMap hashMap = new HashMap(); - hashMap.put("token", video_token); - hashMap.put("tm", video_tm); - hashMap.put("url", video_url); - hashMap.put("vkey", video_key); - hashMap.put("sign", video_sign); - OkHttpUtil.get(OkHttpUtil.defaultClient(), "https://play.shcpin.com/xplay/555tZ4pvzHE3BpiO838.php", hashMap, new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - String url = new String(Base64.decode(new JSONObject(str).getString("url").substring(8).getBytes(), Base64.DEFAULT)); - result.put("url", url.substring(8, url.length() - 8)); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - } - } - // result.put("header", headers.toString()); - result.put("parse", 0); - result.put("playUrl", ""); - } else { - if (videoUrl.contains(".m3u8")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videoUrl); - // result.put("header", headers.toString()); - } - } - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=35×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Wybg.java b/TVBox_Java/spider/Wybg.java deleted file mode 100644 index 9b77c2e..0000000 --- a/TVBox_Java/spider/Wybg.java +++ /dev/null @@ -1,481 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URL; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - - -/** - * - *

- * - */ -public class Wybg extends Spider { - private static final String siteUrl = "https://www.wybg666.com"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - private Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/voddetail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"duoduozy\":{\"show\":\"蓝光专线\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"sohu\":{\"show\":\"搜狐\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"qq\":{\"show\":\"腾讯\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"bilibili\":{\"show\":\"哔哩\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"youku\":{\"show\":\"优酷\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"qiyi\":{\"show\":\"爱奇艺\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"mgtv\":{\"show\":\"芒果\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"xigua\":{\"show\":\"西瓜\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"},\"pptv\":{\"show\":\"PPTV\",\"des\":\"\",\"ps\":\"0\",\"parse\":\"https://player.tjomet.com/lgyy/?url=\"}}"); - filterConfig = new JSONObject("{}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - if (!TextUtils.isEmpty(url)) { - headers.put("Referer", url); - } - headers.put("Accept-Encoding", "gzip, deflate, br"); - headers.put("upgrade-insecure-requests", "1"); - headers.put("DNT", "1"); - headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"); - headers.put("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headers.put("accept-language", "zh-CN,zh;q=0.9"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(new URL(siteUrl).openStream(), "utf-8",OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul[class='stui_header__user'] >li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = true; - if (filter) { - show = name.equals("电影") || - name.equals("电视剧") || - name.equals("综艺") || - name.equals("动漫") || - name.equals("纪录片"); - } - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - Element homeList = doc.select("ul.stui-vodlist").get(0); - Elements list = homeList.select("div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("a").attr("data-original"); - String remark = vod.select("a .pic-text").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.trim().length() == 0) - continue; - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/vodshow/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(new URL(url).openStream(), "utf-8",OkHttpUtil.string(url, getHeaders(url))); - - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - Elements pageInfo = doc.select("div[id='page'] a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("page-current")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("a").attr("data-original"); - String remark = vod.select("a .pic-text").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - private static String Regex(Pattern pattern, String content) { - if (pattern == null) { - return content; - } - try { - Matcher matcher = pattern.matcher(content); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return content; - } - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.stui-content__thumb img").attr("data-original"); - String title = doc.selectFirst("div.stui-content__detail h1").text(); - String desc = doc.selectFirst("span.detail-content").text(); - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("vod_content", desc); - - Map vod_play = new LinkedHashMap<>(); - - // 取播放列表数据 - Elements sources = doc.select("div.stui-pannel__head ul.nav li a"); - Elements sourceList = doc.select("div.tab-content div.clearfix"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("li a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - - private final Pattern urlt = Pattern.compile("\"url\": *\"([^\"]*)\","); - private final Pattern token = Pattern.compile("\"token\": *\"([^\"]*)\""); - private final Pattern vkey = Pattern.compile("\"vkey\": *\"([^\"]*)\","); - private final Pattern urls = Pattern.compile("urls = *\'([^\']*)"); - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // JSONObject headers = new JSONObject(); - // headers.put("Referer", "https://www.wybg666.com"); - // headers.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); - // headers.put("Accept", " text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - // headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6"); - // headers.put("Accept-Encoding", " gzip, deflate"); - String url = siteUrl + "/vodplay/" + id + ".html"; - Elements allScript = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))).select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - JSONObject player = new JSONObject(scContent.substring(scContent.indexOf('{'), scContent.lastIndexOf('}') + 1)); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - //String jxurl = "https://player.tjomet.com/lgyy/?url=" + player.getString("url"); - String jxurl = pCfg.getString("parse") + player.getString("url"); - Document doc = Jsoup.parse(OkHttpUtil.string(jxurl, getHeaders(jxurl))); - Elements script = doc.select("body>script"); - for (int j = 0; j < script.size(); j++) { - String Content = script.get(j).html().trim(); - Matcher matcher = urlt.matcher(Content); - if (!matcher.find()) { - return ""; - } - String urlt = matcher.group(1); - Matcher matcher1 = token.matcher(Content); - if (!matcher1.find()) { - return ""; - } - String token = matcher1.group(1); - Matcher matcher2 = vkey.matcher(Content); - if (!matcher2.find()) { - return ""; - } - String vkey = matcher2.group(1); - HashMap hashMap = new HashMap(); - hashMap.put("token", token); - hashMap.put("url", urlt); - hashMap.put("vkey", vkey); - hashMap.put("sign", "bKvCXSsVjPyTNr9R"); - OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://player.wybg666.com/xinapi.php", hashMap, new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - String url = new String(Base64.decode(new JSONObject(str).getString("url").substring(8).getBytes(), 0)); - result.put("url", url.substring(8, url.length() - 8)); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - result.put("header", headers.toString()); - result.put("parse", 0); - result.put("playUrl", ""); - - } - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) { - cover = siteUrl + cover; - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/XBiu.java b/TVBox_Java/spider/XBiu.java deleted file mode 100644 index 11032ee..0000000 --- a/TVBox_Java/spider/XBiu.java +++ /dev/null @@ -1,1935 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; -import android.util.Pair; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.net.URL; -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - -public class XBiu extends Spider { - - protected String ext = null; - public JSONObject rule = null; - // 默认的视频类型 - private ArrayList videoFormatList = new ArrayList<>(Arrays.asList(".m3u8", ".mp4", ".mpeg", ".flv", ".mkv")); - - - protected final int base64Flag = Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP; - // 一定是正确的分类名称,用来帮助定位分类列表,猜cateManual - protected final ArrayList cateManuals = new ArrayList<>(Arrays.asList("电影", "剧集", "电视剧", "连续剧", "综艺", "动漫")); - // 无效的分类名,彡来过滤cateManual - protected final ArrayList invalidCateNames = new ArrayList<>(Arrays.asList("更多","下载", "首页", "资讯", "留言", "导航", "专题", "短视频", "热榜", "排行", "追剧","更新","APP", "直播", "label", "Netflix")); - // 详情页 影片信息相关字段,猜详情页信息时用 - protected final ArrayList detailItemNames = new ArrayList<>(Arrays.asList("导演", "主演", "演员", "地区", "类型", "年份", "年代")); - protected final ArrayList detailItemKeys = new ArrayList<>(Arrays.asList("vod_director", "vod_actor", "vod_actor", "vod_area", "type_name", "vod_year", "vod_year")); - protected String splitFlag = ""; // 分段标志,猜cateManual时用 - - // html标签查找时用到的辅助类 - protected class HtmlMatchInfo { - public String group0; // 正则表达式匹配到的字符串 - /** - * 一般用来放href中的内容 - */ - public String group1; // - public String group2; // - public String diff; // 两个匹配结果比较group1得到的不同部分 - public int startPos; // 正则匹配到的起始位置 - public int endPos; // 正则匹配到的结束位置 - public ArrayList uploads; // 祖先结节的索引 - public int matchedUpNodePos = -1; // 与其他HtmlMatchInfo最匹配的祖先节点位置 - public int diffStartIndex; // 不同那部分数据的开始位置 - public int diffEndIndex; // 不同那部分数据的结束位置 - - public void init(Matcher m) { - this.group0 = m.group(0); - if (m.groupCount() > 0) - this.group1 = m.group(1); - if (m.groupCount() > 1) - this.group2 = m.group(2); - this.startPos = m.start(0); - this.endPos = m.end(0); - } - - // 通过比较两个group1的不同部分,不同部分的内容以splitFlag中的字符为开始或结束位置 - public boolean findDiffStr(HtmlMatchInfo rhs, String splitFlag) { - int len = Math.min(group1.length(), rhs.group1.length()); - // 找不同字符的开始位置 - for (int i =0; i < len; ++i){ - char a = group1.charAt(i); - char b = rhs.group1.charAt(i); - if(a== b && splitFlag.indexOf (a) != -1) { - diffStartIndex = i+1; - rhs.diffStartIndex = i+1; - } - if(a != b) break; - } - - // 找不同字符的结束位置 - diffEndIndex = group1.length(); - rhs.diffEndIndex = rhs.group1.length(); - for (int i =1; i < len; ++i){ - char a = group1.charAt(group1.length()-i); - char b = rhs.group1.charAt(rhs.group1.length()-i); - if(a== b && splitFlag.indexOf (a) != -1) { - diffEndIndex = group1.length()-i; - rhs.diffEndIndex = rhs.group1.length()-i; - } - if(a != b) break; - } - if(this.diff == null || this.diff.isEmpty() && diffStartIndex < diffEndIndex) { - diff = group1.substring(diffStartIndex, diffEndIndex); - }else{ - if( diffEndIndex < diffStartIndex || !diff.equals(group1.substring(diffStartIndex, diffEndIndex))){ - return false; - } - } - if(rhs.diffStartIndex < rhs.diffEndIndex) { - rhs.diff = rhs.group1.substring(rhs.diffStartIndex, rhs.diffEndIndex); - } - return true; - } - - // 判断 rhs 与当前对象是有相同的祖先节点 - boolean hasSameUpNode(HtmlMatchInfo rhs) { - if (rhs.uploads.size() != this.uploads.size()) return false; - for (int i = 0; i < uploads.size(); ++i) { - if (uploads.get(i).intValue() != rhs.uploads.get(i).intValue()) continue; - if (matchedUpNodePos == -1 || uploads.get(i).intValue() == matchedUpNodePos) { - matchedUpNodePos = uploads.get(i).intValue(); - rhs.matchedUpNodePos = uploads.get(i).intValue(); - return true; - } - return false; - } - return false; - } - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - // 初始化抓虫规则 - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - try { - - if (ext.startsWith("http")) { - if(ext.indexOf("{cateId}") != -1 || ext.indexOf("{catePg}") !=-1){ - rule = new JSONObject(); - rule.put("homeUrl", ext); - }else{ - String json = OkHttpUtil.string(ext, null); - rule = new JSONObject(json); - } - - } else { - rule = new JSONObject(ext); - } - - if (!rule.has("list")) { - rule.put("list", new JSONObject()); - } - JSONObject list = rule.getJSONObject("list"); - // 初始化homeUrl,list.url - String homeUrl= rule.getString("homeUrl"); - if(homeUrl.indexOf("{cateId}") != -1){ - URL r = new URL(homeUrl); - String path = r.getPath(); - // 更新解析出来的homeUrl - rule.put("homeUrl", homeUrl.substring(0, homeUrl.indexOf(path))); - if(!list.has("url")){ - list.put("url", homeUrl); - } - } - // 初始化截断标志 - String listUrl = list.getString("url"); - if(listUrl.indexOf("/") !=-1) splitFlag+='/'; - if(listUrl.indexOf(".") !=-1) splitFlag+='.'; - if(listUrl.indexOf("-") !=-1) splitFlag+='-'; - - if (!rule.has("detail")) { - rule.put("detail", new JSONObject()); - } - - if (!rule.has("playlist")) { - rule.put("playlist", new JSONObject()); - } - - // 如果没有search,则生成一个默认的search规则,大部分网站的search规则都一样 - // 省掉一个search json - if (!rule.has("search")) { - String url = addHttpPrefix("index.php/ajax/suggest?mid=1&wd=阿凡达"); - try { - // 尝试访问这个json接口,如果返回了正确的json格式,就认为支持json搜索 - JSONObject result = new JSONObject( OkHttpUtil.string(url, getHeaders(url))); - JSONObject search = new JSONObject(); - search.put("vod_id", "id"); - search.put("vod_name", "name"); - search.put("vod_pic", "pic"); - search.put("url", addHttpPrefix("index.php/ajax/suggest?mid=1&wd={wd}")); - rule.put("search", search); - } - catch (Exception e){ - - } - } - - // 部分网站的播放页上直接就有 播放地址,基本上就是一样的格式,可以尝试在playerContent中直接拿直链 - if (!rule.has("play")) { - JSONObject play = new JSONObject(); - JSONArray region = new JSONArray(); - region.put("var player_aaaa="); - region.put(0); - - JSONArray vod_url = new JSONArray(); - vod_url.put("\"url\":\""); - vod_url.put("\""); - play.put("region", region); - play.put("vod_url", vod_url); - rule.put("play", play); - } - - // play字段中可以填写播放连接的关键字用来帮助识别嗅探结果, - // 一般奇葩的网站会用到 - if (rule.has("play")) { // 自定义嗅探关键字 - JSONObject play = rule.getJSONObject("play"); - JSONArray keywords = play.optJSONArray("keywords"); - if (keywords != null) { - videoFormatList.clear(); - for (int i = 0; i < keywords.length(); ++i) { - videoFormatList.add(keywords.getString(i)); - } - } - } - - // 猜cateManaul - JSONObject cateManual = rule.optJSONObject("cateManual"); - String body = ""; - if (cateManual == null) { - // 重建 cateManaul规则 - body = this.fetchUrl(rule.getString("homeUrl"), rule.optJSONObject("header")); - if(body.length() > 32*1024) { body = body.substring(0, 32 * 1024); } - cateManual = this.guess_rule_cateManual(body); - if(cateManual != null){ - rule.put("cateManual", cateManual); - } - } - - // 猜list.vod_id - if (!list.has("vod_id")) { - if(body.isEmpty()){ - body = this.fetchUrl(rule.getString("homeUrl"), rule.optJSONObject("header")); - if(body.length() > 32*1024) { body = body.substring(0, 32 * 1024); } - } - JSONArray listvodid = this.guess_rule_vod_id(body); - list.put("vod_id", listvodid); - } - - // 如果没有json搜索接口,那么尝试在主页上找search 的接口 url - if (!rule.has("search")) { - if(body.isEmpty()){ - body = this.fetchUrl(rule.getString("homeUrl"), rule.optJSONObject("header")); - if(body.length() > 32*1024) { body = body.substring(0, 32 * 1024); } - } - String url = this.guess_rule_search_url(body); - if(!url.isEmpty()){ - JSONObject search = new JSONObject(); - search.put("url", url); - rule.put("search", search); - } - } - - SpiderDebug.log(String.format("默认rule: %s", rule.toString())); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - public String addHttpPrefix(String url) { - try { - if (url.isEmpty()) return ""; - if (url.startsWith("http")) return url; - String result = rule.getString("homeUrl"); - if (result.endsWith("/")) { - result = result.substring(0, result.length() - 1); - } - if (url.startsWith("/")) { - result += url; - } else { - result += "/" + url; - } - return result; - } catch (JSONException e) { - e.printStackTrace(); - } - return url; - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - try { - if (rule.has("header")) { - JSONObject header = rule.getJSONObject("header"); - Iterator iter = header.keys(); - while (iter.hasNext()) { - String key = iter.next(); - headers.put(key, header.getString(key)); - } - } - } catch (JSONException e) { - e.printStackTrace(); - } - if (!headers.containsKey("User-Agent")) { - headers.put("User-Agent", Misc.UaWinChrome); - } - return headers; - } - - public static class HtmlNodeHlper{ - // 非正常配对的html标签,进行html层级查找时要用到 - protected static ArrayList notPairedTag = new ArrayList<>(Arrays.asList("img", "br", "meta", "!--")); // 为注释 - // 判断当前html标签是否为正常的标签 - public static boolean isPairedHtmlTag(String str, int startPos) { - String tmp = str.substring(startPos, Math.min(str.length(), startPos + 10)); - for (String p : notPairedTag) { - if (tmp.indexOf(p) != -1) { // 找到了 - // 找 > 如果匹配了 /> 则认为是配对的 - for (int i = startPos + 1; i < str.length(); ++i) { - String sm = str.substring(i); - if (str.charAt(i) == '>') { - if (str.charAt(i - 1) == '/') { - return true; - } else { - return false; - } - } - } - return false; - } - } - return true; - } - - // 查找当前标签的html代码 pos必须是标签的开始位置 < - public static String nodeString(String str, int pos) { - if (pos < 0 || pos >= str.length() || str.charAt(pos) != '<') return str; - int isRightNode = 0; - for (int i = pos; i < str.length() - 1; ++i) { -// String sm = str.substring(i, i + 400); - switch (str.charAt(i)) { - // 遇到 / 那么这个位置有可能是xml的结束标识,这种情况下再遇到<则不是当前节点的上级节点 - case '/': { - if (str.charAt(i + 1) == '>') { // "/>" 认为是标签的结束位置 - isRightNode--; - } else if (str.charAt(i - 1) == '<') { // "': { - if (isRightNode == 0) { - return str.substring(pos, i + 1); - } - break; - } - case '<': { - if (str.charAt(i + 1) != '/' && isPairedHtmlTag(str, i)) { // 不是 " findUpNodes(String str, int pos, int lookback) { - ArrayList nodes = new ArrayList<>(); - ArrayList urls = new ArrayList<>(); - if (pos == -1) return nodes; - int isUpNode = 0; - for (int i = pos; i >= 0; --i) { - switch (str.charAt(i)) { - // 遇到 / 那么这个位置有可能是xml的结束标识,这种情况下再遇到<则不是当前节点的上级节点 - case '/': { - if (str.charAt(i + 1) == '>') { - isUpNode++; -// SpiderDebug.log(String.format("not xml %s", str.substring(i, i + 20))); - } else if (str.charAt(i - 1) == '<') { - isUpNode++; - --i; -// SpiderDebug.log(String.format("not xml %s", str.substring(i, i + 20))); - } - break; - } - case '<': { - if (isUpNode == 0) { -// SpiderDebug.log(String.format("find up node %d %s", i, str.substring(i, i + 30))); - urls.add(String.format("%5d", i)); - nodes.add(i); - } else if (isPairedHtmlTag(str, i)) { - isUpNode--; - if (isUpNode < 0) isUpNode = 0; -// SpiderDebug.log(String.format("%s", str.substring(i, i + 30))); - } - - break; - } - default: - break; - } - if (nodes.size() >= lookback) { - break; - } - } - return nodes; - } - // 获取当前节点的所有子节点 - public static ArrayList getChildNodes(String str) { - ArrayList arr = new ArrayList<>(); - int pos = 0; - if (pos < 0 || pos >= str.length() || str.charAt(pos) != '<') return arr; - ++pos; - while (pos > -1 && pos < str.length()) { - pos = str.indexOf('<', pos); - String p = nodeString(str, pos); - if (p.isEmpty()) { - break; - } - arr.add(p); - pos += p.length(); - } - return arr; - } - - // 移除字符串的html标签 - public static String trimHtmlString(String str, String r) { - String ret = str.replace("\r\n", "") - .replace("\n", "") - .replaceAll("<.+?>", r) - // .replace(" ", "") - .replaceAll("\\s+", " ") - .replace(" ", "") - .replace(" ", "") - .trim(); - return ret; - } - - public static String trimHtmlString(String str) { - return trimHtmlString(str, ""); - } - - } - - public static class Utils{ - // 查找列表块的起始位置,取最靠近共同祖先节点的位置 - public static int findBlockPos(ArrayList a, ArrayList b) { - int len = a.size() > b.size() ? b.size() : a.size(); - if(len ==1 ) return b.get(0); - for (int i = 0; i < len; ++i) { - if (a.get(i).intValue() == b.get(i).intValue()) { - return b.get(i - 1); - } - } - return b.get(len - 1); - } - - // 查找两个字符串之间的子串 - // keys 字段说明 - // 0 prefix 1 suffix 2 找到子串后左边index的偏移量 3 找到子串后右边index的偏移量 - public static String findSubString(String str, int startPos, JSONArray keys, String defaultVal) { - try { - if (keys == null) return defaultVal; - String prefix = keys.getString(0); - String suffix = keys.getString(1); - int offsetl = 0; // 左边的偏移量 - int offsetr = 0; // 右边的偏移量 - if (keys.length() > 2) { - offsetl = keys.getInt(2); - } - if (keys.length() > 3) { - offsetr = keys.getInt(3); - } - int a = str.indexOf(prefix, startPos) + prefix.length(); - if (a < prefix.length()) return defaultVal; - int b = str.indexOf(suffix, a); - if (b < a) return defaultVal; - return HtmlNodeHlper.trimHtmlString(str.substring(a + offsetl, b + offsetr)); - } catch (JSONException e) { - e.printStackTrace(); - } - return defaultVal; - } - - public static String findSubString(String str, int startPos, JSONArray keys) { - return findSubString(str, startPos, keys, ""); - } - - // 获取回看层数 - public static int getLookbackCount(JSONArray keys) { - try { - if (keys != null && keys.length() > 4) return keys.getInt(4); - } catch (Exception e) { - //e.printStackTrace(); - } - return 0; - } - - // 遍历JSONObect中的JSONArray查找回看的层数可用的规则 - public static JSONArray getLookbackArray(JSONObject obj) { - try { - Iterator iter = obj.keys(); - while (iter.hasNext()) { - String key = (String) iter.next(); - Object val = obj.get(key); - if (val.getClass().getSimpleName().equals("JSONArray")) { - int c = getLookbackCount((JSONArray) val); - if (c > 0) return (JSONArray) val; - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - // 统计子串个数 - public static int getSubStringCount(String str, String sub){ - int pos =0; - int count =0; - while (pos < str.length()){ - pos = str.indexOf(sub, pos); - if(pos == -1) break; - pos += sub.length(); - ++count; - } - return count; - } - - // 获取指定区间的字符串 - public static String getRegion(String str, JSONObject obj) { - try { - if (obj == null) return str; - JSONArray region = obj.optJSONArray("region"); - if (region == null) return str; - String prefix = region.getString(0); - int a = str.indexOf(prefix); - if (a == -1) return str; - int b = str.length(); - if (region.length() > 1) { - b = str.indexOf(region.getString(1), a + prefix.length()); - if (b == -1) b = str.length(); - } - return str.substring(a, b); - } catch (JSONException e) { - e.printStackTrace(); - } - return str; - } - - } - - // 猜测分类列表的html区间代码 - protected String guessCateManualHtmlString(String body) { - String regx = String.format(" list = new ArrayList<>(); - int mcount = 0; - while (m.find() ) { - ++mcount; - if(mcount >30 && !list.isEmpty()){ - break; - } - HtmlMatchInfo cate = new HtmlMatchInfo(); - cate.init(m); - cate.group2 = HtmlNodeHlper.trimHtmlString(HtmlNodeHlper.nodeString(body, cate.startPos)); - if (cate.group2.isEmpty()) continue; - boolean bOk = false; - for (String v : cateManuals){ - if(cate.group2.indexOf(v) !=-1) { - bOk = true; - break; - } - } - if(!bOk) continue; - cate.uploads = HtmlNodeHlper.findUpNodes(body, cate.startPos, 3); - if (!list.isEmpty()) { - boolean b = list.get(0).hasSameUpNode(cate); - if (!b) { // 当前找到的info和list中的匹配 - if (list.size() > 1) { // 如果list中的数据大于1 则认为找到了类型列表 - return HtmlNodeHlper.nodeString(body, list.get(0).matchedUpNodePos); - } - list.clear(); - } - } - list.add(cate); - } - if (list.size() > 1) { // 如果list中的数据大于1 则认为找到了类型列表 - return HtmlNodeHlper.nodeString(body, list.get(0).matchedUpNodePos); - } else { - return ""; - } - } - - // 从html代码中猜测分类名和分类ID cateManual规则 - protected JSONObject guess_rule_cateManual(String body) { - try { - String str = this.guessCateManualHtmlString(body); - if (str.isEmpty()) return new JSONObject(); - - String regx = String.format("](\\s*?\\S+?\\s*?)(\"|<)", TextUtils.join("|", cateManuals)); - Pattern pattern = Pattern.compile(regx, Pattern.CASE_INSENSITIVE); - Matcher m = pattern.matcher(str); - ArrayList list = new ArrayList<>(); - while (m.find()) { - // HtmlMatchInfo 字段映射 - // HtmlMatchInfo.group1 -> href - // HtmlMatchInfo.group2 -> name - // HtmlMatchInfo.diff -> id 分类ID - HtmlMatchInfo cate = new HtmlMatchInfo(); - cate.init(m); - if (cate.group1.length() < 5) continue; - cate.group2 = HtmlNodeHlper.trimHtmlString(HtmlNodeHlper.nodeString(str, cate.startPos)); - if(cate.group2.isEmpty()) continue; - // 判断是否为正常的分类名 - boolean validCateName = true; - for (int j = 0; j < invalidCateNames.size(); ++j) { - if (cate.group2.indexOf(invalidCateNames.get(j)) != -1) { - SpiderDebug.log(String.format("排除无效分类:%s --> %s", cate.group1, cate.group2)); - validCateName = false; - break; - } - } - if(!validCateName) continue; - - if (!list.isEmpty()) { - if (!list.get(0).findDiffStr(cate, splitFlag)) { - SpiderDebug.log(String.format("排除可能无效的分类 %s <--> %s", cate.group1, cate.group2)); - continue; - } - } - list.add(cate); - } - - ArrayList baseInfoIndexs = new ArrayList<>(); - // 找到最可能是正确的导航item - for (int i =0; i < list.size(); ++i){ - list.get(i).diff = null; - for (String v : cateManuals){ - if(list.get(i).group2.indexOf(v) !=-1) { - baseInfoIndexs.add(i); - break; - } - } - } - - // 以找到的导航item为基准重建分类ID - int baseInfoIndex=0; - for (int i =1; i < baseInfoIndexs.size(); ++i){ - baseInfoIndex=baseInfoIndexs.get(0).intValue(); - list.get(baseInfoIndex).findDiffStr(list.get(baseInfoIndexs.get(i).intValue()), splitFlag); - } - - JSONObject cateManual = new JSONObject(); - for (int i = 0; i < list.size(); ++i) { - if(list.get(i).diff == null || list.get(i).diff.isEmpty()) { - if(!list.get(baseInfoIndex).findDiffStr(list.get(i), splitFlag)){ - SpiderDebug.log(String.format("排除可能无效的分类 : %s", list.get(i).group0)); - continue; - } - } - - boolean validCateName = true; - String name = list.get(i).group2; - String id = list.get(i).diff; - if (id == null || id.isEmpty()) continue; - if (name == null || name.isEmpty()) continue; - for (int k =0; k arr = HtmlNodeHlper.findUpNodes(body,m.start(0), i); - String r = HtmlNodeHlper.nodeString(body, arr.get(arr.size()-1)); - String regex2 = "action=\"(.+?)\""; - Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE); - Matcher m2 = pattern2.matcher(r); - if(m2.find()){ - String url = m2.group(1); - char ch = url.indexOf('?') ==-1 ? '?' : '&'; - url = addHttpPrefix(url + ch + wd + "={wd}"); - return url; - } - - } - } - return ""; - } - // 猜测列表数据的 vod_id 规则 - public JSONArray guess_rule_vod_id(String body) { - try { - String regx = " founds = new HashMap<>(); - ArrayList list = new ArrayList<>(); - while (m.find()) { - HtmlMatchInfo cate = new HtmlMatchInfo(); - cate.init(m); - cate.uploads = HtmlNodeHlper.findUpNodes(body, cate.startPos, 4); -// String ms = this.findNodeString(body, cate.uploads.get(cate.uploads.size()-1)); - if (!list.isEmpty()) { - - if(cate.group1.equals( list.get(list.size()-1).group1)) continue; - boolean b = list.get(list.size()-1).hasSameUpNode(cate); - if (!b) { // 当前找到的info和list中的匹配 - if (list.size() > 1) { - HtmlMatchInfo info = list.get(0); - info.findDiffStr(list.get(1), splitFlag); - int id = 0; - boolean isNumberID = false; - try { id = Integer.valueOf(info.diff).intValue(); isNumberID = true; }catch (Exception e){} - - if(id > 100 ){ // cateID一般都是小于100的 - String url = (info.group1.replace(list.get(0).diff, "{vid}")); - JSONArray arr = new JSONArray(); - String prefix = url.substring(0, url.indexOf("{vid}")); - String suffix = url.substring(prefix.length() + "{vid}".length()); - int lookback = info.uploads.indexOf(info.matchedUpNodePos) - 1; - if (lookback < 1) lookback = 1; - arr.put(prefix); - arr.put(suffix); - arr.put(0); - arr.put(0); - arr.put(lookback); - arr.put(list.size()); - - if (!founds.containsKey(url)) { - founds.put(url, arr); - } else { - int nlen = founds.get(url).getInt(5) + list.size(); - arr.put(5, nlen); - founds.put(url, arr); - if(nlen >= 30){ - list.clear(); - break; - } - } - } - - } - list.clear(); - } - } - list.add(cate); - if(list.size()>30){ - break; - } - } - - - if (list.size() > 5 || (list.size()>1 && founds.isEmpty())) { // 如果list中的数据大于1 则认为找到了类型列表 - HtmlMatchInfo info = list.get(0); - info.findDiffStr(list.get(1), splitFlag); - int id = 0; - boolean isNumberID = false; - try { id = Integer.valueOf(info.diff).intValue(); isNumberID = true; }catch (Exception e){} - - if(id > 100 ){ // cateID一般都是小于100的 - - String url = (info.group1.replace(list.get(0).diff, "{vid}")); - JSONArray arr = new JSONArray(); - String prefix = url.substring(0, url.indexOf("{vid}")); - String suffix = url.substring(prefix.length() + "{vid}".length()); - int lookback = info.uploads.indexOf(info.matchedUpNodePos) - 1; - if (lookback < 1) lookback = 1; - arr.put(prefix); - arr.put(suffix); - arr.put(0); - arr.put(0); - arr.put(lookback); - arr.put(list.size()); - - if (!founds.containsKey(url)) { - founds.put(url, arr); - } else { - int nlen = founds.get(url).getInt(5) + list.size(); - arr.put(5, nlen); - founds.put(url, arr); - } - } - } - - - JSONArray c = null; - for (String key : founds.keySet()) { - JSONArray v = founds.get(key); - if(c == null || c.getInt(5) < v.getInt(5)) c = v; - } - return c; - - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - // 猜播放列表 - public JSONArray guess_rule_vod_play_url(String str, String vid) { - String regex = "href=\"(/.+?)\""; - Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); - Matcher m = pattern.matcher(str); - HtmlMatchInfo info = new HtmlMatchInfo(); - ArrayList vec = new ArrayList<>(); - boolean p0__ = false; - while (m.find()){ - String sb = m.group(1); - // 太长的url认为是错误的播放地址 - if(sb.length() > 100) continue; - if(sb.indexOf(vid) == -1) continue; - // 如果当前url的长度比上一个url的长度短也认为是无效的播放地址(带上了vod_id一般短一点的可能是详情页的地址) - // 一般来讲 999-1-1.html 这种格式是播放页的地址,不排除这种地址 - boolean is__html = (sb.indexOf(vid+"-") != -1); - if(!is__html && vec.size() > 0 && vec.get(vec.size()-1).length() > sb.length()) continue; - if(is__html && !p0__ ){ // 找到了准确度最高的播放连接格式,如果检查到列表头不是这种格式的话,清空列表从头开始 - vec.clear(); - } - // 如果列表里面装了标准的连接格式,不标准的就不要了 - if(p0__ && !is__html) continue; - - info.init(m); - if(vec.isEmpty()) p0__ = is__html; - vec.add(m.group(1)); - if(vec.size() > 10 && vec.get(vec.size()-2).length() == sb.length()) { - break; - } - } - if(info.group0 != null){ - for (int i =1;i < 4; ++i){ - ArrayList nodes = HtmlNodeHlper.findUpNodes(str, info.startPos, i); - int startPos = nodes.get(nodes.size()-1).intValue(); - //String smd = str.substring(startPos, startPos+10); - String smd = HtmlNodeHlper.nodeString(str, startPos); - - if(smd.indexOf(" map = new HashMap(); - - for (int i = 0; i < words.length; ++i) { - words[i] =words[i].trim(); - if (!words[i].isEmpty() && words[i].indexOf("更新") ==-1) { - - int c = 1; - if (map.containsKey(words[i])) { - c = 1 + map.get(words[i]).intValue(); - ;//[words[i]] - } - map.put(words[i], Integer.valueOf(c)); - } - } - String s = ""; - int c = 0; - for (String key : map.keySet()) { - int v = map.get(key).intValue(); - if (v > c) { - c = v; - s = key; - } - } - val = s; - } - return val.replace("在线", "") - .replace("立即", "") - .replace("观看", "") - .replace("点播", "") - .replace("影片", "") - .replace("信息", "") - .replace("播放", "") - .trim(); - //return val; - } catch (Exception e) { - - } - return ""; - } - - public String guess_value_vod_remarks(String nd, int startPos, String vod_name) { - try { - String all = HtmlNodeHlper.trimHtmlString(nd, "!!!!"); - String[] words = all.split("!!!!"); - String val = ""; - for (int i = 0; i < words.length; ++i) { - String wd = words[i].trim(); - if (!wd.isEmpty() && wd.indexOf(vod_name) == -1) { - String dot = (!val.isEmpty()) ? "," : "";// val += ","; - String tmp = val + dot + wd; - if (tmp.length() > 20) { - break; - } - val = tmp; - } - } - return val; - } catch (Exception e) { - - } - return ""; - - } - - public String guess_value_vod_pic(String nd, int startPos) { - try { - JSONArray vec = new JSONArray(); - vec.put("data-original=\""); - vec.put("\""); - String val = Utils.findSubString(nd, startPos, vec); - if (val.isEmpty()) { - vec.put(0, "data-src=\""); - val = Utils.findSubString(nd, startPos, vec); - } - if (val.isEmpty()) { - vec.put(0, "src=\""); - val = Utils.findSubString(nd, startPos, vec); - } - if (val.isEmpty()) { - vec.put(0, "data-bg=\""); - val = Utils.findSubString(nd, startPos, vec); - } - if (val.isEmpty()) { - //TODO: 直接在nd中找个.jpg .png 之类的当图片 - } - return addHttpPrefix(val); - } catch (Exception e) { - - } - return ""; - } - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } - - // 让当前爬虫自己判断是否为可播放的地址 - @Override - public boolean manualVideoCheck() { - return true; - } - - - @Override - public String homeContent(boolean z) { - try { - fetchRule(); - - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - JSONObject cateManual = rule.optJSONObject("cateManual"); - - Iterator keys = cateManual.keys(); - while (keys.hasNext()) { - String key = keys.next(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_name", key); - jsonObject.put("type_id", cateManual.getString(key)); - classes.put(jsonObject); - } - - result.put("class", classes); - if (z && rule.has("filter")) { - result.put("filters", rule.getJSONObject("filter")); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - // from xpath 加入过滤条件 - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - try { - JSONObject list = this.rule.getJSONObject("list"); - String cateUrl = list.optString(pg, ""); - if(cateUrl.isEmpty()) - cateUrl = list.getString("url"); - if (filter && extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value)); - } - } - } - cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg); - Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl); - while (m.find()) { - String n = m.group(0).replace("{", "").replace("}", ""); - cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", ""); - } - return cateUrl; - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - JSONObject list = this.rule.getJSONObject("list"); - String url = categoryUrl(tid, pg, filter, extend); - String body = fetchUrl(url, list.optJSONObject("header")); - String str = Utils.getRegion(body, list); - JSONArray videos = new JSONArray(); - JSONArray lookback = Utils.getLookbackArray(list); - Set set = new HashSet(); - int pos = 0; - ArrayList urlnodes = null; - int lookup = -1; - while (lookback != null) { - pos = str.indexOf(lookback.getString(0), pos); - if (pos == -1) break; - - ArrayList arr = null; - int blockPos = 0; - String nd =""; - do { - arr = HtmlNodeHlper.findUpNodes(str, pos - 1, lookback.getInt(4)); - if (urlnodes == null) { - urlnodes = arr; - blockPos = arr.get(arr.size() - 1); - } else { - blockPos = Utils.findBlockPos(urlnodes, arr); - } - nd = HtmlNodeHlper.nodeString(str, blockPos); - - // 检查是否回看层数过多,如果回看导数过多会导致加载不出来数据或一页只加载一条数据,需要进行修正 - if(lookup < 0){ - int count = Utils.getSubStringCount(nd, lookback.getString(0)); - if(count > 3 && lookback.getInt(4)>1){ - lookback.put(4, lookback.getInt(4)-1); - urlnodes = null; - blockPos=0; - nd=""; - SpiderDebug.log(String.format("找到过多的url匹配项(%d),降低匹配层级为%d", count, lookback.getInt(4))); - }else if(lookup == -1){ - String pic = guess_value_vod_pic(nd,0); //尝试找一下图片,如果没找到的话增加一级 - String vName = guess_value_vod_name(nd,0); - if(pic.isEmpty()||vName.isEmpty()){ - lookback.put(4, lookback.getInt(4)+1); - urlnodes = null; - blockPos=0; - nd=""; - lookup = -2; // 只退一次 - SpiderDebug.log(String.format("当前层级未找到(%s),增加匹配层级为%d", pic.isEmpty()? "图片": "标题", lookback.getInt(4))); - }else{ - lookup = lookback.getInt(4); - } - }else{ - lookup = lookback.getInt(4); - } - } - }while (lookup < 0 ); - - - pos += nd.length(); - blockPos = 0; - String vod_id = Utils.findSubString(nd, blockPos, list.getJSONArray("vod_id")); - if (!set.contains(vod_id)) { // 排除重复数据 - set.add(vod_id); - JSONObject v = new JSONObject(); - v.put("vod_id", vod_id); - v.put("vod_name", Utils.findSubString(nd, blockPos, list.optJSONArray("vod_name"))); - v.put("vod_pic", addHttpPrefix(Utils.findSubString(nd, blockPos, list.optJSONArray("vod_pic")))); - v.put("vod_remarks", Utils.findSubString(nd, blockPos, list.optJSONArray("vod_remarks"))); - - if (v.getString("vod_name").isEmpty()) { - v.put("vod_name", guess_value_vod_name(nd, 0)); - } - - if (v.getString("vod_pic").isEmpty()) { - v.put("vod_pic", guess_value_vod_pic(nd, 0)); - } - - // 随便整点remark - if (v.getString("vod_remarks").isEmpty()) { - String vod_name = v.getString("vod_name"); - v.put("vod_remarks", guess_value_vod_remarks(nd, 0, vod_name)); - } - v.put("vod_id", Base64.encodeToString(v.toString().getBytes(Misc.CharsetUTF8), base64Flag)); - videos.put(v); - } -// pos += vod_id.length(); - } - - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - // 生成播放的名称 - public ArrayList makeVodPlayFrom(int sz) { - ArrayList vec = new ArrayList(); - for (int i = 1; i <= sz; ++i) { - vec.add("播放列表" + i); - } - return vec; - } - - // 查找播放列表名 - public ArrayList findVodPlayFrom(String str, int sz) { - try { - ArrayList urlnodes = null; - JSONObject playlist = this.rule.getJSONObject("playlist"); - if (!playlist.has("vod_play_from")) { - return makeVodPlayFrom(sz); - } - ArrayList> vod_play_from = new ArrayList>(); - JSONArray rule_vod_play_from = playlist.getJSONArray("vod_play_from"); - for (int i = 0; i < rule_vod_play_from.length(); ++i) { - String s = rule_vod_play_from.get(i).getClass().getSimpleName(); - String key = ""; - String alias = ""; - if (s.equals("String")) { - key = alias = rule_vod_play_from.getString(i); - } else if (s.equals("JSONArray")) { - JSONArray item = rule_vod_play_from.getJSONArray(i); - key = alias = item.getString(0); - if (item.length() > 1) { - alias = item.getString(1); - } - } else { - return makeVodPlayFrom(sz); - } - - int pos = str.indexOf(key); - if (pos == -1) continue; - vod_play_from.add(new Pair<>(pos, alias)); - } - // 找到的名称与实际需要的数量不匹配,返回默认的名称 - if (vod_play_from.size() != sz) { - return makeVodPlayFrom(sz); - } - // 排序 - Collections.sort(vod_play_from, new Comparator>() { - @Override - public int compare(Pair a, Pair b) { - return a.first.intValue() - b.first.intValue(); - } - }); - - ArrayList vec = new ArrayList(); - for (int i = 0; i < vod_play_from.size(); ++i) { - vec.add(vod_play_from.get(i).second); - } - return vec; - } catch (Exception e) { - e.printStackTrace(); - } - return makeVodPlayFrom(sz); - } - - // 查找播放列表 - public ArrayList findVodPlayUrl(String str) { - ArrayList tmp_vod_play_url = new ArrayList(); - ArrayList vod_play_url = new ArrayList(); - try { - int pos = 0; - ArrayList urlnodes = null; - JSONObject playlist = this.rule.getJSONObject("playlist"); - int sort = playlist.optInt("sort", 0); // 如果这个值是0。表示要倒序播放列表 - HashMap map = new HashMap(); - Set rmset = new HashSet(); -// String tmp = ""; - ArrayList tmp = new ArrayList(); - JSONArray lookback = Utils.getLookbackArray(playlist); - while (lookback != null) { - JSONArray rule_vod_play_url = playlist.getJSONArray("vod_play_url"); - pos = str.indexOf(rule_vod_play_url.getString(0), pos); - if (pos == -1) break; - ArrayList arr = HtmlNodeHlper.findUpNodes(str, pos - 1, lookback.getInt(4)); - - int blockPos = 0; - if (urlnodes == null || arr.size() != urlnodes.size() || arr.get(arr.size() - 1).intValue() != urlnodes.get(urlnodes.size() - 1).intValue()) { - urlnodes = arr; - blockPos = arr.get(Math.max(0, arr.size() - 2)); - // 如果上级节点不同,说明当前播放列表已经结束,可以 - if (!tmp.isEmpty()) { - SpiderDebug.log("change play list "); - if (sort != 0) { - Collections.reverse(tmp); - } - tmp_vod_play_url.add(TextUtils.join("#", tmp)); - tmp = new ArrayList(); - } - } else { - blockPos = Utils.findBlockPos(urlnodes, arr); - } -// String bs = str.substring(blockPos, blockPos + 1000); -// String b = this.findNodeString(str, blockPos); - // 处理play_url 为空的情况 - String play_url = addHttpPrefix(Utils.findSubString(str, blockPos, playlist.getJSONArray("vod_play_url"))); - - if (map.containsKey(play_url)) { // 如果以经找过当前播放的url,那么认为之前找到的都是垃圾数据,清空之间的成果 - SpiderDebug.log("发现重复播放连接,清空已解析到的播放列表"); - rmset.add(map.get(play_url)); // 添加移除标志 - } - map.put(play_url, tmp_vod_play_url.size()); - String play_url_title = Utils.findSubString(str, blockPos, playlist.optJSONArray("vod_play_url_title")); - if (play_url_title.isEmpty()) { - play_url_title = HtmlNodeHlper.trimHtmlString(HtmlNodeHlper.nodeString(str, blockPos)); - int dd = 3; - } - tmp.add(play_url_title + "$" + play_url); -// SpiderDebug.log(String.format("%s$%s", play_url_title, play_url)); - pos += play_url.length(); - } - - if (!tmp.isEmpty()) { - if (sort != 0) { - Collections.reverse(tmp); - } - tmp_vod_play_url.add(TextUtils.join("#", tmp)); - } - - for (int i = 0; i < tmp_vod_play_url.size(); ++i) { - if (!rmset.contains(i)) { - vod_play_url.add(tmp_vod_play_url.get(i)); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return vod_play_url; - } - - // 猜测详情数据的html区间 - protected String guessDetailContentRegion(String body) { - String regx = String.format(">\\s*?(%s)|(%s)", TextUtils.join("|", detailItemNames), TextUtils.join(":|", detailItemNames)); - Pattern pattern = Pattern.compile(regx, Pattern.CASE_INSENSITIVE); - Matcher m = pattern.matcher(body); - ArrayList list = new ArrayList<>(); - while (m.find()) { - HtmlMatchInfo cate = new HtmlMatchInfo(); - cate.init(m); - cate.uploads = HtmlNodeHlper.findUpNodes(body, cate.startPos, 5); - if (!list.isEmpty()) { - boolean b = list.get(0).hasSameUpNode(cate); - if (!b) { // 当前找到的info和list中的匹配 - if (list.size() > 1) { - boolean found = false; - for (int i = 0; i < list.size(); ++i) { - if (list.get(i).group0.indexOf("导演") != -1) { - found = true; - } - } - if (found) { - return HtmlNodeHlper.nodeString(body, list.get(0).matchedUpNodePos); - } else { - list.clear(); - } - } - list.clear(); - } - } - list.add(cate); - } - if (list.size() > 1) { // 如果list中的数据大于1 则认为找到了类型列表 - return HtmlNodeHlper.nodeString(body, list.get(0).matchedUpNodePos); - } else { - return ""; - } - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - JSONObject vinfo = new JSONObject(new String(Base64.decode(ids.get(0), base64Flag), "UTF-8")); - - JSONObject detail = rule.optJSONObject("detail"); - if (detail == null) return ""; - // 如果不存在url,则使用list中的vod_id来生成url - if (!detail.has("url")) { - JSONObject list = rule.getJSONObject("list"); - JSONArray tmp = list.getJSONArray("vod_id"); - String u = addHttpPrefix(tmp.getString(0) + "{vid}" + tmp.getString(1)); - detail.put("url", u); - } - String url = detail.getString("url").replace("{vid}", vinfo.getString("vod_id")); - String body = fetchUrl(url, detail.optJSONObject("header")); - String str = Utils.getRegion(body, detail); - int startPos = 0; - - String nodeString = ""; - // 圈定 详情数据的范围 - JSONArray lookback = Utils.getLookbackArray(detail); - if (lookback != null) { - int pos = str.indexOf(lookback.getString(0), 0); - if (pos != -1) { - ArrayList arr = HtmlNodeHlper.findUpNodes(str, pos - 1, lookback.getInt(4)); - if (arr.size() > 0) { - startPos = arr.get(arr.size() - 1); - nodeString = HtmlNodeHlper.nodeString(str, startPos); // 精确详情数据的范围 - } - } - } - // 没有指定详情数据范围则猜一个出来 - if (nodeString.isEmpty()) { - nodeString = this.guessDetailContentRegion(body); - } - - if (nodeString.length() != str.length()) { - str = nodeString; - startPos = 0; - } - /////////////////////////////////////////////////////////////////////////////////////// - - JSONObject vod = new JSONObject(); - vod.put("vod_id", ids.get(0)); - vod.put("vod_name", Utils.findSubString(str, startPos, detail.optJSONArray("vod_name"))); - vod.put("vod_pic", addHttpPrefix(Utils.findSubString(str, startPos, detail.optJSONArray("vod_pic")))); - vod.put("type_name", Utils.findSubString(str, startPos, detail.optJSONArray("type_name"))); - vod.put("vod_year", Utils.findSubString(str, startPos, detail.optJSONArray("vod_year"))); - vod.put("vod_area", Utils.findSubString(str, startPos, detail.optJSONArray("vod_area"))); - vod.put("vod_remarks", Utils.findSubString(str, startPos, detail.optJSONArray("vod_remarks"))); - vod.put("vod_actor", Utils.findSubString(str, startPos, detail.optJSONArray("vod_actor"))); - vod.put("vod_director", Utils.findSubString(str, startPos, detail.optJSONArray("vod_director"))); - vod.put("vod_content", Utils.findSubString(str, startPos, detail.optJSONArray("vod_content"))); - - - //////////////////////////////////////////////////////////////////////////////////////// - if (vod.getString("vod_name").isEmpty()) { - vod.put("vod_name", vinfo.optString("vod_name", "")); - } - // 从页面中猜个视频名称出来 - if (vod.getString("vod_name").isEmpty()) { - vod.put("vod_name", guess_value_vod_name(str, startPos)); - } - - //////////////////////////////////////////////////////////////////////////////////////// - if (vod.getString("vod_pic").isEmpty()) { - vod.put("vod_pic", vinfo.optString("vod_pic", "")); - } - if (vod.getString("vod_pic").isEmpty()) { - vod.put("vod_pic", guess_value_vod_pic(str, startPos)); - } - - //////////////////////////////////////////////////////////////////////////////////////// - if (lookback != null && lookback.length() > 1) { - JSONArray key = new JSONArray(); - String name = lookback.getString(0); - String skey = lookback.getString(0); - - ArrayList detailItems = new ArrayList<>(Arrays.asList("导演", "演员", "类型", "年份")); - for (String p : detailItems) { - if (name.indexOf(p) != -1) { - skey = p; - break; - } - } - key.put(name); - key.put(lookback.getString(1)); - if (vod.getString("vod_director").isEmpty()) { - key.put(0, name.replace(skey, "导演")); - vod.put("vod_director", Utils.findSubString(str, startPos, key)); - } - if (vod.getString("vod_actor").isEmpty()) { - key.put(0, name.replace(skey, "主演")); - vod.put("vod_actor", Utils.findSubString(str, startPos, key)); - } - - if (vod.getString("vod_content").isEmpty()) { - String all = HtmlNodeHlper.trimHtmlString(str, "!!!!"); - String[] words = all.split("!!!!"); - String v = ""; - for (int i = 0; i < words.length; ++i) { - if (words[i].length() > v.length()) { - v = words[i]; - } - } - vod.put("vod_content", HtmlNodeHlper.trimHtmlString(v)); - } - - } else { // 猜一下详情数据 - if (vod.getString("vod_director").isEmpty()) { - ArrayList arr = HtmlNodeHlper.getChildNodes(nodeString); - String content = ""; - String f = TextUtils.join("|", detailItemNames); - String regex = String.format("%s",f); - Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); - for (int i = 0; i < arr.size(); ++i) { - String p = HtmlNodeHlper.trimHtmlString(arr.get(i), " ").replace(":", ""); - if (p.length() > content.length()) { content = p; } - String[] all = p.split(regex); - // split出来的可能存在空字符串,去除掉 - ArrayList items = new ArrayList<>(); - for(String c: all){ - if(c.isEmpty()) continue; - items.add(c); - } - Matcher m = pattern.matcher(p); - int index = 0; - while (m.find() && index < items.size()){ - String s = m.group(0); - for (int j = 0; j < detailItemNames.size(); ++j) { - String name = detailItemNames.get(j); - String key = detailItemKeys.get(j); - if (s.indexOf(name) != -1) { - if (vod.getString(key).isEmpty()) { - vod.put(key, items.get(index).trim()); - } - break; - } - } - ++index; - } - } - - if (vod.getString("vod_content").isEmpty()) { - vod.put("vod_content", content); - } - } - } - - - playlistContent(ids, vod, body);// 获取播放列表 - - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - - } - - // 播放页 str 为 detailContent 函数中http返回值 - protected void playlistContent(List ids, JSONObject vod, String body) { - try { - fetchRule(); - JSONObject vinfo = new JSONObject(new String(Base64.decode(ids.get(0), base64Flag), "UTF-8")); - - JSONObject playlist = rule.optJSONObject("playlist"); - if (playlist == null) return; - if (playlist.has("url")) { - String detailUrl = rule.getJSONObject("detail").optString("url"); - String playListUrl = playlist.getString("url"); - if(!detailUrl.equals(playListUrl)){ - String url = playlist.getString("url").replace("{vid}", vinfo.getString("vod_id")); - body = fetchUrl(url, playlist.optJSONObject("header")); - } - } - String str = Utils.getRegion(body, playlist); - - ArrayList vod_play_url = null; - if (!playlist.has("vod_play_url")) { - // 猜vod_play_url的查找规则 - JSONArray vod_play_url_rule = this.guess_rule_vod_play_url(str, vinfo.getString("vod_id")); - if(vod_play_url_rule != null){ - playlist.put("vod_play_url", vod_play_url_rule); - } - } - vod_play_url = this.findVodPlayUrl(str); - ArrayList vod_play_from = this.findVodPlayFrom(str, vod_play_url.size()); - - // 如果有说明播放源的名称,那么对播放源进行排序 - String f1 = TextUtils.join("$$$", vod_play_from); - String f2 = TextUtils.join("$$$", makeVodPlayFrom(vod_play_url.size())); - - if (!f1.equals(f2)) { - ArrayList urls = new ArrayList<>(); - ArrayList froms = new ArrayList<>(); - - JSONArray rule_vod_play_from = playlist.getJSONArray("vod_play_from"); - for (int i = 0; i < rule_vod_play_from.length(); ++i) { - String s = rule_vod_play_from.get(i).getClass().getSimpleName(); - String alias = ""; - if (s.equals("String")) { - alias = rule_vod_play_from.getString(i); - } else if (s.equals("JSONArray")) { - JSONArray item = rule_vod_play_from.getJSONArray(i); - alias = item.getString(0); - if (item.length() > 1) { - alias = item.getString(1); - } - } - - for (int j = 0; j < vod_play_from.size(); ++j) { - if (vod_play_from.get(j).equals(alias)) { - urls.add(vod_play_url.get(j)); - froms.add(vod_play_from.get(j)); - } - } - - } - vod_play_url = urls; - vod_play_from = froms; - } - vod.put("vod_play_url", TextUtils.join("$$$", vod_play_url)); - vod.put("vod_play_from", TextUtils.join("$$$", vod_play_from)); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - // 尝试从播放页中找播放url - protected String parsePlayUrl(String str, String str2, List list) { - try { - JSONObject play = rule.optJSONObject("play"); - if (play == null) { - return ""; - } - String tmp = fetchUrl(str2, play.optJSONObject("header")); - String body = Utils.getRegion(tmp, play); - int startPos = 0; - JSONArray lookback = Utils.getLookbackArray(play); - if (lookback != null) { - int pos = body.indexOf(lookback.getString(0), 0); - if (pos != -1) { - ArrayList arr = HtmlNodeHlper.findUpNodes(body, pos - 1, lookback.getInt(4)); - if (arr.size() > 0) { - startPos = arr.get(arr.size() - 1); - } else { - startPos = pos; - } - } - } - - String vod_url = Utils.findSubString(body, startPos, play.optJSONArray("vod_url")); - vod_url = vod_url.replace("\\/", "/"); - if (vod_url.isEmpty() || !isVideoFormat(vod_url)) return ""; - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", vod_url); - return result.toString(); - - } catch (Exception e) { - e.printStackTrace(); - } - - return ""; - } - - @Override - public String playerContent(String str, String str2, List list) { - try { - fetchRule(); - // 先判断是否可以拿到直链 - String ret = parsePlayUrl(str, str2, list); - if (!ret.isEmpty()) return ret; - // 直接将网页地址返回回去进行嗅探 - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", str2); - return result.toString(); - } catch (Exception e) { - e.printStackTrace(); - } - return ""; - } - - protected Object parseJsonSearchResult(Object obj) { - try { - if (obj == null) return null; - JSONObject search = rule.optJSONObject("search"); - if (search == null) return null; - String key_vod_id = search.getString("vod_id"); - String key_vod_name = search.getString("vod_name"); - String type = obj.getClass().getSimpleName(); - if (type.equals("JSONObject")) { - JSONObject object = (JSONObject) obj; - if (object.has(key_vod_id) && object.has(key_vod_name)) return object; - for (Iterator iter = object.keys(); iter.hasNext(); ) { - String k = iter.next(); - Object r = parseJsonSearchResult(object.get(k)); - if (r != null) { - return r; - } - } - } else if (type.equals("JSONArray")) { - JSONArray array = (JSONArray) obj; - for (int i = 0; i < array.length(); ++i) { - if (parseJsonSearchResult(array.get(i)) != null) { - return array; - } - } - } - - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - protected String parseSearchResult(String body) { - try { - JSONObject obj = new JSONObject(body); - Object info = parseJsonSearchResult(obj); - if (info == null) return ""; - JSONArray arr = new JSONArray(); - if (info.getClass().getSimpleName().equals("JSONObject")) { - arr.put(info); - } else { - arr = (JSONArray) info; - } - JSONObject search = rule.optJSONObject("search"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < arr.length(); ++i) { - JSONObject v = new JSONObject(); - JSONObject o = arr.getJSONObject(i); - if (search.has("vod_id") && o.has(search.getString("vod_id"))) { - v.put("vod_id", o.get(search.getString("vod_id")).toString()); - } else { - continue; - } - if (search.has("vod_name") && o.has(search.getString("vod_name"))) { - v.put("vod_name", o.get(search.getString("vod_name")).toString()); - } else { - v.put("vod_name", "未知"); - } - - if (search.has("vod_pic") && o.has(search.getString("vod_pic"))) { - v.put("vod_pic", o.get(search.getString("vod_pic")).toString()); - } else { - v.put("vod_pic", ""); - } - - if (search.has("vod_remarks") && o.has(search.getString("vod_remarks"))) { - v.put("vod_remarks", o.get(search.getString("vod_remarks")).toString()); - } else { - v.put("vod_remarks", ""); - } - v.put("vod_id", Base64.encodeToString(v.toString().getBytes(Misc.CharsetUTF8), base64Flag)); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - - } catch (Exception e) { -// e.printStackTrace(); - } - return ""; - } - - // post 搜索,只做了简单的支持 - protected String postSearch(String wd, boolean z) { - try { - JSONObject search = rule.optJSONObject("search"); - if (search == null) return ""; - String url = search.getString("url"); - JSONObject params = search.getJSONObject("post"); // 查询参数 - HashMap reqpayload = new HashMap<>(); - Iterator iter = params.keys(); - while (iter.hasNext()) { - String key = iter.next(); - String value = params.getString(key).replace("{wd}", wd); - reqpayload.put(key, value); - } - final String[] retval = {""}; - HashMap header = getHeaders(url); - header.put("content-type", "application/x-www-form-urlencoded"); - OkHttpUtil.post(OkHttpUtil.defaultClient(), url, reqpayload, header, new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - retval[0] = response; - } - }); - return retval[0]; - } catch (Exception e) { - - } - return ""; - } - - @Override - public String searchContent(String wd, boolean z) { - try { - fetchRule(); - JSONObject search = rule.optJSONObject("search"); - if (search == null) return ""; - String str = ""; - if (search.has("post")) { - str = postSearch(wd, z); - } else { - String url = search.getString("url").replace("{wd}", wd); - str = fetchUrl(url, search.optJSONObject("header")); - } - str = Utils.getRegion(str, search); - // 先当JSON解析试试 - String r = parseSearchResult(str); - if (r != null && !r.isEmpty()) { - return r; - } - - if (!search.has("vod_id")) { - JSONObject list = rule.getJSONObject("list"); - search.put("vod_id", list.getJSONArray("vod_id")); - } - - JSONArray videos = new JSONArray(); - Set set = new HashSet(); - int pos = 0; - ArrayList urlnodes = null; - - JSONArray lookback = Utils.getLookbackArray(search); - - int lookup = -1; - while (lookback != null) { - pos = str.indexOf(lookback.getString(0), pos); - if (pos == -1) break; - - ArrayList arr = null; - int blockPos = 0; - String nd =""; - do { - arr = HtmlNodeHlper.findUpNodes(str, pos - 1, lookback.getInt(4)); - if (urlnodes == null) { - urlnodes = arr; - blockPos = arr.get(arr.size() - 1); - } else { - blockPos = Utils.findBlockPos(urlnodes, arr); - } - nd = HtmlNodeHlper.nodeString(str, blockPos); - // 检查是否回看层数过多,如果回看导数过多会导致加载不出来数据或一页只加载一条数据,需要进行修正 - if(lookup < 0){ - int count = Utils.getSubStringCount(nd, lookback.getString(0)); - if(count > 3 && lookback.getInt(4)>1){ - lookback.put(4, lookback.getInt(4)-1); - urlnodes = null; - blockPos=0; - nd=""; - SpiderDebug.log(String.format("找到过多的url匹配项(%d),降低匹配层级为%d", count, lookback.get(4))); - } - else if(lookup == -1){ - String pic = guess_value_vod_pic(nd,0); //尝试找一下图片,如果没找到的话增加一级 - String vName = guess_value_vod_name(nd,0); - if(pic.isEmpty()||vName.isEmpty()){ - lookback.put(4, lookback.getInt(4)+1); - urlnodes = null; - blockPos=0; - nd=""; - lookup = -2; // 只退一次 - SpiderDebug.log(String.format("当前层级未找到(%s),增加匹配层级为%d", pic.isEmpty()? "图片": "标题", lookback.getInt(4))); - }else{ - lookup = lookback.getInt(4); - } - }else{ - lookup = lookback.getInt(4); - } - } - }while (lookup < 0); - - pos += nd.length(); - blockPos = 0; - String vod_id = Utils.findSubString(nd, blockPos, search.getJSONArray("vod_id")); - if (!set.contains(vod_id)) { - set.add(vod_id); - JSONObject v = new JSONObject(); - v.put("vod_id", vod_id); - v.put("vod_name", Utils.findSubString(nd, blockPos, search.optJSONArray("vod_name"))); - v.put("vod_pic", addHttpPrefix(Utils.findSubString(nd, blockPos, search.optJSONArray("vod_pic")))); - v.put("vod_remarks", Utils.findSubString(nd, blockPos, search.optJSONArray("vod_remarks"))); - - if (v.getString("vod_name").isEmpty()) { - v.put("vod_name", guess_value_vod_name(nd, 0)); - } - - if (v.getString("vod_pic").isEmpty()) { - v.put("vod_pic", guess_value_vod_pic(nd, 0)); - } - // 随便整点remark - if (v.getString("vod_remarks").isEmpty()) { - String vod_name = v.getString("vod_name"); - v.put("vod_remarks", guess_value_vod_remarks(nd, 0, vod_name)); - } - v.put("vod_id", Base64.encodeToString(v.toString().getBytes(Misc.CharsetUTF8), base64Flag)); - videos.put(v); - } - } - - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - protected String fetchUrl(String url, JSONObject h) { - String html = OkHttpUtil.string(url, getHeaders(url)); - html = this.jumpbtwaf(url, html, h); - return html.replaceAll("", "").replace("\r\n","").replace("\n",""); // 移除注释 - } - - protected String jumpbtwaf(String webUrl, String html, JSONObject h) { - - try { - // 没有配置btwaf不执行下面的代码 - if (!rule.optBoolean("btwaf", false)) { - return html; - } - - if (html.contains("检测中") && html.contains("跳转中") && html.contains("btwaf")) { - JSONArray keys = new JSONArray(); - keys.put("btwaf="); - keys.put("\""); - String btwaf = Utils.findSubString(html, 0, keys); - String bturl = webUrl + "?btwaf=" + btwaf; - - Map> cookies = new HashMap<>(); - OkHttpUtil.string(bturl, getHeaders(webUrl), cookies); - for (Map.Entry> entry : cookies.entrySet()) { - if (entry.getKey().equals("set-cookie") || entry.getKey().equals("Set-Cookie")) { - String btcookie = TextUtils.join(";", entry.getValue()); - if (!rule.has("header")) { - rule.put("header", new JSONObject()); - } - rule.getJSONObject("header").put("cookie", btcookie); - break; - } - } - html = fetchUrl(webUrl, h); - } - if (!html.contains("检测中") && !html.contains("btwaf")) { - return html; - } - - } catch (Exception e) { - e.printStackTrace(); - } - return html; - } - -} diff --git a/TVBox_Java/spider/XBiubiu.java b/TVBox_Java/spider/XBiubiu.java deleted file mode 100644 index e805629..0000000 --- a/TVBox_Java/spider/XBiubiu.java +++ /dev/null @@ -1,528 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - -public class XBiubiu extends Spider { - - @Override - public void init(Context context) { - super.init(context); - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - fetchRule(); - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - String[] fenleis = getRuleVal("fenlei", "").split("#"); - for (String fenlei : fenleis) { - String[] info = fenlei.split("\\$"); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_name", info[0]); - jsonObject.put("type_id", info[1]); - classes.put(jsonObject); - } - result.put("class", classes); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - String ua = getRuleVal("ua", Misc.UaWinChrome).trim(); - if (ua.isEmpty()) - ua = Misc.UaWinChrome; - headers.put("User-Agent", ua); - return headers; - } - - @Override - public String homeVideoContent() { - try { - fetchRule(); - if (getRuleVal("shouye").equals("1")) { - JSONArray videos = new JSONArray(); - String[] fenleis = getRuleVal("fenlei", "").split("#"); - for (String fenlei : fenleis) { - String[] info = fenlei.split("\\$"); - JSONObject data = category(info[1], "1", false, new HashMap<>()); - if (data != null) { - JSONArray vids = data.optJSONArray("list"); - if (vids != null) { - for (int i = 0; i < vids.length() && i < 5; i++) { - videos.put(vids.getJSONObject(i)); - } - } - } - if (videos.length() >= 30) - break; - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private JSONObject category(String tid, String pg, boolean filter, HashMap extend) { - try { - fetchRule(); - if (tid.equals("空")) - tid = ""; - String qishiye = rule.optString("qishiye", "nil"); - if (qishiye.equals("空")) - pg = ""; - else if (!qishiye.equals("nil")) { - pg = String.valueOf(Integer.parseInt(pg) - 1 + Integer.parseInt(qishiye)); - } - String webUrl = getRuleVal("url") + tid + pg + getRuleVal("houzhui"); - String html = fetch(webUrl); - html = removeUnicode(html); - String parseContent = html; - boolean shifouercijiequ = getRuleVal("shifouercijiequ").equals("1"); - if (shifouercijiequ) { - String jiequqian = getRuleVal("jiequqian"); - String jiequhou = getRuleVal("jiequhou"); - parseContent = subContent(html, jiequqian, jiequhou).get(0); - } - String jiequshuzuqian = getRuleVal("jiequshuzuqian"); - String jiequshuzuhou = getRuleVal("jiequshuzuhou"); - JSONArray videos = new JSONArray(); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String title = removeHtml(subContent(jiequContent, getRuleVal("biaotiqian"), getRuleVal("biaotihou")).get(0)); - String pic = ""; - String tupianqian = getRuleVal("tupianqian").toLowerCase(); - if (tupianqian.startsWith("http://") || tupianqian.startsWith("https://")) { - pic = getRuleVal("tupianqian"); - } else { - pic = subContent(jiequContent, getRuleVal("tupianqian"), getRuleVal("tupianhou")).get(0); - } - pic = Misc.fixUrl(webUrl, pic); - String link = subContent(jiequContent, getRuleVal("lianjieqian"), getRuleVal("lianjiehou")).get(0); - link = getRuleVal("ljqianzhui").isEmpty() ? (link + getRuleVal("ljhouzhui")) : ("x:" + getRuleVal("ljqianzhui")) + link + getRuleVal("ljhouzhui"); - String remark = !getRuleVal("fubiaotiqian").isEmpty() && !getRuleVal("fubiaotihou").isEmpty() ? - removeHtml(subContent(jiequContent, getRuleVal("fubiaotiqian"), getRuleVal("fubiaotihou")).get(0)) : ""; - JSONObject v = new JSONObject(); - v.put("vod_id", title + "$$$" + pic + "$$$" + link); - v.put("vod_name", title); - v.put("vod_pic", pic); - v.put("vod_remarks", remark); - videos.put(v); - } catch (Throwable th) { - th.printStackTrace(); - } - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result; - } catch (Exception e) { - SpiderDebug.log(e); - } - return null; - } - - private static String removeUnicode(String str) { - Pattern pattern = Pattern.compile("(\\\\u(\\w{4}))"); - Matcher matcher = pattern.matcher(str); - while (matcher.find()) { - String full = matcher.group(1); - String ucode = matcher.group(2); - char c = (char) Integer.parseInt(ucode, 16); - str = str.replace(full, c + ""); - } - return str; - } - - String removeHtml(String text) { - return Jsoup.parse(text).text(); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - JSONObject obj = category(tid, pg, filter, extend); - return obj != null ? obj.toString() : ""; - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - String[] idInfo = ids.get(0).split("\\$\\$\\$"); - String webUrl = idInfo[2].startsWith("x:") ? idInfo[2] : getRuleVal("url") + idInfo[2]; - String html = fetch(webUrl.startsWith("x:") ? webUrl.substring(2) : webUrl); - String parseContent = html; - boolean bfshifouercijiequ = getRuleVal("bfshifouercijiequ").equals("1"); - if (bfshifouercijiequ) { - String jiequqian = getRuleVal("bfjiequqian"); - String jiequhou = getRuleVal("bfjiequhou"); - parseContent = subContent(html, jiequqian, jiequhou).get(0); - } - - ArrayList playList = new ArrayList<>(); - boolean playDirect = getRuleVal("直接播放").equals("1"); - if (!playDirect) { - String jiequshuzuqian = getRuleVal("bfjiequshuzuqian"); - String jiequshuzuhou = getRuleVal("bfjiequshuzuhou"); - boolean bfyshifouercijiequ = getRuleVal("bfyshifouercijiequ").equals("1"); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String parseJqContent = bfyshifouercijiequ ? subContent(jiequContent, getRuleVal("bfyjiequqian"), getRuleVal("bfyjiequhou")).get(0) : jiequContent; - ArrayList lastParseContents = subContent(parseJqContent, getRuleVal("bfyjiequshuzuqian"), getRuleVal("bfyjiequshuzuhou")); - List vodItems = new ArrayList<>(); - for (int j = 0; j < lastParseContents.size(); j++) { - String title = subContent(lastParseContents.get(j), getRuleVal("bfbiaotiqian"), getRuleVal("bfbiaotihou")).get(0); - String link = subContent(lastParseContents.get(j), getRuleVal("bflianjieqian"), getRuleVal("bflianjiehou")).get(0); - String bfqianzhui = getRuleVal("bfqianzhui"); - if (!bfqianzhui.isEmpty()) { - link = bfqianzhui + link; - } - vodItems.add(title + "$" + link); - } - playList.add(TextUtils.join("#", vodItems)); - } catch (Throwable th) { - th.printStackTrace(); - } - } - - } else { - playList.add(idInfo[0] + "$" + idInfo[2]); - } - - String cover = idInfo[1], title = idInfo[0], desc = "", category = "", area = "", year = "", remark = "", director = "", actor = ""; - - if (!getRuleVal("leixinqian").isEmpty() && !getRuleVal("leixinhou").isEmpty()) { - try { - category = subContent(html, getRuleVal("leixinqian"), getRuleVal("leixinhou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("niandaiqian").isEmpty() && !getRuleVal("niandaihou").isEmpty()) { - try { - year = subContent(html, getRuleVal("niandaiqian"), getRuleVal("niandaihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("zhuangtaiqian").isEmpty() && !getRuleVal("zhuangtaihou").isEmpty()) { - try { - remark = subContent(html, getRuleVal("zhuangtaiqian"), getRuleVal("zhuangtaihou")).get(0); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("zhuyanqian").isEmpty() && !getRuleVal("zhuyanhou").isEmpty()) { - try { - actor = subContent(html, getRuleVal("zhuyanqian"), getRuleVal("zhuyanhou")).get(0).replaceAll("\\s+", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("daoyanqian").isEmpty() && !getRuleVal("daoyanhou").isEmpty()) { - try { - director = subContent(html, getRuleVal("daoyanqian"), getRuleVal("daoyanhou")).get(0).replaceAll("\\s+", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("juqingqian").isEmpty() && !getRuleVal("juqinghou").isEmpty()) { - try { - desc = subContent(html, getRuleVal("juqingqian"), getRuleVal("juqinghou")).get(0); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject vod = new JSONObject(); - vod.put("vod_id", ids.get(0)); - vod.put("vod_name", title); - vod.put("vod_pic", cover); - vod.put("type_name", category); - vod.put("vod_year", year); - vod.put("vod_area", area); - vod.put("vod_remarks", remark); - vod.put("vod_actor", actor); - vod.put("vod_director", director); - vod.put("vod_content", desc); - ArrayList playFrom = new ArrayList<>(); - String xlparseContent = html; - if(getRuleVal("xlbiaotiqian").isEmpty() && getRuleVal("xlbiaotihou").isEmpty()){ - - for (int i = 0; i < playList.size(); i++) { - playFrom.add("播放列表" + (i + 1)); - } - }else{ - - boolean xlshifouercijiequ = getRuleVal("xlshifouercijiequ").equals("1"); - if (xlshifouercijiequ) { - String xljiequqian = getRuleVal("xljiequqian"); - String xljiequhou = getRuleVal("xljiequhou"); - xlparseContent = subContent(html, xljiequqian, xljiequhou).get(0); - } - - String xljiequshuzuqian = getRuleVal("xljiequshuzuqian"); - String xljiequshuzuhou = getRuleVal("xljiequshuzuhou"); - ArrayList xljiequContents = subContent(xlparseContent, xljiequshuzuqian, xljiequshuzuhou); - for (int i = 0; i < playList.size(); i++) { - try { - String xltitle = subContent(xljiequContents.get(i), getRuleVal("xlbiaotiqian"), getRuleVal("xlbiaotihou")).get(0); - playFrom.add(xltitle); - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - - } - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = id.startsWith("x:") ? id.substring(2) : getRuleVal("url") + id; - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", webUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - fetchRule(); - boolean ssmoshiJson = getRuleVal("ssmoshi").equals("0"); - String webUrlTmp = getRuleVal("url") + getRuleVal("sousuoqian") + key + getRuleVal("sousuohou"); - String webUrl = webUrlTmp.split(";")[0]; - String webContent = webUrlTmp.contains(";post") ? fetchPost(webUrl) : fetch(webUrl); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (ssmoshiJson) { - JSONObject data = new JSONObject(webContent); - JSONArray vodArray = data.getJSONArray("list"); - for (int j = 0; j < vodArray.length(); j++) { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(getRuleVal("jsname")).trim(); - String id = vod.optString(getRuleVal("jsid")).trim(); - String pic = vod.optString(getRuleVal("jspic")).trim(); - pic = Misc.fixUrl(webUrl, pic); - String link = getRuleVal("sousuohouzhui") + id; - link = getRuleVal("ssljqianzhui").isEmpty() ? (link + getRuleVal("ssljhouzhui")) : ("x:" + getRuleVal("ssljqianzhui")) + link + getRuleVal("ssljhouzhui"); - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + link); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", ""); - videos.put(v); - } - } else { - String parseContent = webContent; - boolean shifouercijiequ = getRuleVal("sousuoshifouercijiequ").equals("1"); - if (shifouercijiequ) { - String jiequqian = getRuleVal("ssjiequqian"); - String jiequhou = getRuleVal("ssjiequhou"); - parseContent = subContent(webContent, jiequqian, jiequhou).get(0); - } - String jiequshuzuqian = getRuleVal("ssjiequshuzuqian"); - String jiequshuzuhou = getRuleVal("ssjiequshuzuhou"); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String title = subContent(jiequContent, getRuleVal("ssbiaotiqian"), getRuleVal("ssbiaotihou")).get(0); - String pic = subContent(jiequContent, getRuleVal("sstupianqian"), getRuleVal("sstupianhou")).get(0); - pic = Misc.fixUrl(webUrl, pic); - String link = subContent(jiequContent, getRuleVal("sslianjieqian"), getRuleVal("sslianjiehou")).get(0); - link = getRuleVal("ssljqianzhui").isEmpty() ? (link + getRuleVal("ssljhouzhui")) : ("x:" + getRuleVal("ssljqianzhui")) + link + getRuleVal("ssljhouzhui"); - String remark = ""; - if (!getRuleVal("ssfubiaotiqian").isEmpty() && !getRuleVal("ssfubiaotihou").isEmpty()) { - try { - remark = subContent(jiequContent, getRuleVal("ssfubiaotiqian"), getRuleVal("ssfubiaotihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", title + "$$$" + pic + "$$$" + link); - v.put("vod_name", title); - v.put("vod_pic", pic); - v.put("vod_remarks", remark); - videos.put(v); - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String ext = null; - protected JSONObject rule = null; - - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - try { - if (ext.startsWith("http")) { - String json = OkHttpUtil.string(ext, null); - rule = new JSONObject(json); - } else { - rule = new JSONObject(ext); - } - } catch (JSONException e) { - } - } - } - } - - protected String fetch(String webUrl) { - SpiderDebug.log(webUrl); - return OkHttpUtil.string(webUrl, getHeaders(webUrl)).replaceAll("\r|\n", ""); - } - - protected String fetchPost(String webUrl) { - SpiderDebug.log(webUrl); - OKCallBack.OKCallBackString callBack = new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - } - }; - OkHttpUtil.post(OkHttpUtil.defaultClient(), webUrl, callBack); - return callBack.getResult().replaceAll("\r|\n", ""); - } - - private String getRuleVal(String key, String defaultVal) { - String v = rule.optString(key); - if (v.isEmpty() || v.equals("空")) - return defaultVal; - return v; - } - - private String getRuleVal(String key) { - return getRuleVal(key, ""); - } - - private ArrayList subContent(String content, String startFlag, String endFlag) { - ArrayList result = new ArrayList<>(); - if (startFlag.isEmpty() && endFlag.isEmpty()) { - result.add(content); - return result; - } - try { - Pattern pattern = Pattern.compile(escapeExprSpecialWord(startFlag) + "(.*?)" + escapeExprSpecialWord(endFlag)); - Matcher matcher = pattern.matcher(content); - while (matcher.find()) { - result.add(matcher.group(1)); - } - } catch (Throwable th) { - th.printStackTrace(); - } - return result; - } - - String escapeExprSpecialWord(String regexStr) { - if (!regexStr.isEmpty()) { - String[] fbsArr = {"\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|"}; - for (String key : fbsArr) { - if (regexStr.contains(key)) { - regexStr = regexStr.replace(key, "\\" + key); - } - } - } - return regexStr; - } - - //修复软件不支持的格式无法嗅探的问题 - @Override - public boolean manualVideoCheck() { - return true; - } - - private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv", ".m4a",".mp3",".wma",".wmv"}; - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } -} diff --git a/TVBox_Java/spider/XPath.java b/TVBox_Java/spider/XPath.java deleted file mode 100644 index cd29071..0000000 --- a/TVBox_Java/spider/XPath.java +++ /dev/null @@ -1,474 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import com.github.catvod.xpath.XPathRule; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.seimicrawler.xpath.JXDocument; -import org.seimicrawler.xpath.JXNode; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -public class XPath extends Spider { - - @Override - public void init(Context context) { - super.init(context); - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - fetchRule(); - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - if (rule.getCateManual().size() > 0) { - Set keys = rule.getCateManual().keySet(); - for (String k : keys) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_name", k); - jsonObject.put("type_id", rule.getCateManual().get(k)); - classes.put(jsonObject); - } - } - try { - String webUrl = rule.getHomeUrl(); - JXDocument doc = JXDocument.create(fetch(webUrl)); - if (rule.getCateManual().size() == 0) { - List navNodes = doc.selN(rule.getCateNode()); - for (int i = 0; i < navNodes.size(); i++) { - String name = navNodes.get(i).selOne(rule.getCateName()).asString().trim(); - name = rule.getCateNameR(name); - String id = navNodes.get(i).selOne(rule.getCateId()).asString().trim(); - id = rule.getCateIdR(id); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - if (!rule.getHomeVodNode().isEmpty()) { - try { - JSONArray videos = new JSONArray(); - List vodNodes = doc.selN(rule.getHomeVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getHomeVodName()).asString().trim(); - name = rule.getHomeVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getHomeVodId()).asString().trim(); - id = rule.getHomeVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getHomeVodImg()).asString().trim(); - pic = rule.getHomeVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getHomeVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getHomeVodMark()).asString().trim(); - mark = rule.getHomeVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - result.put("class", classes); - if (filter && rule.getFilter() != null) { - result.put("filters", rule.getFilter()); - } - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", rule.getUa().isEmpty() - ? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36" - : rule.getUa()); - return headers; - } - - @Override - public String homeVideoContent() { - try { - fetchRule(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - return rule.getCateUrl().replace("{cateId}", tid).replace("{catePg}", pg); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - fetchRule(); - String webUrl = categoryUrl(tid, pg, filter, extend); - JSONArray videos = new JSONArray(); - JXDocument doc = JXDocument.create(fetch(webUrl)); - List vodNodes = doc.selN(rule.getCateVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getCateVodName()).asString().trim(); - name = rule.getCateVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getCateVodId()).asString().trim(); - id = rule.getCateVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getCateVodImg()).asString().trim(); - pic = rule.getCateVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getCateVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getCateVodMark()).asString().trim(); - mark = rule.getCateVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected void detailContentExt(String content, JSONObject vod) { - - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0)); - String webContent = fetch(webUrl); - JXDocument doc = JXDocument.create(webContent); - JXNode vodNode = doc.selNOne(rule.getDetailNode()); - - String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = ""; - - title = vodNode.selOne(rule.getDetailName()).asString().trim(); - title = rule.getDetailNameR(title); - - cover = vodNode.selOne(rule.getDetailImg()).asString().trim(); - cover = rule.getDetailImgR(cover); - cover = Misc.fixUrl(webUrl, cover); - - if (!rule.getDetailCate().isEmpty()) { - try { - category = vodNode.selOne(rule.getDetailCate()).asString().trim(); - category = rule.getDetailCateR(category); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailYear().isEmpty()) { - try { - year = vodNode.selOne(rule.getDetailYear()).asString().trim(); - year = rule.getDetailYearR(year); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailArea().isEmpty()) { - try { - area = vodNode.selOne(rule.getDetailArea()).asString().trim(); - area = rule.getDetailAreaR(area); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailMark().isEmpty()) { - try { - remark = vodNode.selOne(rule.getDetailMark()).asString().trim(); - remark = rule.getDetailMarkR(remark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailActor().isEmpty()) { - try { - actor = vodNode.selOne(rule.getDetailActor()).asString().trim(); - actor = rule.getDetailActorR(actor); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDirector().isEmpty()) { - try { - director = vodNode.selOne(rule.getDetailDirector()).asString().trim(); - director = rule.getDetailDirectorR(director); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDesc().isEmpty()) { - try { - desc = vodNode.selOne(rule.getDetailDesc()).asString().trim(); - desc = rule.getDetailDescR(desc); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - JSONObject vod = new JSONObject(); - vod.put("vod_id", ids.get(0)); - vod.put("vod_name", title); - vod.put("vod_pic", cover); - vod.put("type_name", category); - vod.put("vod_year", year); - vod.put("vod_area", area); - vod.put("vod_remarks", remark); - vod.put("vod_actor", actor); - vod.put("vod_director", director); - vod.put("vod_content", desc); - - ArrayList playFrom = new ArrayList<>(); - - List fromNodes = doc.selN(rule.getDetailFromNode()); - for (int i = 0; i < fromNodes.size(); i++) { - String name = fromNodes.get(i).selOne(rule.getDetailFromName()).asString().trim(); - name = rule.getDetailFromNameR(name); - playFrom.add(name); - } - - ArrayList playList = new ArrayList<>(); - List urlListNodes = doc.selN(rule.getDetailUrlNode()); - for (int i = 0; i < urlListNodes.size(); i++) { - List urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode()); - List vodItems = new ArrayList<>(); - for (int j = 0; j < urlNodes.size(); j++) { - String name = urlNodes.get(j).selOne(rule.getDetailUrlName()).asString().trim(); - name = rule.getDetailUrlNameR(name); - String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim(); - id = rule.getDetailUrlIdR(id); - vodItems.add(name + "$" + id); - } - // 排除播放列表为空的播放源 - if (vodItems.size() == 0 && playFrom.size() > i) { - playFrom.set(i, ""); - } - playList.add(TextUtils.join("#", vodItems)); - } - // 排除播放列表为空的播放源 - for (int i = playFrom.size() - 1; i >= 0; i--) { - if (playFrom.get(i).isEmpty()) - playFrom.remove(i); - } - for (int i = playList.size() - 1; i >= 0; i--) { - if (playList.get(i).isEmpty()) - playList.remove(i); - } - for (int i = playList.size() - 1; i >= 0; i--) { - if (i >= playFrom.size()) - playList.remove(i); - } - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - - detailContentExt(webContent, vod); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id); - SpiderDebug.log(webUrl); - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - if (!rule.getPlayUa().isEmpty()) { - result.put("ua", rule.getPlayUa()); - } - result.put("url", webUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - fetchRule(); - if (rule.getSearchUrl().isEmpty()) { - return ""; - } - String webUrl = rule.getSearchUrl().replace("{wd}", URLEncoder.encode(key)); - String webContent = fetch(webUrl); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - // add maccms suggest search api support - if (rule.getSearchVodNode().startsWith("json:")) { - String[] node = rule.getSearchVodNode().substring(5).split(">"); - JSONObject data = new JSONObject(webContent); - for (int i = 0; i < node.length; i++) { - if (i == node.length - 1) { - JSONArray vodArray = data.getJSONArray(node[i]); - for (int j = 0; j < vodArray.length(); j++) { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(rule.getSearchVodName()).trim(); - name = rule.getSearchVodNameR(name); - String id = vod.optString(rule.getSearchVodId()).trim(); - id = rule.getSearchVodIdR(id); - String pic = vod.optString(rule.getSearchVodImg()).trim(); - pic = rule.getSearchVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = vod.optString(rule.getSearchVodMark()).trim(); - mark = rule.getSearchVodMarkR(mark); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - } else { - data = data.getJSONObject(node[i]); - } - } - } else { - JXDocument doc = JXDocument.create(webContent); - List vodNodes = doc.selN(rule.getSearchVodNode()); - for (int i = 0; i < vodNodes.size(); i++) { - String name = vodNodes.get(i).selOne(rule.getSearchVodName()).asString().trim(); - name = rule.getSearchVodNameR(name); - String id = vodNodes.get(i).selOne(rule.getSearchVodId()).asString().trim(); - id = rule.getSearchVodIdR(id); - String pic = vodNodes.get(i).selOne(rule.getSearchVodImg()).asString().trim(); - pic = rule.getSearchVodImgR(pic); - pic = Misc.fixUrl(webUrl, pic); - String mark = ""; - if (!rule.getCateVodMark().isEmpty()) { - try { - mark = vodNodes.get(i).selOne(rule.getSearchVodMark()).asString().trim(); - mark = rule.getSearchVodMarkR(mark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public boolean manualVideoCheck() { - return false; - } - - private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv"}; - - @Override - public boolean isVideoFormat(String url) { - url = url.toLowerCase(); - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - return true; - } - } - return false; - } - - protected String ext = null; - protected XPathRule rule = null; - - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - if (ext.startsWith("http")) { - String json = OkHttpUtil.string(ext, null); - rule = XPathRule.fromJson(json); - loadRuleExt(json); - } else { - rule = XPathRule.fromJson(ext); - loadRuleExt(ext); - } - } - } - } - - protected void loadRuleExt(String json) { - - } - - protected String fetch(String webUrl) { - SpiderDebug.log(webUrl); - return OkHttpUtil.string(webUrl, getHeaders(webUrl)); - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/XPathBde4.java b/TVBox_Java/spider/XPathBde4.java deleted file mode 100644 index 799cd8d..0000000 --- a/TVBox_Java/spider/XPathBde4.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.github.catvod.spider; - -import android.util.Base64; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - -import okhttp3.Call; -import okhttp3.Response; - -/** - * 需配合猫大的解密接口使用,没有接口不用尝试。 - */ - -public class XPathBde4 extends XPath { - - String tk = ""; - - @Override - protected void loadRuleExt(String json) { - try { - JSONObject jsonObj = new JSONObject(json); - tk = jsonObj.optString("decodeTk").trim(); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - @Override - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - String url = rule.getCateUrl().replace("{catePg}", pg); - String s = "all"; - if (extend != null) { - if (extend.containsKey("s")) { - s = extend.get("s"); - } - } - url = url.replace("{cateId}", s); - url += "?"; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - if (key.equals("s")) - continue; - String value = extend.get(key); - if (value.length() > 0) { - url += (key + "=" + URLEncoder.encode(value) + "&"); - } - } - } - if (!tid.equals("*")) { - url += ("type=" + tid); - } - return url; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id); - SpiderDebug.log(webUrl); - String content = OkHttpUtil.string(webUrl, getHeaders(webUrl)); - String startFlag = "var m3u8 = \""; - int start = content.indexOf(startFlag); - start = start + startFlag.length(); - int end = content.indexOf("\";", start); - String m3u8 = content.substring(start, end).replace("\\", "").replace("https", "http"); - SpiderDebug.log(m3u8); - HashMap headers = getHeaders(m3u8); - - OKCallBack m3u8Callback = new OKCallBack() { - @Override - public String onParseResponse(Call call, Response response) { - try { - return new String(Base64.encode(response.body().bytes(), Base64.DEFAULT)); - } catch (IOException e) { - return ""; - } - } - - @Override - public void onFailure(Call call, Exception e) { - setResult(""); - SpiderDebug.log(e); - } - - @Override - public void onResponse(String response) { - } - }; - OkHttpUtil.get(OkHttpUtil.defaultClient(), m3u8, null, headers, m3u8Callback); - String m3u8Data = m3u8Callback.getResult(); - if (m3u8Data != null && !m3u8Data.isEmpty()) { - JSONObject result = new JSONObject(); - JSONObject json = new JSONObject(); - json.put("data", m3u8Data); - json.put("t", tk); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "https://cat.idontcare.top/ssr/bde4", json.toString(), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - result.put("url", response); - } catch (JSONException e) { - } - } - }); - result.put("parse", 0); - result.put("playUrl", ""); - if (!rule.getPlayUa().isEmpty()) { - result.put("ua", rule.getPlayUa()); - } - return result.toString(); - - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/XPathEgg.java b/TVBox_Java/spider/XPathEgg.java deleted file mode 100644 index 4a8ec16..0000000 --- a/TVBox_Java/spider/XPathEgg.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.github.catvod.spider; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.List; - -import okhttp3.Call; - -public class XPathEgg extends XPath { - - String tk = ""; - - @Override - protected void loadRuleExt(String json) { - try { - JSONObject jsonObj = new JSONObject(json); - tk = jsonObj.optString("decodeTk").trim(); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - @Override - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - if (Integer.parseInt(pg) <= 1) { - return rule.getCateUrl().replace("{cateId}", tid); - } - return (rule.getCateUrl() + "index_{catePg}.html").replace("{cateId}", tid).replace("{catePg}", pg); - } - - @Override - protected void detailContentExt(String content, JSONObject vod) { - try { - String startFlag = "infoid="; - int start = content.indexOf(startFlag); - start = start + startFlag.length(); - int end = content.indexOf(";", start); - String infoid = content.substring(start, end); - - startFlag = "link5='"; - start = content.indexOf(startFlag); - start = start + startFlag.length(); - end = content.indexOf("';", start); - String link5 = content.substring(start, end); - - JSONObject json = new JSONObject(); - json.put("infoid", infoid); - json.put("link5", link5); - json.put("t", tk); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "https://cat.idontcare.top/ssr/dandan", json.toString(), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - JSONObject obj = new JSONObject(response); - vod.put("vod_play_from", obj.getString("vod_play_from")); - vod.put("vod_play_url", obj.getString("vod_play_url")); - } catch (JSONException e) { - } - } - }); - } catch (Exception e) { - - } - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - HashMap json = new HashMap<>(); - json.put("url", id); - HashMap headers = new HashMap<>(); - headers.put("accept", "*/*"); - headers.put("x-requested-with", "XMLHttpRequest"); - headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); - headers.put("origin", "https://www.dandanzan.cc"); - headers.put("accept-language", "zh-CN,zh;q=0.9"); - JSONObject result = new JSONObject(); - OkHttpUtil.post(OkHttpUtil.defaultClient(), rule.getPlayUrl(), json, headers, new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - result.put("url", response); - } catch (JSONException e) { - } - } - }); - result.put("parse", 0); - result.put("playUrl", ""); - if (!rule.getPlayUa().isEmpty()) { - result.put("ua", rule.getPlayUa()); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/XPathFilter.java b/TVBox_Java/spider/XPathFilter.java deleted file mode 100644 index 76e75c1..0000000 --- a/TVBox_Java/spider/XPathFilter.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.github.catvod.spider; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class XPathFilter extends XPath { - - @Override - protected void loadRuleExt(String json) { - super.loadRuleExt(json); - } - - @Override - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - String cateUrl = rule.getCateUrl(); - if (filter && extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value)); - } - } - } - cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg); - Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl); - while (m.find()) { - String n = m.group(0).replace("{", "").replace("}", ""); - cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", ""); - } - return cateUrl; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/XPathMac.java b/TVBox_Java/spider/XPathMac.java deleted file mode 100644 index f36ed55..0000000 --- a/TVBox_Java/spider/XPathMac.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; - -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - -import java.net.URLDecoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class XPathMac extends XPath { - // 尝试分析直连 - private boolean decodePlayUrl; - // 尝试匹配官源标识以调用应用配置中的解析列表 - private boolean decodeVipFlag; - // 播放器配置js - private String playerConfigJs = ""; - // 播放器配置js取值正则 - private String playerConfigJsRegex = "[\\W|\\S|.]*?MacPlayerConfig.player_list[\\W|\\S|.]*?=([\\W|\\S|.]*?),MacPlayerConfig.downer_list"; - // 站点里播放源对应的真实官源 - private HashMap show2VipFlag = new HashMap<>(); - - /** - * mac cms 直连和官源调用应用内播放列表支持 - * - * @param context - * @param extend - */ - public void init(Context context, String extend) { - super.init(context, extend); - - } - - @Override - protected void loadRuleExt(String json) { - try { - JSONObject jsonObj = new JSONObject(json); - decodePlayUrl = jsonObj.optBoolean("dcPlayUrl", false); - decodeVipFlag = jsonObj.optBoolean("dcVipFlag", false); - JSONObject dcShow2Vip = jsonObj.optJSONObject("dcShow2Vip"); - if (dcShow2Vip != null) { - Iterator keys = dcShow2Vip.keys(); - while (keys.hasNext()) { - String name = keys.next(); - show2VipFlag.put(name.trim(), dcShow2Vip.getString(name).trim()); - } - } - playerConfigJs = jsonObj.optString("pCfgJs").trim(); - playerConfigJsRegex = jsonObj.optString("pCfgJsR", playerConfigJsRegex).trim(); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - @Override - public String homeContent(boolean filter) { - String result = super.homeContent(filter); - if (result.length() > 0 && playerConfigJs.length() > 0) { // 尝试通过playerConfigJs获取展示和flag匹配关系 - String webContent = fetch(playerConfigJs); - Matcher matcher = Pattern.compile(playerConfigJsRegex).matcher(webContent); - if (matcher.find()) { - try { - JSONObject jsonObject = new JSONObject(matcher.group(1)); - Iterator keys = jsonObject.keys(); - while (keys.hasNext()) { - String key = keys.next(); - JSONObject keyObj = jsonObject.optJSONObject(key); - if (keyObj == null) - continue; - String show = keyObj.optString("show").trim(); - if (show.isEmpty()) - continue; - show2VipFlag.put(show, key); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - // SpiderDebug.log(webContent); - } - return result; - } - - @Override - public String detailContent(List ids) { - String result = super.detailContent(ids); - if (decodeVipFlag && result.length() > 0) { - try { - JSONObject jsonObject = new JSONObject(result); - String playFrom[] = jsonObject.optJSONArray("list").getJSONObject(0).optString("vod_play_from").split("\\$\\$\\$"); - if (playFrom.length > 0) { - for (int i = 0; i < playFrom.length; i++) { - if (show2VipFlag.containsKey(playFrom[i])) { - playFrom[i] = show2VipFlag.get(playFrom[i]); - } - } - jsonObject.optJSONArray("list").getJSONObject(0).put("vod_play_from", TextUtils.join("$$$", playFrom)); - result = jsonObject.toString(); - } - } catch (Throwable th) { - SpiderDebug.log(th); - } - } - return result; - } - - - @Override - public String playerContent(String flag, String id, List vipFlags) { - fetchRule(); - String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id); - String videoUrl = null; - // 尝试分析直连 - if (decodePlayUrl) { - try { - Document doc = Jsoup.parse(fetch(webUrl)); - Elements allScript = doc.select("script"); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - String videoUrlTmp = player.getString("url"); - if (player.has("encrypt")) { - int encrypt = player.getInt("encrypt"); - if (encrypt == 1) { - videoUrlTmp = URLDecoder.decode(videoUrlTmp); - } else if (encrypt == 2) { - videoUrlTmp = new String(Base64.decode(videoUrlTmp, Base64.DEFAULT)); - videoUrlTmp = URLDecoder.decode(videoUrlTmp); - } - } - videoUrl = videoUrlTmp; - break; - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (videoUrl != null) { - // 适配2.0.6的调用应用内解析列表的支持, 需要配合直连分析和匹配官源解析一起使用,参考cjt影视和极品直连 - if (decodeVipFlag && Misc.isVip(videoUrl)) { // 使用jx:1 - try { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", videoUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } else if (decodeVipFlag && vipFlags.contains(flag)) { // 是否使用应用内解析列表解析官源 - try { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", videoUrl); - result.put("header", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - // 如果是视频直连 直接返回免解 - else if (isVideoFormat(videoUrl)) { - try { - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videoUrl); - result.put("header", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } - // 上述都失败了就按默认模式走 - return super.playerContent(flag, id, vipFlags); - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/XPathMacFilter.java b/TVBox_Java/spider/XPathMacFilter.java deleted file mode 100644 index 3cedd20..0000000 --- a/TVBox_Java/spider/XPathMacFilter.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.catvod.spider; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class XPathMacFilter extends XPathMac { - @Override - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - String cateUrl = rule.getCateUrl(); - if (filter && extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value)); - } - } - } - cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg); - Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl); - while (m.find()) { - String n = m.group(0).replace("{", "").replace("}", ""); - cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", ""); - } - return cateUrl; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/XPathMacTvgook.java b/TVBox_Java/spider/XPathMacTvgook.java deleted file mode 100644 index 479cef6..0000000 --- a/TVBox_Java/spider/XPathMacTvgook.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import com.github.catvod.xpath.XPathRule; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.seimicrawler.xpath.JXDocument; -import org.seimicrawler.xpath.JXNode; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -public class XPathMacTvgook extends XPathMac { - - @Override - public boolean manualVideoCheck() { - return rule.getHomeUrl().contains("tvgook.com"); - - } - - @Override - public boolean isVideoFormat(String url) { - return Misc.isVideoFormat(url)||(url.contains("/ppvod/")&&!url.contains("skipl=1")); - } - - -} diff --git a/TVBox_Java/spider/XPbd.java b/TVBox_Java/spider/XPbd.java deleted file mode 100644 index c6c2905..0000000 --- a/TVBox_Java/spider/XPbd.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.github.catvod.spider; - -import android.text.TextUtils; - -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.seimicrawler.xpath.JXDocument; -import org.seimicrawler.xpath.JXNode; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class XPbd extends XPath { - - @Override - protected String categoryUrl(String tid, String pg, boolean filter, HashMap extend) { - String cateUrl = rule.getCateUrl(); - if (filter && extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value)); - } - } - } - cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg); - Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl); - while (m.find()) { - String n = m.group(0).replace("{", "").replace("}", ""); - cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", ""); - } - return cateUrl; - } - - @Override - public String detailContent(List ids) { - try { - String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0)); - String webContent = fetch(webUrl); - JXDocument doc = JXDocument.create(webContent); - JXNode vodNode = doc.selNOne(rule.getDetailNode()); - JSONObject vodAtom = new JSONObject(); - - String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = ""; - - title = vodNode.selOne(rule.getDetailName()).asString().trim(); - title = rule.getDetailNameR(title); - - cover = vodNode.selOne(rule.getDetailImg()).asString().trim(); - cover = rule.getDetailImgR(cover); - cover = Misc.fixUrl(webUrl, cover); - - if (!rule.getDetailCate().isEmpty()) { - try { - category = vodNode.selOne(rule.getDetailCate()).asString().trim(); - category = rule.getDetailCateR(category); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailYear().isEmpty()) { - try { - year = vodNode.selOne(rule.getDetailYear()).asString().trim(); - year = rule.getDetailYearR(year); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailArea().isEmpty()) { - try { - area = vodNode.selOne(rule.getDetailArea()).asString().trim(); - area = rule.getDetailAreaR(area); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailMark().isEmpty()) { - try { - remark = vodNode.selOne(rule.getDetailMark()).asString().trim(); - remark = rule.getDetailMarkR(remark); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailActor().isEmpty()) { - try { - actor = vodNode.selOne(rule.getDetailActor()).asString().trim(); - actor = rule.getDetailActorR(actor); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDirector().isEmpty()) { - try { - director = vodNode.selOne(rule.getDetailDirector()).asString().trim(); - director = rule.getDetailDirectorR(director); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!rule.getDetailDesc().isEmpty()) { - try { - desc = vodNode.selOne(rule.getDetailDesc()).asString().trim(); - desc = rule.getDetailDescR(desc); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - vodAtom.put("vod_name", title); - vodAtom.put("vod_pic", cover); - vodAtom.put("type_name", category); - vodAtom.put("vod_year", year); - vodAtom.put("vod_area", area); - vodAtom.put("vod_remarks", remark); - vodAtom.put("vod_actor", actor); - vodAtom.put("vod_director", director); - vodAtom.put("vod_content", desc); - - List urlListNodes = doc.selN(rule.getDetailUrlNode()); - for (int i = 0; i < urlListNodes.size(); i++) { - List urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode()); - for (int j = 0; j < urlNodes.size(); j++) { - String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim(); - id = rule.getDetailUrlIdR(id); - JSONObject result = new JSONObject(); - JSONArray lists = new JSONArray(); - vodAtom.put("vod_id", id); - vodAtom.put("vod_play_from", "磁力测试"); - vodAtom.put("vod_play_url", "网站没资源$" + id); - lists.put(vodAtom); - result.put("list", lists); - return result.toString(); - } - } - } catch (JSONException e) { - e.printStackTrace(); - } - return ""; - } - -} diff --git a/TVBox_Java/spider/Xiaoh.java b/TVBox_Java/spider/Xiaoh.java deleted file mode 100644 index 8f543d0..0000000 --- a/TVBox_Java/spider/Xiaoh.java +++ /dev/null @@ -1,471 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Xiaoh extends Spider { - private static final String siteUrl = "https://www.xiaoheimi.net"; - private static final String siteHost = "www.xiaoheimi.net"; - - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/index.php/vod/type/id/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/index.php/vod/detail/id/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/index.php/vod/play/id/(\\d+)/sid/(\\d+)/nid/(\\d+).html"); - private Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+"); - - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"gqy2\":{\"sh\":\"高清2\",\"sn\":0,\"pu\":\"\",\"or\":999},\"xbyy\":{\"sh\":\"高清\",\"sn\":0,\"pu\":\"\",\"or\":999},\"ysgc\":{\"sh\":\"高清源\",\"sn\":0,\"pu\":\"\",\"or\":999},\"if101\":{\"sh\":\"小宝影院\",\"sn\":0,\"pu\":\"\",\"or\":999},\"bili\":{\"sh\":\"bili\",\"sn\":0,\"pu\":\"\",\"or\":999},\"dplayer\":{\"sh\":\"DPlayer-H5播放器\",\"sn\":0,\"pu\":\"\",\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧片\",\"v\":\"喜剧片\"},{\"n\":\"冒险片\",\"v\":\"冒险片\"},{\"n\":\"剧情片\",\"v\":\"剧情片\"},{\"n\":\"动作片\",\"v\":\"动作片\"},{\"n\":\"动画电影\",\"v\":\"动画电影\"},{\"n\":\"同性片\",\"v\":\"同性片\"},{\"n\":\"奇幻片\",\"v\":\"奇幻片\"},{\"n\":\"恐怖片\",\"v\":\"恐怖片\"},{\"n\":\"悬疑片\",\"v\":\"悬疑片\"},{\"n\":\"惊悚片\",\"v\":\"惊悚片\"},{\"n\":\"歌舞片\",\"v\":\"歌舞片\"},{\"n\":\"灾难片\",\"v\":\"灾难片\"},{\"n\":\"爱情片\",\"v\":\"爱情片\"},{\"n\":\"犯罪片\",\"v\":\"犯罪片\"},{\"n\":\"科幻片\",\"v\":\"科幻片\"},{\"n\":\"经典片\",\"v\":\"经典片\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"},{\"n\":\"战争片\",\"v\":\"战争片\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"玄幻\",\"v\":\"玄幻\"},{\"n\":\"谍战\",\"v\":\"谍战\"},{\"n\":\"历险\",\"v\":\"历险\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"军旅\",\"v\":\"军旅\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"江湖\",\"v\":\"江湖\"},{\"n\":\"罪案\",\"v\":\"罪案\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"穿越\",\"v\":\"穿越\"},{\"n\":\"宫廷\",\"v\":\"宫廷\"},{\"n\":\"神话\",\"v\":\"神话\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"同性\",\"v\":\"同性\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"格斗\",\"v\":\"格斗\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"爆笑\",\"v\":\"爆笑\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"恋爱\",\"v\":\"恋爱\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"治愈\",\"v\":\"治愈\"},{\"n\":\"泡面\",\"v\":\"泡面\"},{\"n\":\"穿越\",\"v\":\"穿越\"},{\"n\":\"灵异\",\"v\":\"灵异\"},{\"n\":\"耽美\",\"v\":\"耽美\"},{\"n\":\"动画电影\",\"v\":\"动画电影\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"真人秀\",\"v\":\"真人秀\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"网综\",\"v\":\"网综\"},{\"n\":\"脱口秀\",\"v\":\"脱口秀\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"演唱会\",\"v\":\"演唱会\"},{\"n\":\"晚会\",\"v\":\"晚会\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"21\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"class\",\"name\":\"分类\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"文化\",\"v\":\"文化\"},{\"n\":\"探索\",\"v\":\"探索\"},{\"n\":\"军事\",\"v\":\"军事\"},{\"n\":\"解密\",\"v\":\"解密\"},{\"n\":\"科技\",\"v\":\"科技\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"人物\",\"v\":\"人物\"},{\"n\":\"自然\",\"v\":\"自然\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"20\":[{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":\"lang\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"泰国语\",\"v\":\"泰国语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Host", siteHost); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.nav-menu>li>a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("电视剧") || - name.equals("动漫") || - name.equals("综艺") || - name.equals("纪录片") || - name.equals("体育"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("ul.myui-vodlist").get(1); - Elements list = homeList.select("div.myui-vodlist__box>a"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/index.php/vod/show/id/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select(".myui-page li a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - String name = a.text(); - if (page == -1 && a.hasClass("btn-warm")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).trim()); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).trim()); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.myui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".myui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - - Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/index.php/vod/detail/id/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String vid = doc.selectFirst("span.mac_hits").attr("data-id"); - - String cover = doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("div.myui-content__detail h1.title").text(); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.myui-panel__head>ul").get(0).select("li"); - Elements sourceList = doc.select("div.tab-content>div.tab-pane"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("ul>li>a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "/sid/" + matcher.group(2) + "/nid/" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/index.php/vod/play/id/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", ""); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = "https://www.google.com/search?q=site%3A" + siteHost + "+" + URLEncoder.encode(key); - Document doc = Jsoup.parse(OkHttpUtil.string(url, Headers())); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - Elements sourceList = doc.select("div.yuRUbf a"); - for (int i = 0; i < sourceList.size(); i++) { - Element sourcess = sourceList.get(i); - String sourceName = sourcess.select("h3").text(); - String list1 = sourcess.attr("href"); - Matcher matcher = regexVid.matcher(list1); - if (sourceName.contains(key) && matcher.find()) { - Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1))); - JSONObject v = new JSONObject(); - String group = matcher.group(1); - String cover = ddrklink.selectFirst("a.myui-vodlist__thumb img").attr("data-original"); - String title = ddrklink.selectFirst("div.myui-content__detail h1.title").text(); - Elements span_text_muted = ddrklink.select("div.myui-content__detail span.text-muted"); - for (int j = 0; j < span_text_muted.size(); j++) { - Element text = span_text_muted.get(j); - String info = text.text(); - if (info.equals("更新:")) { - String remark = text.nextElementSibling().text(); - v.put("vod_name", title); - v.put("vod_remarks", remark); - v.put("vod_id", group); - v.put("vod_pic", cover); - videos.put(v); - } - } - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Xifanys.java b/TVBox_Java/spider/Xifanys.java deleted file mode 100644 index b45b26e..0000000 --- a/TVBox_Java/spider/Xifanys.java +++ /dev/null @@ -1,479 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Xifanys extends Spider { - - private static final String siteUrl = "https://www.xifanys.com/"; - private static final String siteHost = "xifanys.com"; - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/yingpiantype/(\\S+).html"); - protected Pattern regexVid = Pattern.compile("/yingpiandetail/(\\S+).html"); - protected Pattern regexPlay = Pattern.compile("/yingpianplay/(\\S+)-(\\d+)-(\\d+).html"); - protected Pattern regexPage = Pattern.compile("/yingpianshow/(\\S+).html"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"tkm3u8\":{\"sh\":\"R播\",\"pu\":\",\"sn\":0,\"or\":999},\"if101\":{\"sh\":\"Y播\",\"pu\":\"\",\"sn\":0,\"or\":999}}"); - filterConfig = new JSONObject("{\"20\":[{\"key\":\"0\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"20\"},{\"n\":\"动作片\",\"v\":\"24\"},{\"n\":\"喜剧片\",\"v\":\"25\"},{\"n\":\"愛情片\",\"v\":\"26\"},{\"n\":\"科幻片\",\"v\":\"27\"},{\"n\":\"恐怖片\",\"v\":\"28\"},{\"n\":\"劇情片\",\"v\":\"11\"},{\"n\":\"戰爭片\",\"v\":\"30\"},{\"n\":\"动画电影\",\"v\":\"33\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"21\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"34\"},{\"n\":\"港剧\",\"v\":\"35\"},{\"n\":\"韩剧\",\"v\":\"37\"},{\"n\":\"欧美剧\",\"v\":\"36\"},{\"n\":\"日本剧\",\"v\":\"38\"},{\"n\":\"台湾剧\",\"v\":\"39\"},{\"n\":\"海外剧\",\"v\":\"40\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"22\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"22\"},{\"n\":\"大陆综艺\",\"v\":\"41\"},{\"n\":\"港台综艺\",\"v\":\"42\"},{\"n\":\"日韩综艺\",\"v\":\"43\"},{\"n\":\"欧美综艺\",\"v\":\"44\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"23\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"23\"},{\"n\":\"国产动漫\",\"v\":\"45\"},{\"n\":\"日本动漫\",\"v\":\"46\"},{\"n\":\"欧美动漫\",\"v\":\"47\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - if (!TextUtils.isEmpty(url)) { - headers.put("Referer", url); - } - //headers.put("sec-ch-ua-platform","Windows"); - headers.put("Accept-Encoding", "gzip, deflate, br"); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headers.put("Accept-Language", "zh-CN,zh;q=0.9"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Element cateList = doc.select("ul.nav-menu-items").get(0); - Elements elements = cateList.select("li > a"); - - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - //分类名 - String name = ele.attr("title"); - boolean show = name.equals("电影") || - name.equals("剧集") || - name.equals("综艺") || - name.equals("动漫"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - //System.out.println(id+":"+name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.module-items").get(0); - Elements list = homeList.select("div.module-item"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".module-item-titlebox a").text(); - String cover = vod.selectFirst(".module-item-pic > img").attr("data-src"); - String remark = vod.selectFirst(".module-item-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst(".module-item-titlebox a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "/yingpianshow/" + TextUtils.join("-", urlParams) + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - - // 取页码相关信息 - Elements pageInfo = doc.select("div.module-footer > div > a"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element a = pageInfo.get(i); - //Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && a.hasClass("display")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - - Elements list = doc.select("div.module-items > div.module-item"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".module-item-titlebox a").text(); - String cover = vod.selectFirst(".module-item-pic > img").attr("data-src"); - String remark = vod.selectFirst(".module-item-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst(".module-item-titlebox a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 72); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 72); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/yingpiandetail/" + ids.get(0) + ".html"; - //System.out.println(url); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.video-cover .module-item-pic > img").attr("data-src"); - String title = doc.selectFirst("div.video-cover .module-item-pic > a").attr("alt"); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.video-info-main span.video-info-itemtitle"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("分类:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("上映:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextElementSibling().text(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - //System.out.println(vodList.toString()); - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.module-tab-content").get(0).select("div > span"); - //System.out.println(sources.size()); - Elements sourceList = doc.select("div.module-player-list"); - //System.out.println(sourceList.size()); - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - //System.out.println(sources.text().split(":")[0].split("』")[1]); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select(".scroll-content > a"); - //System.out.println(playListA.size()); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - //headers.put("origin", " https://juhi.cc"); - //headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - //headers.put("Accept", " */*"); - //headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - //headers.put("Accept-Encoding", " gzip, deflate, br"); - - - // 播放页 url - String url = siteUrl + "/yingpianplay/" + id + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = player.getString("url"); - String playUrl = pCfg.getString("pu"); - if (Misc.isVip(videoUrl)) { // 使用jx:1 - try { - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", videoUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - result.put("parse", pCfg.getInt("sn")); - result.put("playUrl", playUrl); - result.put("url", videoUrl); - result.put("header", headers.toString()); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - //Document doc = Jsoup.parse(srr.content); - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Xmau.java b/TVBox_Java/spider/Xmau.java deleted file mode 100644 index 3dc2bf0..0000000 --- a/TVBox_Java/spider/Xmau.java +++ /dev/null @@ -1,263 +0,0 @@ -package com.github.catvod.spider; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; - -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build; -import android.text.TextUtils; -import android.util.Base64; - - -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import okhttp3.Call; -import okhttp3.Response; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.spec.AlgorithmParameterSpec; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TimeZone; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.Calendar; -import java.net.URLDecoder; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -public class Xmau extends Spider { - @Override - public void init(Context context) {super.init(context);} - - - @Override - public String homeContent(boolean filter) { - try { - JSONObject cateobj = new JSONObject(); - JSONArray classes = new JSONArray(); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - JSONObject v = new JSONObject(); - cateobj.put("type_name", "test111"); - cateobj.put("type_id", "1"); - classes.put(cateobj); - result.put("class", classes); - v.put("vod_id", "testid222"); - v.put("vod_name", "testname333"); - v.put("vod_pic","https://pic.rmb.bdstatic.com/bjh/1d0b02d0f57f0a42201f92caba5107ed.jpeg"); - v.put("vod_remarks", "testmark444"); - videos.put(v); - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - vodList.put("vod_id", "id"); - vodList.put("vod_name", "Xmau解密练习,写固定播放连结,有需要请自行补齐"); - vodList.put("vod_pic", "https://pic.rmb.bdstatic.com/bjh/1d0b02d0f57f0a42201f92caba5107ed.jpeg"); - vodList.put("vod_year", "year9999"); - vodList.put("type_name", "type7777"); - vodList.put("vod_area","are0000a" ); - vodList.put("vod_actor", "actor0987"); - vodList.put("vod_content", "content1234567890"); - String playList = ""; - List vodItems = new ArrayList<>(); - String pl1 = "playname1$playlink1"; - String pl2 = "playname2$playlink2"; - vodItems.add(pl1); - vodItems.add(pl2); - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - if (playList.length() == 0) - playList = "nothing here"; - Map vod_play = new TreeMap<>(); - vod_play.put("test", playList); - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - long currentTime = System.currentTimeMillis()/ 1000; - String apikey=getapikey(); - String deturl ="http://eg.xmau.cn/lvdou_api.php/v1.vod/detail?vod_id=8055&rel_limit=10&apikey="+apikey+"&keytime="+currentTime; - String detsrc = OkHttpUtil.string(deturl, getHeaders(deturl)); - JSONObject detsrcobj = new JSONObject(detsrc); - JSONObject detsrcobjdata= detsrcobj.getJSONObject("data"); - String requrlsrc = detsrcobjdata.getString("vod_play_url"); - String requrl = requrlsrc.substring(3); - currentTime = System.currentTimeMillis()/ 1000; - apikey=getapikey(); - String reqapiurl="https://h5.freejson.xyz/?url="+requrl+"&apikey="+apikey+"&keytime="+currentTime; - String reqapirsp = OkHttpUtil.string(reqapiurl, getHeaders(reqapiurl)); - Document doc = Jsoup.parse(reqapirsp); - Elements allScript = doc.select("script"); - String iv=""; - String enyurl=""; - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).toString(); - if (scContent.contains("var le_token")) { - System.out.println("fpplog scContent:"+scContent); - int start = scContent.indexOf('"'); - int end = scContent.lastIndexOf('"') + 1; - iv = scContent.substring(start+1, end-1); - } - if (scContent.contains("var config")) { - int start = scContent.indexOf("var config ="); - int end = scContent.lastIndexOf('}') + 1; - String j1 = scContent.substring(start, end); - start = j1.indexOf('('); - end = j1.lastIndexOf(')') ; - enyurl = j1.substring(start+2, end-1); - break; - } - } - String enyurlb64dec=toHex(Base64.decode(enyurl.getBytes(), Base64.DEFAULT)); - String key = "A42EAC0C2B408472"; - String videolink=decrypt(enyurlb64dec,key,iv); - JSONObject result = new JSONObject(); - result.put("url", videolink); - result.put("header", new JSONObject(getHeaders(videolink)).toString()); - result.put("parse", 0); - result.put("playUrl", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - - private HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent","User-Agent:okhttp/4.1.0"); - return headers; - } - - @TargetApi(Build.VERSION_CODES.KITKAT) - protected String getapikey() { - try { - Calendar cal=Calendar.getInstance(); - int y=cal.get(Calendar.YEAR); - int h=cal.get(Calendar.HOUR_OF_DAY); - int m=cal.get(Calendar.MINUTE); - String apikeyori=y+":"+(h<10?("0"+h):h)+":"+y+":"+(m<10?("0"+m):m)+":lvdoutv-1.0.0"; - String apikey=Misc.MD5(apikeyori,StandardCharsets.UTF_8); - return apikey; - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - protected String decrypt(String src, String KEY, String IV) { - try { - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); - cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); - return new String(cipher.doFinal(hex2byte(src))); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - protected String encrypt(String src, String KEY, String IV) { - try { - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); - cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec); - return bytesToHexStr(cipher.doFinal(src.getBytes())).toUpperCase(); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - - protected byte[] hex2byte(String hex) throws IllegalArgumentException { - if (hex.length() % 2 != 0){ - throw new IllegalArgumentException("invalid hex string"); - } - char[] arr = hex.toCharArray(); - byte[] b = new byte[hex.length() / 2]; - for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { - String swap ="" + arr[i++] + arr[i]; - int byteint = Integer.parseInt(swap, 16) & 0xFF; - b[j] = new Integer(byteint).byteValue(); - } - return b; - } - - protected String bytesToHexStr(byte[] bytes) { - StringBuilder hexStr = new StringBuilder(); - for (byte b : bytes) { - String hex = Integer.toHexString(b & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - hexStr.append(hex); - } - return hexStr.toString(); - } - - - private static final char[] DIGITS - = {'0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static final String toHex(byte[] data) { - final StringBuffer sb = new StringBuffer(data.length * 2); - for (int i = 0; i < data.length; i++) { - sb.append(DIGITS[(data[i] >>> 4) & 0x0F]); - sb.append(DIGITS[data[i] & 0x0F]); - } - return sb.toString(); - } - - - - -} diff --git a/TVBox_Java/spider/Xxys.java b/TVBox_Java/spider/Xxys.java deleted file mode 100644 index e4af42c..0000000 --- a/TVBox_Java/spider/Xxys.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; - - -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.HashMap; - -import java.util.regex.Pattern; - -public class Xxys extends AppYsV2 { - - @Override - protected JSONObject getFinalVideo(String flag, ArrayList parseUrls, String url) throws JSONException { - String htmlPlayUrl = ""; - for (String parseUrl : parseUrls) { - if (parseUrl.isEmpty() || parseUrl.equals("null")) - continue; - String playUrl = parseUrl + url; - String content = desc(OkHttpUtil.string(playUrl, null), (byte) 4); - try { - HashMap hashMap = new HashMap(); - OkHttpUtil.stringNoRedirect(playUrl, null, hashMap); - String d = OkHttpUtil.getRedirectLocation(hashMap); - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", d); - return result; - } catch (JSONException e) { - e.printStackTrace(); - } - JSONObject tryJson = null; - try { - tryJson = Misc.jsonParse(url, content); - } catch (Throwable th) { - - } - if (tryJson != null && tryJson.has("url") && tryJson.has("header")) { - tryJson.put("header", tryJson.getJSONObject("header").toString()); - return tryJson; - } - if (content.contains("0){ - break; - }else{ - Thread.sleep(1000); - } - } - - JSONObject srcori = new JSONObject(srcOrignstr); - JSONArray srcoria = srcori.getJSONArray("data"); - - - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - String catestr ="{\"推荐\":\"?\",\"斗鱼\":\"ByPlatform?platform=douyu&\",\"哔哩哔哩\":\"ByPlatform?platform=bilibili&\",\"虎牙\":\"ByPlatform?platform=huya&\",\"网易CC\":\"ByPlatform?platform=cc&\"}"; - JSONObject catedef = new JSONObject(catestr); - Iterator it = catedef.keys(); - while(it.hasNext()){ - JSONObject jsonObject = new JSONObject(); - String key =(String) it.next(); - jsonObject.put("type_name", key); - jsonObject.put("type_id", catedef.getString(key)); - classes.put(jsonObject); - } - result.put("class", classes); - - JSONObject filterConfig = new JSONObject(); - String geta ="http://live.yj1211.work/api/live/getAllAreas"; - String aaid = ""; - for(int i=0 ; i<3 ; i++){ - aaid = OkHttpUtil.string(geta, getHeaders()); - if(aaid.length()>0){ - break; - }else{ - Thread.sleep(1000); - } - } - - JSONObject aido = new JSONObject(aaid); - JSONArray aidoa = aido.getJSONArray("data"); - JSONArray extendsAll = new JSONArray(); - for (int j=0 ; j< 13;j++){ - JSONObject newTypeExtend = new JSONObject(); - String typeName = aidoa.getJSONArray(j).getJSONObject(0).getString("typeName"); - newTypeExtend.put("key", "typeName" + j); - newTypeExtend.put("name", typeName); - JSONArray newTypeExtendKV = new JSONArray(); - int fg = Math.min(aidoa.getJSONArray(j).length(), 20); - JSONObject kv = new JSONObject(); - kv.put("n", "全部"); - kv.put("v", typeName + "=" + "all"); - newTypeExtendKV.put(kv); - for (int k=0 ; k< fg ; k++){ - kv = new JSONObject(); - String areaName = aidoa.getJSONArray(j).getJSONObject(k).getString("areaName"); - kv.put("n", areaName); - kv.put("v", typeName + "=" + areaName); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - } - for (int i = 0 ; i < 5 ; i++){ - String typeId = classes.getJSONObject(i).getString("type_id"); - filterConfig.put(typeId, extendsAll); - } - - JSONArray videos = new JSONArray(); - int ch = Math.min(srcoria.length(), 10); - for (int i = 0; i < ch; i++) { - JSONObject srchome = new JSONObject(); - String platForm = srcoria.getJSONObject(i).getString("platForm"); - String rd = srcoria.getJSONObject(i).getString("roomId"); - String id = platForm + "&" + rd; - String name = srcoria.getJSONObject(i).getString("ownerName"); - String pic = srcoria.getJSONObject(i).getString("ownerHeadPic"); - String mark = srcoria.getJSONObject(i).getString("categoryName"); - srchome.put("vod_id", id); - srchome.put("vod_name", name); - srchome.put("vod_pic",pic); - srchome.put("vod_remarks", mark); - videos.put(srchome); - } - if (filter) { - result.put("filters", filterConfig); - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String catt=""; - switch (tid) { - case "?": - catt = "all"; - break; - case "ByPlatform?platform=douyu&": - catt = "douyu"; - break; - case "ByPlatform?platform=bilibili&": - catt = "bilibili"; - break; - case "ByPlatform?platform=huya&": - catt = "huya"; - break; - case "ByPlatform?platform=cc&": - catt = "cc"; - break; - } - - - - - - - extend = extend == null ? new HashMap<>() : extend; - String srcurl=""; - String[] cate= new String[13]; - int pp = 0; - for(int i = 0; i < 13; i++){ - cate[i] = extend.containsKey("typeName"+i) ? extend.get("typeName"+i) : ("typeName"+i + "=" + "all"); - String[] info = cate[i].split("="); - String area = info[1]; - if( !area.contains("all") ){ - pp= pp + 1; - } - } - if(pp == 1){ - for(int i = 0; i < 13; i++){ - String[] info = cate[i].split("="); - String areaType = info[0]; - String area = info[1]; - if(!area.contains("all")) { - String urlft = "http://live.yj1211.work/api/live/getRecommendByAreaAll?areaType={areaType}&area={area}&page={pg}"; - srcurl = urlft.replace("{areaType}", URLEncoder.encode(areaType)).replace("{area}", URLEncoder.encode(area)).replace("{pg}", pg); - break; - } - } - }else if( pp == 0 || pp > 1 ){ - String urlft = "http://live.yj1211.work/api/live/getRecommend{tid}page={pg}&size=20"; - srcurl = urlft.replace("{tid}", tid).replace("{pg}", pg); - } - String srcOrignstr = ""; - for (int i = 0; i < 3; i++) { - srcOrignstr = OkHttpUtil.string(srcurl, getHeaders()); - if (srcOrignstr.length() > 0 ) { - break; - } else { - Thread.sleep(1000); - } - } - JSONObject srcori = new JSONObject(srcOrignstr); - JSONArray srcoria = srcori.getJSONArray("data"); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - for (int i = 0; i < srcoria.length(); i++) { - JSONObject srchome = new JSONObject(); - String platForm = srcoria.getJSONObject(i).getString("platForm"); - if(pp == 1 && !catt.equals("all")){ - if(!platForm.equals(catt) ){ - continue; - } - } - - String rd = srcoria.getJSONObject(i).getString("roomId"); - String id = platForm + "&" + rd; - String name = srcoria.getJSONObject(i).getString("ownerName"); - String pic = srcoria.getJSONObject(i).getString("ownerHeadPic"); - String mark = srcoria.getJSONObject(i).getString("categoryName"); - srchome.put("vod_id", id); - srchome.put("vod_name", name); - srchome.put("vod_pic", pic); - srchome.put("vod_remarks", mark); - videos.put(srchome); - } - if(videos.length() == 0 ) { - JSONObject srchome = new JSONObject(); - srchome.put("vod_id", 111); - srchome.put("vod_name", "此页无符合"); - srchome.put("vod_pic",""); - srchome.put("vod_remarks", "nothing"); - videos.put(srchome); - } - if (pp ==1 ) { - result.put("pagecount", 50); - result.put("limit",1 ); - } else{ - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit",90 ); - } - result.put("list", videos); - result.put("page", pg); - result.put("total", Integer.MAX_VALUE); - - - - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private HashMap getHeaders() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.134 YaBrowser/22.7.1.755 (beta) Yowser/2.5 Safari/537.36"); - return headers; - } - - @Override - public String detailContent(List ids) { - try { - String id = ids.get(0); - String[] info = id.split("&"); - String platform = info[0]; - String roomId = info[1]; - String srcurl = "http://live.yj1211.work/api/live/getRoomInfo?platform="+platform+"&roomId="+roomId; - String srcplayurl = "http://live.yj1211.work/api/live/getRealUrl?platform="+platform+"&roomId="+roomId; - String srcdtlstr = OkHttpUtil.string(srcurl, getHeaders()); - String srcdtlplay = OkHttpUtil.string(srcplayurl, getHeaders()); - JSONObject srcdtl = new JSONObject(srcdtlstr); - JSONObject srcdtlo = srcdtl.getJSONObject("data"); - JSONObject srcdtplay = new JSONObject(srcdtlplay); - JSONObject srcdtplayo = srcdtplay.getJSONObject("data"); - String title = srcdtlo.getString("roomName"); - String pic = srcdtlo.getString("roomPic"); - String director = srcdtlo.getString("ownerName") + " RoomID:"+ srcdtlo.getString("roomId"); - String content = srcdtlo.getString("categoryName"); - String actor = "观看人数:" + srcdtlo.getString("online"); - String area =srcdtlo.getString("platForm"); - String typechk =srcdtlo.optString("isLive"); - String type = typechk.equals("") ? "录播" : "正在直播中" ; - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_pic",pic); - vodList.put("vod_name", title); - vodList.put("vod_area",area ); - vodList.put("type_name", type); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", content); - String playList = ""; - String pl=""; - List vodItems = new ArrayList<>(); - for(int i=0; i<5 ; i++){ - String[] qq = new String[] {"OD", "HD", "SD", "LD", "FD"}; - String qa = srcdtplayo.optString(qq[i]); - if (qa.isEmpty()) { - continue; - } - switch (qq[i]) { - case "OD": - pl = "原画" + "$" + qa; - break; - case "HD": - pl = "超清" + "$" + qa; - break; - case "SD": - pl = "高清" + "$" + qa; - break; - case "LD": - pl = "清晣" + "$" + qa; - break; - case "FD": - pl = "流畅" + "$" + qa; - break; - } - vodItems.add(pl); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - playList = "NoStream$nolink"; - - Map vod_play = new TreeMap<>(); - vod_play.put("YJ1211", playList); - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject result = new JSONObject(); - result.put("header", getHeaders()); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - String url = "http://live.yj1211.work/api/live/search?platform=all&keyWords=" + URLEncoder.encode(key) + "&isLive=0"; - String content =""; - for(int i=0 ; i<3 ; i++){ - content =OkHttpUtil.string(url, getHeaders()); - if(content.length() >0){ - break; - }else{ - Thread.sleep(1000); - } - } - JSONObject searchResult = new JSONObject(content); - JSONArray sra = searchResult.getJSONArray("data"); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (sra.length() > 0) { - int ch = Math.min(sra.length(), 20); - for (int i = 0; i < ch; i++) { - JSONObject srat = new JSONObject(); - String platForm = sra.getJSONObject(i).getString("platform"); - String rd = sra.getJSONObject(i).getString("roomId"); - String id = platForm + "&" + rd; - String name = sra.getJSONObject(i).getString("nickName"); - String pic = sra.getJSONObject(i).getString("headPic"); - String mark =""; - if(!sra.getJSONObject(i).isNull("cateName")){ - mark = sra.getJSONObject(i).getString("cateName"); - } - srat.put("vod_remarks", mark); - srat.put("vod_id", id); - srat.put("vod_name", name); - srat.put("vod_pic", pic); - - videos.put(srat); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Ysdq.java b/TVBox_Java/spider/Ysdq.java deleted file mode 100644 index 1153366..0000000 --- a/TVBox_Java/spider/Ysdq.java +++ /dev/null @@ -1,275 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class Ysdq extends Spider { - private static HashMap sites = new HashMap<>(); - - protected void fetchRule() { - if (sites.size() == 0) { - try { - String json = OkHttpUtil.string("https://pj567.coding.net/p/source/d/source/git/raw/master/mobile/config.json", null); - JSONArray sources = new JSONObject(json).optJSONArray("source"); - for (int i = 0; i < sources.length(); i++) { - JSONObject obj = sources.getJSONObject(i); - String type = obj.optString("type"); - if (type.equals("AppV0") || type.equals("AppTv") || type.equals("aiKanTv")) { - String scName = obj.optString("sourceName"); - sites.put(scName, obj); - SpiderDebug.log("{\"key\":\"csp_ysdq_" + scName + "\", \"name\":\"" + scName + "(搜)\", \"type\":3, \"api\":\"csp_Ysdq\",\"searchable\":1,\"quickSearch\":0, \"ext\":\"" + scName + "\"},"); - } - } - } catch (Exception e) { - - } - } - } - - private JSONObject getJson() { - if (sites.containsKey(sourceName)) { - return sites.get(sourceName); - } - return null; - } - - private String sourceName = ""; - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - this.sourceName = extend; - } - - private String jsonArr2Str(JSONArray array) { - try { - ArrayList strings = new ArrayList<>(); - for (int i = 0; i < array.length(); i++) { - strings.add(array.getString(i)); - } - return TextUtils.join(",", strings); - } catch (JSONException e) { - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - JSONObject cfg = getJson(); - if (cfg != null) { - String type = cfg.optString("type"); - JSONObject result = new JSONObject(); - JSONObject vod = new JSONObject(); - if (type.equals("AppV0")) { - String url = cfg.optString("detailUrl").replace("%s", ids.get(0)); - String json = OkHttpUtil.string(url, null); - JSONObject obj = new JSONObject(json).optJSONObject("data"); - vod.put("vod_id", obj.getString("vod_id")); - vod.put("vod_name", obj.getString("vod_name")); - vod.put("vod_pic", obj.getString("vod_pic")); - vod.put("type_name", obj.optString("vod_class")); - vod.put("vod_year", obj.optString("vod_year")); - vod.put("vod_lang", obj.optString("vod_lang")); - vod.put("vod_area", obj.optString("vod_area")); - vod.put("vod_remarks", obj.optString("vod_remarks")); - vod.put("vod_actor", obj.optString("vod_actor")); - vod.put("vod_director", obj.optString("vod_director")); - vod.put("vod_content", obj.optString("vod_content")); - vod.put("vod_play_from", obj.getString("vod_play_from")); - vod.put("vod_play_url", obj.getString("vod_play_url")); - } else if (type.equals("AppTV")) { - String url = ids.get(0); - String json = OkHttpUtil.string(url, null); - JSONObject obj = new JSONObject(json); - vod.put("vod_id", obj.getString("id")); - vod.put("vod_name", obj.getString("title")); - vod.put("vod_pic", obj.getString("img_url")); - vod.put("type_name", jsonArr2Str(obj.optJSONArray("type"))); - vod.put("vod_year", obj.optString("pubtime")); - vod.put("vod_area", jsonArr2Str(obj.optJSONArray("area"))); - vod.put("vod_remarks", obj.optString("trunk")); - vod.put("vod_actor", jsonArr2Str(obj.optJSONArray("actor"))); - vod.put("vod_director", jsonArr2Str(obj.optJSONArray("director"))); - vod.put("vod_content", obj.optString("intro")); - Map vod_play = new LinkedHashMap<>(); - JSONObject playList = obj.getJSONObject("videolist"); - Iterator playListKeys = playList.keys(); - while (playListKeys.hasNext()) { - String from = playListKeys.next(); - JSONArray playListUrls = playList.getJSONArray(from); - ArrayList urls = new ArrayList<>(); - for (int j = 0; j < playListUrls.length(); j++) { - JSONObject urlObj = playListUrls.getJSONObject(j); - urls.add(urlObj.getString("title") + "$" + urlObj.getString("url")); - } - vod_play.put(from, TextUtils.join("#", urls)); - } - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - } else if (type.equals("aiKanTv")) { - String url = cfg.optString("detailUrl").replace("%s", ids.get(0)); - String json = OkHttpUtil.string(url, null); - JSONObject obj = new JSONObject(json).optJSONObject("data"); - vod.put("vod_id", obj.getString("vod_id")); - vod.put("vod_name", obj.getString("vod_name")); - vod.put("vod_pic", obj.getString("vod_pic")); - vod.put("type_name", obj.optString("vod_class")); - vod.put("vod_year", obj.optString("vod_year")); - vod.put("vod_lang", obj.optString("vod_lang")); - vod.put("vod_area", obj.optString("vod_area")); - vod.put("vod_remarks", obj.optString("vod_remarks")); - vod.put("vod_actor", obj.optString("vod_actor")); - vod.put("vod_director", obj.optString("vod_director")); - vod.put("vod_content", obj.optString("vod_content")); - - Map vod_play = new LinkedHashMap<>(); - JSONArray playList = obj.getJSONArray("vod_play_list"); - for (int i = 0; i < playList.length(); i++) { - JSONObject playListObj = playList.getJSONObject(i); - String from = playListObj.getString("from"); - String playUrls = playListObj.getString("url"); - if (playUrls.length() > 0) { - vod_play.put(from, playUrls); - } - } - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - fetchRule(); - JSONObject cfg = getJson(); - if (cfg != null) { - String type = cfg.optString("type"); - String url = cfg.optString("searchUrl"); - if (!url.isEmpty()) { - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - url = url.replace("%s", URLEncoder.encode(key)); - String json = OkHttpUtil.string(url, null); - if (type.equals("AppV0")) { - JSONArray list = new JSONObject(json).optJSONArray("list"); - for (int i = 0; i < list.length(); i++) { - JSONObject obj = list.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", obj.getString("vod_id")); - v.put("vod_name", obj.getString("vod_name")); - v.put("vod_pic", obj.getString("vod_pic")); - v.put("vod_remarks", obj.getString("vod_remarks")); - videos.put(v); - } - } else if (type.equals("AppTV")) { - JSONArray list = new JSONObject(json).optJSONArray("data"); - for (int i = 0; i < list.length(); i++) { - JSONObject obj = list.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", obj.getString("nextlink")); - v.put("vod_name", obj.getString("title")); - v.put("vod_pic", obj.getString("pic")); - v.put("vod_remarks", obj.getString("state")); - videos.put(v); - } - } else if (type.equals("aiKanTv")) { - JSONArray list = new JSONObject(json).optJSONObject("data").optJSONArray("list"); - for (int i = 0; i < list.length(); i++) { - JSONObject obj = list.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", obj.getString("vod_id")); - v.put("vod_name", obj.getString("vod_name")); - v.put("vod_pic", obj.getString("vod_pic")); - v.put("vod_remarks", obj.getString("vod_remarks")); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - if (vipFlags.contains(flag)) { - try { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", id); - result.put("header", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - // 如果是视频直连 直接返回免解 - else if (isVideoFormat(id)) { - try { - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", id); - result.put("header", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - // 尝试解析 - try { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", id); - result.put("header", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/Ysgc.java b/TVBox_Java/spider/Ysgc.java deleted file mode 100644 index ffc446a..0000000 --- a/TVBox_Java/spider/Ysgc.java +++ /dev/null @@ -1,394 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 影视工厂 - *

- * Author: 小黄瓜 - */ -public class Ysgc extends Spider { - - private static final String siteUrl = "https://www.ik4.cc"; - private static final String siteHost = "www.ik4.cc"; - - protected JSONObject playerConfig = new JSONObject(); - - @Override - public void init(Context context) { - super.init(context); - } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("user-agent", "Dart/2.14 (dart:io)"); - headers.put("version", "1.9.8"); - headers.put("copyright", "xiaogui"); - headers.put("host", siteHost); - headers.put("platform", "android"); - return headers; - } - - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + "/xgapp.php/v1/nav?token="; - JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - JSONArray classes = new JSONArray(); - JSONObject filterConfig = new JSONObject(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - String typeName = jObj.getString("type_name"); - if (typeName.equals("电视直播")) - continue; - String typeId = jObj.getString("type_id"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - classes.put(newCls); - try { - JSONObject typeExtend = jObj.getJSONObject("type_extend"); - Iterator typeExtendKeys = typeExtend.keys(); - JSONArray extendsAll = new JSONArray(); - while (typeExtendKeys.hasNext()) { - String typeExtendKey = typeExtendKeys.next(); - String typeExtendName = null; - switch (typeExtendKey) { - case "class": - typeExtendName = "类型"; - break; - case "area": - typeExtendName = "地区"; - break; - case "lang": - typeExtendName = "语言"; - break; - case "year": - typeExtendName = "年代"; - break; - } - if (typeExtendName == null) { - SpiderDebug.log(typeExtendKey); - continue; - } - String typeExtendStr = typeExtend.getString(typeExtendKey); - if (typeExtendStr.trim().length() == 0) - continue; - String[] newTypeExtendKeys = typeExtendStr.split(","); - JSONObject newTypeExtend = new JSONObject(); - newTypeExtend.put("key", typeExtendKey); - newTypeExtend.put("name", typeExtendName); - JSONArray newTypeExtendKV = new JSONArray(); - { - JSONObject kvAll = new JSONObject(); - kvAll.put("n", "全部"); - kvAll.put("v", ""); - newTypeExtendKV.put(kvAll); - } - for (String k : newTypeExtendKeys) { - if (typeExtendName.equals("伦理")) - continue; - JSONObject kv = new JSONObject(); - kv.put("n", k); - kv.put("v", k); - newTypeExtendKV.put(kv); - } - newTypeExtend.put("value", newTypeExtendKV); - extendsAll.put(newTypeExtend); - } - filterConfig.put(typeId, extendsAll); - } catch (Exception e) { - SpiderDebug.log(e); - } - - } - JSONObject result = new JSONObject(); - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - String url = siteUrl + "/xgapp.php/v1/index_video?token="; - JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - JSONArray videoList = jObj.getJSONArray("vlist"); - for (int j = 0; j < videoList.length() && j < 6; j++) { - JSONObject vObj = videoList.getJSONObject(j); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/xgapp.php/v1/video?tid=" + tid + "&pg=" + pg + "&token="; - Set keys = extend.keySet(); - for (String key : keys) { - url += "&" + key + "=" + URLEncoder.encode(extend.get(key)); - } - JSONObject dataObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONArray jsonArray = dataObject.getJSONArray("data"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - JSONObject result = new JSONObject(); - int limit = 20; - int page = dataObject.getInt("page"); - int total = dataObject.getInt("total"); - int pageCount = dataObject.getInt("pagecount"); - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", total); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + "/xgapp.php/v1/video_detail?id=" + ids.get(0) + "&token="; - JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject dataObject = jsonObject.getJSONObject("data"); - if (dataObject.has("vod_info")) { - try { - dataObject = dataObject.getJSONObject("vod_info"); - } catch (Exception e) { - - } - } - JSONObject vodList = new JSONObject(); - vodList.put("vod_id", dataObject.getString("vod_id")); - vodList.put("vod_name", dataObject.getString("vod_name")); - vodList.put("vod_pic", dataObject.getString("vod_pic")); - vodList.put("type_name", dataObject.getString("vod_class")); - vodList.put("vod_year", dataObject.getString("vod_year")); - vodList.put("vod_area", dataObject.getString("vod_area")); - vodList.put("vod_remarks", dataObject.getString("vod_remarks")); - vodList.put("vod_actor", dataObject.getString("vod_actor")); - vodList.put("vod_director", dataObject.getString("vod_director")); - vodList.put("vod_content", dataObject.getString("vod_content")); - JSONArray playerList = dataObject.getJSONArray("vod_url_with_player"); - List playFlags = new ArrayList<>(); - HashMap playUrls = new HashMap<>(); - for (int i = 0; i < playerList.length(); i++) { - JSONObject playerListObj = playerList.getJSONObject(i); - String from = playerListObj.getString("code"); - playUrls.put(from, playerListObj.getString("url")); - playerListObj.remove("url"); - playerConfig.put(from, playerListObj); - playFlags.add(from); - } - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - int sort1 = playFlags.indexOf(o1); - int sort2 = playFlags.indexOf(o2); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } - }); - - String[] vod_play_from_list = dataObject.getString("vod_play_from").split("\\$\\$\\$"); - String[] vod_play_url_list = dataObject.getString("vod_play_url").split("\\$\\$\\$"); - - for (int i = 0; i < vod_play_from_list.length; i++) { - String from = vod_play_from_list[i]; - if (i >= vod_play_url_list.length || vod_play_url_list[i].trim().length() == 0) { - if (playUrls.containsKey(from) && playUrls.get(from).trim().length() > 0) { - vod_play.put(vod_play_from_list[i], playUrls.get(from)); - } - continue; - } - vod_play.put(vod_play_from_list[i], vod_play_url_list[i]); - } - - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private HashMap getHeaderJxs(String url) { - HashMap headers = new HashMap<>(); - headers.put("platform_version", "LMY47I"); - headers.put("user-agent", "Dart/2.12 (dart:io)"); - headers.put("version", "1.6.4"); - headers.put("copyright", "xiaogui"); - headers.put("platform", "android"); - headers.put("client_name", "6L+95Ymn6L6+5Lq6"); - return headers; - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject result = new JSONObject(); - if (id.contains("hsl.ysgc.xyz")) { - String uuu = "https://www.ysgc.cc/static/player/dplayer.php?url=" + id; - HashMap headers = new HashMap(); - headers.put("referer", "https://www.ysgc.cc/"); - String content = OkHttpUtil.string(uuu, headers); - Matcher matcher = Pattern.compile("url: url\\+'(.+?)',").matcher(content); - if (matcher.find()) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", id + matcher.group(1)); - result.put("header", "{\"Referer\":\" https://www.ysgc.cc\"}"); - } else { - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", uuu); - result.put("header", "{\"Referer\":\"https://www.ysgc.cc/\"}"); - } - return result.toString(); - } else if (id.contains("duoduozy.com") || id.contains("m3u8.cache.suoyo.cc")) { - String uuu = "https://www.6080kan.cc/app.php?url=" + id; - String content = OkHttpUtil.string(uuu, null); - return Misc.jsonParse(id, content).toString(); - } - if (vipFlags.contains(flag)) { - try { - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } catch (Exception ee) { - SpiderDebug.log(ee); - } - } - JSONObject playerObj = playerConfig.getJSONObject(flag); - String parseUrl = playerObj.getString("parse_api") + id; - String content = OkHttpUtil.string(parseUrl, getHeaderJxs(parseUrl)); - JSONObject playerData = new JSONObject(content); - JSONObject headers = new JSONObject(); - String ua = playerData.optString("user-agent", ""); - if (ua.trim().length() > 0) { - headers.put("User-Agent", " " + ua); - } - String referer = playerData.optString("referer", ""); - if (referer.trim().length() > 0) { - headers.put("Referer", " " + referer); - } - result.put("parse", 0); - result.put("header", headers.toString()); - result.put("playUrl", ""); - result.put("url", playerData.getString("url")); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - if (vipFlags.contains(flag)) { - try { - JSONObject result = new JSONObject(); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", id); - return result.toString(); - } catch (Exception ee) { - SpiderDebug.log(ee); - } - } - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - if (quick) - return ""; - try { - String url = siteUrl + "/xgapp.php/v1/search?text=" + URLEncoder.encode(key) + "&pg=1"; - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject dataObject = new JSONObject(content); - JSONArray jsonArray = dataObject.getJSONArray("data"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("vod_id")); - v.put("vod_name", vObj.getString("vod_name")); - v.put("vod_pic", vObj.getString("vod_pic")); - v.put("vod_remarks", vObj.getString("vod_remarks")); - videos.put(v); - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/spider/YydsAli1.java b/TVBox_Java/spider/YydsAli1.java deleted file mode 100644 index f3df733..0000000 --- a/TVBox_Java/spider/YydsAli1.java +++ /dev/null @@ -1,517 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - -public class YydsAli1 extends Spider { - private static final String siteUrl = "https://cmn.yyds.fans"; - - @Override - public void init(Context context) { - super.init(context); - } - - private HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("accept", "application/json, text/plain, */*"); - headers.put("origin", "https://yyds.fans"); - headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - return headers; - } - - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + "/api/categories"; - String content = OkHttpUtil.string(url, getHeaders(url)); - JSONObject jsonObject = new JSONObject(content); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - JSONArray classes = new JSONArray(); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jObj = jsonArray.getJSONObject(i); - String typeName = jObj.getString("title"); - if (typeName.equals("首页") || typeName.equals("热门精选")) { - continue; - } - String typeId = jObj.getString("id"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", typeId); - newCls.put("type_name", typeName); - classes.put(newCls); - } - JSONObject result = new JSONObject(); - result.put("class", classes); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String homeVideoContent() { - try { - JSONArray videos = new JSONArray(); - try { - String url = siteUrl + "/api/posts"; - JSONObject json = new JSONObject(); - json.put("category_id", "0"); - json.put("skip", "0"); - json.put("limit", "30"); - json.put("keyword", ""); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, json.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - JSONObject jsonObject = new JSONObject(response); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.optString("cover")); - String mark = vObj.optString("subtitle"); - if (mark.equals("null")) - mark = ""; - v.put("vod_remarks", mark); - videos.put(v); - } - } catch (JSONException e) { - } - } - }); - } catch (Exception e) { - - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - int limit = 30; - int page = Integer.parseInt(pg); - if (page == 0) { - page = 1; - } - String url = siteUrl + "/api/posts"; - JSONObject json = new JSONObject(); - json.put("category_id", tid); - json.put("skip", ((page - 1) * limit) + ""); - json.put("limit", limit + ""); - json.put("keyword", ""); - JSONArray videos = new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, json.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - JSONObject jsonObject = new JSONObject(response); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.optString("cover")); - String mark = vObj.optString("subtitle"); - if (mark.equals("null")) - mark = ""; - v.put("vod_remarks", mark); - videos.put(v); - } - } catch (JSONException e) { - } - } - }); - JSONObject result = new JSONObject(); - result.put("page", page); - int pageCount = videos.length() == limit ? page + 1 : page; - result.put("pagecount", pageCount); - result.put("limit", limit); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - Pattern aliyun = Pattern.compile(".*?aliyundrive.com/s/(\\w+)[^\\w]?"); - Pattern aliyunShort = Pattern.compile(".*?alywp.net/(\\w+)[^\\w]?"); - - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + "/api/post-info"; - JSONObject json = new JSONObject(); - json.put("id", ids.get(0)); - JSONObject vodAtom = new JSONObject(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, json.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - JSONObject dataObject = new JSONObject(response); - JSONObject vObj = dataObject.getJSONObject("data"); - - vodAtom.put("vod_id", vObj.getString("id")); - vodAtom.put("vod_name", vObj.getString("title")); - vodAtom.put("vod_pic", vObj.getString("cover")); - vodAtom.put("type_name", ""); - vodAtom.put("vod_year", vObj.getString("year")); - vodAtom.put("vod_area", vObj.getString("region")); - String mark = vObj.optString("subtitle"); - if (mark.equals("null")) - mark = ""; - vodAtom.put("vod_remarks", mark); - vodAtom.put("vod_actor", vObj.getString("actors")); - vodAtom.put("vod_director", vObj.getString("director")); - String desc = vObj.optString("desc"); - if (desc.equals("null")) - desc = ""; - vodAtom.put("vod_content", desc); - - Map vod_play = new LinkedHashMap<>(); - JSONArray jsonArray = vObj.getJSONArray("links"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject obj = jsonArray.getJSONObject(i); - String link = obj.optString("link", ""); - updatePlaylist(link, vod_play); - } - if (vod_play.size() == 0 && vObj.optString("content").length() > 0) { - updatePlaylist(vObj.optString("content"), vod_play); - } - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodAtom.put("vod_play_from", vod_play_from); - vodAtom.put("vod_play_url", vod_play_url); - } - } catch (JSONException e) { - } - } - }); - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vodAtom); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private void updatePlaylist(String link, Map vod_play) { - String shareId = null; - Matcher matcher = aliyun.matcher(link); - if (matcher.find()) { - shareId = matcher.group(1); - } else { - matcher = aliyunShort.matcher(link); - if (matcher.find()) { - shareId = matcher.group(1); - Map> respHeaders = new TreeMap<>(); - OkHttpUtil.stringNoRedirect("https://alywp.net/" + shareId, null, respHeaders); - shareId = OkHttpUtil.getRedirectLocation(respHeaders); - if (shareId != null) { - matcher = aliyun.matcher(shareId); - if (matcher.find()) { - shareId = matcher.group(1); - } - } - } - } - if (shareId != null) { - String shareToken = getShareTk(shareId, ""); - ArrayList vodItems = new ArrayList<>(); - getFileList(shareToken, shareId, "", "root", vodItems); - vod_play.put("阿里云盘" + (vod_play.size() > 0 ? vod_play.size() : ""), TextUtils.join("#", vodItems)); - } - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String[] infos = id.split("\\+"); - String shareTk = getShareTk(infos[0], ""); - refreshTk(); - if (!accessTk.isEmpty()) { - JSONObject json = new JSONObject(); - json.put("share_id", infos[0]); - json.put("category", "live_transcoding"); - json.put("file_id", infos[1]); - json.put("template_id", ""); - HashMap headers = new HashMap<>(); - headers.put("x-share-token", shareTk); - headers.put("authorization", accessTk); - OKCallBack.OKCallBackString callback = new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - String videoUrl = ""; - try { - JSONArray playList = new JSONObject(response).getJSONObject("video_preview_play_info").getJSONArray("live_transcoding_task_list"); - String[] orders = new String[]{"FHD", "HD", "SD"}; - for (String or : orders) { - for (int i = 0; i < playList.length(); i++) { - JSONObject obj = playList.getJSONObject(i); - if (obj.optString("template_id").equals(or)) { - videoUrl = obj.getString("url"); - break; - } - } - if (!videoUrl.isEmpty()) - break; - } - if (videoUrl.isEmpty() && playList.length() > 0) { - videoUrl = playList.getJSONObject(0).getString("url"); - } - } catch (JSONException e) { - } finally { - setResult(videoUrl); - } - } - }; - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "https://api.aliyundrive.com/v2/file/get_share_link_video_preview_play_info", json.toString(), headers, callback); - JSONArray playList = new JSONObject(callback.getResult()).getJSONObject("video_preview_play_info").getJSONArray("live_transcoding_task_list"); - String videoUrl = ""; - String[] orders = new String[]{"FHD", "HD", "SD"}; - for (String or : orders) { - for (int i = 0; i < playList.length(); i++) { - JSONObject obj = playList.getJSONObject(i); - if (obj.optString("template_id").equals(or)) { - videoUrl = obj.getString("url"); - break; - } - } - if (!videoUrl.isEmpty()) - break; - } - if (videoUrl.isEmpty() && playList.length() > 0) { - videoUrl = playList.getJSONObject(0).getString("url"); - } - JSONObject headerObj = new JSONObject(); - headerObj.put("user-agent", " Dalvik/2.1.0 (Linux; U; Android 7.0; ZTE BA520 Build/MRA58K)"); - headerObj.put("referer", " https://www.aliyundrive.com/"); - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videoUrl); - result.put("header", headerObj.toString()); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - JSONArray videos = new JSONArray(); - try { - String url = siteUrl + "/api/posts"; - JSONObject json = new JSONObject(); - json.put("category_id", "-1"); - json.put("skip", "0"); - json.put("limit", "30"); - json.put("keyword", key); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, json.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - } - - @Override - public void onResponse(String response) { - try { - JSONObject jsonObject = new JSONObject(response); - JSONArray jsonArray = jsonObject.getJSONArray("data"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("id")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.getString("cover")); - v.put("vod_remarks", vObj.getString("subtitle")); - videos.put(v); - } - } catch (JSONException e) { - } - } - }); - - } catch (Exception e) { - - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private String aliTk = ""; - - private void fetchAliTk() { - if (aliTk.isEmpty()) { - try { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "okhttp/4.5.0"); - aliTk = new JSONObject(OkHttpUtil.string("http://81.68.244.5/tv/alitk", headers)).optString("alitk"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - } - - private String accessTk = ""; - - private void refreshTk() { - fetchAliTk(); - if (!aliTk.isEmpty() && accessTk.isEmpty()) { - try { - JSONObject json = new JSONObject(); - json.put("refresh_token", aliTk); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "https://api.aliyundrive.com/token/refresh", json.toString(), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - - } - - @Override - public void onResponse(String response) { - try { - JSONObject obj = new JSONObject(response); - accessTk = obj.getString("token_type") + " " + obj.getString("access_token"); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - }); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - } - - private String getShareTk(String shareId, String sharePwd) { - try { - JSONObject json = new JSONObject(); - json.put("share_id", shareId); - json.put("share_pwd", ""); - OKCallBack.OKCallBackString callback = new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - - } - - @Override - public void onResponse(String response) { - - } - }; - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "https://api.aliyundrive.com/v2/share_link/get_share_token", json.toString(), callback); - return new JSONObject(callback.getResult()).optString("share_token"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - return ""; - } - - - private void getFileList(String shareTk, String shareId, String sharePwd, String root, ArrayList vodItems) { - try { - // 取文件夹 - JSONObject json = new JSONObject(); - json.put("share_id", shareId); - json.put("parent_file_id", root); - json.put("limit", 100); - json.put("image_thumbnail_process", "image/resize,w_160/format,jpeg"); - json.put("image_url_process", "image/resize,w_1920/format,jpeg"); - json.put("video_thumbnail_process", "video/snapshot,t_1000,f_jpg,ar_auto,w_300"); - json.put("order_by", "name"); - json.put("order_direction", "ASC"); - HashMap headers = new HashMap<>(); - headers.put("x-share-token", shareTk); - OKCallBack.OKCallBackString callback = new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception e) { - - } - - @Override - public void onResponse(String response) { - - } - }; - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), "https://api.aliyundrive.com/adrive/v3/file/list", json.toString(), headers, callback); - JSONArray rootList = new JSONObject(callback.getResult()).optJSONArray("items"); - if (rootList != null && rootList.length() > 0) { - for (int i = 0; i < rootList.length(); i++) { - JSONObject item = rootList.getJSONObject(i); - if (item.getString("type").equals("folder")) { - String dirId = item.getString("file_id"); - getFileList(shareTk, shareId, sharePwd, dirId, vodItems); - } else { - if (item.getString("type").equals("file") && !item.getString("file_extension").equals("txt")) { - String fileId = item.getString("file_id"); - String fileName = item.getString("name"); - vodItems.add(fileName + "$" + shareId + "+" + fileId); - } - } - } - } - // 取文件列表 - } catch (JSONException e) { - SpiderDebug.log(e); - } - } -} diff --git a/TVBox_Java/spider/Zhaozy.java b/TVBox_Java/spider/Zhaozy.java deleted file mode 100644 index baabc00..0000000 --- a/TVBox_Java/spider/Zhaozy.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class Zhaozy extends Spider { - private static final Pattern aliyun = Pattern.compile("(https://www.aliyundrive.com/s/[^\"]+)"); - private PushAgent pushAgent; - - public String detailContent(List list) { - try { - Pattern pattern = aliyun; - if (pattern.matcher(list.get(0)).find()) { - return pushAgent.detailContent(list); - } - Matcher matcher = pattern.matcher(OkHttpUtil.string("https://zhaoziyuan.me/" + list.get(0), null)); - if (!matcher.find()) { - return ""; - } - list.set(0, matcher.group(1)); - return pushAgent.detailContent(list); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public void init(Context context, String str) { - super.init(context, str); - pushAgent = new PushAgent(); - pushAgent.init(context, str); - } - - public String playerContent(String str, String str2, List list) { - return pushAgent.playerContent(str, str2, list); - } - - protected static HashMap sHeaders() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headers.put("Accept-encoding", "gzip, deflate, br"); - headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6"); - return headers; - } - - private Pattern regexVid = Pattern.compile("(\\S+)"); - - public String searchContent(String key, boolean quick) { - try { - String url = "https://zhaoziyuan.me/so?filename=" + URLEncoder.encode(key); - Document docs = Jsoup.parse(OkHttpUtil.string(url, null)); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - Elements list = docs.select("div.li_con div.news_text"); - for (int i = 0; i < list.size(); i++) { - Element doc = list.get(i); - String sourceName = doc.select("div.news_text a h3").text(); - if (sourceName.contains(key)) { - String list1 = doc.select("div.news_text a").attr("href"); - Matcher matcher = regexVid.matcher(list1); - if (matcher.find()) { - JSONObject v = new JSONObject(); - String group = matcher.group(1); - String cover = "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000"; - String remark = doc.select("div.news_text a p").text(); - - v.put("vod_name", sourceName); - v.put("vod_remarks", remark); - v.put("vod_id", group); - v.put("vod_pic", cover); - videos.put(v); - } - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} \ No newline at end of file diff --git a/TVBox_Java/spider/Zxzj.java b/TVBox_Java/spider/Zxzj.java deleted file mode 100644 index c75fb37..0000000 --- a/TVBox_Java/spider/Zxzj.java +++ /dev/null @@ -1,486 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Zxzj extends Spider { - private static final String siteUrl = "https://zxzj.vip/"; - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - private Pattern regexCategory = Pattern.compile("/list/(\\d+).html"); - private Pattern regexVid = Pattern.compile("/detail/(\\d+).html"); - private Pattern regexPlay = Pattern.compile("/video/(\\d+)-(\\d+)-(\\d+).html"); - private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html"); - - protected String ext = null; - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"dpp\":{\"sh\":\"DP播放\",\"pu\":\"https://jx.zxzj.vip/dplayer.php?url=\",\"sn\":1,\"or\":999}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"情色\",\"v\":\"情色\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"法语\",\"v\":\"法语\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"6\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"5\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - - protected static HashMap Headers() { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.62 Safari/537.36"); - headers.put("Referer", siteUrl); - return headers; - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - headers.put("Upgrade-Insecure-Requests", "1"); - headers.put("DNT", "1"); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.stui-header__menu li a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - boolean show = name.equals("电影") || - name.equals("美剧") || - name.equals("韩剧") || - name.equals("日剧") || - name.equals("泰剧") || - name.equals("动漫"); - if (show) { - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Element homeList = doc.select("ul.stui-vodlist").get(0); - Elements list = homeList.select("div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("a").attr("data-original"); - String remark = vod.select("a .pic-text").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""}; - urlParams[0] = tid; - urlParams[8] = pg; - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - urlParams[Integer.parseInt(key)] = URLEncoder.encode(value); - } - } - // 获取分类数据的url - String url = siteUrl + "vodshow/" + TextUtils.join("-", urlParams) + ".html"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.stui-page__item li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - //System.out.println("哈哈"+matcher.group(1)); - page = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - //System.out.println("尾页" + matcher.group(1)); - pageCount = Integer.parseInt(matcher.group(1).split("-")[8]); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - String cover = vod.select("a").attr("data-original"); - String remark = vod.select("a .pic-text").text(); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/detail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.select("div.stui-content__thumb a img").attr("data-original"); - String title = doc.select("div.stui-content__detail h1").text(); - String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = ""; - Elements data = doc.select("p.data"); - Pattern cate = Pattern.compile("类型:(\\S+)"); - category = doReplaceRegex(cate, data.get(0).text()); - Pattern areas = Pattern.compile("地区:(\\S+)"); - area = doReplaceRegex(areas, data.get(0).text()); - Pattern years = Pattern.compile("年份:(\\S+)"); - year = doReplaceRegex(years, data.get(0).text()); - Pattern rms = Pattern.compile("更新:(\\S+)"); - remark = doReplaceRegex(rms, data.get(3).text()); - Pattern acs = Pattern.compile("主演:(\\S+)"); - actor = doReplaceRegex(acs, data.get(1).text()); - Pattern dis = Pattern.compile("导演:(\\S+)"); - director = doReplaceRegex(dis, data.get(2).text()); - - desc = doc.selectFirst("span.detail-content").text().trim(); - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - // 取播放列表数据 - Elements sources = doc.select("div.stui-vodlist__head h3"); - Elements sourceList = doc.select("ul.stui-content__playlist"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) { - sourceName = flag; - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = sourceList.get(i).select("li a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - //定义播放用的headers - JSONObject headers = new JSONObject(); - //headers.put("Host", " cokemv.co"); - headers.put("origin", " https://zxzj.vip"); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - - // 播放页 url - String url = siteUrl + "/video/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - JSONObject pCfg = playerConfig.getJSONObject(player.getString("from")); - String videoUrl = pCfg.getString("pu") + player.getString("url"); - Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, getHeaders(videoUrl))); - Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')"); - Elements allScripts = docs.select("body script"); - for (int j = 0; j < allScripts.size(); j++) { - String scContents = allScripts.get(j).html().trim(); - Matcher matcher = pattern.matcher(scContents); - if (matcher.find()) { - String players = matcher.group(0); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", players); - result.put("header", headers.toString()); - } - break; - } - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - String url = siteUrl + "/vodsearch/-------------.html?wd=" + URLEncoder.encode(key) + "&submit="; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - - JSONArray videos = new JSONArray(); - Elements list = doc.select("div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.select("a").attr("title"); - if (title.contains(key)) { - String cover = vod.select("a").attr("data-original"); - Matcher matcher = regexVid.matcher(vod.select("a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - String remark = vod.select("a span.pic-text").text(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } -} diff --git a/TVBox_Java/spider/merge/RSA.java b/TVBox_Java/spider/merge/RSA.java deleted file mode 100644 index ccca061..0000000 --- a/TVBox_Java/spider/merge/RSA.java +++ /dev/null @@ -1,96 +0,0 @@ -// -// Decompiled by Jadx - 632ms -// -package com.github.catvod.spider.merge; - -import android.util.Base64; -import java.io.ByteArrayOutputStream; -import java.nio.charset.Charset; -import java.security.KeyFactory; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import javax.crypto.Cipher; - -public class RSA { - public static final Charset qb = Charset.forName("UTF8"); - - public static String l(String str, String str2) { - try { - byte[] bytes = str.getBytes(qb); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(1, n8(str2)); - int length = bytes.length; - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - int i = 0; - int i2 = 0; - while (true) { - int i3 = length - i; - if (i3 > 0) { - byte[] doFinal = i3 > 117 ? cipher.doFinal(bytes, i, 117) : cipher.doFinal(bytes, i, i3); - byteArrayOutputStream.write(doFinal, 0, doFinal.length); - i2++; - i = i2 * 117; - } else { - byte[] byteArray = byteArrayOutputStream.toByteArray(); - byteArrayOutputStream.close(); - return new String(Base64.encode(byteArray, 0)); - } - } - } catch (Exception e) { - ug(e); - return null; - } - } - - public static PublicKey n8(String str) { - try { - return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(str, 0))); - } catch (Exception e) { - ug(e); - return null; - } - } - - public static String qb(String str, String str2) { - try { - byte[] decode = Base64.decode(str, 0); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(2, zC(str2)); - int length = decode.length; - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - int i = 0; - int i2 = 0; - while (true) { - int i3 = length - i; - if (i3 > 0) { - byte[] doFinal = i3 > 128 ? cipher.doFinal(decode, i, 128) : cipher.doFinal(decode, i, i3); - byteArrayOutputStream.write(doFinal, 0, doFinal.length); - i2++; - i = i2 * 128; - } else { - byte[] byteArray = byteArrayOutputStream.toByteArray(); - byteArrayOutputStream.close(); - return new String(byteArray, qb); - } - } - } catch (Exception e) { - ug(e); - return null; - } - } - - private static void ug(Exception exc) { - exc.printStackTrace(); - } - - public static PrivateKey zC(String str) { - try { - return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(str, 0))); - } catch (Exception e) { - ug(e); - return null; - } - } -} diff --git a/TVBox_Java/utils/AES.java b/TVBox_Java/utils/AES.java deleted file mode 100644 index d20028b..0000000 --- a/TVBox_Java/utils/AES.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.github.catvod.utils; - -import android.util.Base64; - -import com.github.catvod.crawler.SpiderDebug; - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.security.spec.AlgorithmParameterSpec; - -import javax.crypto.Cipher; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.DESKeySpec; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -public class AES { - - public static String CBC(String src, String KEY, String IV) { - try { - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV.getBytes()); - cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec); - return new String(cipher.doFinal(Base64.decode(src.getBytes(), 0))); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - - - public static Cipher GetCipher(int opmode, String key) { - try { - DESKeySpec dks = new DESKeySpec(key.getBytes()); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); - Key secretkey = keyFactory.generateSecret(dks); - Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding"); - cipher.init(opmode, secretkey); - return cipher; - } catch (Exception exception) { - SpiderDebug.log(exception); - return null; - } - } - - - - public static String decode(String data, String key) throws Exception { - if (data == null || data.isEmpty()){ - return null; - } - try { - byte[] b = hex2byte(data); - Cipher cipher = GetCipher(Cipher.DECRYPT_MODE, key); - if (cipher != null){ - return new String(cipher.doFinal(b), "UTF-8"); - } else { - return null; - } - } catch (Exception exception) { - SpiderDebug.log(exception); - return data; - } - } - - public static byte[] hex2byte(String hex) throws IllegalArgumentException { - if (hex.length() % 2 != 0){ - throw new IllegalArgumentException("invalid hex string"); - } - char[] arr = hex.toCharArray(); - byte[] b = new byte[hex.length() / 2]; - for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { - String swap ="" + arr[i++] + arr[i]; - int byteint = Integer.parseInt(swap, 16) & 0xFF; - b[j] = new Integer(byteint).byteValue(); - } - return b; - } - - public static String encrypt(String data, String key) { - try { - byte[] data2 = data.getBytes("UTF-8"); - SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); - Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); - cipher.init(Cipher.ENCRYPT_MODE, keySpec); - byte[] result = cipher.doFinal(data2); - return bytesToHexStr(result); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - - /** - * byte数组转16进制字符串 - * - * @param bytes byte数组 - * @return hex字符串 - */ - public static String bytesToHexStr(byte[] bytes) { - StringBuilder hexStr = new StringBuilder(); - for (byte b : bytes) { - String hex = Integer.toHexString(b & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - hexStr.append(hex); - } - return hexStr.toString(); - } - -} diff --git a/TVBox_Java/utils/Base64Ext.java b/TVBox_Java/utils/Base64Ext.java deleted file mode 100644 index db32bbf..0000000 --- a/TVBox_Java/utils/Base64Ext.java +++ /dev/null @@ -1,755 +0,0 @@ -package com.github.catvod.utils; - - - /* - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -import java.io.UnsupportedEncodingException; - -/** - * #nodoc- Utilities for encoding and decoding the Base64 representation of - * binary data. See RFCs 2045 and 3548. - */ -public class Base64Ext { - /** - * Default values for encoder/decoder flags. - */ - public static final int DEFAULT = 0; - - /** - * Encoder flag bit to omit the padding '=' characters at the end - * of the output (if any). - */ - public static final int NO_PADDING = 1; - - /** - * Encoder flag bit to omit all line terminators (i.e., the output - * will be on one long line). - */ - public static final int NO_WRAP = 2; - - /** - * Encoder flag bit to indicate lines should be terminated with a - * CRLF pair instead of just an LF. Has no effect if {@code - * NO_WRAP} is specified as well. - */ - public static final int CRLF = 4; - - /** - * Encoder/decoder flag bit to indicate using the "URL and - * filename safe" variant of Base64 (see RFC 3548 section 4) where - * {@code -} and {@code _} are used in place of {@code +} and - * {@code /}. - */ - public static final int URL_SAFE = 8; - - /** - * Flag to pass to to indicate that it - * should not close the output stream it is wrapping when it - * itself is closed. - */ - public static final int NO_CLOSE = 16; - - // -------------------------------------------------------- - // shared code - // -------------------------------------------------------- - - /* package */ static abstract class Coder { - public byte[] output; - public int op; - - /** - * Encode/decode another block of input data. this.output is - * provided by the caller, and must be big enough to hold all - * the coded data. On exit, this.opwill be set to the length - * of the coded data. - * - * @param finish true if this is the final call to process for - * this object. Will finalize the coder state and - * include any final bytes in the output. - * @return true if the input so far is good; false if some - * error has been detected in the input stream.. - */ - public abstract boolean process(byte[] input, int offset, int len, boolean finish); - - /** - * @return the maximum number of bytes a call to process() - * could produce for the given number of input bytes. This may - * be an overestimate. - */ - public abstract int maxOutputSize(int len); - } - - // -------------------------------------------------------- - // decoding - // -------------------------------------------------------- - - /** - * Decode the Base64-encoded data in input and return the data in - * a new byte array. - *

- *

The padding '=' characters at the end are considered optional, but - * if any are present, there must be the correct number of them. - * - * @param str the input String to decode, which is converted to - * bytes using the default charset - * @param flags controls certain features of the decoded output. - * Pass {@code DEFAULT} to decode standard Base64. - * @throws IllegalArgumentException if the input contains - * incorrect padding - */ - public static byte[] decode(String str, int flags) { - return decode(str.getBytes(), flags); - } - - /** - * Decode the Base64-encoded data in input and return the data in - * a new byte array. - *

- *

The padding '=' characters at the end are considered optional, but - * if any are present, there must be the correct number of them. - * - * @param input the input array to decode - * @param flags controls certain features of the decoded output. - * Pass {@code DEFAULT} to decode standard Base64. - * @throws IllegalArgumentException if the input contains - * incorrect padding - */ - public static byte[] decode(byte[] input, int flags) { - return decode(input, 0, input.length, flags); - } - - /** - * Decode the Base64-encoded data in input and return the data in - * a new byte array. - *

- *

The padding '=' characters at the end are considered optional, but - * if any are present, there must be the correct number of them. - * - * @param input the data to decode - * @param offset the position within the input array at which to start - * @param len the number of bytes of input to decode - * @param flags controls certain features of the decoded output. - * Pass {@code DEFAULT} to decode standard Base64. - * @throws IllegalArgumentException if the input contains - * incorrect padding - */ - public static byte[] decode(byte[] input, int offset, int len, int flags) { - // Allocate space for the most data the input could represent. - // (It could contain less if it contains whitespace, etc.) - Decoder decoder = new Decoder(flags, new byte[len * 3 / 4]); - - if (!decoder.process(input, offset, len, true)) { - throw new IllegalArgumentException("bad base-64"); - } - - // Maybe we got lucky and allocated exactly enough output space. - if (decoder.op == decoder.output.length) { - return decoder.output; - } - - // Need to shorten the array, so allocate a new one of the - // right size and copy. - byte[] temp = new byte[decoder.op]; - System.arraycopy(decoder.output, 0, temp, 0, decoder.op); - return temp; - } - - /* package */ static class Decoder extends Coder { - /** - * Lookup table for turning bytes into their position in the - * Base64 alphabet. - */ - private static final int DECODE[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - /** - * Decode lookup table for the "web safe" variant (RFC 3548 - * sec. 4) where - and _ replace + and /. - */ - private static final int DECODE_WEBSAFE[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - /** - * Non-data values in the DECODE arrays. - */ - private static final int SKIP = -1; - private static final int EQUALS = -2; - - /** - * States 0-3 are reading through the next input tuple. - * State 4 is having read one '=' and expecting exactly - * one more. - * State 5 is expecting no more data or padding characters - * in the input. - * State 6 is the error state; an error has been detected - * in the input and no future input can "fix" it. - */ - private int state; // state number (0 to 6) - private int value; - - final private int[] alphabet; - - public Decoder(int flags, byte[] output) { - this.output = output; - - alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE; - state = 0; - value = 0; - } - - /** - * @return an overestimate for the number of bytes {@code - * len} bytes could decode to. - */ - - @Override - public int maxOutputSize(int len) { - return len * 3 / 4 + 10; - } - - /** - * Decode another block of input data. - * - * @return true if the state machine is still healthy. false if - * bad base-64 data has been detected in the input stream. - */ - @Override - public boolean process(byte[] input, int offset, int len, boolean finish) { - if (this.state == 6) {return false;} - - int p = offset; - len += offset; - - // Using local variables makes the decoder about 12% - // faster than if we manipulate the member variables in - // the loop. (Even alphabet makes a measurable - // difference, which is somewhat surprising to me since - // the member variable is final.) - int state = this.state; - int value = this.value; - int op = 0; - final byte[] output = this.output; - final int[] alphabet = this.alphabet; - - while (p < len) { - // Try the fast path: we're starting a new tuple and the - // next four bytes of the input stream are all data - // bytes. This corresponds to going through states - // 0-1-2-3-0. We expect to use this method for most of - // the data. - // - // If any of the next four bytes of input are non-data - // (whitespace, etc.), value will end up negative. (All - // the non-data values in decode are small negative - // numbers, so shifting any of them up and or'ing them - // together will result in a value with its top bit set.) - // - // You can remove this whole block and the output should - // be the same, just slower. - if (state == 0) { - while (p + 4 <= len && - (value = ((alphabet[input[p] & 0xff] << 18) | - (alphabet[input[p + 1] & 0xff] << 12) | - (alphabet[input[p + 2] & 0xff] << 6) | - (alphabet[input[p + 3] & 0xff]))) >= 0) { - output[op + 2] = (byte) value; - output[op + 1] = (byte) (value >> 8); - output[op] = (byte) (value >> 16); - op += 3; - p += 4; - } - if (p >= len) {break;} - } - - // The fast path isn't available -- either we've read a - // partial tuple, or the next four input bytes aren't all - // data, or whatever. Fall back to the slower state - // machine implementation. - - int d = alphabet[input[p++] & 0xff]; - - switch (state) { - case 0: - if (d >= 0) { - value = d; - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 1: - if (d >= 0) { - value = (value << 6) | d; - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 2: - if (d >= 0) { - value = (value << 6) | d; - ++state; - } else if (d == EQUALS) { - // Emit the last (partial) output tuple; - // expect exactly one more padding character. - output[op++] = (byte) (value >> 4); - state = 4; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 3: - if (d >= 0) { - // Emit the output triple and return to state 0. - value = (value << 6) | d; - output[op + 2] = (byte) value; - output[op + 1] = (byte) (value >> 8); - output[op] = (byte) (value >> 16); - op += 3; - state = 0; - } else if (d == EQUALS) { - // Emit the last (partial) output tuple; - // expect no further data or padding characters. - output[op + 1] = (byte) (value >> 2); - output[op] = (byte) (value >> 10); - op += 2; - state = 5; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 4: - if (d == EQUALS) { - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 5: - if (d != SKIP) { - this.state = 6; - return false; - } - break; - } - } - - if (!finish) { - // We're out of input, but a future call could provide - // more. - this.state = state; - this.value = value; - this.op = op; - return true; - } - - // Done reading input. Now figure out where we are left in - // the state machine and finish up. - - switch (state) { - case 0: - // Output length is a multiple of three. Fine. - break; - case 1: - // Read one extra input byte, which isn't enough to - // make another output byte. Illegal. - this.state = 6; - return false; - case 2: - // Read two extra input bytes, enough to emit 1 more - // output byte. Fine. - output[op++] = (byte) (value >> 4); - break; - case 3: - // Read three extra input bytes, enough to emit 2 more - // output bytes. Fine. - output[op++] = (byte) (value >> 10); - output[op++] = (byte) (value >> 2); - break; - case 4: - // Read one padding '=' when we expected 2. Illegal. - this.state = 6; - return false; - case 5: - // Read all the padding '='s we expected and no more. - // Fine. - break; - } - - this.state = state; - this.op = op; - return true; - } - } - - // -------------------------------------------------------- - // encoding - // -------------------------------------------------------- - - /** - * Base64-encode the given data and return a newly allocated - * String with the result. - * - * @param input the data to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static String encodeToString(byte[] input, int flags) { - try { - return new String(encode(input, flags), "US-ASCII"); - } catch (UnsupportedEncodingException e) { - // US-ASCII is guaranteed to be available. - throw new AssertionError(e); - } - } - - /** - * Base64-encode the given data and return a newly allocated - * String with the result. - * - * @param input the data to encode - * @param offset the position within the input array at which to - * start - * @param len the number of bytes of input to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static String encodeToString(byte[] input, int offset, int len, int flags) { - try { - return new String(encode(input, offset, len, flags), "US-ASCII"); - } catch (UnsupportedEncodingException e) { - // US-ASCII is guaranteed to be available. - throw new AssertionError(e); - } - } - - /** - * Base64-encode the given data and return a newly allocated - * byte[] with the result. - * - * @param input the data to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static byte[] encode(byte[] input, int flags) { - return encode(input, 0, input.length, flags); - } - - /** - * Base64-encode the given data and return a newly allocated - * byte[] with the result. - * - * @param input the data to encode - * @param offset the position within the input array at which to - * start - * @param len the number of bytes of input to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static byte[] encode(byte[] input, int offset, int len, int flags) { - Encoder encoder = new Encoder(flags, null); - - // Compute the exact length of the array we will produce. - int output_len = len / 3 * 4; - - // Account for the tail of the data and the padding bytes, if any. - if (encoder.do_padding) { - if (len % 3 > 0) { - output_len += 4; - } - } else { - switch (len % 3) { - case 0: - break; - case 1: - output_len += 2; - break; - case 2: - output_len += 3; - break; - } - } - - // Account for the newlines, if any. - if (encoder.do_newline && len > 0) { - output_len += (((len - 1) / (3 * Encoder.LINE_GROUPS)) + 1) * - (encoder.do_cr ? 2 : 1); - } - - encoder.output = new byte[output_len]; - encoder.process(input, offset, len, true); - - assert encoder.op == output_len; - - return encoder.output; - } - - /* package */ static class Encoder extends Coder { - /** - * Emit a new line every this many output tuples. Corresponds to - * a 76-character line length (the maximum allowable according to - * RFC 2045). - */ - public static final int LINE_GROUPS = 19; - - /** - * Lookup table for turning Base64 alphabet positions (6 bits) - * into output bytes. - */ - private static final byte ENCODE[] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', - }; - - /** - * Lookup table for turning Base64 alphabet positions (6 bits) - * into output bytes. - */ - private static final byte ENCODE_WEBSAFE[] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', - }; - - final private byte[] tail; - /* package */ int tailLen; - private int count; - - final public boolean do_padding; - final public boolean do_newline; - final public boolean do_cr; - final private byte[] alphabet; - - public Encoder(int flags, byte[] output) { - this.output = output; - - do_padding = (flags & NO_PADDING) == 0; - do_newline = (flags & NO_WRAP) == 0; - do_cr = (flags & CRLF) != 0; - alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE; - - tail = new byte[2]; - tailLen = 0; - - count = do_newline ? LINE_GROUPS : -1; - } - - /** - * @return an overestimate for the number of bytes {@code - * len} bytes could encode to. - */ - @Override - public int maxOutputSize(int len) { - return len * 8 / 5 + 10; - } - - @Override - public boolean process(byte[] input, int offset, int len, boolean finish) { - // Using local variables makes the encoder about 9% faster. - final byte[] alphabet = this.alphabet; - final byte[] output = this.output; - int op = 0; - int count = this.count; - - int p = offset; - len += offset; - int v = -1; - - // First we need to concatenate the tail of the previous call - // with any input bytes available now and see if we can empty - // the tail. - - switch (tailLen) { - case 0: - // There was no tail. - break; - - case 1: - if (p + 2 <= len) { - // A 1-byte tail with at least 2 bytes of - // input available now. - v = ((tail[0] & 0xff) << 16) | - ((input[p++] & 0xff) << 8) | - (input[p++] & 0xff); - tailLen = 0; - } - ; - break; - - case 2: - if (p + 1 <= len) { - // A 2-byte tail with at least 1 byte of input. - v = ((tail[0] & 0xff) << 16) | - ((tail[1] & 0xff) << 8) | - (input[p++] & 0xff); - tailLen = 0; - } - break; - } - - if (v != -1) { - output[op++] = alphabet[(v >> 18) & 0x3f]; - output[op++] = alphabet[(v >> 12) & 0x3f]; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (--count == 0) { - if (do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - count = LINE_GROUPS; - } - } - - // At this point either there is no tail, or there are fewer - // than 3 bytes of input available. - - // The main loop, turning 3 input bytes into 4 output bytes on - // each iteration. - while (p + 3 <= len) { - v = ((input[p] & 0xff) << 16) | - ((input[p + 1] & 0xff) << 8) | - (input[p + 2] & 0xff); - output[op] = alphabet[(v >> 18) & 0x3f]; - output[op + 1] = alphabet[(v >> 12) & 0x3f]; - output[op + 2] = alphabet[(v >> 6) & 0x3f]; - output[op + 3] = alphabet[v & 0x3f]; - p += 3; - op += 4; - if (--count == 0) { - if (do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - count = LINE_GROUPS; - } - } - - if (finish) { - // Finish up the tail of the input. Note that we need to - // consume any bytes in tail before any bytes - // remaining in input; there should be at most two bytes - // total. - - if (p - tailLen == len - 1) { - int t = 0; - v = ((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 4; - tailLen -= t; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (do_padding) { - output[op++] = '='; - output[op++] = '='; - } - if (do_newline) { - if (do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - } - } else if (p - tailLen == len - 2) { - int t = 0; - v = (((tailLen > 1 ? tail[t++] : input[p++]) & 0xff) << 10) | - (((tailLen > 0 ? tail[t++] : input[p++]) & 0xff) << 2); - tailLen -= t; - output[op++] = alphabet[(v >> 12) & 0x3f]; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (do_padding) { - output[op++] = '='; - } - if (do_newline) { - if (do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - } - } else if (do_newline && op > 0 && count != LINE_GROUPS) { - if (do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - } - - assert tailLen == 0; - assert p == len; - } else { - // Save the leftovers in tail to be consumed on the next - // call to encodeInternal. - - if (p == len - 1) { - tail[tailLen++] = input[p]; - } else if (p == len - 2) { - tail[tailLen++] = input[p]; - tail[tailLen++] = input[p + 1]; - } - } - - this.op = op; - this.count = count; - - return true; - } - } - - private Base64Ext() { - } // don't instantiate -} diff --git a/TVBox_Java/utils/CBC.java b/TVBox_Java/utils/CBC.java deleted file mode 100644 index afde9d0..0000000 --- a/TVBox_Java/utils/CBC.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.catvod.utils; - -import com.github.catvod.crawler.SpiderDebug; -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; - -public class CBC { - public static byte[] CBC(byte[] data, byte[] key, byte[] iv) { - try { - IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); - SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); - cipher.init(2, secretKeySpec, ivParameterSpec); - return cipher.doFinal(data); - } catch (Exception e) { - SpiderDebug.log(e); - return null; - } - } -} \ No newline at end of file diff --git a/TVBox_Java/utils/Misc.java b/TVBox_Java/utils/Misc.java deleted file mode 100644 index 65142fc..0000000 --- a/TVBox_Java/utils/Misc.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.github.catvod.utils; - -import android.net.Uri; - -import com.github.catvod.crawler.SpiderDebug; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.nio.charset.Charset; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.regex.Pattern; - -public class Misc { - public static boolean isVip(String url) { - // 适配2.0.6的调用应用内解析列表的支持, 需要配合直连分析一起使用,参考cjt影视和极品直连 - try { - boolean isVip = false; - String host = Uri.parse(url).getHost(); - String[] vipWebsites = new String[]{"iqiyi.com", "v.qq.com", "youku.com", "le.com", "tudou.com", "mgtv.com", "sohu.com", "acfun.cn", "bilibili.com", "baofeng.com", "pptv.com"}; - for (int b = 0; b < vipWebsites.length; b++) { - if (host.contains(vipWebsites[b])) { - if ("iqiyi.com".equals(vipWebsites[b])) { - //爱奇艺需要特殊处理 - if (url.contains("iqiyi.com/a_") || url.contains("iqiyi.com/w_") || url.contains("iqiyi.com/v_")) { - isVip = true; - break; - } - } else { - isVip = true; - break; - } - } - } - return isVip; - } catch (Exception e) { - } - return false; - } - - private static final Pattern snifferMatch = Pattern.compile("http((?!http).){26,}?\\.(m3u8|mp4)\\?.*|http((?!http).){26,}\\.(m3u8|mp4)|http((?!http).){26,}?/m3u8\\?pt=m3u8.*|http((?!http).)*?default\\.ixigua\\.com/.*|http((?!http).)*?cdn-tos[^\\?]*|http((?!http).)*?/obj/tos[^\\?]*|http.*?/player/m3u8play\\.php\\?url=.*|http.*?/player/.*?[pP]lay\\.php\\?url=.*|http.*?/playlist/m3u8/\\?vid=.*|http.*?\\.php\\?type=m3u8&.*|http.*?/download.aspx\\?.*|http.*?/api/up_api.php\\?.*|https.*?\\.66yk\\.cn.*|http((?!http).)*?netease\\.com/file/.*"); - - public static boolean isVideoFormat(String url) { - if (snifferMatch.matcher(url).find()) { - if (url.contains("cdn-tos") && url.contains(".js")) { - return false; - } - return true; - } - return false; - } - - public static String fixUrl(String base, String src) { - try { - if (src.startsWith("//")) { - Uri parse = Uri.parse(base); - src = parse.getScheme() + ":" + src; - } else if (!src.contains("://")) { - Uri parse = Uri.parse(base); - src = parse.getScheme() + "://" + parse.getHost() + src; - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - - public static boolean isBlackVodUrl(String input, String url) { - if (url.contains("973973.xyz") || url.contains(".fit:")) - return true; - return false; - } - - public static final String UaWinChrome = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - - public static JSONObject fixJsonVodHeader(JSONObject headers, String input, String url) throws JSONException { - if (headers == null) - headers = new JSONObject(); - if (input.contains("www.mgtv.com")) { - headers.put("Referer", " "); - headers.put("User-Agent", " Mozilla/5.0"); - } else if (url.contains("titan.mgtv")) { - headers.put("Referer", " "); - headers.put("User-Agent", " Mozilla/5.0"); - } else if (input.contains("bilibili")) { - headers.put("Referer", " https://www.bilibili.com/"); - headers.put("User-Agent", " " + Misc.UaWinChrome); - } - return headers; - } - - public static JSONObject jsonParse(String input, String json) throws JSONException { - JSONObject jsonPlayData = new JSONObject(json); - String url; - if (jsonPlayData.has("data")) { - url = jsonPlayData.getJSONObject("data").getString("url"); - } else { - url = jsonPlayData.getString("url"); - } - if (url.startsWith("//")) { - url = "https:" + url; - } - if (!url.startsWith("http")) { - return null; - } - if (url.equals(input)) { - if (isVip(url) || !isVideoFormat(url)) { - return null; - } - } - if (Misc.isBlackVodUrl(input, url)) { - return null; - } - JSONObject headers = new JSONObject(); - String ua = jsonPlayData.optString("user-agent", ""); - if (ua.trim().length() > 0) { - headers.put("User-Agent", " " + ua); - } - String referer = jsonPlayData.optString("referer", ""); - if (referer.trim().length() > 0) { - headers.put("Referer", " " + referer); - } - - headers = Misc.fixJsonVodHeader(headers, input, url); - JSONObject taskResult = new JSONObject(); - taskResult.put("header", headers); - taskResult.put("url", url); - return taskResult; - } - - - public static Charset CharsetUTF8 = Charset.forName("UTF-8"); - public static Charset CharsetIOS8859 = Charset.forName("iso-8859-1"); - - public static String MD5(String src, Charset charset) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] bytes = md.digest(src.getBytes(charset)); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - int v = bytes[i] & 0xFF; - String hv = Integer.toHexString(v); - if (hv.length() < 2) { - sb.append(0); - } - sb.append(hv); - } - return sb.toString().toLowerCase(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return ""; - } -} diff --git a/TVBox_Java/utils/RSAUtils.java b/TVBox_Java/utils/RSAUtils.java deleted file mode 100644 index 95786e7..0000000 --- a/TVBox_Java/utils/RSAUtils.java +++ /dev/null @@ -1,364 +0,0 @@ -package com.github.catvod.utils; - -import com.github.catvod.crawler.SpiderDebug; -import javax.crypto.Cipher; -import java.io.ByteArrayOutputStream; -import java.security.*; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.Map; - - -/** - * 实现RSA加密算法 - */ -public final class RSAUtils { - /** - * 加密算法RSA - */ - public static final String KEY_ALGORITHM = "RSA"; - - /** - * 签名算法 - */ - public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; - - /** - * 获取公钥的key - */ - private static final String PUBLIC_KEY = "RSAPublicKey"; - - /** - * 获取私钥的key - */ - private static final String PRIVATE_KEY = "RSAPrivateKey"; - - /** - * RSA最大加密明文大小 - */ - private static final int MAX_ENCRYPT_BLOCK = 117; - - /** - * RSA最大解密密文大小 - */ - private static final int MAX_DECRYPT_BLOCK = 128; - - - /** - * BASE64解密 - * - * @param key - * @return - * @throws Exception - */ - public static byte[] decryptBASE64(String key) throws Exception { - return Base64Ext.decode(key.getBytes(), Base64Ext.NO_WRAP); - } - - /** - * BASE64加密 - * - * @param key - * @return - * @throws Exception - */ - public static String encryptBASE64(byte[] key) throws Exception { - return new String(Base64Ext.encode(key, Base64Ext.NO_WRAP)); - } - - - /** - *

- * 生成密钥对(公钥和私钥) - *

- * - * @return - * @throws Exception - */ - public static Map genKeyPair() throws Exception { - KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); - keyPairGen.initialize(1024); - KeyPair keyPair = keyPairGen.generateKeyPair(); - RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); - RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); - Map keyMap = new HashMap<>(); - keyMap.put(PUBLIC_KEY, publicKey); - keyMap.put(PRIVATE_KEY, privateKey); - return keyMap; - } - - /** - *

- * 用私钥对信息生成数字签名 - *

- * - * @param data 待加签preSign - * @param privateKey 私钥(BASE64编码) - * @return - * @throws Exception - */ - public static String sign(byte[] data, String privateKey) throws Exception { - byte[] keyBytes = decryptBASE64(privateKey); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); - Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); - signature.initSign(privateK); - signature.update(data); - return encryptBASE64(signature.sign()); - } - - /** - *

- * 校验数字签名 - *

- * - * @param data 待加签preSign - * @param publicKey 公钥(BASE64编码) - * @param sign 数字签名 - * @return - * @throws Exception - */ - public static boolean verify(byte[] data, String publicKey, String sign) throws Exception { - byte[] keyBytes = decryptBASE64(publicKey); - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - PublicKey publicK = keyFactory.generatePublic(keySpec); - Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); - signature.initVerify(publicK); - signature.update(data); - return signature.verify(decryptBASE64(sign)); - } - - /** - *

- * 私钥解密 - *

- * - * @param encryptedData 已加密数据 - * @param privateKey 私钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception { - byte[] keyBytes = decryptBASE64(privateKey); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.DECRYPT_MODE, privateK); - int inputLen = encryptedData.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段解密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_DECRYPT_BLOCK) { - cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); - } else { - cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_DECRYPT_BLOCK; - } - byte[] decryptedData = out.toByteArray(); - out.close(); - return decryptedData; - } - - /** */ - /** - *

- * 公钥解密 - *

- * - * @param encryptedData 已加密数据 - * @param publicKey 公钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) throws Exception { - byte[] keyBytes = decryptBASE64(publicKey); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key publicK = keyFactory.generatePublic(x509KeySpec); - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.DECRYPT_MODE, publicK); - int inputLen = encryptedData.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段解密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_DECRYPT_BLOCK) { - cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); - } else { - cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_DECRYPT_BLOCK; - } - byte[] decryptedData = out.toByteArray(); - out.close(); - return decryptedData; - } - - /** */ - /** - *

- * 公钥加密 - *

- * - * @param data 源数据 - * @param publicKey 公钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception { - byte[] keyBytes = decryptBASE64(publicKey); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key publicK = keyFactory.generatePublic(x509KeySpec); - // 对数据加密 - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.ENCRYPT_MODE, publicK); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = out.toByteArray(); - out.close(); - return encryptedData; - } - - /** - *

- * 私钥加密 - *

- * - * @param data 源数据 - * @param privateKey 私钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] encryptByPrivateKey(byte[] data, String privateKey) throws Exception { - byte[] keyBytes = decryptBASE64(privateKey); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.ENCRYPT_MODE, privateK); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = out.toByteArray(); - out.close(); - return encryptedData; - } - - /** - *

- * 获取私钥 - *

- * - * @param keyMap 密钥对 - * @return - * @throws Exception - */ - public static String getPrivateKey(Map keyMap) throws Exception { - Key key = (Key) keyMap.get(PRIVATE_KEY); - return encryptBASE64(key.getEncoded()); - } - - /** - *

- * 获取公钥 - *

- * - * @param keyMap 密钥对 - * @return - * @throws Exception - */ - public static String getPublicKey(Map keyMap) throws Exception { - Key key = (Key) keyMap.get(PUBLIC_KEY); - return encryptBASE64(key.getEncoded()); - } - - /** - * java端私钥加密 - * - * @param data - * @param PRIVATEKEY - * @return - * @throws Exception - */ - public static String encryptedDataWithPriKey(String data, String PRIVATEKEY) throws Exception { - return encryptBASE64(encryptByPrivateKey(data.getBytes(), PRIVATEKEY)); - } - - - /** - * java端私钥解密 - * - * @throws Exception - */ - public static String decryptDataWithPubKey(String data, String PUBLICKEY) throws Exception { - byte[] rs = decryptBASE64(data); - return new String(decryptByPublicKey(rs, PUBLICKEY), "UTF-8"); - } - - - /** - * java端公钥加密 - * - * @throws Exception - */ - public static String encryptedDataWithPubKey(String data, String PUBLICKEY) throws Exception { - data = encryptBASE64(encryptByPublicKey(data.getBytes(), PUBLICKEY)); - return data; - } - - /** - * java端私钥解密 - * - * @throws Exception - */ - public static String decryptDataWithPriKey(String data, String PRIVATEKEY) throws Exception { - byte[] rs = decryptBASE64(data); - return new String(decryptByPrivateKey(rs, PRIVATEKEY), "UTF-8"); - } - - -} diff --git a/TVBox_Java/utils/SSLSocketFactoryCompat.java b/TVBox_Java/utils/SSLSocketFactoryCompat.java deleted file mode 100644 index 81104e4..0000000 --- a/TVBox_Java/utils/SSLSocketFactoryCompat.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.github.catvod.utils; - -import android.os.Build; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.net.UnknownHostException; -import java.security.GeneralSecurityException; -import java.security.cert.CertificateException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.X509TrustManager; - -public class SSLSocketFactoryCompat extends SSLSocketFactory { - private SSLSocketFactory defaultFactory; - // Android 5.0+ (API level21) provides reasonable default settings - // but it still allows SSLv3 - // https://developer.android.com/about/versions/android-5.0-changes.html#ssl - static String protocols[] = null, cipherSuites[] = null; - - static { - try { - SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(); - if (socket != null) { - /* set reasonable protocol versions */ - // - enable all supported protocols (enables TLSv1.1 and TLSv1.2 on Android <5.0) - // - remove all SSL versions (especially SSLv3) because they're insecure now - List protocols = new LinkedList<>(); - for (String protocol : socket.getSupportedProtocols()) - if (!protocol.toUpperCase().contains("SSL")) - protocols.add(protocol); - SSLSocketFactoryCompat.protocols = protocols.toArray(new String[protocols.size()]); - /* set up reasonable cipher suites */ - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - // choose known secure cipher suites - List allowedCiphers = Arrays.asList( - // TLS 1.2 - "TLS_RSA_WITH_AES_256_GCM_SHA384", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_ECHDE_RSA_WITH_AES_128_GCM_SHA256", - // maximum interoperability - "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", - // additionally - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); - List availableCiphers = Arrays.asList(socket.getSupportedCipherSuites()); - // take all allowed ciphers that are available and put them into preferredCiphers - HashSet preferredCiphers = new HashSet<>(allowedCiphers); - preferredCiphers.retainAll(availableCiphers); - /* For maximum security, preferredCiphers should *replace* enabled ciphers (thus disabling - * ciphers which are enabled by default, but have become unsecure), but I guess for - * the security level of DAVdroid and maximum compatibility, disabling of insecure - * ciphers should be a server-side task */ - // add preferred ciphers to enabled ciphers - HashSet enabledCiphers = preferredCiphers; - enabledCiphers.addAll(new HashSet<>(Arrays.asList(socket.getEnabledCipherSuites()))); - SSLSocketFactoryCompat.cipherSuites = enabledCiphers.toArray(new String[enabledCiphers.size()]); - } - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public SSLSocketFactoryCompat(X509TrustManager tm) { - try { - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, (tm != null) ? new X509TrustManager[]{tm} : null, null); - defaultFactory = sslContext.getSocketFactory(); - } catch (GeneralSecurityException e) { - throw new AssertionError(); // The system has no TLS. Just give up. - } - } - - private void upgradeTLS(SSLSocket ssl) { - // Android 5.0+ (API level21) provides reasonable default settings - // but it still allows SSLv3 - // https://developer.android.com/about/versions/android-5.0-changes.html#ssl - if (protocols != null) { - ssl.setEnabledProtocols(protocols); - } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && cipherSuites != null) { - ssl.setEnabledCipherSuites(cipherSuites); - } - } - - @Override - public String[] getDefaultCipherSuites() { - return cipherSuites; - } - - @Override - public String[] getSupportedCipherSuites() { - return cipherSuites; - } - - @Override - public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - Socket ssl = defaultFactory.createSocket(s, host, port, autoClose); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(String host, int port) throws IOException, UnknownHostException { - Socket ssl = defaultFactory.createSocket(host, port); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { - Socket ssl = defaultFactory.createSocket(host, port, localHost, localPort); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - Socket ssl = defaultFactory.createSocket(address, port, localAddress, localPort); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - //定义一个信任所有证书的TrustManager - public static final X509TrustManager trustAllCert = new X509TrustManager() { - @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; - } - }; -} diff --git a/TVBox_Java/utils/SpiderOKClient.java b/TVBox_Java/utils/SpiderOKClient.java deleted file mode 100644 index 5fba1e9..0000000 --- a/TVBox_Java/utils/SpiderOKClient.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.github.catvod.utils; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import okhttp3.OkHttpClient; - -public class SpiderOKClient { - private static OkHttpClient noRedirectClient = null; - - public static OkHttpClient noRedirectClient() { - if (noRedirectClient == null) { - OkHttpClient.Builder builder = new OkHttpClient.Builder() - .readTimeout(15, TimeUnit.SECONDS) - .writeTimeout(15, TimeUnit.SECONDS) - .connectTimeout(15, TimeUnit.SECONDS) - .followRedirects(false) - .followSslRedirects(false) - .retryOnConnectionFailure(true) - .sslSocketFactory(new SSLSocketFactoryCompat(SSLSocketFactoryCompat.trustAllCert), SSLSocketFactoryCompat.trustAllCert); - noRedirectClient = builder.build(); - } - return noRedirectClient; - } - - public static String getRedirectLocation(Map> headers) { - if (headers == null) - return null; - if (headers.containsKey("location")) - return headers.get("location").get(0); - if (headers.containsKey("Location")) - return headers.get("Location").get(0); - return null; - } -} diff --git a/TVBox_Java/utils/gZip.java b/TVBox_Java/utils/gZip.java deleted file mode 100644 index e8f14ea..0000000 --- a/TVBox_Java/utils/gZip.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.catvod.utils; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.zip.GZIPInputStream; - - -public class gZip { - public static String KS(byte[] bArr) throws IOException { - GZIPInputStream gZIPInputStream = new GZIPInputStream(new ByteArrayInputStream(bArr)); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - byte[] bArr2 = new byte[1024]; - while (true) { - int read = gZIPInputStream.read(bArr2); - if (read == -1) { - return byteArrayOutputStream.toString("UTF-8"); - } - byteArrayOutputStream.write(bArr2, 0, read); - } - } -} \ No newline at end of file diff --git a/TVBox_Java/utils/okhttp/OKCallBack.java b/TVBox_Java/utils/okhttp/OKCallBack.java deleted file mode 100644 index 9bd5b7c..0000000 --- a/TVBox_Java/utils/okhttp/OKCallBack.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.github.catvod.utils.okhttp; - -import java.io.IOException; - -import okhttp3.Call; -import okhttp3.Response; - - -public abstract class OKCallBack { - - private T result = null; - - public T getResult() { - return result; - } - - protected void setResult(T val) { - result = val; - } - - protected void onError(final Call call, final Exception e) { - onFailure(call, e); - } - - protected void onSuccess(Call call, Response response) { - T obj = onParseResponse(call, response); - setResult(obj); - onResponse(obj); - } - - protected abstract T onParseResponse(Call call, Response response); - - protected abstract void onFailure(Call call, Exception e); - - protected abstract void onResponse(T response); - - public static abstract class OKCallBackDefault extends OKCallBack { - @Override - public Response onParseResponse(Call call, Response response) { - return response; - } - } - - public static abstract class OKCallBackString extends OKCallBack { - @Override - public void onError(Call call, Exception e) { - setResult(""); - super.onError(call, e); - } - - @Override - public String onParseResponse(Call call, Response response) { - try { - return response.body().string(); - } catch (IOException e) { - return ""; - } - } - } -} diff --git a/TVBox_Java/utils/okhttp/OKRequest.java b/TVBox_Java/utils/okhttp/OKRequest.java deleted file mode 100644 index c24d5ba..0000000 --- a/TVBox_Java/utils/okhttp/OKRequest.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.github.catvod.utils.okhttp; - -import android.text.TextUtils; - -import java.io.IOException; -import java.util.Map; - -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.FormBody; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.RequestBody; -import okhttp3.Response; - -class OKRequest { - private final String mMethodType; - private String mUrl; - private Object mTag = null; - private final Map mParamsMap; - private final String mJsonStr; - private final Map mHeaderMap; - private final OKCallBack mCallBack; - private okhttp3.Request mOkHttpRequest; - private okhttp3.Request.Builder mRequestBuilder; - - - OKRequest(String methodType, String url, Map paramsMap, Map headerMap, OKCallBack callBack) { - this(methodType, url, null, paramsMap, headerMap, callBack); - } - - OKRequest(String methodType, String url, String jsonStr, Map headerMap, OKCallBack callBack) { - this(methodType, url, jsonStr, null, headerMap, callBack); - } - - private OKRequest(String methodType, String url, String jsonStr, Map paramsMap, Map headerMap, OKCallBack callBack) { - mMethodType = methodType; - mUrl = url; - mJsonStr = jsonStr; - mParamsMap = paramsMap; - mHeaderMap = headerMap; - mCallBack = callBack; - getInstance(); - } - - public void setTag(Object tag) { - mTag = tag; - } - - private void getInstance() { - mRequestBuilder = new okhttp3.Request.Builder(); - switch (mMethodType) { - case OkHttpUtil.METHOD_GET: - setGetParams(); - break; - case OkHttpUtil.METHOD_POST: - mRequestBuilder.post(getRequestBody()); - break; - } - mRequestBuilder.url(mUrl); - if (mTag != null) - mRequestBuilder.tag(mTag); - if (mHeaderMap != null) { - setHeader(); - } - mOkHttpRequest = mRequestBuilder.build(); - } - - private RequestBody getRequestBody() { - if (!TextUtils.isEmpty(mJsonStr)) { - MediaType JSON = MediaType.parse("application/json; charset=utf-8"); - return RequestBody.create(JSON, mJsonStr); - } - FormBody.Builder formBody = new FormBody.Builder(); - if (mParamsMap != null) { - for (String key : mParamsMap.keySet()) { - formBody.add(key, mParamsMap.get(key)); - } - } - return formBody.build(); - } - - private void setGetParams() { - if (mParamsMap != null) { - mUrl = mUrl + "?"; - for (String key : mParamsMap.keySet()) { - mUrl = mUrl + key + "=" + mParamsMap.get(key) + "&"; - } - mUrl = mUrl.substring(0, mUrl.length() - 1); - } - } - - private void setHeader() { - if (mHeaderMap != null) { - for (String key : mHeaderMap.keySet()) { - mRequestBuilder.addHeader(key, mHeaderMap.get(key)); - } - } - } - - void execute(OkHttpClient client) { - Call call = client.newCall(mOkHttpRequest); - try { - Response response = call.execute(); - if (mCallBack != null) { - mCallBack.onSuccess(call, response); - } - } catch (IOException e) { - if (mCallBack != null) { - mCallBack.onError(call, e); - } - } - } - - void call(OkHttpClient client) { - client.newCall(mOkHttpRequest).enqueue(new Callback() { - @Override - public void onFailure(final Call call, final IOException e) { - if (mCallBack != null) { - mCallBack.onError(call, e); - } - } - - @Override - public void onResponse(final Call call, final Response response) throws IOException { - if (mCallBack != null) { - mCallBack.onSuccess(call, response); - } - } - }); - } -} diff --git a/TVBox_Java/utils/okhttp/OkHttpUtil.java b/TVBox_Java/utils/okhttp/OkHttpUtil.java deleted file mode 100644 index e161c40..0000000 --- a/TVBox_Java/utils/okhttp/OkHttpUtil.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.github.catvod.utils.okhttp; - -import com.github.catvod.crawler.SpiderDebug; - -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import okhttp3.Call; -import okhttp3.OkHttpClient; -import okhttp3.Response; - -public class OkHttpUtil { - - public static final String METHOD_GET = "GET"; - public static final String METHOD_POST = "POST"; - - private static final int DEFAULT_TIMEOUT = 15; - - private static final Object lockO = new Object(); - - private static OkHttpClient defaultClient = null; - - /** - * 不自动重定向 - */ - private static OkHttpClient noRedirectClient = null; - - public static OkHttpClient defaultClient() { - synchronized (lockO) { - if (defaultClient == null) { - OkHttpClient.Builder builder = new OkHttpClient.Builder() - .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .retryOnConnectionFailure(true) - .sslSocketFactory(new SSLSocketFactoryCompat(SSLSocketFactoryCompat.trustAllCert), SSLSocketFactoryCompat.trustAllCert); - defaultClient = builder.build(); - } - return defaultClient; - } - } - - public static OkHttpClient noRedirectClient() { - synchronized (lockO) { - if (noRedirectClient == null) { - OkHttpClient.Builder builder = new OkHttpClient.Builder() - .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) - .followRedirects(false) - .followSslRedirects(false) - .retryOnConnectionFailure(true) - .sslSocketFactory(new SSLSocketFactoryCompat(SSLSocketFactoryCompat.trustAllCert), SSLSocketFactoryCompat.trustAllCert); - noRedirectClient = builder.build(); - } - return noRedirectClient; - } - } - - public static String string(OkHttpClient client, String url, String tag, Map paramsMap, Map headerMap, Map> respHeaderMap) { - OKCallBack stringCallback = new OKCallBack() { - @Override - public String onParseResponse(Call call, Response response) { - try { - if (respHeaderMap != null) { - respHeaderMap.clear(); - respHeaderMap.putAll(response.headers().toMultimap()); - } - return response.body().string(); - } catch (IOException e) { - return ""; - } - } - - @Override - public void onFailure(Call call, Exception e) { - setResult(""); - SpiderDebug.log(e); - } - - @Override - public void onResponse(String response) { - } - }; - OKRequest req = new OKRequest(METHOD_GET, url, paramsMap, headerMap, stringCallback); - req.setTag(tag); - req.execute(client); - return stringCallback.getResult(); - } - - public static String stringNoRedirect(String url, Map headerMap, Map> respHeaderMap) { - return string(noRedirectClient(), url, null, null, headerMap, respHeaderMap); - } - - public static String string(String url, Map headerMap, Map> respHeaderMap) { - return string(defaultClient(), url, null, null, headerMap, respHeaderMap); - } - - public static String string(String url, Map headerMap) { - return string(defaultClient(), url, null, null, headerMap, null); - } - - public static String string(String url, String tag, Map headerMap) { - return string(defaultClient(), url, tag, null, headerMap, null); - } - - public static void get(OkHttpClient client, String url, OKCallBack callBack) { - get(client, url, null, null, callBack); - } - - public static void get(OkHttpClient client, String url, Map paramsMap, OKCallBack callBack) { - get(client, url, paramsMap, null, callBack); - } - - public static void get(OkHttpClient client, String url, Map paramsMap, Map headerMap, OKCallBack callBack) { - new OKRequest(METHOD_GET, url, paramsMap, headerMap, callBack).execute(client); - } - - public static void post(OkHttpClient client, String url, OKCallBack callBack) { - post(client, url, null, callBack); - } - - public static void post(OkHttpClient client, String url, Map paramsMap, OKCallBack callBack) { - post(client, url, paramsMap, null, callBack); - } - - public static void post(OkHttpClient client, String url, Map paramsMap, Map headerMap, OKCallBack callBack) { - new OKRequest(METHOD_POST, url, paramsMap, headerMap, callBack).execute(client); - } - - public static void post(OkHttpClient client, String url, String tag, Map paramsMap, Map headerMap, OKCallBack callBack) { - OKRequest req = new OKRequest(METHOD_POST, url, paramsMap, headerMap, callBack); - req.setTag(tag); - req.execute(client); - } - - public static void postJson(OkHttpClient client, String url, String jsonStr, OKCallBack callBack) { - postJson(client, url, jsonStr, null, callBack); - } - - public static void postJson(OkHttpClient client, String url, String jsonStr, Map headerMap, OKCallBack callBack) { - new OKRequest(METHOD_POST, url, jsonStr, headerMap, callBack).execute(client); - } - - /** - * 根据Tag取消请求 - */ - public static void cancel(OkHttpClient client, Object tag) { - if (client == null || tag == null) return; - for (Call call : client.dispatcher().queuedCalls()) { - if (tag.equals(call.request().tag())) { - call.cancel(); - } - } - for (Call call : client.dispatcher().runningCalls()) { - if (tag.equals(call.request().tag())) { - call.cancel(); - } - } - } - - public static void cancel(Object tag) { - cancel(defaultClient(), tag); - } - - public static void cancelAll() { - cancelAll(defaultClient()); - } - - /** - * 取消所有请求请求 - */ - public static void cancelAll(OkHttpClient client) { - if (client == null) return; - for (Call call : client.dispatcher().queuedCalls()) { - call.cancel(); - } - for (Call call : client.dispatcher().runningCalls()) { - call.cancel(); - } - } - - /** - * 获取重定向地址 - * - * @param headers - * @return - */ - public static String getRedirectLocation(Map> headers) { - if (headers == null) - return null; - if (headers.containsKey("location")) - return headers.get("location").get(0); - if (headers.containsKey("Location")) - return headers.get("Location").get(0); - return null; - } -} diff --git a/TVBox_Java/utils/okhttp/SSLSocketFactoryCompat.java b/TVBox_Java/utils/okhttp/SSLSocketFactoryCompat.java deleted file mode 100644 index f0395e0..0000000 --- a/TVBox_Java/utils/okhttp/SSLSocketFactoryCompat.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.github.catvod.utils.okhttp; - -import android.os.Build; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.security.GeneralSecurityException; -import java.security.cert.CertificateException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.X509TrustManager; - -public class SSLSocketFactoryCompat extends SSLSocketFactory { - private final SSLSocketFactory defaultFactory; - // Android 5.0+ (API level21) provides reasonable default settings - // but it still allows SSLv3 - // https://developer.android.com/about/versions/android-5.0-changes.html#ssl - static String[] protocols = null; - static String[] cipherSuites = null; - - static { - try { - SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(); - if (socket != null) { - /* set reasonable protocol versions */ - // - enable all supported protocols (enables TLSv1.1 and TLSv1.2 on Android <5.0) - // - remove all SSL versions (especially SSLv3) because they're insecure now - List protocols = new LinkedList<>(); - for (String protocol : socket.getSupportedProtocols()) - if (!protocol.toUpperCase().contains("SSL")) - protocols.add(protocol); - SSLSocketFactoryCompat.protocols = protocols.toArray(new String[protocols.size()]); - /* set up reasonable cipher suites */ - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - // choose known secure cipher suites - List allowedCiphers = Arrays.asList( - // TLS 1.2 - "TLS_RSA_WITH_AES_256_GCM_SHA384", - "TLS_RSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_ECHDE_RSA_WITH_AES_128_GCM_SHA256", - // maximum interoperability - "TLS_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", - // additionally - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); - List availableCiphers = Arrays.asList(socket.getSupportedCipherSuites()); - // take all allowed ciphers that are available and put them into preferredCiphers - HashSet preferredCiphers = new HashSet<>(allowedCiphers); - preferredCiphers.retainAll(availableCiphers); - /* For maximum security, preferredCiphers should *replace* enabled ciphers (thus disabling - * ciphers which are enabled by default, but have become unsecure), but I guess for - * the security level of DAVdroid and maximum compatibility, disabling of insecure - * ciphers should be a server-side task */ - // add preferred ciphers to enabled ciphers - HashSet enabledCiphers = preferredCiphers; - enabledCiphers.addAll(new HashSet<>(Arrays.asList(socket.getEnabledCipherSuites()))); - SSLSocketFactoryCompat.cipherSuites = enabledCiphers.toArray(new String[enabledCiphers.size()]); - } - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public SSLSocketFactoryCompat(X509TrustManager tm) { - try { - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, (tm != null) ? new X509TrustManager[]{tm} : null, null); - defaultFactory = sslContext.getSocketFactory(); - } catch (GeneralSecurityException e) { - throw new AssertionError(); // The system has no TLS. Just give up. - } - } - - private void upgradeTLS(SSLSocket ssl) { - // Android 5.0+ (API level21) provides reasonable default settings - // but it still allows SSLv3 - // https://developer.android.com/about/versions/android-5.0-changes.html#ssl - if (protocols != null) { - ssl.setEnabledProtocols(protocols); - } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && cipherSuites != null) { - ssl.setEnabledCipherSuites(cipherSuites); - } - } - - @Override - public String[] getDefaultCipherSuites() { - return cipherSuites; - } - - @Override - public String[] getSupportedCipherSuites() { - return cipherSuites; - } - - @Override - public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - Socket ssl = defaultFactory.createSocket(s, host, port, autoClose); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(String host, int port) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port, localHost, localPort); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - Socket ssl = defaultFactory.createSocket(address, port, localAddress, localPort); - if (ssl instanceof SSLSocket) - upgradeTLS((SSLSocket) ssl); - return ssl; - } - - //定义一个信任所有证书的TrustManager - public static final X509TrustManager trustAllCert = new X509TrustManager() { - @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { - } - - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; - } - }; -} diff --git a/TVBox_Java/xpath/XPathRule.java b/TVBox_Java/xpath/XPathRule.java deleted file mode 100644 index 7238fdc..0000000 --- a/TVBox_Java/xpath/XPathRule.java +++ /dev/null @@ -1,687 +0,0 @@ -package com.github.catvod.xpath; - -import com.github.catvod.crawler.SpiderDebug; - -import org.json.JSONObject; - -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class XPathRule { - /** - * user-agent - */ - private String ua; - /** - * 获取分类和首页推荐的Url - */ - private String homeUrl; - /** - * 分类节点 xpath - */ - private String cateNode; - /** - * 分类节点名 xpath - */ - private String cateName; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern cateNameR; - /** - * 分类节点id xpath - */ - private String cateId; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern cateIdR; - /** - * 手动指定 分类 如果有则不从homeUrl中获取分类 - */ - private LinkedHashMap cateManual = new LinkedHashMap<>(); - - /** - * 筛选 - */ - private JSONObject filter; - - /** - * 更新推荐视频节点 xpath - */ - private String homeVodNode; - /** - * 更新推荐视频名称 xpath - */ - private String homeVodName; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern homeVodNameR; - /** - * 更新推荐视频id xpath - */ - private String homeVodId; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern homeVodIdR; - /** - * 更新推荐视频图片 xpath - */ - private String homeVodImg; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern homeVodImgR; - /** - * 更新推荐视频简介 xpath - */ - private String homeVodMark; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern homeVodMarkR; - /** - * 分类页地址 - */ - private String cateUrl; - /** - * 分类叶视频节点 xpath - */ - private String cateVodNode; - /** - * 分类叶视频名称 xpath - */ - private String cateVodName; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern cateVodNameR; - /** - * 分类叶视频视频id xpath - */ - private String cateVodId; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern cateVodIdR; - /** - * 分类叶视频视频图片 xpath - */ - private String cateVodImg; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern cateVodImgR; - /** - * 分类叶视频视频简介 xpath - */ - private String cateVodMark; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern cateVodMarkR; - - /** - * 详情页面 - */ - private String dtUrl; - /** - * 详情节点 xpath - */ - private String dtNode; - /** - * 详情 视频名 xpath - */ - private String dtName; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtNameR; - /** - * 详情视频图片 xpath - */ - private String dtImg; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtImgR; - /** - * 详情视频分类 xpath - */ - private String dtCate; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtCateR; - /** - * 详情视频年份 xpath - */ - private String dtYear; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtYearR; - /** - * 详情视频地区 xpath - */ - private String dtArea; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtAreaR; - /** - * 详情视频简介 xpath - */ - private String dtMark; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtMarkR; - /** - * 详情演员 xpath - */ - private String dtActor; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtActorR; - /** - * 详情导演 xpath - */ - private String dtDirector; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtDirectorR; - /** - * 详情 说明 长 xpath - */ - private String dtDesc; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern dtDescR; - - /** - * 详情播放来源节点 - */ - private String dtFromNode; - /** - * 详情播放来源名称 xpath - */ - private String dtFromName; - /** - * 详情 - */ - private Pattern dtFromNameR; - /** - * 详情播放地址列表节点 xpath - */ - private String dtUrlNode; - /** - * 详情播放地址节点 xpath - */ - private String dtUrlSubNode; - /** - * 详情播放地址id xpath - */ - private String dtUrlId; - /** - * 详情 - */ - private Pattern dtUrlIdR; - /** - * 详情播放地址名称 xpath - */ - private String dtUrlName; - /** - * 详情 - */ - private Pattern dtUrlNameR; - /** - * 播放页面url - */ - private String playUrl; - /** - * 播放解析调用ua - */ - private String playUa; - - /** - * 搜索页地址 - */ - private String searchUrl; - - /** - * 搜索页视频节点 xpath - */ - private String scVodNode; - /** - * 搜索页视频名称 xpath - */ - private String scVodName; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern scVodNameR; - /** - * 搜索页视频id xpath - */ - private String scVodId; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern scVodIdR; - /** - * 搜索页视频图片 xpath - */ - private String scVodImg; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern scVodImgR; - /** - * 搜索页视频简介 xpath - */ - private String scVodMark; - /** - * 正则对取到的数据进行二次处理 - */ - private Pattern scVodMarkR; - - private static Pattern getPattern(JSONObject json, String key) { - String v = json.optString(key).trim(); - if (v.isEmpty()) - return null; - else { - try { - return Pattern.compile(v); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - return null; - } - - private static String doReplaceRegex(Pattern pattern, String src) { - if (pattern == null) - return src; - try { - Matcher matcher = pattern.matcher(src); - if (matcher.find()) { - return matcher.group(1).trim(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return src; - } - - public static XPathRule fromJson(String json) { - try { - JSONObject jsonObj = new JSONObject(json); - XPathRule rule = new XPathRule(); - rule.ua = jsonObj.optString("ua"); - rule.homeUrl = jsonObj.optString("homeUrl").trim(); - rule.cateNode = jsonObj.optString("cateNode").trim(); - rule.cateName = jsonObj.optString("cateName").trim(); - rule.cateNameR = getPattern(jsonObj, "cateNameR"); - rule.cateId = jsonObj.optString("cateId").trim(); - rule.cateIdR = getPattern(jsonObj, "cateIdR"); - JSONObject navs = jsonObj.optJSONObject("cateManual"); - if (navs != null) { - Iterator keys = navs.keys(); - while (keys.hasNext()) { - String name = keys.next(); - rule.cateManual.put(name.trim(), navs.getString(name).trim()); - } - } - rule.filter = jsonObj.optJSONObject("filter"); - rule.homeVodNode = jsonObj.optString("homeVodNode").trim(); - rule.homeVodName = jsonObj.optString("homeVodName").trim(); - rule.homeVodNameR = getPattern(jsonObj, "homeVodNameR"); - rule.homeVodId = jsonObj.optString("homeVodId").trim(); - rule.homeVodIdR = getPattern(jsonObj, "homeVodIdR"); - rule.homeVodImg = jsonObj.optString("homeVodImg").trim(); - rule.homeVodImgR = getPattern(jsonObj, "homeVodImgR"); - rule.homeVodMark = jsonObj.optString("homeVodMark").trim(); - rule.homeVodMarkR = getPattern(jsonObj, "homeVodMarkR"); - rule.cateUrl = jsonObj.optString("cateUrl").trim(); - rule.cateVodNode = jsonObj.optString("cateVodNode").trim(); - rule.cateVodName = jsonObj.optString("cateVodName").trim(); - rule.cateVodNameR = getPattern(jsonObj, "cateVodNameR"); - rule.cateVodId = jsonObj.optString("cateVodId").trim(); - rule.cateVodIdR = getPattern(jsonObj, "cateVodIdR"); - rule.cateVodImg = jsonObj.optString("cateVodImg").trim(); - rule.cateVodImgR = getPattern(jsonObj, "cateVodImgR"); - rule.cateVodMark = jsonObj.optString("cateVodMark").trim(); - rule.cateVodMarkR = getPattern(jsonObj, "cateVodMarkR"); - rule.dtUrl = jsonObj.optString("dtUrl"); - rule.dtNode = jsonObj.optString("dtNode"); - rule.dtName = jsonObj.optString("dtName"); - rule.dtNameR = getPattern(jsonObj, "dtNameR"); - rule.dtImg = jsonObj.optString("dtImg"); - rule.dtImgR = getPattern(jsonObj, "dtImgR"); - rule.dtCate = jsonObj.optString("dtCate"); - rule.dtCateR = getPattern(jsonObj, "dtCateR"); - rule.dtYear = jsonObj.optString("dtYear"); - rule.dtYearR = getPattern(jsonObj, "dtYearR"); - rule.dtArea = jsonObj.optString("dtArea"); - rule.dtAreaR = getPattern(jsonObj, "dtAreaR"); - rule.dtMark = jsonObj.optString("dtMark"); - rule.dtMarkR = getPattern(jsonObj, "dtMarkR"); - rule.dtActor = jsonObj.optString("dtActor"); - rule.dtActorR = getPattern(jsonObj, "dtActorR"); - rule.dtDirector = jsonObj.optString("dtDirector"); - rule.dtDirectorR = getPattern(jsonObj, "dtDirectorR"); - rule.dtDesc = jsonObj.optString("dtDesc"); - rule.dtDescR = getPattern(jsonObj, "dtDescR"); - rule.dtFromNode = jsonObj.optString("dtFromNode"); - rule.dtFromName = jsonObj.optString("dtFromName"); - rule.dtFromNameR = getPattern(jsonObj, "dtFromNameR"); - rule.dtUrlNode = jsonObj.optString("dtUrlNode"); - rule.dtUrlSubNode = jsonObj.optString("dtUrlSubNode"); - rule.dtUrlId = jsonObj.optString("dtUrlId"); - rule.dtUrlIdR = getPattern(jsonObj, "dtUrlIdR"); - rule.dtUrlName = jsonObj.optString("dtUrlName"); - rule.dtUrlNameR = getPattern(jsonObj, "dtUrlNameR"); - rule.playUrl = jsonObj.optString("playUrl"); - rule.playUa = jsonObj.optString("playUa"); - rule.searchUrl = jsonObj.optString("searchUrl"); - rule.scVodNode = jsonObj.optString("scVodNode").trim(); - rule.scVodName = jsonObj.optString("scVodName").trim(); - rule.scVodNameR = getPattern(jsonObj, "scVodNameR"); - rule.scVodId = jsonObj.optString("scVodId").trim(); - rule.scVodIdR = getPattern(jsonObj, "scVodIdR"); - rule.scVodImg = jsonObj.optString("scVodImg").trim(); - rule.scVodImgR = getPattern(jsonObj, "scVodImgR"); - rule.scVodMark = jsonObj.optString("scVodMark").trim(); - rule.scVodMarkR = getPattern(jsonObj, "scVodMarkR"); - return rule; - } catch (Exception e) { - SpiderDebug.log(e); - } - return null; - } - - public String getUa() { - return ua; - } - - public String getHomeUrl() { - return homeUrl; - } - - public String getCateNode() { - return cateNode; - } - - public String getCateName() { - return cateName; - } - - public String getCateNameR(String src) { - return doReplaceRegex(cateNameR, src); - } - - public String getCateId() { - return cateId; - } - - public String getCateIdR(String src) { - return doReplaceRegex(cateIdR, src); - } - - public LinkedHashMap getCateManual() { - return cateManual; - } - - public JSONObject getFilter() { - return filter; - } - - public String getHomeVodNode() { - return homeVodNode; - } - - public String getHomeVodName() { - return homeVodName; - } - - public String getHomeVodNameR(String src) { - return doReplaceRegex(homeVodNameR, src); - } - - public String getHomeVodId() { - return homeVodId; - } - - public String getHomeVodIdR(String src) { - return doReplaceRegex(homeVodIdR, src); - } - - public String getHomeVodImg() { - return homeVodImg; - } - - public String getHomeVodImgR(String src) { - return doReplaceRegex(homeVodImgR, src); - } - - public String getHomeVodMark() { - return homeVodMark; - } - - public String getHomeVodMarkR(String src) { - return doReplaceRegex(homeVodMarkR, src); - } - - public String getCateUrl() { - return cateUrl; - } - - public String getCateVodNode() { - return cateVodNode; - } - - public String getCateVodName() { - return cateVodName; - } - - public String getCateVodNameR(String src) { - return doReplaceRegex(cateVodNameR, src); - } - - public String getCateVodId() { - return cateVodId; - } - - public String getCateVodIdR(String src) { - return doReplaceRegex(cateVodIdR, src); - } - - public String getCateVodImg() { - return cateVodImg; - } - - public String getCateVodImgR(String src) { - return doReplaceRegex(cateVodImgR, src); - } - - public String getCateVodMark() { - return cateVodMark; - } - - public String getCateVodMarkR(String src) { - return doReplaceRegex(cateVodNameR, src); - } - - public String getDetailUrl() { - return dtUrl; - } - - public String getDetailNode() { - return dtNode; - } - - public String getDetailName() { - return dtName; - } - - public String getDetailNameR(String src) { - return doReplaceRegex(dtNameR, src); - } - - public String getDetailImg() { - return dtImg; - } - - public String getDetailImgR(String src) { - return doReplaceRegex(dtImgR, src); - } - - public String getDetailCate() { - return dtCate; - } - - public String getDetailCateR(String src) { - return doReplaceRegex(dtCateR, src); - } - - public String getDetailYear() { - return dtYear; - } - - public String getDetailYearR(String src) { - return doReplaceRegex(dtYearR, src); - } - - public String getDetailArea() { - return dtArea; - } - - public String getDetailAreaR(String src) { - return doReplaceRegex(dtAreaR, src); - } - - public String getDetailMark() { - return dtMark; - } - - public String getDetailMarkR(String src) { - return doReplaceRegex(dtMarkR, src); - } - - public String getDetailActor() { - return dtActor; - } - - public String getDetailActorR(String src) { - return doReplaceRegex(dtActorR, src); - } - - public String getDetailDirector() { - return dtDirector; - } - - public String getDetailDirectorR(String src) { - return doReplaceRegex(dtDirectorR, src); - } - - public String getDetailDesc() { - return dtDesc; - } - - public String getDetailDescR(String src) { - return doReplaceRegex(dtDescR, src); - } - - public String getDetailFromNode() { - return dtFromNode; - } - - public String getDetailFromName() { - return dtFromName; - } - - public String getDetailFromNameR(String src) { - return doReplaceRegex(dtFromNameR, src); - } - - public String getDetailUrlNode() { - return dtUrlNode; - } - - public String getDetailUrlSubNode() { - return dtUrlSubNode; - } - - public String getDetailUrlId() { - return dtUrlId; - } - - public String getDetailUrlIdR(String src) { - return doReplaceRegex(dtUrlIdR, src); - } - - public String getDetailUrlName() { - return dtUrlName; - } - - public String getDetailUrlNameR(String src) { - return doReplaceRegex(dtUrlNameR, src); - } - - public String getPlayUrl() { - return playUrl; - } - - public String getPlayUa() { - return playUa; - } - - public String getSearchUrl() { - return searchUrl; - } - - public String getSearchVodNode() { - return scVodNode; - } - - public String getSearchVodName() { - return scVodName; - } - - public String getSearchVodNameR(String src) { - return doReplaceRegex(scVodNameR, src); - } - - public String getSearchVodId() { - return scVodId; - } - - public String getSearchVodIdR(String src) { - return doReplaceRegex(scVodIdR, src); - } - - public String getSearchVodImg() { - return scVodImg; - } - - public String getSearchVodImgR(String src) { - return doReplaceRegex(scVodImgR, src); - } - - public String getSearchVodMark() { - return scVodMark; - } - - public String getSearchVodMarkR(String src) { - return doReplaceRegex(scVodMarkR, src); - } -} diff --git a/TVBox_Java/xpath/p.json b/TVBox_Java/xpath/p.json deleted file mode 100644 index 68ce241..0000000 --- a/TVBox_Java/xpath/p.json +++ /dev/null @@ -1,1326 +0,0 @@ -{ - "player": { - "dpp": { - "sh": "DP播放", - "pu": "https://pic.zxzjtv.com/dplayer.php?url=", - "sn": 1, - "or": 999 - } - }, - "filter": { - "1": [ - { - "key": "3", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "喜剧", - "v": "喜剧" - }, - { - "n": "爱情", - "v": "爱情" - }, - { - "n": "恐怖", - "v": "恐怖" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "剧情", - "v": "剧情" - }, - { - "n": "战争", - "v": "战争" - }, - { - "n": "警匪", - "v": "警匪" - }, - { - "n": "犯罪", - "v": "犯罪" - }, - { - "n": "动画", - "v": "动画" - }, - { - "n": "奇幻", - "v": "奇幻" - }, - { - "n": "冒险", - "v": "冒险" - }, - { - "n": "恐怖", - "v": "恐怖" - }, - { - "n": "悬疑", - "v": "悬疑" - }, - { - "n": "惊悚", - "v": "惊悚" - }, - { - "n": "青春", - "v": "青春" - }, - { - "n": "情色", - "v": "情色" - } - ] - }, - { - "key": "1", - "name": "地区", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "大陆", - "v": "大陆" - }, - { - "n": "香港", - "v": "香港" - }, - { - "n": "台湾", - "v": "台湾" - }, - { - "n": "欧美", - "v": "欧美" - }, - { - "n": "韩国", - "v": "韩国" - }, - { - "n": "日本", - "v": "日本" - }, - { - "n": "泰国", - "v": "泰国" - }, - { - "n": "印度", - "v": "印度" - }, - { - "n": "俄罗斯", - "v": "俄罗斯" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "4", - "name": "语言", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "英语", - "v": "英语" - }, - { - "n": "韩语", - "v": "韩语" - }, - { - "n": "日语", - "v": "日语" - }, - { - "n": "法语", - "v": "法语" - }, - { - "n": "泰语", - "v": "泰语" - }, - { - "n": "德语", - "v": "德语" - }, - { - "n": "印度语", - "v": "印度语" - }, - { - "n": "国语", - "v": "国语" - }, - { - "n": "粤语", - "v": "粤语" - }, - { - "n": "俄语", - "v": "俄语" - }, - { - "n": "西班牙语", - "v": "西班牙语" - }, - { - "n": "意大利语", - "v": "意大利语" - }, - { - "n": "其它", - "v": "其它" - } - ] - }, - { - "key": "2", - "name": "排序", - "value": [ - { - "n": "时间", - "v": "time" - }, - { - "n": "人气", - "v": "hits" - }, - { - "n": "评分", - "v": "score" - } - ] - } - ], - "2": [ - { - "key": "3", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "剧情", - "v": "剧情" - }, - { - "n": "喜剧", - "v": "喜剧" - }, - { - "n": "爱情", - "v": "爱情" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "悬疑", - "v": "悬疑" - }, - { - "n": "恐怖", - "v": "恐怖" - }, - { - "n": "奇幻", - "v": "奇幻" - }, - { - "n": "惊悚", - "v": "惊悚" - }, - { - "n": "犯罪", - "v": "犯罪" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "音乐", - "v": "音乐" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "4", - "name": "语言", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "英语", - "v": "英语" - }, - { - "n": "法语", - "v": "法语" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "2", - "name": "排序", - "value": [ - { - "n": "时间", - "v": "time" - }, - { - "n": "人气", - "v": "hits" - }, - { - "n": "评分", - "v": "score" - } - ] - } - ], - "3": [ - { - "key": "3", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "剧情", - "v": "剧情" - }, - { - "n": "喜剧", - "v": "喜剧" - }, - { - "n": "爱情", - "v": "爱情" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "悬疑", - "v": "悬疑" - }, - { - "n": "恐怖", - "v": "恐怖" - }, - { - "n": "奇幻", - "v": "奇幻" - }, - { - "n": "惊悚", - "v": "惊悚" - }, - { - "n": "犯罪", - "v": "犯罪" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "音乐", - "v": "音乐" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "2", - "name": "排序", - "value": [ - { - "n": "时间", - "v": "time" - }, - { - "n": "人气", - "v": "hits" - }, - { - "n": "评分", - "v": "score" - } - ] - } - ], - "4": [ - { - "key": "3", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "剧情", - "v": "剧情" - }, - { - "n": "喜剧", - "v": "喜剧" - }, - { - "n": "爱情", - "v": "爱情" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "悬疑", - "v": "悬疑" - }, - { - "n": "恐怖", - "v": "恐怖" - }, - { - "n": "奇幻", - "v": "奇幻" - }, - { - "n": "惊悚", - "v": "惊悚" - }, - { - "n": "犯罪", - "v": "犯罪" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "音乐", - "v": "音乐" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "2", - "name": "排序", - "value": [ - { - "n": "时间", - "v": "time" - }, - { - "n": "人气", - "v": "hits" - }, - { - "n": "评分", - "v": "score" - } - ] - } - ], - "6": [ - { - "key": "3", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "情感", - "v": "情感" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "热血", - "v": "热血" - }, - { - "n": "推理", - "v": "推理" - }, - { - "n": "搞笑", - "v": "搞笑" - }, - { - "n": "冒险", - "v": "冒险" - }, - { - "n": "萝莉", - "v": "萝莉" - }, - { - "n": "校园", - "v": "校园" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "机战", - "v": "机战" - }, - { - "n": "运动", - "v": "运动" - }, - { - "n": "战争", - "v": "战争" - }, - { - "n": "少年", - "v": "少年" - }, - { - "n": "少女", - "v": "少女" - }, - { - "n": "社会", - "v": "社会" - }, - { - "n": "原创", - "v": "原创" - }, - { - "n": "亲子", - "v": "亲子" - }, - { - "n": "益智", - "v": "益智" - }, - { - "n": "励志", - "v": "励志" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "1", - "name": "地区", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "国产", - "v": "国产" - }, - { - "n": "日本", - "v": "日本" - }, - { - "n": "欧美", - "v": "欧美" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "4", - "name": "语言", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "国语", - "v": "国语" - }, - { - "n": "日语", - "v": "日语" - }, - { - "n": "英语", - "v": "英语" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "2", - "name": "排序", - "value": [ - { - "n": "时间", - "v": "time" - }, - { - "n": "人气", - "v": "hits" - }, - { - "n": "评分", - "v": "score" - } - ] - } - ], - "5": [ - { - "key": "3", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "剧情", - "v": "剧情" - }, - { - "n": "喜剧", - "v": "喜剧" - }, - { - "n": "爱情", - "v": "爱情" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "悬疑", - "v": "悬疑" - }, - { - "n": "恐怖", - "v": "恐怖" - }, - { - "n": "奇幻", - "v": "奇幻" - }, - { - "n": "惊悚", - "v": "惊悚" - }, - { - "n": "犯罪", - "v": "犯罪" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "音乐", - "v": "音乐" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "2", - "name": "排序", - "value": [ - { - "n": "时间", - "v": "time" - }, - { - "n": "人气", - "v": "hits" - }, - { - "n": "评分", - "v": "score" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/TVBox_Java/xpath/test.json b/TVBox_Java/xpath/test.json deleted file mode 100644 index a6d46e4..0000000 --- a/TVBox_Java/xpath/test.json +++ /dev/null @@ -1,791 +0,0 @@ -{ - "siteUrl": "https://www.smdyy.cc", - "regexCategory": "/list/(\\d+).html", - "regexVid": "/kan/(\\d+).html", - "regexPlay": "/play/(\\d+)-(\\d+)-(\\d+).html", - "regexPage": "/show/(\\S+).html", - "player": { - "duoduozy": { - "show": "高清线路", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "sohu": { - "show": "优选7", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "qq": { - "show": "优选3", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "bilibili": { - "show": "bilibili", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "youku": { - "show": "优选1", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "qiyi": { - "show": "优选2", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "letv": { - "show": "优选6", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "xigua": { - "show": "西瓜视频", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "mgtv": { - "show": "优选4", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "tkm3u8": { - "show": "备用", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - }, - "pptv": { - "show": "优选5", - "or": 999, - "ps": "0", - "parse": "https://player.6080kan.cc/player/play.php?url=" - } - }, - "filter": { - "1": [ - { - "key": "tid", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "1" - }, - { - "n": "动作片", - "v": "6" - }, - { - "n": "喜剧片", - "v": "7" - }, - { - "n": "爱情片", - "v": "8" - }, - { - "n": "科幻片", - "v": "9" - }, - { - "n": "恐怖片", - "v": "10" - }, - { - "n": "剧情片", - "v": "11" - }, - { - "n": "战争片", - "v": "12" - }, - { - "n": "犯罪片", - "v": "20" - }, - { - "n": "惊悚片", - "v": "21" - }, - { - "n": "冒险片", - "v": "22" - }, - { - "n": "悬疑片", - "v": "23" - }, - { - "n": "武侠片", - "v": "24" - }, - { - "n": "奇幻片", - "v": "25" - }, - { - "n": "纪录片", - "v": "26" - }, - { - "n": "动画片", - "v": "27" - } - ] - }, - { - "key": "1", - "name": "地区", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "大陆", - "v": "大陆" - }, - { - "n": "香港", - "v": "香港" - }, - { - "n": "台湾", - "v": "台湾" - }, - { - "n": "美国", - "v": "美国" - }, - { - "n": "法国", - "v": "法国" - }, - { - "n": "英国", - "v": "英国" - }, - { - "n": "日本", - "v": "日本" - }, - { - "n": "韩国", - "v": "韩国" - }, - { - "n": "德国", - "v": "德国" - }, - { - "n": "泰国", - "v": "泰国" - }, - { - "n": "印度", - "v": "印度" - }, - { - "n": "意大利", - "v": "意大利" - }, - { - "n": "西班牙", - "v": "西班牙" - }, - { - "n": "加拿大", - "v": "加拿大" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "4", - "name": "语言", - "value": [ - { - "n": "全部", - "v": "" - } - ] - } - ], - "2": [ - { - "key": "tid", - "name": "类型", - "value": [ - { - "n": "全部", - "v": "2" - }, - { - "n": "国产剧", - "v": "13" - }, - { - "n": "港台剧", - "v": "14" - }, - { - "n": "日韩剧", - "v": "15" - }, - { - "n": "欧美剧", - "v": "16" - }, - { - "n": "泰国剧", - "v": "28" - } - ] - }, - { - "key": "1", - "name": "地区", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "大陆", - "v": "大陆" - }, - { - "n": "香港", - "v": "香港" - }, - { - "n": "韩国", - "v": "韩国" - }, - { - "n": "美国", - "v": "美国" - }, - { - "n": "日本", - "v": "日本" - }, - { - "n": "法国", - "v": "法国" - }, - { - "n": "英国", - "v": "英国" - }, - { - "n": "德国", - "v": "德国" - }, - { - "n": "台湾", - "v": "台湾" - }, - { - "n": "泰国", - "v": "泰国" - }, - { - "n": "印度", - "v": "印度" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "4", - "name": "语言", - "value": [ - { - "n": "全部", - "v": "" - } - ] - } - ], - "3": [ - { - "key": "3", - "name": "剧情", - "value": [ - { - "n": "全部", - "v": "3" - }, - { - "n": "情感", - "v": "情感" - }, - { - "n": "科幻", - "v": "科幻" - }, - { - "n": "热血", - "v": "热血" - }, - { - "n": "推理", - "v": "推理" - }, - { - "n": "搞笑", - "v": "搞笑" - }, - { - "n": "冒险", - "v": "冒险" - }, - { - "n": "萝莉", - "v": "萝莉" - }, - { - "n": "校园", - "v": "校园" - }, - { - "n": "动作", - "v": "动作" - }, - { - "n": "机战", - "v": "机战" - }, - { - "n": "运动", - "v": "运动" - }, - { - "n": "战争", - "v": "战争" - }, - { - "n": "少年", - "v": "少年" - }, - { - "n": "少女", - "v": "少女" - }, - { - "n": "社会", - "v": "社会" - }, - { - "n": "原创", - "v": "原创" - }, - { - "n": "亲子", - "v": "亲子" - }, - { - "n": "益智", - "v": "益智" - }, - { - "n": "励志", - "v": "励志" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "1", - "name": "地区", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": " 内地", - "v": " 内地" - }, - { - "n": "韩国", - "v": "韩国" - }, - { - "n": "香港", - "v": "香港" - }, - { - "n": "台湾", - "v": "台湾" - }, - { - "n": "日本", - "v": "日本" - }, - { - "n": "美国", - "v": "美国" - }, - { - "n": "泰国", - "v": "泰国" - }, - { - "n": "英国", - "v": "英国" - }, - { - "n": "新加坡", - "v": "新加坡" - }, - { - "n": "其他", - "v": "其他" - } - ] - }, - { - "key": "11", - "name": "年份", - "value": [ - { - "n": "全部", - "v": "" - }, - { - "n": "2022", - "v": "2022" - }, - { - "n": "2021", - "v": "2021" - }, - { - "n": "2020", - "v": "2020" - }, - { - "n": "2019", - "v": "2019" - }, - { - "n": "2018", - "v": "2018" - }, - { - "n": "2017", - "v": "2017" - }, - { - "n": "2016", - "v": "2016" - }, - { - "n": "2015", - "v": "2015" - }, - { - "n": "2014", - "v": "2014" - }, - { - "n": "2013", - "v": "2013" - }, - { - "n": "2012", - "v": "2012" - }, - { - "n": "2011", - "v": "2011" - }, - { - "n": "2010", - "v": "2010" - }, - { - "n": "2009", - "v": "2009" - }, - { - "n": "2008", - "v": "2008" - }, - { - "n": "2007", - "v": "2007" - }, - { - "n": "2006", - "v": "2006" - }, - { - "n": "2005", - "v": "2005" - }, - { - "n": "2004", - "v": "2004" - }, - { - "n": "2003", - "v": "2003" - }, - { - "n": "2002", - "v": "2002" - }, - { - "n": "2001", - "v": "2001" - }, - { - "n": "2000", - "v": "2000" - } - ] - }, - { - "key": "4", - "name": "语言", - "value": [ - { - "n": "全部", - "v": "" - } - ] - } - ] - } -} - - - - diff --git a/TVBox_Java/加进去报错的Java源代码/Alist2.java b/TVBox_Java/加进去报错的Java源代码/Alist2.java deleted file mode 100644 index 03a8d50..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Alist2.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONObject; - -import okhttp3.Call; - -public class Alist extends Spider { - private String ext; - - public String categoryContent(String tid, String pg, boolean filter, HashMap hashMap) { - try { - String url = this.ext + "/api/public/path"; - JSONObject params = new JSONObject(); - params.put("path", tid); - - JSONArray jSONArray2 = new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, params.toString(), new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - try { - JSONObject retval = new JSONObject(response); - JSONArray list = retval.getJSONObject("data").getJSONArray("files"); - for (int i =0; i < list.length(); ++i){ - JSONObject o = list.getJSONObject(i); - String pic = o.getString("thumbnail"); - if(pic.isEmpty()){ - pic = "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png"; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", tid + (tid.charAt(tid.length()-1) == '/' ? "" : "/") + o.getString("name")); - jSONObject2.put("vod_name", o.getString("name")); - jSONObject2.put("vod_pic", pic); - jSONObject2.put("vod_tag",o.getInt("type")==1 ? "folder" : "file" ); - jSONObject2.put("vod_remarks", o.getInt("type")==1 ? "文件夹" : "文件"); - jSONArray2.put(jSONObject2); - - } - }catch (Exception e){ - e.printStackTrace(); - } - } - }); - - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("page", 1); - jSONObject3.put("pagecount", 1); - jSONObject3.put("limit", jSONArray2.length()); - jSONObject3.put("total", jSONArray2.length()); - jSONObject3.put("list", jSONArray2); - return jSONObject3.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public String detailContent(List ids) { - try - { - String filename = ids.get(0); - String url = this.ext + "/api/public/path"; - JSONObject params = new JSONObject(); - params.put("path", filename); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, params.toString(), new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(String response) { - try { - JSONObject retval = new JSONObject(response); - JSONArray files = retval.getJSONObject("data").getJSONArray("files"); - for (int i =0; i < files.length(); ++i){ - JSONObject o = files.getJSONObject(i); - String url = o.getString("url"); - if(url.indexOf("//") ==0){ - url = "http:"+url; - } - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", filename + "/" + o.getString("name")); - jSONObject2.put("vod_name", o.getString("name")); - jSONObject2.put("vod_pic", o.getString("thumbnail")); - jSONObject2.put("vod_tag",o.getInt("type")==1 ? "folder" : "file" ); - jSONObject2.put("vod_play_from", "播放"); - jSONObject2.put("vod_play_url", o.getString("name")+"$"+url); - list.put(jSONObject2); - - } - }catch (Exception e){ - e.printStackTrace(); - } - } - }); - - result.put("list", list); - return result.toString(); - } - catch (Exception e){ - e.printStackTrace(); - } - return ""; - - } - - - String fileTime(long time, String fmt) { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(time); - Date date = calendar.getTime(); - SimpleDateFormat sdf = new SimpleDateFormat(fmt); - return sdf.format(date); - } - - public String homeContent(boolean z) { - try { - JSONArray classes = new JSONArray(); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", "/"); - newCls.put("type_name", "Alist"); - newCls.put("type_flag", "1"); // 1 列表形式的文件夹 2 缩略图 0 或者不存在 表示正常 - classes.put(newCls); - - JSONArray jSONArray3 = new JSONArray(); - - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put("class", classes); - if(z) { - jSONObject4.put("filters", new JSONObject("{}")); - } - return jSONObject4.toString(); - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - - public void init(Context context, String ext){ - Alist.super.init(context); - this.ext = ext; - } - - public String playerContent(String str, String str2, List list) { - try{ - JSONObject result = new JSONObject(); - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", str2); - return result.toString(); - }catch (Exception e){ - e.printStackTrace(); - } - return ""; - } - - public String searchContent(String str, boolean z) { - try { - return ""; - } catch (Exception e) { - e.printStackTrace(); - return ""; - } - } - -} diff --git a/TVBox_Java/加进去报错的Java源代码/Bdys01_SSSVIP.java b/TVBox_Java/加进去报错的Java源代码/Bdys01_SSSVIP.java deleted file mode 100644 index 4dea140..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Bdys01_SSSVIP.java +++ /dev/null @@ -1,604 +0,0 @@ -package com.github.catvod.spider; - -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build; -import android.text.TextUtils; -import android.util.Base64; - -import java.io.InputStream; -import java.io.ByteArrayOutputStream; - - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.gZip; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.TreeMap; - -import javax.crypto.Cipher; -import javax.crypto.spec.SecretKeySpec; - -import okhttp3.Call; -import okhttp3.Response; - - - - -public class Bdys01 extends Spider { - private static final String siteUrl = "https://www.bdys01.com"; - private static final String siteHost = "www.bdys01.com"; - private String cookie=""; - private String referer=""; - private String rspurl=""; - - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - - @Override - public void init(Context context) { - super.init(context); - try { - filterConfig = new JSONObject("{\"0\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}],\"1\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}],\"a\":[{\"key\":\"s\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"all\"},{\"n\":\"动作\",\"v\":\"dongzuo\"},{\"n\":\"爱情\",\"v\":\"aiqing\"},{\"n\":\"喜剧\",\"v\":\"xiju\"},{\"n\":\"科幻\",\"v\":\"kehuan\"},{\"n\":\"恐怖\",\"v\":\"kongbu\"},{\"n\":\"战争\",\"v\":\"zhanzheng\"},{\"n\":\"武侠\",\"v\":\"wuxia\"},{\"n\":\"魔幻\",\"v\":\"mohuan\"},{\"n\":\"剧情\",\"v\":\"juqing\"},{\"n\":\"动画\",\"v\":\"donghua\"},{\"n\":\"惊悚\",\"v\":\"jingsong\"},{\"n\":\"3D\",\"v\":\"3D\"},{\"n\":\"灾难\",\"v\":\"zainan\"},{\"n\":\"悬疑\",\"v\":\"xuanyi\"},{\"n\":\"警匪\",\"v\":\"jingfei\"},{\"n\":\"文艺\",\"v\":\"wenyi\"},{\"n\":\"青春\",\"v\":\"qingchun\"},{\"n\":\"冒险\",\"v\":\"maoxian\"},{\"n\":\"犯罪\",\"v\":\"fanzui\"},{\"n\":\"纪录\",\"v\":\"jilu\"},{\"n\":\"古装\",\"v\":\"guzhuang\"},{\"n\":\"奇幻\",\"v\":\"qihuan\"},{\"n\":\"国语\",\"v\":\"guoyu\"},{\"n\":\"综艺\",\"v\":\"zongyi\"},{\"n\":\"历史\",\"v\":\"lishi\"},{\"n\":\"运动\",\"v\":\"yundong\"},{\"n\":\"原创压制\",\"v\":\"yuanchuang\"},{\"n\":\"美剧\",\"v\":\"meiju\"},{\"n\":\"韩剧\",\"v\":\"hanju\"},{\"n\":\"国产电视剧\",\"v\":\"guoju\"},{\"n\":\"日剧\",\"v\":\"riju\"},{\"n\":\"英剧\",\"v\":\"yingju\"},{\"n\":\"德剧\",\"v\":\"deju\"},{\"n\":\"俄剧\",\"v\":\"eju\"},{\"n\":\"巴剧\",\"v\":\"baju\"},{\"n\":\"加剧\",\"v\":\"jiaju\"},{\"n\":\"西剧\",\"v\":\"anish\"},{\"n\":\"意大利剧\",\"v\":\"yidaliju\"},{\"n\":\"泰剧\",\"v\":\"taiju\"},{\"n\":\"港台剧\",\"v\":\"gangtaiju\"},{\"n\":\"法剧\",\"v\":\"faju\"},{\"n\":\"澳剧\",\"v\":\"aoju\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"不限\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"澳大利亚\",\"v\":\"澳大利亚\"},{\"n\":\"比利时\",\"v\":\"比利时\"},{\"n\":\"瑞典\",\"v\":\"瑞典\"},{\"n\":\"荷兰\",\"v\":\"荷兰\"},{\"n\":\"丹麦\",\"v\":\"丹麦\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"order\",\"name\":\"排序\",\"value\":[{\"n\":\"更新时间\",\"v\":\"0\"},{\"n\":\"豆瓣评分\",\"v\":\"1\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url,String ref) { - HashMap headers = new HashMap<>(); - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - if(!ref.equals("google")){ - headers.put("Authority", "www.bdys01.com"); - if(ref.length()>0){ - if(ref.equals("origin")){ - headers.put("Origin", "https://www.bdys01.com"); - } else { - headers.put("Referer", ref); - } - } - if(cookie.length()>0){ - headers.put("Cookie", cookie); - } - } - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - protected HashMap getHeaders2(String url) { - HashMap headers = new HashMap<>(); - String ss = url.replace("https://","").split("/")[0]; - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Authority", ss); - headers.put("Origin", "www.bdys01.com"); - headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - return headers; - } - - - protected void getCookie(){ - cookie=""; - String cookieurl="https://www.bdys01.com/zzzzz"; - Map> cookies = new HashMap<>(); - OkHttpUtil.string(cookieurl,getHeaders(cookieurl,""),cookies); - for( Map.Entry> entry : cookies.entrySet() ){ - if(entry.getKey().equals("set-cookie")){ - cookie = "Messi YYDS Forever 8K ;" + TextUtils.join(";",entry.getValue()); - break; - } - } - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - getCookie(); - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl,referer))); - referer=siteUrl+"/"; - // 分类节点 - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - String catestr ="{\"全部\": \"a\",\"电影\": \"0\",\"电视剧\": \"1\"}"; - JSONObject catedef = new JSONObject(catestr); - Iterator it = catedef.keys(); - while(it.hasNext()){ - JSONObject jsonObject = new JSONObject(); - String key =(String) it.next(); - jsonObject.put("type_name", key); - jsonObject.put("type_id", catedef.getString(key)); - classes.put(jsonObject); - } - result.put("class", classes); - if (filter) { - result.put("filters", filterConfig); - } - try { - // 取首页推荐视频列表 - Element homeList = doc.select("div.row.row-cards").get(0); - Elements list = homeList.select("div.col-4.rows-md-7"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("h3.card-title").text(); - String cover = vod.selectFirst("img.w-100" ).attr("data-src"); - String remark = vod.selectFirst("p.text-muted").text(); - String id =vod.selectFirst("a.d-block.cover").attr("href"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/s/" ; - if (extend != null && extend.size() > 0 ) { - String urlformat= ""; - if(tid.equals("a")){ - urlformat= url +"{s}/"+ pg +"?&area={area}&year={year}&order={order}"; - }else { - urlformat= url +"{s}/"+ pg +"?&type="+tid+"&area={area}&year={year}&order={order}"; - } - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - urlformat=urlformat.replace("{"+key+"}",URLEncoder.encode(value)); - } - } - for (int i=0 ;i<4;i++) { - if (urlformat.contains("{s}")) { - urlformat = urlformat.replace("{s}", "all"); - } else if (urlformat.contains("{area}")) { - urlformat = urlformat.replace("&area={area}", ""); - } else if (urlformat.contains("{year}")) { - urlformat = urlformat.replace("&year={year}", ""); - } else if (urlformat.contains("{order}")) { - urlformat = urlformat.replace("{order}", "0"); - } - } - url = urlformat; - } else { - if(tid.equals("a")){ - url += "all/" + pg + "?&order=0"; - }else { - url += "all/" + pg + "?&type=" + tid + "&order=0"; - } - } - referer=siteUrl+"/"; - String html = OkHttpUtil.string(url, getHeaders(url,referer)); - referer = url; - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - // 取当前分类页的视频列表 - Elements list = doc.select("div.col-lg-8"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst("h3.mb-0").text(); - String cover = vod.selectFirst("img.w-100").attr("src"); - String remark = vod.selectFirst("p.mb-0").text(); - String idtt = vod.selectFirst("a.d-block").attr("href"); - String id =""; - if(idtt.contains("JSESSIONID")) { - int end = idtt.indexOf(";"); - id = idtt.substring(0,end); - }else{ - id =idtt; - } - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - int page =Integer.parseInt(pg); - result.put("page", page); - result.put("pagecount", videos.length()== 24 ? page + 1 : page); - result.put("limit", 24); - result.put("total",Integer.MAX_VALUE ); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - String url = siteUrl + ids.get(0); - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url,referer))); - referer=url; - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - String cover = doc.selectFirst("div.col-md-auto img").attr("src"); - String title = doc.selectFirst("h1.d-none.d-md-block").text(); - String desc = doc.select("div.card.collapse > div.card-body").text(); - String year = doc.select("span.badge.bg-purple-lt").text().replace("更新时间:","").split("-")[0]; - String category = "", area = "", remark = "", director = "", actor = ""; - Element details = doc.select("div.col.mb-2").get(0); - Elements allp = details.select("p"); - for (int i = 0; i < allp.size(); i++) { - Element text = allp.get(i); - String info = text.selectFirst("strong").text(); - if (info.equals("类型:")) { - List categorys = new ArrayList<>(); - Elements aa = text.select("a"); - for (int j = 0; j < aa.size(); j++) { - categorys.add(aa.get(j).text()); - } - category ="类型:"+TextUtils.join(",", categorys); - } else if (info.contains("地区")) { - int start= text.text().indexOf("[")+1; - int end = text.text().indexOf("]"); - area = text.text().substring(start,end); - } else if (info.contains("豆瓣")) { - remark = "豆瓣:"+text.text(); - } else if (info.contains("导演:")) { - director = text.selectFirst("a").text(); - } else if (info.contains("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor =TextUtils.join(",", actors); - } - } - String vid = ids.get(0); - vodList.put("vod_id", vid); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - Map vod_play = new TreeMap<>(); - // 取播放列表数据 - Elements playListA = doc.select("a.btn.btn-square"); - String sourceName = "播放列表"; - String playList = ""; - List vodItems = new ArrayList<>(); - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - String idtt = vod.attr("href"); - String playURL =""; - if(idtt.contains("JSESSIONID")) { - int end = idtt.indexOf(";"); - playURL = idtt.substring(0,end); - }else{ - playURL =idtt; - } - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - vod_play.put(sourceName, playList); - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @TargetApi(Build.VERSION_CODES.KITKAT) - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - String url = siteUrl + id ; - String htmlplay = OkHttpUtil.string(url, getHeaders(url,referer)); - Document doc = Jsoup.parse(htmlplay); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - String pid=""; - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).toString(); - if (scContent.contains("var pid =")) { - int start = scContent.indexOf("var pid ="); - int end = scContent.lastIndexOf("var time") + 1; - String pidtmp = scContent.substring(start, end); - start = pidtmp.indexOf("=")+2; - end = pidtmp.lastIndexOf(";") ; - pid = pidtmp.substring(start, end); - break; - } - } - long t = System.currentTimeMillis(); - String key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16); - String sg = encrypt(pid+"-"+t,key); - String geturl = siteUrl+"/lines?t="+t+"&sg="+sg+"&pid="+pid; - String urlsrc = OkHttpUtil.string(geturl, getHeaders(geturl,"")); - JSONObject urlsrcobj = new JSONObject(urlsrc); - JSONObject urldb = urlsrcobj.getJSONObject("data"); - List urldblist = new ArrayList<>(); - if(!urldb.isNull("url3")){ - String url3 = urldb.optString("url3"); - urldblist.add(url3); - } - if(!urldb.isNull("m3u8")){ - String m3u8 = urldb.optString("m3u8").replace("www.bde4.cc","www.bdys01.com"); - urldblist.add(m3u8); - } - if(!urldb.isNull("m3u8_2")){ - String m3u8_2 =urldb.optString("m3u8_2"); - String[] m2=m3u8_2.split(","); - for(int i=0; i< m2.length ;i++){ - urldblist.add(m2[i].replace("www.bde4.cc","www.bdys01.com")); - } - } - if(urldblist.isEmpty()){ - rspurl=""; - t = System.currentTimeMillis(); - key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16); - sg = encrypt(pid+"-"+t,key); - geturl = siteUrl+"/god/"+pid; - HashMap hashMap = new HashMap(); - hashMap.put("t", Long.toString(t)); - hashMap.put("sg", sg); - hashMap.put("verifyCode", "666"); - OkHttpUtil.post(OkHttpUtil.defaultClient(), geturl, hashMap,getHeaders(geturl,"origin") ,new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject rspobj = new JSONObject(str); - if(rspobj.isNull("url")){ - rspurl=""; - }else { - rspurl = rspobj.getString("url"); - } - - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - if(rspurl.isEmpty()){ - t = System.currentTimeMillis(); - key = Misc.MD5(pid+"-"+t, StandardCharsets.UTF_8).substring(0,16); - sg = encrypt(pid+"-"+t,key); - geturl = siteUrl+"/god/"+pid+"?type=1"; - HashMap hashMap2 = new HashMap(); - hashMap2.put("t", Long.toString(t)); - hashMap2.put("sg", sg); - hashMap2.put("verifyCode", "888"); - OkHttpUtil.post(OkHttpUtil.defaultClient(), geturl, hashMap2,getHeaders(geturl,"origin") ,new OKCallBack.OKCallBackString() { - @Override - protected void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - rspurl = new JSONObject(str).getString("url"); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }); - } - String realurl =""; - if(rspurl.contains("rkey")){ - t = System.currentTimeMillis(); - realurl =rspurl.replace("?rkey",t+".mp4?ver=6010&rkey"); - }else if (rspurl.contains("ixigua")) { - realurl = rspurl; - }else{ - t = System.currentTimeMillis(); - realurl = rspurl.replace("http:","https:") +"/"+t+".mp4"; - } - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", realurl); - result.put("header", ""); - return result.toString(); - } - int index =new Random().nextInt(urldblist.size()); - String videourl = urldblist.get(index); - if(videourl.contains("mp4")){ - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videourl); - result.put("header", ""); - return result.toString(); - } - Map> respHeaders = new HashMap<>(); - OkHttpUtil.stringNoRedirect(videourl, getHeaders(videourl,""), respHeaders); - String redirect = OkHttpUtil.getRedirectLocation(respHeaders); - String realm3u8=""; - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - } - @Override - protected void onResponse(Response response) { - } - }; - OkHttpUtil.get(OkHttpUtil.defaultClient(), redirect, null, getHeaders2(redirect), callBack); - if (callBack.getResult().code() == 200) { - InputStream picsrc = callBack.getResult().body().byteStream(); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - int nRead; - byte[] data = new byte[4]; - while ((nRead = picsrc.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); - } - buffer.flush(); - byte[] targetArray = buffer.toByteArray(); - picsrc.close(); - byte[] dep = Arrays.copyOfRange(targetArray,3354,targetArray.length); - String pp = gZip.KS(dep); - String[] m3u8ori = pp.split("\n"); - for(int i=0;i0){ - for (int i = 0; i < 1; i++) { - Element sourcess = sourceList.get(i); - String sourceName = sourcess.select("h3.LC20lb.MBeuO.DKV0Md").text(); - String list1 = sourcess.attr("href"); - if(list1.contains("/s/")||list1.contains("play")||list1.contains("performer")||list1.contains("search")||list1.contains("jsessionid")){ - continue; - } - if (sourceName.contains(key)) { - Document ddrklink = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(list1,referer))); - JSONObject v = new JSONObject(); - String cover = ddrklink.selectFirst("div.col-md-auto img").attr("src"); - String title = ddrklink.selectFirst("h2.d-sm-block.d-md-none").text(); - String id =list1.replace("https://www.bdys01.com",""); - v.put("vod_name", title); - v.put("vod_remarks", ""); - v.put("vod_id", id); - v.put("vod_pic", cover); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String encrypt(String src, String KEY) { - try { - Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); - SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES"); - cipher.init(Cipher.ENCRYPT_MODE, keySpec); - return bytesToHexStr(cipher.doFinal(src.getBytes())).toUpperCase(); - } catch (Exception exception) { - SpiderDebug.log(exception); - } - return null; - } - - protected String bytesToHexStr(byte[] bytes) { - StringBuilder hexStr = new StringBuilder(); - for (byte b : bytes) { - String hex = Integer.toHexString(b & 0xFF); - if (hex.length() == 1) { - hex = '0' + hex; - } - hexStr.append(hex); - } - return hexStr.toString(); - } - -} diff --git a/TVBox_Java/加进去报错的Java源代码/Bttwoo.java b/TVBox_Java/加进去报错的Java源代码/Bttwoo.java deleted file mode 100644 index 638c380..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Bttwoo.java +++ /dev/null @@ -1,386 +0,0 @@ -package com.github.catvod.spider; - -import android.text.TextUtils; -import android.util.Base64; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.CBC; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -/* loaded from: classes.dElements */ -public class Bttwoo extends Spider { - private final String O = "{}"; - private final Pattern G = Pattern.compile("https://www.bttwoo.com/(\\S+)"); - private final Pattern n = Pattern.compile("https://www.bttwoo.com/movie/(\\d+).html"); - private final Pattern Ur = Pattern.compile("https://www.bttwoo.com/v_play/(\\S+).html"); - private final Pattern eA = Pattern.compile("https://www.bttwoo.com/\\S+/page/(\\d+)"); - private final Pattern o = Pattern.compile("=\"(.*?)\";var"); - private final Pattern F = Pattern.compile("parse\\(\"(.*?)\"\\);var iv"); - private final Pattern Cp = Pattern.compile("iv=md5\\.enc\\.Utf8\\.parse\\((.*?)\\);var decrypted"); - private final Pattern JC = Pattern.compile("url: \"(.*?)\""); - - protected HashMap header(String str) { - HashMap hashMap = new HashMap<>(); - hashMap.put("method", "GET"); - if (!TextUtils.isEmpty(str)) { - hashMap.put("Referer", str); - } - hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - return hashMap; - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - int i; - try { - String str3 = "https://www.bttwoo.com/" + str + "/page/" + str2; - String h = OkHttpUtil.string(str3, header(str3)); - Document ue = Jsoup.parse(h); - JSONObject jSONObject = new JSONObject(); - Matcher matcher = this.eA.matcher(ue.select("div.pagenavi_txt > a.extend").attr("href")); - int i2 = 1; - int parseInt = matcher.find() ? Integer.parseInt(matcher.group(1).trim()) : 1; - - Elements B1 = ue.select("div.pagenavi_txt > a "); - int i3 = 0; - if (B1.size() > 0) { - i = Integer.parseInt(str2); - for (int i4 = 0; i4 < B1.size(); i4++) { - Element O = B1.get(i4).selectFirst("a"); - if (O != null) { - O.text().trim(); - if (O.hasClass("current")) { - Matcher matcher2 = this.eA.matcher(O.attr("href")); - if (matcher2.find()) { - i = Integer.parseInt(matcher2.group(1).trim()); - } - } - } - } - } else { - i = 1; -// i = Integer.parseInt(str2); - } - JSONArray jSONArray = new JSONArray(); - if (!h.contains("没有找到您想要的结果哦")) { - Elements B12 = ue.select("div.bt_img > ul > li"); - while (i3 < B12.size()) { - Element hq = B12.get(i3); - String pE = hq.selectFirst("h3.dytit > a").text(); - String Pd = hq.selectFirst("a > img ").attr("data-original"); - Element O2 = hq.selectFirst("div.jidi > span"); - String pE2 = O2 != null ? O2.text() : ""; - Matcher matcher3 = this.n.matcher(hq.selectFirst("h3.dytit > a").attr("href")); - if (matcher3.find()) { - String group = matcher3.group(i2); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", group); - jSONObject2.put("vod_name", pE); - jSONObject2.put("vod_pic", Pd); - jSONObject2.put("vod_remarks", pE2); - jSONArray.put(jSONObject2); - } - i3++; - i2 = 1; - } - } - System.out.println("page: "+i); - jSONObject.put("page", i); - jSONObject.put("pagecount", parseInt); - jSONObject.put("limit", 25); - jSONObject.put("total", parseInt <= 1 ? jSONArray.length() : parseInt * 25); - jSONObject.put("list", jSONArray); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String detailContent(List list) { - String str =""; - Exception e; - Document ue = null; - JSONObject jSONObject = null; - String Pd = ""; - String pE = ""; - String pE2 =""; - Elements B1 = null; - String str2 =" "; - String str3 = ""; - String str4 = ""; - String str5 = ""; - String str6 = ""; - String str7 = ""; - int i = 0; - Element hq = null; - String str8; - String str9 = "$$$"; - String str10 = ""; - try { - String str11 = "https://www.bttwoo.com/movie/" + list.get(0) + ".html"; - ue = Jsoup.parse(OkHttpUtil.string(str11, header(str11))); - jSONObject = new JSONObject(); - Pd = ue.selectFirst("div.dyimg > img").attr("src"); - pE = ue.selectFirst("div.moviedteail_tt > h1").text(); - pE2 = Jsoup.parse(ue.selectFirst("meta[name=description]").attr("content")).text(); - B1 = ue.select("ul.moviedteail_list > li"); - str2 = str10; - str3 = str2; - str4 = str3; - str5 = str4; - str6 = str5; - str7 = str6; -// i = 0; - } catch (Exception e2) { - e = e2; - str = str10; - return "1111"; - } - while (true) { - str = str10; - if (i >= B1.size()) { - break; - } - try { - Element hq2 = B1.get(i); - Elements exVar = B1; - String pE3 = hq2.text(); - JSONObject jSONObject3 = jSONObject; - if (pE3.contains("类型:")) { - str2 = hq2.text(); - } else if (pE3.contains("年份:")) { - str3 = hq2.text(); - } else if (pE3.contains("地区:")) { - str4 = hq2.text(); - } else if (pE3.contains("上映:")) { - str5 = hq2.text(); - } else { - str8 = str9; - if (pE3.contains("导演:")) { - ArrayList arrayList = new ArrayList(); - Elements B12 = hq2.select("a"); - for (int i2 = 0; i2 < B12.size(); i2++) { - arrayList.add(B12.get(i2).text()); - } - str7 = TextUtils.join(",", arrayList); - } else if (pE3.contains("主演:")) { - ArrayList arrayList2 = new ArrayList(); - Elements B13 = hq2.select("a"); - for (int i3 = 0; i3 < B13.size(); i3++) { - arrayList2.add(B13.get(i3).text()); - } - str6 = TextUtils.join(",", arrayList2); - } - } - str8 = str9; - i++; - str10 = str; - B1 = exVar; - jSONObject = jSONObject3; - str9 = str8; - } catch (Exception e3) { - e = e3; - SpiderDebug.log(e); - return str; - } - } - String str12 = str9; - JSONObject jSONObject4 = jSONObject; - JSONObject jSONObject2 = new JSONObject(); - try{ - jSONObject2.put("vod_id", list.get(0)); - jSONObject2.put("vod_name", pE); - jSONObject2.put("vod_pic", Pd); - jSONObject2.put("type_name", str2); - jSONObject2.put("vod_year", str3); - jSONObject2.put("vod_area", str4); - jSONObject2.put("vod_remarks", str5); - jSONObject2.put("vod_actor", str6); - jSONObject2.put("vod_director", str7); - jSONObject2.put("vod_content", pE2); - TreeMap treeMap = new TreeMap(); - Elements B14 = ue.select("div.mi_paly_box > div > div.ypxingq_t"); - Elements B15 = ue.select("div.paly_list_btn"); - - for (int i4 = 0; i4 < B14.size(); i4++) { - String pE4 = B14.get(i4).text(); - Elements B16 = B15.get(i4).select("a"); - ArrayList arrayList3 = new ArrayList(); - for (int i5 = 0; i5 < B16.size(); i5++) { - String name = B16.get(i5).text(); - Matcher matcher = this.Ur.matcher(B16.get(i5).attr("href")); - if (matcher.find()) { - arrayList3.add(name + "$" + matcher.group(1)); - } - } - String join = arrayList3.size() > 0 ? TextUtils.join("#", arrayList3) : str; - if (join.length() != 0) { - treeMap.put(pE4, join); - } - } - if (treeMap.size() > 0) { - String join2 = TextUtils.join(str12, treeMap.keySet()); - String join3 = TextUtils.join(str12, treeMap.values()); - jSONObject2.put("vod_play_from", join2); - jSONObject2.put("vod_play_url", join3); - } - JSONArray jSONArray = new JSONArray(); - jSONArray.put(jSONObject2); - jSONObject4.put("list", jSONArray); - - }catch (Exception e4){ - SpiderDebug.log(e4); - } - - return jSONObject4.toString(); - } - - public String homeContent(boolean z) { - int i; - try { - Document ue = Jsoup.parse(OkHttpUtil.string("https://www.bttwoo.com/", header("https://www.bttwoo.com"))); - Elements B1 = ue.select("ul.navlist > li > a"); - JSONArray jSONArray = new JSONArray(); - Iterator it = B1.iterator(); - while (true) { - i = 0; - if (!it.hasNext()) { - break; - } - Element next = it.next(); - String pE = next.text(); - if (pE.equals("最新电影")) { - pE = "最新"; - } - if (pE.equals("热门下载")) { - pE = "热门放映"; - } - if (pE.equals("最新") || pE.equals("本月热门") || pE.equals("热门放映") || pE.equals("国产剧") || pE.equals("日韩剧") || pE.equals("美剧")) { - i = 1; - } - if (i != 0) { - Matcher matcher = this.G.matcher(next.attr("href")); - if (matcher.find()) { - String trim = matcher.group(1).trim(); - JSONObject jSONObject = new JSONObject(); - jSONObject.put("type_id", trim); - jSONObject.put("type_name", pE); - jSONArray.put(jSONObject); - } - } - } - JSONObject jSONObject2 = new JSONObject(); - if (z) { - jSONObject2.put("filters", new JSONObject("{}")); - } - jSONObject2.put("class", jSONArray); - try { - Elements B12 = ue.select("div.leibox > ul > li "); - JSONArray jSONArray2 = new JSONArray(); - while (i < B12.size()) { - Element hq = B12.get(i); - String pE2 = hq.selectFirst("h3.dytit > a").text(); - String Pd = hq.selectFirst("a > img").attr("data-original"); - Element O = hq.selectFirst("div.jidi > span "); - String pE3 = O != null ? O.text() : ""; - Matcher matcher2 = this.n.matcher(hq.selectFirst("h3.dytit > a").attr("href")); - if (matcher2.find()) { - String group = matcher2.group(1); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put("vod_id", group); - jSONObject3.put("vod_name", pE2); - jSONObject3.put("vod_pic", Pd); - jSONObject3.put("vod_remarks", pE3); - jSONArray2.put(jSONObject3); - } - i++; - } - jSONObject2.put("list", jSONArray2); - } catch (Exception e) { - SpiderDebug.log(e); - } - return jSONObject2.toString(); - } catch (Exception e2) { - SpiderDebug.log(e2); - return ""; - } - } - - public String playerContent(String str, String str2, List list) { - try { - String str3 = "https://www.bttwoo.com/v_play/" + str2 + ".html"; - Document ue = Jsoup.parse(OkHttpUtil.string(str3, header(str3))); - JSONObject jSONObject = new JSONObject(); - Matcher matcher = this.o.matcher(ue.toString()); - Matcher matcher2 = this.F.matcher(ue.toString()); - Matcher matcher3 = this.Cp.matcher(ue.toString()); - if (matcher.find() && matcher2.find() && matcher3.find()) { - // Matcher matcher4 = this.JC.matcher(AES.decryptToString(Base64.decode(matcher.group(1), 0), matcher2.group(1).getBytes(), matcher3.group(1).getBytes(),AES.AES_CBC_PKCS7Padding)); - Matcher matcher4 = this.JC.matcher(CBC.DECRYPT(Base64.decode(matcher.group(1), 0), matcher2.group(1).getBytes(), matcher3.group(1).getBytes())); - if (matcher4.find()) { - String group = matcher4.group(1); - HashMap hashMap = new HashMap(); - hashMap.put("User-Agent", " Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"); - jSONObject.put("url", group); - jSONObject.put("header", new JSONObject(hashMap).toString()); - jSONObject.put("parse", "0"); - jSONObject.put("palyUrl", ""); - } - } - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - public String searchContent(String str, boolean z) { - if (z) { - return ""; - } - try { - String str2 = "https://www.bttwoo.com/xssearch?q=" + URLEncoder.encode(str) + "&f=_all&p=1"; - Document ue = Jsoup.parse(OkHttpUtil.string(str2, header(str2))); - JSONObject jSONObject = new JSONObject(); - JSONArray jSONArray = new JSONArray(); - Elements B1 = ue.select("div.mi_ne_kd > ul > li"); - for (int i = 0; i < B1.size(); i++) { - Element hq = B1.get(i); - String trim = hq.selectFirst("img").attr("alt").trim(); - String Pd = hq.selectFirst("img ").attr("data-original"); - Element O = hq.selectFirst("div.jidi > span"); - String pE = O != null ? O.text() : ""; - Matcher matcher = this.n.matcher(hq.selectFirst("a").attr("href")); - if (matcher.find()) { - String group = matcher.group(1); - JSONObject jSONObject2 = new JSONObject(); - jSONObject2.put("vod_id", group); - jSONObject2.put("vod_name", trim); - jSONObject2.put("vod_pic", Pd); - jSONObject2.put("vod_remarks", pE); - jSONArray.put(jSONObject2); - } - } - jSONObject.put("list", jSONArray); - return jSONObject.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } -} diff --git a/TVBox_Java/加进去报错的Java源代码/Dy1010.java b/TVBox_Java/加进去报错的Java源代码/Dy1010.java deleted file mode 100644 index dd034c4..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Dy1010.java +++ /dev/null @@ -1,479 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.AES; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static com.github.catvod.utils.AES.AES_CBC_PKCS7Padding; -import static com.github.catvod.utils.AES.decryptToString; - -/** - * 双十电影 - *

- * Author: 忍一忍我很大 - */ -public class Dy1010 extends Spider { - private static final String siteUrl = "http://www.1010dy1.com"; - private static final String siteHost = "www.1010dy1.com"; - /** - * 播放源配置 - */ - private JSONObject playerConfig; - /** - * 筛选配置 - */ - private JSONObject filterConfig; - - private Pattern regexCategory = Pattern.compile("/type/(\\w+)/"); - private Pattern regexVid = Pattern.compile("/detail/(\\w+)/"); - private Pattern regexPlay = Pattern.compile("/play/(\\w+)-(\\d+)-(\\d+)/"); - private Pattern regexPage = Pattern.compile("/show/\\d+/page/(\\d+)/"); - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject("{\"xg_app_player\":{\"show\":\"app全局解析\",\"or\":999,\"ps\":\"1\",\"parse\":\"\"},\"duoduozy\":{\"show\":\"多多云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"renrenmi\":{\"show\":\"快速云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"xigua\":{\"show\":\"西瓜云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"mgtv\":{\"show\":\"芒果云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"qq\":{\"show\":\"腾讯云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"youku\":{\"show\":\"优酷云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"qiyi\":{\"show\":\"爱奇艺\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"pptv\":{\"show\":\"PPTV\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"letv\":{\"show\":\"乐视云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"sohu\":{\"show\":\"搜狐云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"bilibili\":{\"show\":\"哔哩云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"dbm3u8\":{\"show\":\"百度云\",\"des\":\"在线播放\",\"ps\":\"0\",\"parse\":\"\"},\"tkm3u8\":{\"show\":\"天空云\",\"des\":\"天空播放器\",\"ps\":\"0\",\"parse\":\"\"},\"dplayer\":{\"show\":\"DPlayer-H5播放器\",\"des\":\"dplayer.js.org\",\"ps\":\"0\",\"parse\":\"\"},\"videojs\":{\"show\":\"videojs-H5播放器\",\"des\":\"videojs.com\",\"ps\":\"0\",\"parse\":\"\"},\"iva\":{\"show\":\"iva-H5播放器\",\"des\":\"videojj.com\",\"ps\":\"0\",\"parse\":\"\"},\"iframe\":{\"show\":\"iframe外链数据\",\"des\":\"iframe外链数据\",\"ps\":\"0\",\"parse\":\"\"},\"link\":{\"show\":\"外链数据\",\"des\":\"外部网站播放链接\",\"ps\":\"0\",\"parse\":\"\"},\"swf\":{\"show\":\"Flash文件\",\"des\":\"swf\",\"ps\":\"0\",\"parse\":\"\"},\"flv\":{\"show\":\"Flv文件\",\"des\":\"flv\",\"ps\":\"0\",\"parse\":\"\"},\"bdxm3u8\":{\"show\":\"北斗云\",\"des\":\"在线播放\",\"ps\":\"0\",\"parse\":\"\"},\"lym3u8\":{\"show\":\"老鸭资源\",\"des\":\"在线播放\",\"ps\":\"0\",\"parse\":\"\"},\"aliplayer\":{\"show\":\"阿里云播放器\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"hnm3u8\":{\"show\":\"红牛云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"kbm3u8\":{\"show\":\"快播云\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"},\"wjm3u8\":{\"show\":\"无尽备用\",\"or\":999,\"ps\":\"0\",\"parse\":\"\"}}"); - filterConfig = new JSONObject("{\"1\":[{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"灾难\",\"v\":\"灾难\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"冒险\",\"v\":\"冒险\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2000\",\"v\":\"2000\"},{\"n\":\"1997\",\"v\":\"1997\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"class\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"海外\",\"v\":\"海外\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"网剧\",\"v\":\"网剧\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"1997\",\"v\":\"1997\"},{\"n\":\"1980\",\"v\":\"1980\"}]},{\"key\":\"by\",\"name\":\"排序\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}"); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param url - * @return - */ - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("Referer", "http://www.1010dy1.com/"); - headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.169.400 QQBrowser/11.0.5130.400"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl))); - // 分类节点 - Elements elements = doc.select("ul.stui-header__menu > li > a"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - Matcher mather = regexCategory.matcher(ele.attr("href")); - if (!mather.find()) - continue; - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("div.stui-pannel_bd:nth-child(1) ul.stui-vodlist li div.stui-vodlist__box"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String title = vod.selectFirst(".stui-vodlist__thumb").attr("title"); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - String url = siteUrl + "/show/"; - if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) { - url += extend.get("tid"); - } else { - url += tid; - } - if (extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - url += "/" + key + "/" + URLEncoder.encode(value); - } - } - } - url += "/page/" + pg + "/"; - // 获取分类数据的url - //String url = siteUrl + "/show/" + tid + "/page/" + pg + "/"; - String html = OkHttpUtil.string(url, getHeaders(url)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 0; - int page = -1; - // 取页码相关信息 - Elements pageInfo = doc.select(".stui-page li"); - if (pageInfo.size() == 0) { - page = Integer.parseInt(pg); - pageCount = page; - } else { - for (int i = 0; i < pageInfo.size(); i++) { - Element li = pageInfo.get(i); - Element a = li.selectFirst("a"); - if (a == null) - continue; - String name = a.text(); - if (page == -1 && li.hasClass("active")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - page = Integer.parseInt(matcher.group(1)); - } else { - page = 0; - } - } - if (name.equals("尾页")) { - Matcher matcher = regexPage.matcher(a.attr("href")); - if (matcher.find()) { - pageCount = Integer.parseInt(matcher.group(1)); - } else { - pageCount = 0; - } - break; - } - } - } - - JSONArray videos = new JSONArray(); - if (!html.contains("没有找到您想要的结果哦")) { - Elements list = doc.select("ul.stui-vodlist li div.stui-vodlist__box"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.selectFirst(".title").text(); - String cover = vod.selectFirst(".stui-vodlist__thumb").attr("data-original"); - String remark = vod.selectFirst("span.pic-text").text(); - Matcher matcher = regexVid.matcher(vod.selectFirst(".stui-vodlist__thumb").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 30); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 30); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/detail/" + ids.get(0) + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("a.stui-vodlist__thumb img").attr("data-original"); - String title = doc.selectFirst("a.stui-vodlist__thumb").attr("title"); - String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text(); - String category = "", area = "", year = "", remark = "", director = "", actor = ""; - Elements span_text_muted = doc.select("div.stui-content__detail span.text-muted"); - for (int i = 0; i < span_text_muted.size(); i++) { - Element text = span_text_muted.get(i); - String info = text.text(); - if (info.equals("类型:")) { - category = text.nextElementSibling().text(); - } else if (info.equals("年份:")) { - year = text.nextElementSibling().text(); - } else if (info.equals("地区:")) { - area = text.nextElementSibling().text(); - } else if (info.equals("更新:")) { - remark = text.nextSibling().outerHtml().trim(); - } else if (info.equals("导演:")) { - List directors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - directors.add(aa.get(j).text()); - } - director = TextUtils.join(",", directors); - } else if (info.equals("主演:")) { - List actors = new ArrayList<>(); - Elements aa = text.parent().select("a"); - for (int j = 0; j < aa.size(); j++) { - actors.add(aa.get(j).text()); - } - actor = TextUtils.join(",", actors); - } - } - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("type_name", category); - vodList.put("vod_year", year); - vodList.put("vod_area", area); - vodList.put("vod_remarks", remark); - vodList.put("vod_actor", actor); - vodList.put("vod_director", director); - vodList.put("vod_content", desc); - - Map vod_play = new TreeMap<>(new Comparator() { - @Override - public int compare(String o1, String o2) { - try { - int sort1 = playerConfig.getJSONObject(o1).getInt("or"); - int sort2 = playerConfig.getJSONObject(o2).getInt("or"); - - if (sort1 == sort2) { - return 1; - } - return sort1 - sort2 > 0 ? 1 : -1; - } catch (JSONException e) { - SpiderDebug.log(e); - } - return 1; - } - }); - - Elements sources = doc.select("div.playlist"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.selectFirst("h3.title").text().trim(); - String tabHref = source.attr("href"); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { - sourceName = playerConfig.getJSONObject(flag).getString("show"); - found = true; - break; - } - } - if (!found) - continue; - String playList = ""; - Elements playListA = source.select("ul.stui-content__playlist > li > a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3); - vodItems.add(vod.text() + "$" + playURL); - } - if (vodItems.size() > 0) - playList = TextUtils.join("#", vodItems); - - if (playList.length() == 0) - continue; - - vod_play.put(sourceName, playList); - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private final Pattern regexUrl = Pattern.compile("(?<=urls = \").+?(?=\";)"); - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject headers = new JSONObject(); - headers.put("Origin", " https://dp.1010dy.cc"); - //headers.put("Referer", " http://www.1010dy1.com/"); - //headers.put("Icy-MetaData", "1"); - //headers.put("scheme", " https"); - headers.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); - headers.put("Accept", " */*"); - //headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-GB;q=0.8,en-US;q=0.7,en;q=0.6"); - //headers.put("Accept-Encoding", " gzip, deflate"); - headers.put("Connection", " close"); - // 播放页 url - String url = siteUrl + "/play/" + id + "/"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - if (playerConfig.has(player.getString("from"))) { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); - hashMap.put("Referer", url); - String jxurl = "https://dp.1010dy.cc/?url=" + player.getString("url")+"&next="+player.getString("link_next")+"&id="+player.getString("id")+"&nid="+player.getString("nid")+"&from="+player.getString("from"); - String doc1 = OkHttpUtil.string(jxurl, hashMap); - Matcher matcher = regexUrl.matcher(doc1); - if (!matcher.find()) { - return ""; - } - String data = matcher.group(0); - byte[] decode = Base64.decode(data, Base64.DEFAULT); - String iv = "c487ebl2e38a0faO"; - String key = "Of84ff0clf252cba"; - String directUrl = decryptToString(decode, key.getBytes(), iv.getBytes(),AES_CBC_PKCS7Padding); - if (player.getString("from").equals("duoduozy")) { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", directUrl); - result.put("header", headers.toString()); - } else { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", directUrl); - result.put("header", ""); - } - } - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 搜索 - * - * @param key - * @param quick 是否播放页的快捷搜索 - * @return - */ - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/加进去报错的Java源代码/Jianying.java b/TVBox_Java/加进去报错的Java源代码/Jianying.java deleted file mode 100644 index 73a70a7..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Jianying.java +++ /dev/null @@ -1,296 +0,0 @@ -package com.github.catvod.spider; - -import android.annotation.TargetApi; -import android.content.Context; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.CBC; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; -import java.util.List; -import okhttp3.Call; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - - -public class Jianying extends Spider { - public static String token; - - - public void init(Context context, String str) { - super.init(context, str); - token = str; - } - - private HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - headers.put("accept", "application/json, text/plain, */*"); - headers.put("accept-encoding", "gzip, deflate, br"); - headers.put("connection", "keep-alive"); - headers.put("Authorization", token); - headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - return headers; - } - - public String homeContent(boolean filter) { - try { - String url = "https://admin.syrme.top/v1/api/video/index"; - JSONObject jSONObject = new JSONObject(); - JSONArray classes = new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONArray list = new JSONObject(str).getJSONArray("data"); - for (int i = 0; i < list.length(); i++) { - JSONObject vObj = list.getJSONObject(i); - String name = vObj.getString("title"); - if (!name.equals("轮播")) { - String id = vObj.getString("title"); - JSONObject newCls = new JSONObject(); - newCls.put("type_id", id); - newCls.put("type_name", name); - classes.put(newCls); - } - } - } catch (JSONException unused) { - } - } - }); - JSONObject result = new JSONObject(); - result.put("class", classes); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public String homeVideoContent() { - try { - JSONArray videos = new JSONArray(); - JSONObject jSONObject = new JSONObject(); - String url = "https://admin.syrme.top/v1/api/video/index"; - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONArray jsonArray = new JSONObject(str).getJSONArray("data"); - JSONArray list = jsonArray.getJSONObject(1).getJSONArray("video_list"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = list.getJSONObject(i); - String id = vObj.getString("ID"); - String title = vObj.getString("title"); - String cover = vObj.getString("image"); - String mark = vObj.getString("score"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", mark); - videos.put(v); - } - } catch (JSONException unused) { - } - } - }); - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - int parseInt = Integer.parseInt(pg); - if (parseInt == 0) { - parseInt = 1; - } - String url = "https://admin.syrme.top/v1/api/video/search?q=" + tid + "&page=" + pg + "&size=" + 24; - JSONObject jSONObject = new JSONObject(); - JSONArray list = new JSONArray(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str4) { - try { - JSONArray data = new JSONObject(str4).getJSONArray("data"); - for (int i = 0; i < data.length(); i++) { - JSONObject vObj = data.getJSONObject(i); - JSONObject vodAtom = new JSONObject(); - vodAtom.put("vod_id", vObj.getString("ID")); - vodAtom.put("vod_name", vObj.getString("title")); - vodAtom.put("vod_pic", vObj.optString("image")); - String mark = vObj.optString("score"); - if (mark.equals("null")) { - mark = ""; - } - vodAtom.put("vod_remarks", mark); - list.put(vodAtom); - } - } catch (JSONException unused) { - } - } - }); - JSONObject result = new JSONObject(); - result.put("page", parseInt); - if (list.length() == 24) { - parseInt++; - } - result.put("pagecount", parseInt); - result.put("limit", 24); - result.put("total", Integer.MAX_VALUE); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public String detailContent(List ids) { - try { - String url = "https://admin.syrme.top/v1/api/video/id?id=" + ids.get(0); - JSONObject jSONObject = new JSONObject(); - JSONObject vodAtom = new JSONObject(); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jSONObject.toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str) { - try { - JSONObject vObj = new JSONObject(str).getJSONObject("data"); - vodAtom.put("vod_id", vObj.getString("ID")); - vodAtom.put("vod_name", vObj.getString("title")); - vodAtom.put("vod_pic", vObj.getString("image")); - vodAtom.put("type_name", vObj.getString("video_type")); - vodAtom.put("vod_year", vObj.getString("year")); - vodAtom.put("vod_area", vObj.getString("video_tags")); - String optString = vObj.optString("score"); - String des = ""; - if (optString.equals("null")) { - optString = des; - } - vodAtom.put("vod_remarks", optString); - vodAtom.put("vod_actor", vObj.getString("authors")); - vodAtom.put("vod_director", vObj.getString("director")); - String optString2 = vObj.optString("content"); - if (!optString2.equals("null")) { - des = optString2; - } - vodAtom.put("vod_content", des); - vodAtom.put("vod_play_from", "简影"); - vodAtom.put("vod_play_url", vObj.optString("url_content").replace("\n", "#")); - } catch (JSONException unused) { - } - } - }); - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vodAtom); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @TargetApi(26) - public String playerContent(String flag, String id, List vipFlags) { - try { - JSONObject result = new JSONObject(); - String time = LocalDateTime.now(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")).replace("-", "丨"); - String key = "ba0-1024-11eb-ad"; - String enData = CBC.hexs(time, key, key); - String basic = ""; - int i = 0; - while (i < enData.length()) { - int i2 = i + 8; - basic = basic + enData.substring(i, i2) + "-"; - i = i2; - } - String sid = basic.substring(0, basic.length() - 1); - JSONObject headers = new JSONObject(); - headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", " */*"); - headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7"); - headers.put("Accept-Encoding", " gzip, deflate"); - - result.put("parse", 0); - result.put("url", id + "?sid=" + sid); - result.put("playUrl", ""); - result.put("header", headers.toString()); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - public String searchContent(String str, boolean quick) { - if (quick) { - return ""; - } - try { - JSONArray videos = new JSONArray(); - try { - String url = "https://admin.syrme.top/v1/api/video/search?q=" + str + "&page=1&size=24"; - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, new JSONObject().toString(), getHeaders(url), new OKCallBack.OKCallBackString() { - @Override - public void onFailure(Call call, Exception exc) { - } - - public void onResponse(String str3) { - try { - JSONArray jsonArray = new JSONObject(str3).getJSONArray("data"); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject vObj = jsonArray.getJSONObject(i); - JSONObject v = new JSONObject(); - v.put("vod_id", vObj.getString("ID")); - v.put("vod_name", vObj.getString("title")); - v.put("vod_pic", vObj.optString("image")); - String mark = vObj.optString("score"); - if (mark.equals("null")) { - mark = ""; - } - v.put("vod_remarks", mark); - videos.put(v); - } - } catch (JSONException unused) { - } - } - }); - } catch (Exception unused) { - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} \ No newline at end of file diff --git a/TVBox_Java/加进去报错的Java源代码/NianYing.java b/TVBox_Java/加进去报错的Java源代码/NianYing.java deleted file mode 100644 index 954637a..0000000 --- a/TVBox_Java/加进去报错的Java源代码/NianYing.java +++ /dev/null @@ -1,326 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.utils.okhttp.OkHttpUtil; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -public class Nianying extends Spider { - - private static String host = "http://cms111.nbhut.com/api.php/Chengcheng/vod"; - - public HashMap headers() { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 11; M2105K81AC Build/RKQ1.200826.002)"); - return hashMap; - } - - - @Override - public void init(Context context) { - super.init(context); - } - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - } - - - @Override - public String homeContent(boolean filter) { - try { - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - LinkedHashMap linkedHashMap = new LinkedHashMap<>(); - linkedHashMap.put("movie", "电影"); - linkedHashMap.put("tvplay", "剧集"); - linkedHashMap.put("comic", "动漫"); - linkedHashMap.put("tvshow", "综艺"); - for (String str : linkedHashMap.keySet()) { - JSONObject item = new JSONObject(); - item.put("type_id", str); - item.put("type_name", linkedHashMap.get(str)); - classes.put(item); - } - result.put("class", classes); - - if (filter) { - JSONObject filterBox = new JSONObject(); - result.put("filters", filterBox); - String json = OkHttpUtil.string(host + "/?ac=flitter", headers()); - JSONObject sourceData = new JSONObject(decrypt(json)); - for (String tid : linkedHashMap.keySet()) { - JSONArray filterArr = new JSONArray(); - filterBox.put(tid, filterArr); - JSONArray typeJSON = sourceData.optJSONArray(tid); - for (int j = 0; j < typeJSON.length(); j++) { - JSONObject item = typeJSON.optJSONObject(j); - String itemName = item.optString("name"); - String itemField = item.optString("field"); - JSONArray itemValues = item.optJSONArray("values"); - JSONObject jOne = new JSONObject(); - jOne.put("key", itemField); - jOne.put("name", itemName); - filterArr.put(jOne); - JSONArray values = new JSONArray(); - jOne.put("value", values); - - JSONObject all = new JSONObject(); - all.put("n", "全部"); - all.put("v", ""); - values.put(all); - for (int k = 0; k < itemValues.length(); k++) { - String k1 = itemValues.optString(k); - JSONObject kvo = new JSONObject(); - kvo.put("n", k1); - kvo.put("v", k1); - values.put(kvo); - } - } - } - } - - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - return ""; - } - } - - private String decrypt(String data) { - return data; - } - - @Override - public String homeVideoContent() { - JSONObject result = new JSONObject(); - try { - String url = host + "/?ac=list&class=tvplay&page=1"; - String encodeData = OkHttpUtil.string(url, headers()); - JSONObject json = new JSONObject(decrypt(encodeData)); - JSONArray data = json.optJSONArray("data"); - JSONArray list = new JSONArray(); - for (int i = 0; i < data.length(); i++) { - JSONObject item = data.getJSONObject(i); - JSONObject vod = new JSONObject(); - String nextlink = item.getString("nextlink"); - String vod_id = nextlink.substring(nextlink.indexOf("ids=") + 4); - vod.put("vod_id", vod_id); - vod.put("vod_name", item.getString("title")); - vod.put("vod_pic", item.getString("pic")); - vod.put("vod_remarks", item.getString("state")); - list.put(vod); - } - result.put("list", list); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - JSONObject result = new JSONObject(); - try { - String url = host + "/"; - Map params = new HashMap<>(); - if (extend != null) { - params.putAll(extend); - } - params.put("class", tid); - params.put("page", pg); - params.put("ac", "list"); - - List ps = new LinkedList<>(); - for (Map.Entry entry : params.entrySet()) { - ps.add(entry.getKey() + "=" + entry.getValue()); - } - url = url + "?" + TextUtils.join("&", ps); - String encodeData = OkHttpUtil.string(url, headers()); - JSONObject json = new JSONObject(decrypt(encodeData)); - JSONArray list = json.optJSONArray("data"); - JSONArray vods = new JSONArray(); - for (int i = 0; i < list.length(); i++) { - JSONObject item = list.getJSONObject(i); - JSONObject vod = new JSONObject(); - String nextlink = item.getString("nextlink"); - String vod_id = nextlink.substring(nextlink.indexOf("ids=") + 4); - vod.put("vod_id", vod_id); - vod.put("vod_name", item.getString("title")); - vod.put("vod_pic", item.getString("pic")); - vod.put("vod_remarks", item.getString("state")); - vods.put(vod); - } - int parseInt = Integer.parseInt(pg); - result.put("page", parseInt); - if (vods.length() == 20) { - parseInt++; - } - result.put("pagecount", parseInt); - result.put("limit", 20); - result.put("total", Integer.MAX_VALUE); - result.put("list", vods); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } - - @Override - public String detailContent(List ids) { - JSONObject result = new JSONObject(); - try { - String url = host + "/?ac=detail&ids=" + ids.get(0); - String encodeData = OkHttpUtil.string(url, headers()); - JSONObject vodInfo = new JSONObject(decrypt(encodeData)); - JSONObject vod = new JSONObject(); - vod.put("vod_id", vodInfo.getString("id")); - vod.put("vod_name", vodInfo.getString("title")); - vod.put("vod_pic", vodInfo.getString("img_url")); - vod.put("vod_year", vodInfo.optString("pubtime")); - vod.put("vod_remarks", vodInfo.optString("season_num")); - vod.put("vod_content", vodInfo.optString("intro").trim()); - - JSONArray type = vodInfo.optJSONArray("type"); - if (type != null && type.length() > 0) { - vod.put("type_name", type.toString().replace("[\"", "").replace("\"]", "")); - } - JSONArray area = vodInfo.optJSONArray("area"); - if (area != null && area.length() > 0) { - vod.put("vod_area", area.toString().replace("[\"", "").replace("\"]", "")); - } - - JSONArray actor = vodInfo.optJSONArray("actor"); - if (actor != null && actor.length() > 0) { - vod.put("vod_actor", actor.toString().replace("[\"", "").replace("\"]", "")); - } - - JSONArray director = vodInfo.optJSONArray("director"); - if (director != null && director.length() > 0) { - vod.put("vod_director", director.toString().replace("[\"", "").replace("\"]", "")); - } - - JSONObject videolist = vodInfo.getJSONObject("videolist"); - Iterator keys = videolist.keys(); - Map map = new TreeMap<>((o1, o2) -> { - if (o1.contains("m3u8")) { - if (o2.contains("lzm3u8")) { - return 1; - } - return 1; - } - if (o1.contains("ddzy")) { - return -1; - } - return 1; - }); - while (keys.hasNext()) { - String source = keys.next(); - JSONArray urls = videolist.optJSONArray(source); - List sourceValues = new ArrayList<>(); - for (int i = 0; i < urls.length(); i++) { - JSONObject item = urls.getJSONObject(i); - String title = item.optString("title"); - String urlv = item.optString("url"); - if (urlv.contains("url=")) { - urlv = urlv.replace("http://ry.nbhut.com/4.7.php?url=", ""); - } - sourceValues.add(title + "$" + urlv); - } - - map.put(source, TextUtils.join("#", sourceValues)); - } - - String join = TextUtils.join("$$$", map.keySet()); - String join2 = TextUtils.join("$$$", map.values()); - vod.put("vod_play_from", join); - vod.put("vod_play_url", join2); - JSONArray vods = new JSONArray(); - vods.put(vod); - result.put("list", vods); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } - - - /** - * @param flag - * @param id - * @param vipFlags - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - JSONObject result = new JSONObject(); - try { - result.put("parse", "0"); - if (Misc.isVideoFormat(id)) { - result.put("url", id); - } else if (Misc.isVip(id)) { - result.put("url", id); - result.put("parse", "1"); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } - - @Override - public String searchContent(String key, boolean quick) { - JSONObject result = new JSONObject(); - try { - String url = host + "/?ac=list&wd=" + key + "&page=1"; - String encodeData = OkHttpUtil.string(url, headers()); - JSONObject json = new JSONObject(decrypt(encodeData)); - JSONArray list = json.optJSONArray("data"); - JSONArray vods = new JSONArray(); - for (int i = 0; i < list.length(); i++) { - JSONObject item = list.getJSONObject(i); - JSONObject vod = new JSONObject(); - String nextlink = item.getString("nextlink"); - String vod_id = nextlink.substring(nextlink.indexOf("ids=") + 4); - vod.put("vod_id", vod_id); - vod.put("vod_name", item.getString("title")); - vod.put("vod_pic", item.getString("pic")); - vod.put("vod_remarks", item.getString("state")); - vods.put(vod); - } - result.put("list", vods); - } catch (Exception e) { - - } - return result.toString(); - } - - @Override - public boolean isVideoFormat(String url) { - return super.isVideoFormat(url); - } - - @Override - public boolean manualVideoCheck() { - return super.manualVideoCheck(); - } - -} diff --git a/TVBox_Java/加进去报错的Java源代码/Tkys.java b/TVBox_Java/加进去报错的Java源代码/Tkys.java deleted file mode 100644 index 11ef8b6..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Tkys.java +++ /dev/null @@ -1,410 +0,0 @@ -package com.github.catvod.spider; - - - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import com.github.catvod.crawler.Spider; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; - - -public class Tkys extends Spider { - - private static final String siteUrl = new String("https://www.tkys.tv"); - private static final String siteHost = new String("www.tkys.tv"); - - protected JSONObject playerConfig; - protected JSONObject filterConfig; - - protected Pattern regexCategory = Pattern.compile("/vodtype/(\\d+).html"); - protected Pattern regexVoddetail = Pattern.compile("/voddetail/(\\d+).html"); - protected Pattern regexPlay = Pattern.compile("/vodplay/(\\S+).html"); - protected Pattern regexPage = Pattern.compile("/vodshow/\\d+--------(\\d+)---.html"); - protected Pattern regexBtToken = Pattern.compile("token = \"(.*?)\""); - protected Pattern regexEnurl = Pattern.compile("getVideoInfo\\(\"(.*?)\""); - - - private final String filterString = ""; - private final String playerString = "{\"mgtv\":{\"show\":\"芒果-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://play.tkys.tv/?url=\"},\"qiyi\":{\"show\":\"奇艺-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"qq\":{\"show\":\"QQ-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"sohu\":{\"show\":\"搜狐-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://play.tkys.tv/?url=\"},\"xx\":{\"show\":\"蓝光C\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"youku\":{\"show\":\"优酷-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"bilibili\":{\"show\":\"BL-官方\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"dbm3u8\":{\"show\":\"备用1(请勿相信片中广告!!)\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"wjm3u8\":{\"show\":\"备用2(请勿相信片中广告!!)\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"kbm3u8\":{\"show\":\"备用3(有广告,误信)\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8222222.php?url=\"},\"tkqp\":{\"show\":\"app专用\",\"des\":\"天空自切\",\"ps\":\"1\",\"parse\":\"https://jxqd.tkys.tv/dnmdsb2.php?url=\"},\"wuduzy\":{\"show\":\"蓝光B(维护中)\",\"des\":\"五毒\",\"ps\":\"1\",\"parse\":\"https://jx.yyy4080.com/351755?url=\"},\"miaoparty\":{\"show\":\"蓝光MZ\",\"des\":\"\",\"ps\":\"1\",\"parse\":\"https://jxqd.tkys.tv/dnmdsb2.php?url=\"},\"wuduby\":{\"show\":\"蓝光备用\",\"des\":\"五毒备用\",\"ps\":\"0\",\"parse\":\"https://jx.tiankongyingshi.tv/m3u8.php?url=\"},\"iframe\":{\"show\":\"iframe外链数据\",\"des\":\"iframe外链数据\",\"ps\":\"0\",\"parse\":\"\"},\"link\":{\"show\":\"外链数据\",\"des\":\"外部网站播放链接\",\"ps\":\"0\",\"parse\":\"\"}}"; - - @Override - public void init(Context context) { - super.init(context); - try { - playerConfig = new JSONObject(playerString); - filterConfig = new JSONObject(filterString); - } catch (JSONException e) { - SpiderDebug.log(e); - } - } - - /** - * 爬虫headers - * - * @param refererUrl - * @return - */ - protected HashMap getHeaders(String refererUrl) { - HashMap headers = new HashMap<>(); - headers.put("method", "GET"); - if (!TextUtils.isEmpty(refererUrl)) { - headers.put("Referer", refererUrl); - } - headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36"); - headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - return headers; - } - - /** - * 获取分类数据 + 首页最近更新视频列表数据 - * - * @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关 - * @return - */ - @Override - public String homeContent(boolean filter) { - try { - String url = siteUrl + '/'; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl))); - Elements elements = doc.select("ul.nav-menu>li>a[href*='vodtype']"); - JSONArray classes = new JSONArray(); - for (Element ele : elements) { - String name = ele.text(); - String href = ele.attr("href"); - Matcher mather = regexCategory.matcher(href); - if (!mather.find()) - continue; - // 把分类的id和名称取出来加到列表里 - String id = mather.group(1).trim(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type_id", id); - jsonObject.put("type_name", name); - classes.put(jsonObject); - } - - JSONObject result = new JSONObject(); - if (filter) { - result.put("filters", filterConfig); - } - result.put("class", classes); - try { - // 取首页推荐视频列表 - Elements list = doc.select("ul.myui-vodlist > li > div.myui-vodlist__box > a"); - JSONArray videos = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = ""; - Element remarkEle = vod.selectFirst("span.pic-text"); - if (remarkEle != null) { - remark = remarkEle.text(); - } - Matcher matcher = regexVoddetail.matcher(vod.attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - result.put("list", videos); - } catch (Exception e) { - SpiderDebug.log(e); - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - /** - * 获取分类信息数据 - * - * @param tid 分类id - * @param pg 页数 - * @param filter 同homeContent方法中的filter - * @param extend 筛选参数{k:v, k1:v1} - * @return - */ - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - int page = 1; - TreeMap ext = new TreeMap<>(); - if (!TextUtils.isEmpty(pg) && Integer.parseInt(pg.trim()) > 1) { - page = Integer.parseInt(pg.trim()); - ext.put("page", page + ""); - } - if (extend != null && extend.size() > 0) { - ext.putAll(extend); - } - ext.put("id", tid); - List kv = new ArrayList<>(); - for (Map.Entry entry : ext.entrySet()) { - if ("".equals(entry.getValue())) { - continue; - } - kv.add(entry.getKey() + "/" + entry.getValue()); - } - String params = TextUtils.join("/", kv); - - String url = siteUrl + "/vodshow/" + params + ".html"; - - String html = OkHttpUtil.string(url, getHeaders(siteUrl)); - Document doc = Jsoup.parse(html); - JSONObject result = new JSONObject(); - int pageCount = 1; - - // 取页码相关信息 - Elements pageInfo = doc.select("ul.myui-page li.visible-xs > a"); - if (pageInfo.size() > 0) { - String text = pageInfo.text(); - pageCount = Integer.parseInt(text.split("/")[1]); - } - - JSONArray videos = new JSONArray(); - // 取当前分类页的视频列表 - Elements list = doc.select("ul.myui-vodlist > li > div > a"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = vod.attr("title"); - String cover = vod.attr("data-original"); - String remark = ""; - Element remarkEle = vod.selectFirst("span.pic-text"); - if (remarkEle != null) { - remark = remarkEle.text(); - } - - Matcher matcher = regexVoddetail.matcher(vod.attr("href")); - if (matcher.find()) { - String vodId = matcher.group(1); - JSONObject v = new JSONObject(); - v.put("vod_id", vodId); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", remark); - videos.put(v); - } - } - result.put("page", page); - result.put("pagecount", pageCount); - result.put("limit", 48); - result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48); - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 视频详情信息 - * - * @param ids 视频id - * @return - */ - @Override - public String detailContent(List ids) { - try { - // 视频详情url - String url = siteUrl + "/voddetail/" + ids.get(0) + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl))); - JSONObject result = new JSONObject(); - JSONObject vodList = new JSONObject(); - - // 取基本数据 - String cover = doc.selectFirst("div.myui-content__thumb > a > img").attr("data-original"); - String title = doc.selectFirst("div.myui-content__detail > h1").text(); - String desc = doc.selectFirst("#desc span.data").text(); - - vodList.put("vod_id", ids.get(0)); - vodList.put("vod_name", title); - vodList.put("vod_pic", cover); - vodList.put("vod_content", desc); - - Map vod_play = new LinkedHashMap<>(); - - // 取播放列表数据 - Elements sources = doc.select("a[href*='playlist']"); - Elements sourceList = doc.select("div[id*='playlist']"); - - for (int i = 0; i < sources.size(); i++) { - Element source = sources.get(i); - String sourceName = source.text(); - boolean found = false; - for (Iterator it = playerConfig.keys(); it.hasNext(); ) { - String flag = it.next(); - if (playerConfig.getJSONObject(flag).getString("show").equals(sourceName)) { -// sourceName = flag; - found = true; - break; - } - } - if (found) { - String playList = ""; - Elements playListA = sourceList.get(i).select("a"); - List vodItems = new ArrayList<>(); - - for (int j = 0; j < playListA.size(); j++) { - Element vod = playListA.get(j); - Matcher matcher = regexPlay.matcher(vod.attr("href")); - if (matcher.find()) { - String playURL = matcher.group(1); - String playUrlName = vod.text(); - vodItems.add(playUrlName + "$" + playURL); - } - } - if (vodItems.size() > 0) { - playList = TextUtils.join("#", vodItems); - vod_play.put(sourceName, playList); - } - } - } - - if (vod_play.size() > 0) { - String vod_play_from = TextUtils.join("$$$", vod_play.keySet()); - String vod_play_url = TextUtils.join("$$$", vod_play.values()); - vodList.put("vod_play_from", vod_play_from); - vodList.put("vod_play_url", vod_play_url); - } - JSONArray list = new JSONArray(); - list.put(vodList); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - /** - * 获取视频播放信息 - * - * @param flag 播放源 - * @param id 视频id - * @param vipFlags 所有可能需要vip解析的源 - * @return - */ - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - // 播放页 url - String url = siteUrl + "/vodplay/" + id + ".html"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(siteUrl))); - Elements allScript = doc.select("script"); - JSONObject result = new JSONObject(); - Map playHeader = new HashMap<>(); - playHeader.put("User-Agent", " Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"); - result.put("header", new JSONObject(playHeader).toString()); - result.put("parse", "0"); - result.put("playUrl", ""); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { // 取直链 - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - String videoUrl = player.optString("url"); - String from = player.optString("from"); - if (from.equals("")) { - from = "tkqp"; - } - if (Misc.isVideoFormat(videoUrl)) { - result.put("url", videoUrl); - return result.toString(); - } - - JSONObject playJxConfig = playerConfig.optJSONObject(from); - String parseUrl = playJxConfig.optString("parse"); - - Map paramsMap = new HashMap<>(); - paramsMap.put("url", videoUrl); - String parseHtml = OkHttpUtil.string(parseUrl + videoUrl, getHeaders(siteUrl)); - - Matcher tokenMatcher = regexBtToken.matcher(parseHtml); - Matcher enurlMatcher = regexEnurl.matcher(parseHtml); - - if (tokenMatcher.find() && enurlMatcher.find()) { - String token = tokenMatcher.group(1); - String enurl = enurlMatcher.group(1); - byte[] decode = Base64.decode(enurl, Base64.DEFAULT); - String realurl = AES.decryptOfAesCbcPkcs7(decode, "7692AA70EEF92B42".getBytes(), token.getBytes()); - result.put("url", realurl); - return result.toString(); - } - break; - } - } - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String searchContent(String key, boolean quick) { - try { - long currentTime = System.currentTimeMillis(); - String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10×tamp=" + currentTime; - JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(siteUrl))); - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (searchResult.getInt("total") > 0) { - JSONArray lists = new JSONArray(searchResult.getString("list")); - for (int i = 0; i < lists.length(); i++) { - JSONObject vod = lists.getJSONObject(i); - String id = vod.getString("id"); - String title = vod.getString("name"); - String cover = vod.getString("pic"); - JSONObject v = new JSONObject(); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", cover); - v.put("vod_remarks", ""); - videos.put(v); - } - } - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} diff --git a/TVBox_Java/加进去报错的Java源代码/XYQBiu.java b/TVBox_Java/加进去报错的Java源代码/XYQBiu.java deleted file mode 100644 index a8ea061..0000000 --- a/TVBox_Java/加进去报错的Java源代码/XYQBiu.java +++ /dev/null @@ -1,1167 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import android.text.TextUtils; -import android.util.Base64; - -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.Misc; -import com.github.catvod.utils.okhttp.OKCallBack; -import com.github.catvod.utils.okhttp.OkHttpUtil; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.net.URLDecoder; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Map; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import okhttp3.Call; -import okhttp3.Headers; -import okhttp3.Response; - -public class XYQBiu extends Spider { - - private String btcookie = ""; - - @Override - public void init(Context context) { - super.init(context); - } - - public void init(Context context, String extend) { - super.init(context, extend); - this.ext = extend; - } - - @Override - public String homeContent(boolean filter) { - try { - fetchRule(); - JSONObject result = new JSONObject(); - JSONArray classes = new JSONArray(); - - String[] fenleis = getRuleVal("class_name", "").split("&"); - String[] fenleisval = getRuleVal("class_value", "").split("&"); - for (int i = 0; i < fenleis.length; i++) { - JSONObject fenjson = new JSONObject(); - fenjson.put("type_id", fenleisval[i].replaceAll("&&", "&")); - fenjson.put("type_name", fenleis[i]); - classes.put(fenjson); - } - result.put("class", classes); - String getclan = getRuleVal("filterdata", ""); - InetAddress addr = InetAddress.getLocalHost(); - String locadd = "http://" + addr.getHostAddress() + ":9978/file/"; - String filepath = null; - JSONObject filterdata = null; - if (getclan.startsWith("clan://") || getclan.startsWith("http")) { - if (getclan.startsWith("clan://")) { - if (getclan.startsWith("clan://localhost/")) { - filepath = getclan.replace("clan://localhost/", locadd); - } else { - filepath = getclan.replace("clan://", locadd); - } - } else { - filepath = getclan; - } - try { - String filtejson = OkHttpUtil.string(filepath, null); - filterdata = new JSONObject(filtejson); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - } else { - filterdata = rule.optJSONObject("filterdata"); - } - if (filter && filterdata != null) { - result.put("filters", filterdata); - } - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - -// protected HashMap getHeaders(String url) { -// HashMap headers = new HashMap<>(); -// String ua = getRuleVal("UserAgent", "okhttp/3.12.11").trim(); -// if (ua.isEmpty()) { -// ua = "okhttp/3.12.11"; -// } else if (ua.equals("PC_UA")) { -// ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; -// } else if (ua.equals("MOBILE_UA")) { -// ua = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } -// headers.put("User-Agent", ua); - -// if (!getRuleVal("Referer").isEmpty()) { -// String webref = getRuleVal("Referer").trim(); -// if (webref.startsWith("http")) { -// headers.put("Referer", webref); -// } -// } -// return headers; -// } - - protected HashMap getHeaders(String url) { - HashMap headers = new HashMap<>(); - String ua = getRuleVal("SUserAgent", "").trim(); - if (ua.contains("$")) { - String[] split = ua.split("#"); - for (String split2 : split) { - String[] split3 = split2.split("\\$"); - String str2 = split3[0]; - JSONObject obj = split3[1]; - if (obj.equals("PC_UA")) { - obj = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - } else if (ua.equals("MOBILE_UA")) { - obj = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } - if (!btcookie.isEmpty() && (str2.equals("cookie") || str2.equals("Cookie"))) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(obj); - stringBuilder.append(";"); - stringBuilder.append(btcookie); - obj = stringBuilder.toString(); - } - headers.put(str2, obj); - } - if (!(btcookie.isEmpty() || btcookie.length() <= 1 || ua.contains("Cookie$") || ua.contains("cookie$"))) { - headers.put("Cookie", btcookie); - } - } else if (ua.isEmpty()) { - return sHeaders(url); - } else { - JSONObject obj2; - if (ua.equals("PC_UA")) { - obj2 = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - } else if (ua.equals("MOBILE_UA")) { - obj2 = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } else { - String obj22 = ua; - } - if (!btcookie.isEmpty() && btcookie.length() > 1) { - headers.put("Cookie", btcookie); - } - headers.put("User-Agent", obj22); - } - return headers; - } - - protected HashMap sHeaders(String url) { - HashMap headers = new HashMap<>(); - String ua = getRuleVal("UserAgent", "").trim(); - if (ua.contains("$")) { - String[] split = ua.split("#"); - for (String split2 : split) { - String[] split3 = split2.split("\\$"); - String str2 = split3[0]; - JSONObject obj = split3[1]; - if (obj.equals("PC_UA")) { - obj = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - } else if (ua.equals("MOBILE_UA")) { - obj = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } - if (!btcookie.isEmpty() && (str2.equals("cookie") || str2.equals("Cookie"))) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(obj); - stringBuilder.append(";"); - stringBuilder.append(btcookie); - obj = stringBuilder.toString(); - } - headers.put(str2, obj); - } - if (!(btcookie.isEmpty() || btcookie.length() <= 1 || ua.contains("Cookie$") || ua.contains("cookie$"))) { - headers.put("Cookie", btcookie); - } - } else { - JSONObject obj2; - if (ua.isEmpty()) { - obj2 = "okhttp/3.12.11"; - } else if (ua.equals("PC_UA")) { - obj2 = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - } else if (ua.equals("MOBILE_UA")) { - obj2 = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } else { - String obj22 = ua; - } - if (!btcookie.isEmpty() && btcookie.length() > 1) { - headers.put("Cookie", btcookie); - } - headers.put("User-Agent", obj22); - } - return headers; - } - - @Override - public String homeVideoContent() { - try { - fetchRule(); - if (getRuleVal("homeContent").equals("1")) { - JSONArray videos = new JSONArray(); - String[] fenleis = getRuleVal("class_value", "").split("&"); - for (String fenlei : fenleis) { - JSONObject data = category(fenlei.replaceAll("&&", "&"), "1", false, new HashMap<>()); - if (data != null) { - JSONArray vids = data.optJSONArray("list"); - if (vids != null) { - for (int i = 0; i < vids.length() && i < 5; i++) { - videos.put(vids.getJSONObject(i)); - } - } - } - if (videos.length() >= 20) - break; - } - JSONObject result = new JSONObject(); - result.put("list", videos); - return result.toString(); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - private JSONObject category(String tid, String pg, boolean filter, HashMap extend) { - try { - fetchRule(); - String fistpg = String.valueOf(Integer.parseInt(getRuleVal("firstpage", "1"))); - ////页码 - if (fistpg.equals("0")) { - pg = String.valueOf(Integer.parseInt(pg) - 1 * 1); - } else { - pg = String.valueOf(Integer.parseInt(pg) - 1 + Integer.parseInt(getRuleVal("firstpage", "1"))); - } - //web链接 - String webUrl = getRuleVal("class_url"); - if (webUrl.contains("firstPage=")) { - if (pg.equals("1")) { - webUrl = webUrl.split("\\[firstPage=")[1].split("\\]")[0]; - } else { - webUrl = webUrl.split("\\[firstPage=")[0]; - } - } - //筛选开始 - if (filter && extend != null && extend.size() > 0) { - for (Iterator it = extend.keySet().iterator(); it.hasNext(); ) { - String key = it.next(); - String value = extend.get(key); - if (value.length() > 0) { - webUrl = webUrl.replace("{" + key + "}", URLEncoder.encode(value)); - } - } - } - webUrl = webUrl.replaceAll("\\{cateId\\}", tid).replaceAll("\\{catePg\\}", pg); - Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(webUrl); - while (m.find()) { - String n = m.group(0).replace("{", "").replace("}", ""); - webUrl = webUrl.replace(m.group(0), "").replace("/" + n + "/", ""); - } - //筛选结束 - String html = null; - String btwatUrl = ""; - //取网页 - if (webUrl.contains(";post")) { - OKCallBack.OKCallBackString callBack = new OKCallBack.OKCallBackString() { - - public void onResponse(String response) { - } - - @Override - protected void onFailure(Call call, Exception exc) { - } - }; - String posturl = webUrl.split("\\?")[0].replaceAll("??", "?").trim(); - String postbody = webUrl.split("\\?")[1].split(";")[0].replaceAll("??", "?").trim(); - if (!postbody.isEmpty() && postbody != null) { - if (postbody.startsWith("{") && postbody.endsWith("}")) { - JSONObject jsbody = new JSONObject(postbody); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), posturl, jsbody.toString(), sHeaders(posturl), callBack); - } else { - LinkedHashMap params = new LinkedHashMap(); - String[] userbody = postbody.split("&"); - for (String userbd : userbody) { - int loca = userbd.indexOf("="); - params.put(userbd.substring(0, loca), userbd.substring(loca + 1)); - } - OkHttpUtil.post(OkHttpUtil.defaultClient(), posturl, params, sHeaders(posturl), callBack); - } - } else { - OkHttpUtil.post(OkHttpUtil.defaultClient(), posturl, null, sHeaders(posturl), callBack); - } - html = convertUnicodeToCh(callBack.getResult().replaceAll("\r|\n", "")); - btwatUrl = posturl; - } else { - html = convertUnicodeToCh(fetch(webUrl)); - btwatUrl = webUrl; - } - - html = jumpbtwaf(html,convertUnicodeToCh(fetch(webUrl)));//5秒盾 - String parseContent = html; - String mark = ""; - String pic = ""; - boolean fenleiJson = getRuleVal("cat_mode").equals("0"); - boolean picneetproxy = getRuleVal("PicNeedProxy").equals("1"); - - JSONArray videos = new JSONArray(); - JSONObject result = new JSONObject(); - if (fenleiJson) { - JSONObject data = new JSONObject(parseContent); - JSONArray vodArray = null; - String[] keylen = getRuleVal("catjsonlist", "data").split("\\."); - if (keylen.length == 1) { - vodArray = data.getJSONArray(keylen[0]); - } else if (keylen.length == 2) { - vodArray = data.getJSONObject(keylen[0]).getJSONArray(keylen[1]); - } else if (keylen.length == 3) { - vodArray = data.getJSONObject(keylen[0]).getJSONObject(keylen[1]).getJSONArray(keylen[2]); - } - //JSONArray vodArray = data.getJSONArray(getRuleVal("catjsonlist","list")); - for (int j = 0; j < vodArray.length(); j++) { - try { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(getRuleVal("catjsonname")).trim(); - String id = vod.optString(getRuleVal("catjsonid")).trim(); - id = getRuleVal("cat_prefix", "") + id + getRuleVal("cat_suffix", ""); - if (!getRuleVal("catjsonpic").isEmpty()) { - try { - pic = vod.optString(getRuleVal("catjsonpic")).trim(); - pic = Misc.fixUrl(webUrl, pic); - if (picneetproxy) { - pic = fixCover(pic, webUrl); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - try { - mark = vod.optString(getRuleVal("catjsonstitle")).trim(); - } catch (Exception e) { - SpiderDebug.log(e); - } - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } else { - boolean shifouercijiequ = getRuleVal("cat_YN_twice").equals("1"); - if (shifouercijiequ) { - String jiequqian = getRuleVal("cat_twice_pre"); - String jiequhou = getRuleVal("cat_twice_suf"); - parseContent = subContent(html, jiequqian, jiequhou).get(0); - } - String jiequshuzuqian = getRuleVal("cat_arr_pre"); - String jiequshuzuhou = getRuleVal("cat_arr_suf"); - - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String title = subContent(jiequContent, getRuleVal("cat_title").split("&&")[0], getRuleVal("cat_title").split("&&")[1]).get(0).replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - if (!getRuleVal("cat_pic").isEmpty()) { - try { - pic = subContent(jiequContent, getRuleVal("cat_pic").split("&&")[0], getRuleVal("cat_pic").split("&&")[1]).get(0); - pic = Misc.fixUrl(webUrl, pic); - if (picneetproxy) { - pic = fixCover(pic, webUrl); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - String link = subContent(jiequContent, getRuleVal("cat_url").split("&&")[0], getRuleVal("cat_url").split("&&")[1]).get(0); - link = getRuleVal("cat_prefix", "") + link + getRuleVal("cat_suffix", ""); - if (!getRuleVal("cat_subtitle").isEmpty()) { - try { - mark = subContent(jiequContent, getRuleVal("cat_subtitle").split("&&")[0], getRuleVal("cat_subtitle").split("&&")[1]).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - JSONObject v = new JSONObject(); - v.put("vod_id", title + "$$$" + pic + "$$$" + link); - v.put("vod_name", title); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - } - - result.put("page", pg); - result.put("pagecount", Integer.MAX_VALUE); - result.put("limit", 90); - result.put("total", Integer.MAX_VALUE); - result.put("list", videos); - return result; - } catch (Exception e) { - SpiderDebug.log(e); - } - return null; - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - JSONObject obj = category(tid, pg, filter, extend); - return obj != null ? obj.toString() : ""; - } - - @Override - public String detailContent(List ids) { - try { - fetchRule(); - String[] idInfo = ids.get(0).split("\\$\\$\\$"); - String webUrl = idInfo[2]; - - String cover = idInfo[1], vodtitle = idInfo[0], area = ""; - String desc = ""; - String director = ""; - String actor = ""; - String remark = ""; - String year = ""; - String category = ""; - - ArrayList playList = new ArrayList<>(); - ArrayList playFrom = new ArrayList<>(); - boolean isMagnet = false; - boolean zhijiebofang = getRuleVal("force_play").equals("1"); - boolean picneetproxy = getRuleVal("PicNeedProxy").equals("1"); - try { - if (picneetproxy) { - cover = fixCover(cover, webUrl); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - if (zhijiebofang) { - //直接播放 - playFrom.add(idInfo[0]); - playList.add(idInfo[0] + "$" + idInfo[2]); - if (idInfo[2].startsWith("magnet")) { - isMagnet = true; - } - } else { - //非直接播放 - String html = fetch(webUrl).trim(); - html = jumpbtwaf(webUrl,html);//5秒盾 - html = convertUnicodeToCh(html); - String parseContent = html; - boolean bfshifouercijiequ = getRuleVal("list_YN_twice").equals("1"); - if (bfshifouercijiequ) { - String jiequqian = getRuleVal("list_twice_pre"); - String jiequhou = getRuleVal("list_twice_suf"); - parseContent = subContent(html, jiequqian, jiequhou).get(0); - } - - String jiequshuzuqian = getRuleVal("list_arr_pre"); - String jiequshuzuhou = getRuleVal("list_arr_suf"); - boolean bfyshifouercijiequ = getRuleVal("epi_YN_twice").equals("1"); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String parseJqContent = bfyshifouercijiequ ? subContent(jiequContent, getRuleVal("epi_twice_pre"), getRuleVal("epi_twice_suf")).get(0) : jiequContent; - ArrayList lastParseContents = subContent(parseJqContent, getRuleVal("epi_arr_pre"), getRuleVal("epi_arr_suf")); - List vodItems = new ArrayList<>(); - for (int j = 0; j < lastParseContents.size(); j++) { - String title = subContent(lastParseContents.get(j), getRuleVal("epi_title").split("&&")[0], getRuleVal("epi_title").split("&&")[1]).get(0); - String link = subContent(lastParseContents.get(j), getRuleVal("epi_url").split("&&")[0], getRuleVal("epi_url").split("&&")[1]).get(0); - link = getRuleVal("epiurl_prefix", "") + link + getRuleVal("epiurl_suffix", ""); - vodItems.add(title + "$" + link); - if (link.startsWith("magnet")) { - isMagnet = true; - break; - } - } - playList.add(TextUtils.join("#", vodItems)); - if (isMagnet) { - break; - } - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - - //线路代码 - String xlparseContent = html; - //没有线路规则代码时 - if (!getRuleVal("tab_title").isEmpty() && !getRuleVal("tab_arr_pre").isEmpty()) { - //代码取线路名 - boolean xlshifouercijiequ = getRuleVal("tab_YN_twice").equals("1"); - if (xlshifouercijiequ) { - String xljiequqian = getRuleVal("tab_twice_pre"); - String xljiequhou = getRuleVal("tab_twice_suf"); - xlparseContent = subContent(html, xljiequqian, xljiequhou).get(0); - } - - String xljiequshuzuqian = getRuleVal("tab_arr_pre"); - String xljiequshuzuhou = getRuleVal("tab_arr_suf"); - ArrayList xljiequContents = subContent(xlparseContent, xljiequshuzuqian, xljiequshuzuhou); - for (int i = 0; i < playList.size(); i++) { - try { - String xltitle = subContent(xljiequContents.get(i), getRuleVal("tab_title").split("&&")[0], getRuleVal("tab_title").split("&&")[1]).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - playFrom.add(xltitle); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } else { - for (int i = 0; i < playList.size(); i++) { - playFrom.add("播放列表" + (i + 1)); - } - } - - if (!getRuleVal("proj_actor").isEmpty()) { - try { - actor = subContent(html, getRuleVal("proj_actor").split("&&")[0], getRuleVal("proj_actor").split("&&")[1]).get(0).replaceAll("\\s+", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - if (!getRuleVal("proj_plot").isEmpty()) { - try { - desc = subContent(html, getRuleVal("proj_plot").split("&&")[0], getRuleVal("proj_plot").split("&&")[1]).get(0); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } - //非直接播放结束 - JSONObject vod = new JSONObject(); - vod.put("vod_id", ids.get(0)); - vod.put("vod_name", vodtitle); - vod.put("vod_pic", cover); - vod.put("type_name", category); - vod.put("vod_year", year); - vod.put("vod_area", area); - vod.put("vod_remarks", remark); - vod.put("vod_actor", actor); - vod.put("vod_director", director); - vod.put("vod_content", desc); - - String vod_play_from = TextUtils.join("$$$", playFrom); - String vod_play_url = TextUtils.join("$$$", playList); - vod.put("vod_play_from", vod_play_from); - vod.put("vod_play_url", vod_play_url); - - JSONObject result = new JSONObject(); - JSONArray list = new JSONArray(); - list.put(vod); - result.put("list", list); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - fetchRule(); - String webUrl = id; - //WebView嗅探请求头 -// JSONObject webheaders = new JSONObject(); -// String webua = getRuleVal("UserAgent", "okhttp/3.12.11").trim(); -// if (webua.isEmpty()) { -// webua = "okhttp/3.12.11"; -// } else if (webua.equals("PC_UA")) { -// webua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; -// } else if (webua.equals("MOBILE_UA")) { -// webua = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; -// } -// webheaders.put("User-Agent", webua); - -// if (!getRuleVal("Referer").isEmpty()) { -// String webref = getRuleVal("Referer").trim(); -// if (webref.startsWith("http")) { -// webheaders.put("Referer", webref); -// } else if (webref.equals("WebView")) { -// webheaders.put("Referer", webUrl); - } - } - - JSONObject webheaders = new JSONObject(); - String webua = getRuleVal("UserAgent", "").trim(); - String str4 = "\\$"; - if (webua.contains("$")) { - String[] split = webua.split("#"); - for (String str32 : split) { - String[] head = str32.split(str4); - String str5 = head[0]; - obj = head[0]; - if (obj.equals("PC_UA")) { - obj = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - } else if (webua.equals("MOBILE_UA")) { - obj = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } - if (!btcookie.isEmpty() && (str5.equals("cookie") || str5.equals("Cookie"))) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(obj); - stringBuilder.append(";"); - stringBuilder.append(btcookie); - obj = stringBuilder.toString(); - } - if ((str5.equals("Referer") || str5.equals("referer")) && webref.equals("WebView")) { - obj = str2; - } - webheaders.put(str5, obj); - } - if (btcookie.isEmpty() || btcookie.length() <= 1 || webua.contains("Cookie$") || webua.contains("cookie$")) { - webua = str4; - } else { - webheaders.put("Cookie", btcookie); - webua = str4; - } - } else { - if (webua.isEmpty()) { - obj = "okhttp/3.12.11"; - } else if (webua.equals("PC_UA")) { - obj = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"; - } else if (webua.equals("MOBILE_UA")) { - obj = "Mozilla/5.0 (Linux; Android 11; Mi 10 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 Mobile Safari/537.36"; - } else { - str32 = webua; - } - if (!btcookie.isEmpty() && btcookie.length() > 1) { - webheaders.put("Cookie", btcookie); - } - webheaders.put("User-Agent", obj); - webua = str4; - } - - if (!getRuleVal("Referer").isEmpty()) { - String webref = getRuleVal("Referer").trim(); - if (webref.startsWith("http")) { - webheaders.put("Referer", webref); - } else if (webref.equals("WebView")) { - webheaders.put("Referer", webUrl); - } - } - - //嗅探请求头结束 - - JSONObject result = new JSONObject(); - boolean enforceplay = (getRuleVal("force_play").equals("1") || getRuleVal("force_play").equals("2")); - //强制视频链接 - if (enforceplay) { - webUrl = getRuleVal("play_prefix", "") + webUrl + getRuleVal("play_suffix", ""); - //请求头代码 - if (!getRuleVal("play_header").isEmpty()) { - JSONObject uaresult = rule.optJSONObject("play_header"); - if (uaresult != null) { - result.put("header", uaresult.toString()); - } else { - String[] usera = getRuleVal("play_header").split("#"); - JSONObject strua = new JSONObject(); - for (String user : usera) { - String[] head = user.split("\\$"); - strua.put(head[0], " " + head[1]); - } - result.put("header", strua.toString()); - } - } else { - result.put("header", webheaders.toString()); - } - //视频格式识别 - if (webUrl.contains("#isVideo=true#") || Misc.isVideoFormat(webUrl)) { - if (webUrl.contains("#isVideo=true#")) { - webUrl = webUrl.replaceAll("#isVideo=true#", ""); - } - result.put("parse", 0); - result.put("playUrl", ""); - } else if (Misc.isVip(webUrl)) { - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", webUrl); - return result.toString(); - } else { - //不是视频就转嗅探 - result.put("parse", 1); - result.put("playUrl", ""); - } - result.put("url", webUrl); - return result.toString(); - } - //直接播放代码结束 - - //普通链接开始 - //分析mac链接解析 - boolean enMacPlayer = getRuleVal("Anal_MacPlayer").equals("1"); - String videoUrl = null; - String fromflag = null; - - if (enMacPlayer && enforceplay == false) { - try { - Document doc = Jsoup.parse(fetch(webUrl)); - Elements allScript = doc.select("script"); - for (int i = 0; i < allScript.size(); i++) { - String scContent = allScript.get(i).html().trim(); - if (scContent.startsWith("var player_")) { - int start = scContent.indexOf('{'); - int end = scContent.lastIndexOf('}') + 1; - String json = scContent.substring(start, end); - JSONObject player = new JSONObject(json); - String videoUrlTmp = player.getString("url"); - - fromflag = player.getString("from"); - if (player.has("encrypt")) { - int encrypt = player.getInt("encrypt"); - if (encrypt == 1) { - videoUrlTmp = URLDecoder.decode(videoUrlTmp); - } else if (encrypt == 2) { - videoUrlTmp = new String(Base64.decode(videoUrlTmp, Base64.DEFAULT)); - videoUrlTmp = URLDecoder.decode(videoUrlTmp); - } - } - videoUrl = videoUrlTmp; - break; - } - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - - - //视频不为null时进行处理解析 - if (videoUrl != null) { - if (Misc.isVip(videoUrl)) { // 使用jx:1 - try { - result.put("parse", 1); - result.put("jx", "1"); - result.put("url", videoUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } else if (fromflag.matches("duoduozy|ddzy")) { - - result.put("header", webheaders.toString()); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", webUrl); - return result.toString(); - } else if (Misc.isVideoFormat(videoUrl)) { - try { - result.put("parse", 0); - result.put("playUrl", ""); - result.put("url", videoUrl); - result.put("header", ""); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } - //视频不为null代码结束 - - result.put("header", webheaders.toString()); - result.put("parse", 1); - result.put("playUrl", ""); - result.put("url", webUrl); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - @Override - public boolean manualVideoCheck() { - fetchRule(); - if (getRuleVal("ManualSniffer").equals("1")) { - return true; - } else { - return false; - } - } - - //private String[] videoFormatList = getRuleVal("videoformat",".m3u8#.mp4#.flv").split("#"); - - @Override - public boolean isVideoFormat(String url) { - fetchRule(); - String[] videoFormatList = getRuleVal("VideoFormat", ".m3u8#.mp4#.flv#.mp3#.m4a").split("#"); - String[] videoFilterList = getRuleVal("VideoFilter", "=http#.html").split("#"); - url = url.toLowerCase(); - - if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) { - return false; - } - for (String format : videoFormatList) { - if (url.contains(format)) { - for (String videoFilter : videoFilterList) { - if (url.contains(videoFilter)) { - return false; - } - } - return true; - } - } - return false; - } - - @Override - public String searchContent(String key, boolean quick) { - try { - fetchRule(); - String webUrlTmp = getRuleVal("search_url").replaceAll("\\{wd\\}", key); - String webUrl = webUrlTmp.split(";")[0]; - String webContent = null; - - if (webUrlTmp.contains(";post")) { - OKCallBack.OKCallBackString callBack = new OKCallBack.OKCallBackString() { - - public void onResponse(String response) { - } - - @Override - protected void onFailure(Call call, Exception exc) { - } - }; - - String postbody = getRuleVal("sea_PtBody").replaceAll("\\{wd\\}", key).trim(); - if (!postbody.isEmpty() && postbody != null) { - if (postbody.startsWith("{") && postbody.endsWith("}")) { - JSONObject jsbody = new JSONObject(postbody); - OkHttpUtil.postJson(OkHttpUtil.defaultClient(), webUrl, jsbody.toString(), getHeaders(webUrl), callBack); - } else { - LinkedHashMap params = new LinkedHashMap(); - //params.put(postbody, key); - String[] userbody = postbody.split("&"); - for (String userbd : userbody) { - int loca = userbd.indexOf("="); - //int end = userbd.lastIndexOf('=') + 1; - //String[] bdhead = userbd.split("="); - params.put(userbd.substring(0, loca), userbd.substring(loca + 1)); - } - OkHttpUtil.post(OkHttpUtil.defaultClient(), webUrl, params, getHeaders(webUrl), callBack); - } - } else { - OkHttpUtil.post(OkHttpUtil.defaultClient(), webUrl, null, getHeaders(webUrl), callBack); - } - webContent = convertUnicodeToCh(callBack.getResult().replaceAll("\r|\n", "")); - } else { - webContent = convertUnicodeToCh(fetch(webUrl)); - } - - String mark = ""; - String pic = ""; - boolean ssmoshiJson = getRuleVal("search_mode").equals("0"); - boolean picneetproxy = getRuleVal("PicNeedProxy").equals("1"); - - JSONObject result = new JSONObject(); - JSONArray videos = new JSONArray(); - if (ssmoshiJson) { - JSONObject data = new JSONObject(webContent); - JSONArray vodArray = null; - String[] keylen = getRuleVal("jsonlist", "list").split("\\."); - if (keylen.length == 1) { - vodArray = data.getJSONArray(keylen[0]); - } else if (keylen.length == 2) { - vodArray = data.getJSONObject(keylen[0]).getJSONArray(keylen[1]); - } else if (keylen.length == 3) { - vodArray = data.getJSONObject(keylen[0]).getJSONObject(keylen[1]).getJSONArray(keylen[2]); - } - //JSONArray vodArray = data.getJSONArray(getRuleVal("jsonlist","list")); - for (int j = 0; j < vodArray.length(); j++) { - try { - JSONObject vod = vodArray.getJSONObject(j); - String name = vod.optString(getRuleVal("jsonname")).trim(); - String id = vod.optString(getRuleVal("jsonid")).trim(); - id = getRuleVal("cat_prefix", "") + id + getRuleVal("cat_suffix", ""); - if (!getRuleVal("jsonpic").isEmpty()) { - try { - pic = vod.optString(getRuleVal("jsonpic")).trim(); - pic = Misc.fixUrl(webUrl, pic); - if (picneetproxy) { - pic = fixCover(pic, webUrl); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - try { - mark = vod.optString(getRuleVal("jsonstitle")).trim(); - } catch (Exception e) { - SpiderDebug.log(e); - } - JSONObject v = new JSONObject(); - v.put("vod_id", name + "$$$" + pic + "$$$" + id); - v.put("vod_name", name); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } catch (Exception e) { - SpiderDebug.log(e); - } - } - } else { - String parseContent = webContent; - boolean shifouercijiequ = getRuleVal("sea_YN_twice").equals("1"); - if (shifouercijiequ) { - String jiequqian = getRuleVal("sea_twice_pre"); - String jiequhou = getRuleVal("sea_twice_suf"); - parseContent = subContent(webContent, jiequqian, jiequhou).get(0); - } - String jiequshuzuqian = getRuleVal("sea_arr_pre"); - String jiequshuzuhou = getRuleVal("sea_arr_suf"); - ArrayList jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou); - for (int i = 0; i < jiequContents.size(); i++) { - try { - String jiequContent = jiequContents.get(i); - String title = subContent(jiequContent, getRuleVal("sea_title").split("&&")[0], getRuleVal("sea_title").split("&&")[1]).get(0).replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - if (!getRuleVal("sea_pic").isEmpty()) { - try { - pic = subContent(jiequContent, getRuleVal("sea_pic").split("&&")[0], getRuleVal("sea_pic").split("&&")[1]).get(0); - pic = Misc.fixUrl(webUrl, pic); - if (picneetproxy) { - pic = fixCover(pic, webUrl); - } - } catch (Exception e) { - SpiderDebug.log(e); - } - } - String link = subContent(jiequContent, getRuleVal("sea_url").split("&&")[0], getRuleVal("sea_url").split("&&")[1]).get(0); - link = getRuleVal("search_prefix") + link + getRuleVal("search_suffix"); - try { - mark = subContent(jiequContent, getRuleVal("sea_subtitle").split("&&")[0], getRuleVal("sea_subtitle").split("&&")[1]).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", ""); - } catch (Exception e) { - SpiderDebug.log(e); - } - JSONObject v = new JSONObject(); - v.put("vod_id", title + "$$$" + pic + "$$$" + link); - v.put("vod_name", title); - v.put("vod_pic", pic); - v.put("vod_remarks", mark); - videos.put(v); - } catch (Throwable th) { - th.printStackTrace(); - break; - } - } - } - result.put("list", videos); - return result.toString(); - } catch ( - Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - protected String ext = null; - protected JSONObject rule = null; - - protected void fetchRule() { - if (rule == null) { - if (ext != null) { - try { - if (ext.startsWith("http")) { - String json = OkHttpUtil.string(ext, null); - rule = new JSONObject(json); - } else { - rule = new JSONObject(ext); - } - } catch (JSONException e) { - } - } - } - } - - protected String fetch(String webUrl) { - SpiderDebug.log(webUrl); - return OkHttpUtil.string(webUrl, getHeaders(webUrl)).replaceAll("\r|\n", ""); - } - - private static String convertUnicodeToCh(String str) { - Pattern pattern = Pattern.compile("(\\\\u(\\w{4}))"); - Matcher matcher = pattern.matcher(str); - - // 迭代,将str中的所有unicode转换为正常字符 - while (matcher.find()) { - String unicodeFull = matcher.group(1); // 匹配出的每个字的unicode,比如\u67e5 - String unicodeNum = matcher.group(2); // 匹配出每个字的数字,比如\u67e5,会匹配出67e5 - - // 将匹配出的数字按照16进制转换为10进制,转换为char类型,就是对应的正常字符了 - char singleChar = (char) Integer.parseInt(unicodeNum, 16); - - // 替换原始字符串中的unicode码 - str = str.replace(unicodeFull, singleChar + ""); - } - return str; - } - - private String getRuleVal(String key, String defaultVal) { - String v = rule.optString(key); - if (v.isEmpty() || v.equals("空") || v.equals("&&")) - return defaultVal; - return v; - } - - private String getRuleVal(String key) { - return getRuleVal(key, ""); - } - - private ArrayList subContent(String content, String startFlag, String endFlag) { - ArrayList result = new ArrayList<>(); - if (startFlag.isEmpty() && endFlag.isEmpty()) { - result.add(content); - return result; - } - try { - Pattern pattern = Pattern.compile(escapeExprSpecialWord(startFlag) + "(.*?)" + escapeExprSpecialWord(endFlag)); - Matcher matcher = pattern.matcher(content); - while (matcher.find()) { - result.add(matcher.group(1).trim()); - } - } catch (Throwable th) { - th.printStackTrace(); - } - if (result.isEmpty()) result.add(""); - return result; - } - - public static String escapeExprSpecialWord(String keyword) { - if (!keyword.isEmpty()) { - String[] fbsArr = {"\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|"}; - for (String key : fbsArr) { - if (keyword.contains(key)) { - keyword = keyword.replace(key, "\\" + key); - } - } - } - return keyword; - } - - protected String fixCover(String cover, String site) { - try { - return "proxy://do=XYQBiu&site=" + site + "&pic=" + cover; - } catch (Exception e) { - SpiderDebug.log(e); - } - return cover; - } - - private static HashMap XYQPicHeader = null; - - public static Object[] loadPic(Map prmap) { - try { - //pic = new String(Base64.decode(pic, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8"); - String site = prmap.get("site"); - String pic = prmap.get("pic"); - - if (XYQPicHeader == null) { - XYQPicHeader = new HashMap<>(); - XYQPicHeader.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"); - XYQPicHeader.put("referer", site); - } - OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() { - @Override - protected void onFailure(Call call, Exception e) { - - } - - @Override - protected void onResponse(Response response) { - - } - }; - OkHttpUtil.get(OkHttpUtil.defaultClient(), pic, null, XYQPicHeader, callBack); - if (callBack.getResult().code() == 200) { - Headers headers = callBack.getResult().headers(); - String type = headers.get("Content-Type"); - if (type == null) { - type = "application/octet-stream"; - } - Object[] result = new Object[3]; - result[0] = 200; - result[1] = type; - System.out.println(pic); - System.out.println(type); - result[2] = callBack.getResult().body().byteStream(); - return result; - } - } catch (Throwable th) { - th.printStackTrace(); - } - return null; - } - - private String jumpbtwaf(String webUrl, String html) { - for (int i = 0; i < 3; i++) { - if (html.contains("检测中") && html.contains("跳转中") && html.contains("btwaf")) { - String btwaf = subContent(html, "btwaf=", "\"").get(0); - String bturl = webUrl + "?btwaf=" + btwaf; - - Map> cookies = new HashMap<>(); - OkHttpUtil.string(bturl, sHeaders(webUrl), cookies); - for (Map.Entry> entry : cookies.entrySet()) { - if (entry.getKey().equals("set-cookie") || entry.getKey().equals("Set-Cookie")) { - btcookie = TextUtils.join(";", entry.getValue()); - break; - } - } - html = convertUnicodeToCh(fetch(webUrl)); - } - if (!html.contains("检测中") && !html.contains("btwaf")) { - return html; - } - } - return null; - } - - private String jumpbtwaf1(String webUrl, String html) { - for (int i = 0; i < 3; i++) { - if (html.contains("检测中") && html.contains("跳转中") && html.contains("btwaf")) { - String btwaf = subContent(html, "btwaf=", "\"").get(0); - String bturl = webUrl + "?btwaf=" + btwaf; - - Map> cookies = new HashMap<>(); - OkHttpUtil.string(bturl, getHeaders(webUrl), cookies); - for (Map.Entry> entry : cookies.entrySet()) { - if (entry.getKey().equals("set-cookie") || entry.getKey().equals("Set-Cookie")) { - btcookie = TextUtils.join(";", entry.getValue()); - break; - } - } - html = convertUnicodeToCh(fetch(webUrl)); - } - if (!html.contains("检测中") && !html.contains("btwaf")) { - return html; - } - } - return null; - } -} \ No newline at end of file diff --git a/TVBox_Java/加进去报错的Java源代码/Yisou.java b/TVBox_Java/加进去报错的Java源代码/Yisou.java deleted file mode 100644 index fb74e3f..0000000 --- a/TVBox_Java/加进去报错的Java源代码/Yisou.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import com.github.catvod.crawler.Spider; -import com.github.catvod.crawler.SpiderDebug; -import com.github.catvod.utils.okhttp.OkHttpUtil; -import org.json.JSONArray; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class Yisou extends Spider { - private static final Pattern aliyun = Pattern.compile("(https://www.aliyundrive.com/s/[^\"]+)"); - private PushAgent yisou; - - - public String detailContent(List list) { - try { - return yisou.detailContent(list); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } - - - public void init(Context context, String str) { - super.init(context, str); - yisou = new PushAgent(); - yisou.init(context,str); - } - - - public String playerContent(String str, String str2, List list) { - return yisou.playerContent(str, str2, list); - } - - private Pattern regexVid = Pattern.compile("(\\S+)"); - public String searchContent(String key, boolean quick) { - try { - if (quick) - return ""; - String url = "https://yiso.fun/info?searchKey=" + URLEncoder.encode(key)+"&from=ali"; - Document doc = Jsoup.parse(OkHttpUtil.string(url, null)); - JSONObject result = new JSONObject(); - - JSONArray videos = new JSONArray(); - // Elements list = doc.select("ul.newsList>li>div.li_con"); - Elements list = doc.select("div.col-md-8>div.row-cards"); - for (int i = 0; i < list.size(); i++) { - Element vod = list.get(i); - String title = ""; - Elements titlelist = vod.select("h3.card-title>a>span"); - for(int k = 0; k < titlelist.size(); k++){ - title+=titlelist.get(k).text() - } - String cover = ""; - String remark = vod.selectFirst("div.align-items-center>p.text-muted").text(); - Matcher matcher = regexVid.matcher(vod.select("h3.card-title>a").attr("href")); - if (!matcher.find()) - continue; - String id = matcher.group(1); - JSONObject v = new JSONObject(); - //v.put("vod_id", vod.select("h3.card-title>a").attr("href")); - v.put("vod_id", id); - v.put("vod_name", title); - v.put("vod_pic", "https://inews.gtimg.com/newsapp_bt/0/13263837859/1000"); - v.put("vod_remarks", remark); - videos.put(v); - } - - result.put("list", videos); - return result.toString(); - } catch (Exception e) { - SpiderDebug.log(e); - } - return ""; - } -} \ No newline at end of file diff --git a/TVBox_Java/加进去报错的Java源代码/kansj.java b/TVBox_Java/加进去报错的Java源代码/kansj.java deleted file mode 100644 index 1a4a0cc..0000000 --- a/TVBox_Java/加进去报错的Java源代码/kansj.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.github.catvod.spider; - -import android.content.Context; -import com.github.catvod.crawler.Spider; -import com.github.catvod.spider.merge.Ms; -import com.github.catvod.spider.merge.W; -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.List; -import org.json.JSONArray; -import org.json.JSONObject; - -/* loaded from: classes.dex */ -public class KanSJ extends Spider { - private static short[] $ = {648, 660, 660, 656, 730, 719, 719, 651, 641, 654, 660, 662, 718, 666, 659, 665, 666, 643, 665, 718, 643, 654, 2987, 2991, 2977, 2944, 2987, 2983, 3030, 2977, 2981, 2997, 2967, 2977, 2997, 2991, 2948, 3029, 2978, 2999, 2979, 2980, 2983, 2999, 2995, 2983, 2983, 3026, 2977, 2984, 2983, 2978, 2981, 2980, 2959, 2999, 2989, 2980, 2945, 2999, 2978, 2967, 2948, 2999, 3028, 2983, 2985, 3031, 2979, 2958, 2975, 2951, 2966, 3024, 2976, 2955, 2986, 2964, 2957, 2967, 2956, 2958, 2965, 2967, 2966, 2975, 2967, 2985, 2986, 3017, 2987, 3039, 2996, 2962, 2975, 2962, 2996, 2961, 2967, 2996, 2967, 2960, 3017, 3007, 2972, 2947, 2967, 3028, 3031, 2955, 2994, 2953, 2976, 2963, 2988, 3029, 2975, 2979, 3039, 2997, 2991, 2951, 2984, 3031, 2958, 3007, 2958, 2967, 3025, 3004, 2997, 3007, 2952, 2993, 2958, 2958, 2960, 2956, 2961, 2980, 3006, 3006, 2992, 2990, 2953, 3025, 2945, 2997, 2996, 3017, 2983, 2980, 2987, 2981, 2957, 2996, 2997, 2996, 2987, 2986, 2979, 2984, 2984, 2946, 2965, 3027, 2972, 3007, 2983, 3038, 2966, 2992, 2974, 2974, 2998, 2987, 2986, 2993, 2995, 3006, 2965, 2946, 2975, 2953, 2957, 3004, 2954, 2965, 2991, 2996, 2976, 3028, 3006, 2985, 2974, 2972, 3038, 2985, 2954, 3024, 2972, 2961, 2967, 2995, 2996, 2957, 2966, 3039, 2994, 2958, 2988, 2980, 2978, 2963, 3026, 2975, 2955, 3039, 3031, 3004, 3006, 2958, 3026, 2976, 2945, 2954, 2967, 2999, 2997, 3028, 2981, 2961, 2991, 2978, 2983, 2999, 2983, 2980, 2388, 2384, 2384, 2394, 2429, 2430, 2384, 2395, 2392, 2397, 2392, 2391, 2395, 2430, 2418, 2408, 2417, 2418, 2416, 2398, 2336, 2414, 2345, 2395, 2392, 2376, 2396, 2399, 2392, 2392, 2378, 2394, 2392, 2420, 2392, 2414, 2430, 2430, 2387, 2426, 2392, 2430, 2396, 2392, 2392, 2422, 2398, 2395, 2392, 2390, 2409, 2413, 2397, 2368, 2392, 2350, 2380, 2378, 2385, 2387, 2408, 2423, 2422, 2382, 2368, 2412, 2412, 2378, 2408, 2390, 2398, 2400, 2408, 2423, 2386, 2422, 2349, 2415, 2337, 2403, 2344, 2398, 2346, 2386, 2344, 2385, 2394, 2409, 2398, 2408, 2358, 2336, 2419, 2391, 2351, 2411, 2427, 2382, 2371, 2390, 2430, 2382, 2349, 2423, 2431, 2384, 2381, 2344, 2384, 2417, 2422, 2346, 2382, 2399, 2416, 2398, 2411, 2413, 2421, 2387, 2416, 2429, 2424, 2398, 2398, 2354, 2377, 2392, 2399, 2429, 2429, 2380, 2428, 2419, 2412, 2395, 2387, 2385, 2337, 2392, 2396, 2414, 2386, 2379, 2399, 2387, 2396, 2414, 2410, 2376, 2345, 2344, 2347, 2403, 2423, 2391, 2430, 2397, 2400, 2421, 2369, 2385, 2396, 2337, 2414, 2413, 2371, 2379, 2428, 2401, 2346, 2386, 2416, 2379, 2420, 2382, 2414, 2417, 2396, 2369, 2371, 2426, 2350, 2385, 2377, 2414, 2351, 2369, 2411, 2377, 2394, 2409, 2379, 2398, 2378, 2423, 2344, 2390, 2396, 2418, 2396, 2390, 2350, 2419, 2386, 2427, 2346, 2383, 2421, 2428, 2385, 2430, 2382, 2394, 2382, 2409, 2395, 2389, 2368, 2389, 2392, 2430, 2388, 2395, 2392, 2392, 2396, 2394, 2430, 2368, 2395, 2383, 2412, 2412, 2385, 2422, 2399, 2418, 2418, 2351, 2368, 2376, 2381, 2390, 2391, 2400, 2428, 2431, 2346, 2377, 2428, 2381, 2351, 2422, 2385, 2348, 2392, 2409, 2417, 2371, 2398, 2431, 2401, 2394, 2344, 2409, 2344, 2376, 2376, 2417, 2429, 2346, 2424, 2415, 2388, 2337, 2427, 2344, 2427, 2385, 2401, 2418, 2430, 2395, 2385, 2337, 2398, 2416, 2349, 2431, 2350, 2395, 2413, 2424, 2385, 2394, 2371, 2416, 2427, 2399, 2368, 2428, 2371, 2429, 2409, 2387, 2431, 2384, 2429, 2346, 2377, 2399, 2383, 2408, 2416, 2384, 2389, 2379, 2347, 2411, 2428, 2427, 2387, 2348, 2409, 2411, 2387, 2409, 2399, 2400, 2431, 2385, 2421, 2346, 2379, 2383, 2408, 2380, 2371, 2336, 2392, 2403, 2377, 2412, 2420, 2385, 2379, 2379, 2397, 2348, 2387, 2384, 2394, 2351, 2368, 2392, 2350, 2415, 2395, 2394, 2430, 2348, 2350, 2347, 2349, 2381, 2337, 2383, 2428, 2430, 2336, 2394, 2401, 2381, 2429, 2385, 2403, 2400, 2427, 2368, 2389, 2394, 2414, 2369, 2424, 2397, 2368, 2399, 2381, 2421, 2382, 2345, 2358, 2351, 2423, 2423, 2417, 2344, 2430, 2377, 2422, 2376, 2387, 2395, 2392, 2377, 2408, 2427, 2408, 2348, 2430, 2418, 2369, 2394, 2417, 2354, 2422, 2358, 2397, 2411, 2409, 2381, 2350, 2418, 2408, 2416, 2424, 2347, 2426, 2381, 2412, 2423, 2349, 2348, 2369, 2388, 2394, 2420, 2368, 2381, 2416, 2386, 2378, 2417, 2419, 2420, 2388, 2412, 2419, 2384, 2383, 2377, 2394, 2354, 2358, 2390, 2349, 2346, 2424, 2396, 2411, 2379, 2409, 2412, 2389, 2427, 2428, 2416, 2415, 2401, 2384, 2351, 2395, 2336, 2369, 2408, 2392, 2337, 2349, 2344, 2420, 2378, 2377, 2427, 2337, 2412, 2381, 2380, 2409, 2427, 2410, 2394, 2376, 2376, 2397, 2415, 2428, 2396, 2394, 2401, 2421, 2386, 2431, 2409, 2408, 2345, 2344, 2408, 2358, 2358, 2401, 2392, 2369, 2427, 2346, 2421, 2389, 2354, 2428, 2354, 2377, 2350, 2397, 2369, 2344, 2337, 2382, 2337, 2428, 2418, 2354, 2421, 2389, 2413, 2369, 2422, 2380, 2397, 2417, 2400, 2386, 2396, 2395, 2347, 2426, 2351, 2403, 2385, 2390, 2336, 2430, 2351, 2392, 2358, 2351, 2431, 2385, 2430, 2401, 2347, 2397, 2387, 2385, 2344, 2354, 2415, 2423, 2368, 2420, 2419, 2385, 2416, 2416, 2385, 2347, 2376, 2410, 2422, 2377, 2401, 2392, 2418, 2396, 2392, 2420, 2391, 2424, 2379, 2400, 2345, 2389, 2348, 2421, 2371, 2381, 2390, 2409, 2378, 2388, 2395, 2350, 2348, 2351, 2397, 2416, 2414, 2386, 2431, 2430, 2421, 2391, 2336, 2392, 2394, 2398, 2421, 2430, 2428, 2382, 2391, 2349, 2347, 2385, 2384, 2391, 2430, 2389, 2414, 2423, 2420, 2416, 2337, 2397, 2428, 2358, 2412, 2383, 2348, 2403, 2384, 2354, 2424, 2386, 2378, 2427, 2381, 2421, 2411, 2388, 2399, 2398, 2399, 2350, 2336, 2426, 2336, 2409, 2390, 2416, 2371, 2380, 2431, 2348, 2383, 2369, 2347, 2412, 2345, 2354, 2414, 2387, 2392, 2395, 2418, 2351, 2398, 2429, 2424, 2427, 2378, 2423, 2380, 2427, 2381, 2411, 2378, 2390, 2337, 2414, 2415, 2345, 2344, 2394, 2379, 2422, 2415, 2349, 2418, 2381, 2377, 2387, 2368, 2392, 2427, 2379, 2401, 2399, 2348, 2418, 2349, 2384, 2428, 2379, 2395, 2368, 2384, 2401, 2422, 2419, 2418, 2347, 2427, 2423, 2398, 2389, 2378, 2396, 2368, 2382, 2411, 2350, 2388, 2389, 2354, 2416, 2426, 2411, 2347, 2426, 2348, 2382, 2391, 2337, 2371, 2376, 2382, 2418, 2428, 2388, 2403, 2426, 2417, 2395, 2346, 2378, 2388, 2384, 2376, 2387, 2392, 2397, 2398, - 2403, 2383, 2351, 2379, 2385, 2415, 2401, 2358, 2351, 2397, 2394, 2403, 2389, 2415, 2378, 2411, 2413, 2385, 2380, 2423, 2400, 2431, 2386, 2400, 2394, 2417, 2344, 2336, 2413, 2394, 2348, 2417, 2401, 2400, 2383, 2400, 2412, 2369, 2388, 2392, 2421, 2386, 2429, 2376, 2384, 2403, 2379, 2378, 2416, 2381, 2384, 2390, 2416, 2379, 2368, 2358, 2348, 2385, 2414, 2415, 2383, 2416, 2337, 2371, 2394, 2383, 2415, 2368, 2420, 2385, 2376, 2350, 2423, 2345, 2369, 2398, 2368, 2399, 2429, 2387, 2346, 2410, 2350, 2376, 2340, 2340, 2346, 2350, 2336, 2305, 2346, 2342, 2391, 2336, 2340, 2356, 2326, 2336, 2356, 2350, 2309, 2388, 2339, 2358, 2338, 2341, 2342, 2358, 2354, 2342, 2342, 2387, 2336, 2345, 2342, 2339, 2340, 2341, 2318, 2358, 2348, 2341, 2304, 2358, 2340, 2325, 2318, 2315, 2323, 2342, 2312, 2348, 2390, 2345, 2319, 2305, 2348, 2385, 2355, 2327, 2317, 2318, 2327, 2388, 2322, 2358, 2304, 2399, 2384, 2341, 2399, 2336, 2313, 2305, 2380, 2314, 2376, 2348, 2305, 2384, 2352, 2333, 2380, 2312, 2359, 2324, 2305, 2355, 2305, 2316, 2327, 2340, 2327, 2327, 2325, 2306, 2358, 2385, 2317, 2390, 2319, 2339, 2307, 2359, 2309, 2342, 2309, 2319, 2399, 2384, 2380, 2318, 2322, 2324, 2333, 2340, 2307, 2304, 2356, 2326, 2309, 2314, 2376, 2335, 2325, 2399, 2387, 2359, 2337, 2350, 2308, 2352, 2323, 2337, 2386, 2313, 2313, 2307, 2356, 2388, 2325, 2335, 2347, 2326, 2312, 2398, 2338, 2346, 2304, 2339, 2325, 2340, 2380, 2334, 2355, 2307, 2306, 2353, 2336, 2340, 2385, 2317, 2316, 2322, 2399, 2315, 2325, 2398, 2337, 2304, 2355, 2359, 2357, 2305, 2380, 2347, 2305, 2346, 2357, 2385, 2386, 2347, 2306, 2324, 2367, 2315, 2317, 2389, 2307, 2319, 2314, 2350, 2398, 2359, 2339, 2376, 2335, 2337, 2312, 2323, 2358, 2338, 2376, 2366, 2327, 2324, 2340, 2346, 2306, 2312, 2321, 2353, 2390, 2333, 2333, 2320, 2350, 2339, 2342, 2358, 2342, 2341, 7332, 7328, 7328, 7338, 7309, 7326, 7328, 7339, 7336, 7341, 7336, 7335, 7339, 7310, 7298, 7320, 7297, 7298, 7296, 7342, 7376, 7326, 7385, 7339, 7336, 7352, 7340, 7343, 7336, 7336, 7354, 7338, 7336, 7300, 7340, 7326, 7310, 7310, 7331, 7309, 7336, 7310, 7340, 7336, 7336, 7302, 7342, 7339, 7336, 7330, 7324, 7330, 7358, 7385, 7338, 7310, 7323, 7356, 7387, 7343, 7377, 7323, 7321, 7334, 7300, 7334, 7330, 7303, 7308, 7388, 7338, 7341, 7315, 7322, 7329, 7326, 7304, 7309, 7366, 7391, 7307, 7377, 7321, 7366, 7325, 7307, 7353, 7391, 7310, 7362, 7313, 7376, 7335, 7362, 7354, 7298, 7330, 7300, 7300, 7325, 7388, 7341, 7320, 7353, 7358, 7340, 7335, 7385, 7376, 7322, 7339, 7324, 7329, 7315, 7327, 7391, 7330, 7391, 7315, 7332, 7331, 7387, 7339, 7330, 7321, 7324, 7307, 7366, 7342, 7327, 7315, 7310, 7377, 7356, 7297, 7313, 7304, 7385, 7345, 7300, 7308, 7309, 7384, 7333, 7308, 7327, 7340, 7324, 7320, 7299, 7385, 7352, 7312, 7336, 7334, 7322, 7333, 7390, 7331, 7335, 7384, 7388, 7356, 7344, 7333, 7320, 7334, 7354, 7390, 7312, 7358, 7327, 7385, 7358, 7339, 7332, 7376, 7343, 7366, 7389, 7325, 7377, 7313, 7329, 7323, 7298, 7325, 7391, 7313, 7308, 7358, 7353, 7347, 7387, 7342, 7344, 7299, 7385, 7377, 7353, 7366, 7340, 7358, 7296, 7384, 7336, 7357, 7376, 7296, 7300, 7326, 7328, 7313, 7391, 7296, 7376, 7345, 7345, 7353, 7353, 7336, 7310, 7332, 7339, 7336, 7336, 7340, 7338, 7310, 7344, 7339, 7389, 7343, 7322, 7327, 7390, 7358, 7302, 7341, 7389, 7303, 7330, 7359, 7302, 7324, 7340, 7384, 7311, 7303, 7384, 7339, 7321, 7326, 7384, 7312, 7299, 7308, 7334, 7332, 7301, 7389, 7311, 7356, 7355, 7343, 7302, 7307, 7300, 7340, 7330, 7333, 7391, 7301, 7340, 7390, 7298, 7312, 7308, 7299, 7329, 7352, 7324, 7384, 7307, 7377, 7304, 7389, 7310, 7312, 7387, 7301, 7357, 7329, 7306, 7357, 7352, 7336, 7341, 7325, 7341, 7331, 7356, 7298, 7333, 7320, 7341, 7309, 7311, 7315, 7389, 7311, 7309, 7332, 7333, 7312, 7389, 7299, 7332, 7301, 7366, 7338, 7327, 7387, 7343, 7331, 7385, 7330, 7386, 7315, 7330, 7345, 7352, 7330, 7359, 7297, 7332, 7321, 7357, 7306, 7303, 7309, 7333, 7333, 7299, 7298, 7309, 7355, 7327, 7344, 7312, 7323, 7309, 7300, 7312, 7335, 7355, 7307, 7358, 7386, 7347, 7310, 7297, 7332, 7326, 7306, 7326, 7335, 7323, 7300, 7298, 7344, 7326, 7352, 7335, 7356, 7315, 7390, 7312, 7386, 7338, 7327, 7311, 7385, 7362, 7321, 7335, 7329, 7297, 7340, 7306, 7298, 7390, 7353, 7347, 7339, 7306, 7386, 7301, 7377, 7324, 7326, 7352, 7331, 7339, 7336, 7335, 7302, 7352, 7386, 7296, 7321, 7376, 7327, 7304, 7377, 7302, 7353, 7298, 7313, 7342, 7391, 7377, 7296, 7354, 7303, 7359, 7315, 7341, 7336, 7354, 7303, 7320, 7334, 7342, 7341, 7309, 7310, 7341, 7341, 7376, 7307, 7328, 7312, 7327, 7304, 7385, 7354, 7390, 7333, 7385, 7326, 7296, 7313, 7385, 7306, 7297, 7306, 7312, 7385, 7385, 7338, 7298, 7300, 7302, 7355, 7390, 7322, 7323, 7296, 7327, 7353, 7355, 7313, 7297, 7332, 7377, 7313, 7339, 7320, 7391, 7296, 7353, 7308, 7358, 7332, 7300, 7302, 7345, 7353, 7313, 7356, 7338, 7352, 7352, 7341, 7331, 7344, 7347, 7328, 7354, 7331, 7376, 7389, 7390, 7385, 7334, 7359, 7323, 7343, 7359, 7302, 7387, 7389, 7324, 7325, 7299, 7362, 7385, 7299, 7324, 7390, 7307, 7311, 7336, 7307, 7343, 7341, 7320, 7307, 7387, 7324, 7343, 7313, 7312, 7332, 7391, 7311, 7345, 7330, 7300, 7358, 7308, 7308, 7335, 7341, 7333, 7331, 7328, 7327, 7354, 7352, 7386, 7308, 7311, 7301, 7391, 7354, 7331, 7328, 7344, 7331, 7310, 7387, 7297, 7362, 7321, 7345, 7353, 7386, 7387, 7354, 7309, 7330, 7331, 7341, 7335, 7297, 7336, 7339, 7357, 7336, 7298, 7339, 7309, 7339, 7311, 7306, 7352, 7329, 7385, 7358, 7322, 7298, 7390, 7301, 7329, 7321, 7323, 7359, 7322, 7310, 7344, 7307, 7347, 7299, 7342, 7331, 7355, 7325, 7339, 7345, 7330, 7384, 7331, 7330, 7307, 7385, 7387, 7366, 7307, 7390, 7366, 7356, 7335, 7310, 7362, 7339, 7310, 7359, 7357, 7342, 7386, 7358, 7356, 7338, 7309, 7384, 7324, 7347, 7352, 7301, 7388, 7345, 7331, 7376, 7344, 7336, 7389, 7343, 7331, 7334, 7327, 7303, 7312, 7325, 7385, 7315, 7389, 7336, 7310, 7355, 7297, 7359, 7331, 7297, 7321, 7332, 7301, 7336, 7298, 7340, 7336, 7303, 7298, 7315, 7388, 7302, 7313, 7345, 7376, 7388, 7324, 7384, 7309, 7362, 7300, 7339, 7335, 7296, 7385, 7300, 7315, 7300, 7308, 7334, 7343, 7352, 7329, - 7355, 7357, 7309, 7302, 7321, 7324, 7315, 7334, 7320, 7333, 7341, 7297, 7385, 7322, 7366, 7312, 7355, 7327, 7313, 7329, 7388, 7384, 7324, 7386, 7345, 7344, 7296, 7390, 7376, 7330, 7326, 7308, 7356, 7390, 7341, 7341, 7302, 7355, 7313, 7307, 7353, 7306, 7340, 7347, 7343, 7342, 7313, 7330, 7328, 7321, 7300, 7341, 7354, 7385, 7331, 7312, 7301, 7384, 7296, 7326, 7331, 7339, 7336, 7328, 7334, 7341, 7296, 7391, 7354, 7387, 7353, 7359, 7296, 7302, 7302, 7358, 7304, 7312, 7326, 7376, 7362, 7301, 7353, 7376, 7321, 7327, 7320, 7334, 7333, 7336, 7340, 7326, 7328, 7366, 7315, 7334, 7386, 7388, 7296, 7356, 7312, 7330, 7320, 7334, 7377, 7323, 7296, 7315, 7311, 7386, 7343, 7343, 7329, 7321, 7376, 7344, 7321, 7315, 7335, 7315, 7324, 7310, 7313, 7345, 7312, 7301, 7306, 7333, 7386, 7385, 7310, 7388, 7354, 7315, 7377, 7308, 7359, 7356, 7328, 7320, 7311, 7299, 7304, 7355, 7320, 7306, 7354, 7338, 7310, 7380, 7912, 2474, 2444, 2458, 2445, 2514, 2494, 2456, 2458, 2449, 2443, 1998, 2027, 2022, 2044, 2019, 2017, 1957, 1976, 1956, 1979, 1956, 1978, 1962, 1954, 1990, 2019, 2020, 2047, 2034, 1969, 1962, 2015, 1969, 1962, 1995, 2020, 2030, 2040, 2021, 2019, 2030, 1962, 1979, 1978, 1969, 1962, 2010, 1992, 1999, 1991, 1978, 1978, 1962, 1992, 2047, 2019, 2022, 2030, 1957, 2011, 1985, 2011, 1979, 1956, 1979, 1971, 1978, 1971, 1979, 1970, 1956, 1978, 1978, 1979, 1955, 7368, 7377, 7386, 7393, 7372, 7387, 7379, 7391, 7372, 7381, 7373, 3653, 3676, 3671, 3692, 3651, 3674, 3664, 426, 431, 427, 431, 434, 2808, 2785, 2794, 2769, 2784, 2799, 2787, 2795, 1500, 1485, 1483, 1481, 1461, 1452, 1447, 1436, 1450, 1447, 4758, 4743, 4737, 4739, 4741, 4745, 4755, 4744, 4754, 110, 117, 110, 123, 118, 1261, 1256, 1266, 1269, 5796, 5803, 5798, 5812, 5812, 13384, 13396, 13392, 13379, 13679, 13666, 13675, 13694, 7533, 7550, 7529, 7533, 14304, 14334, 14335, 14327, 14335, 14251, 14250, 14267, 14254, 14246, 14243, 14305, 14271, 14247, 14271, 14304, 14254, 14271, 14271, 14304, 14265, 14246, 14251, 14250, 14240, 14320, 14313, 14267, 14246, 14251, 14322, 3727, 3786, 3781, 3784, 3802, 3802, 3732, 13109, 13170, 13153, 13174, 13170, 13102, 1531, 1444, 1464, 1468, 1455, 1504, 921, 975, 984, 898, -1690, -1665, -1676, -1713, -1696, -1668, -1679, -1687, -1713, -1691, -1694, -1668, -4962, -4985, -4980, -4937, -4968, -4988, -4983, -4975, -4937, -4978, -4966, -4985, -4987, -16281, -16258, -16267, -16306, -16270, -16258, -16257, -16283, -16268, -16257, -16283, -4343, -4336, -4325, -4320, -4325, -4330, -4339, -4326, -4324, -4341, -4336, -4339, -15761, -15754, -15747, -15802, -15752, -15750, -15763, -15754, -15765, -3997, -3974, -3983, -4022, -3993, -3984, -3976, -3980, -3993, -3970, -3994, -2459, -2436, -2441, -2484, -2446, -2463, -2442, -2446, -3375, -3384, -3389, -3336, -3362, -3390, -3386, -3371, -7980, -7987, -7994, -7939, -7982, -7989, -7999, -6424, -6415, -6406, -6463, -6416, -6401, -6413, -6405, -5794, -5817, -5812, -5769, -5823, -5812, -7819, -7824, -7830, -7827, -5561, -5543, -5544, -5552, -5544, -5604, -5602, -5562, -5608, -5632, -5608, -5561, -5608, -5606, -5625, -5602, -5631, -5620, -5619, -5561, -5602, -5625, -5620, -5561, -5545, -5623, -5621, -5547, -5620, -5619, -5604, -5623, -5631, -5628, -5554, -5631, -5620, -5605, -5547, -6431, -6420, -6427, -6416, -6454, -6405, -6412, -6408, -6416, -14907, -14884, -14889, -14868, -14896, -14881, -14894, -14912, -14912, -6217, -6204, -6498, 32013, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32103, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 2147, 8743, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32100, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 2147, -2928, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32101, 32102, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 6323, -5441, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32100, 32111, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 5745, 728, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32101, 32101, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 4985, 11942, 12081, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32101, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 938, -212, 32116, 32043, 32122, 32045, 32116, 32034, 32047, 32038, 32051, 32009, 32063, 32050, 32116, 32108, 32116, 32098, 32116, 32122, 32116, 32034, 32047, 32038, 32051, 32009, 32056, 32055, 32059, 32051, 32116, 32108, 32116, 12286, 4733, 32116, 32043, 32011, 29529, 29526, 29531, 29513, 29513, 26445, 26388, 26375, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12970, 13649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12970, 13649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 5383, 2035, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 5383, 2035, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1894, 1824, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1894, 1824, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 10346, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 10346, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 7911, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 7911, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13649, 2035, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13649, 2035, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1326, 10687, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1326, 10687, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5040, 13340, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5040, 13340, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 5529, 6236, 26388, 26394, 26388, 26432, - 26388, 26380, 26388, 5529, 6236, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 4621, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 4621, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15985, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15985, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3152, 10390, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3152, 10390, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13988, -3745, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13988, -3745, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 156, 1326, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 156, 1326, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1894, 1824, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1894, 1824, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1946, 4775, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1946, 4775, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2044, 1964, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2044, 1964, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6649, 13902, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6649, 13902, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3996, 275, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3996, 275, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 689, -6836, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 689, -6836, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14488, 4611, 14407, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14488, 4611, 14407, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13522, -4109, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13522, -4109, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13488, 13508, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13488, 13508, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5914, 13726, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5914, 13726, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13994, 103, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13994, 103, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13833, 7635, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13833, 7635, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14003, 12294, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 15889, -3728, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15889, -3728, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, -337, 2329, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -337, 2329, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 13510, 2376, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13510, 2376, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6328, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6328, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3043, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3043, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -6713, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -6713, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, 26, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, 26, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3873, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3873, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14465, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14465, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3014, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3014, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13382, 14736, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13382, 14736, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1593, 15889, 13599, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1593, 15889, 13599, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -4535, 5339, 5487, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -4535, 5339, 5487, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13718, 1481, 15889, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13718, 1481, 15889, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, - 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26443, 26475, 26443, 26475, 26394, 26388, 26372, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13522, -4109, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13522, -4109, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1326, 10687, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1326, 10687, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3996, 275, 14144, 14329, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3996, 275, 14144, 14329, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12970, 13649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12970, 13649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15488, 14747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15488, 14747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 5529, 6236, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 5529, 6236, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 10346, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 10346, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15985, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15985, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13649, 2035, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13649, 2035, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13488, 13508, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13488, 13508, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6649, 13902, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6649, 13902, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10583, 103, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10583, 103, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2035, 345, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2035, 345, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12912, 1326, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12912, 1326, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6247, 13649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6247, 13649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14003, 12294, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 15889, -3728, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15889, -3728, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 13510, 2376, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10523, 12747, 13510, 2376, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, -337, 2329, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10523, 12747, -337, 2329, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3873, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -3873, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, 26, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, 26, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6328, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6328, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3014, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3014, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -6713, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -6713, 12747, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 646, 13718, 12375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 646, 13718, 12375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, - 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26443, 26475, 26443, 26475, 26394, 26388, 26370, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2035, 1577, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2035, 1577, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 7911, 14669, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 7911, 14669, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6107, -4234, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6107, -4234, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1182, 4912, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1182, 4912, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 808, 7207, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 808, 7207, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13988, -3745, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13988, -3745, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -7381, -6977, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -7381, -6977, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3863, 12763, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3863, 12763, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13726, 10346, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13726, 10346, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 12, 1326, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 12, 1326, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5914, 13726, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5914, 13726, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 1326, 10687, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 1326, 10687, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15143, 14658, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15143, 14658, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 15143, 15941, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 15143, 15941, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 7688, 10284, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 7688, 10284, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13481, 13613, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13481, - 13613, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10628, 15462, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 10628, 15462, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 4604, 332, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 4604, 332, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13703, 14561, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13703, 14561, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 10523, 12747, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, 26, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, 26, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3089, 6328, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3089, 6328, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 13888, 10720, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 13888, 10720, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26374, 26374, 26388, 26443, 26475, 26394, 26388, 26373, 26388, 26380, 26477, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26434, 26447, 26438, 26451, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 6989, 12477, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -2241, 7926, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -2241, 7926, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2035, 1577, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2035, 1577, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -4983, -5314, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -4983, -5314, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 923, 1427, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 923, 1427, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 755, 2318, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 755, 2318, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -3899, 10598, 26388, 26394, 26388, 26432, 26388, 26380, 26388, - -3899, 10598, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6328, -23, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6328, -23, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 6556, 15528, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 6556, 15528, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 452, -6836, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 452, -6836, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 4649, 2573, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 4649, 2573, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2318, 1337, 10660, 13726, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2318, 1337, 10660, 13726, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, -5612, 6649, 26388, 26394, 26388, 26432, 26388, 26380, 26388, -5612, 6649, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2932, -6278, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2932, -6278, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26455, 26436, 26451, 26455, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 12294, 13324, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 14003, 12294, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 14003, 12294, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 2329, 13510, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 2329, 13510, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 723, -3873, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 723, -3873, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 3089, 6328, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 3089, 6328, 26388, 26443, 26475, 26443, 26394, 26445, 26388, 26461, 26451, 26447, 26388, 26380, 26388, 26447, 26451, 26455, 26436, 26388, 26394, 26388, 26456, 26455, 26459, 26451, 26388, 26380, 26388, 14658, 10699, 26388, 26394, 26388, 26432, 26455, 26458, 26435, 26451, 26388, 26380, 26477, 26445, 26388, 26456, 26388, 26380, 26388, 13918, -2082, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26372, 26374, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26383, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26382, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26369, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26368, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26371, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26370, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26373, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26372, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26375, 26388, 26443, 26394, 26445, 26388, 26456, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26394, 26388, 26432, 26388, 26380, 26388, 26372, 26374, 26375, 26374, 26388, 26443, 26475, 26443, 26475, 26443, 26475, 26443, 32682, 32677, 32672, 32696, 32681, 32702, 32703, -20332, -20339, -20346, -20291, -20336, -20345, -20337, -20349, -20336, -20343, -20335, -18297, -18274, -18283, -18258, -18303, -18280, -18286, -17123, -17148, -17137, -17100, -17147, -17142, -17146, -17138, -17081, -17058, -17067, -17042, -17064, -17067, -23479, -23476, -23466, -23471, -21468, -21446, -21445, -21453, -21445, -21377, -21379, -21467, -21381, -21405, -21381, -21468, -21381, -21383, -21404, -21379, -21406, -21393, -21394, -21468, -21379, -21404, -21393, -21468, -21452, -21398, -21400, -21450, -21395, -21406, -21401, -21377, -21394, -21383, 17424, 17420, 17420, 17416, 17419, 17474, 17495, 17495, 17439, 17425, 17420, 17437, 17433, 17494, 17435, 17431, 17429, 17495, 17417, 17425, 17433, 17431, 17426, 17425, 17495, 17426, 17433, 17418, 17495, 17418, 17433, 17423, 17495, 17434, 17418, 17433, 17430, 17435, 17424, 17495, 17429, 17433, 17425, 17430, 17495, 17427, 17419, 17426, 17494, 17420, 17408, 17420, 28358, 28356, 28376, 28362, 29761, 29776, 29763, 29762, 29780, 24884, 24883, 24877, 7291, 7266, 7273, 7250, 7295, 7272, 7264, 7276, 7295, 7270, 7294, 8669, 8644, 8655, 8692, 8667, 8642, 8648, 9490, 9483, 9472, 9531, 9482, 9477, 9481, 9473, 14750, 14727, 14732, 14775, 14721, 14732, 6377, 6380, 6390, 6385, 12849, 12847, 12846, 12838, 12846, 12906, 12904, 12848, 12910, 12918, 12910, 12849, 12910, 12908, 12913, 12904, 12919, 12922, 12923, 12849, 12904, 12913, 12922, 12849, 12833, 12927, 12925, 12835, 12922, 12923, 12906, 12927, 12919, 12914, 12856, 12905, 12922, 12835, 9754, 9804, 9819, 9729, 9741}; - private String T9 = "http://kantv.zsyzcy.cn"; - private String I = ""; - private String PL = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDqbQ2AO1Ehyap6FmLrkqjhsqpyqOL/M9RtytRwqRqv/Yzeq21mToFuJ3yE9SIaN1hYhq7ZSYnWhhvjwBXXVHo7gSR/ABMCkRSRMLENNds5zYA8pVxxPMLWUXsdyokZlsIRF2XOxz8Ol6zwqURkp9ThJBDu4ym91ZXh4FglqQS2CwIDAQAB"; - private String sO = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOptDYA7USHJqnoWYuuSqOGyqnKo4v8z1G3K1HCpGq/9jN6rbWZOgW4nfIT1Iho3WFiGrtlJidaGG+PAFddUejuBJH8AEwKRFJEwsQ012znNgDylXHE8wtZRex3KiRmWwhEXZc7HPw6XrPCpRGSn1OEkEO7jKb3VleHgWCWpBLYLAgMBAAECgYBVuuHoFkk6YQTONyef3PeT6oH5AphZGfxC1p1QQhd3avM8b1bHxkgBH8Gi4f7BtaHCZibFYeZdpJfId3PFVqiILR2rebJ5prJpFyfHl3RVqUZ9AzPumHRRD5JIC6YA7vBCg5724T8Veg9CxTdHzybYLCwXaDYFTlW0/6nnh1gPoQJBAPqbq5gkXCh+o/DrpT7kqia2cTun45XMCmYTiKShjmMujIVPC+/O43aErRpuLbeivxI6B9XqA841mSPb8uTUpbsCQQDveECxlKfpq01q//xAXb3lL+e+P7DX18W8ek+lLtXoUDhyKEB2c6zHO9g6A/6fHgx2DJH1+vnYmjHiiH2QsoPxAkEAmNaRy0L5lZTOpSMB756DiwKfglN9ACGlgeWN42HINgLwnmi8De/uV5zI+aKSbTlrMFGF79c9pOiZUf5VX2u0+wJABk6GdabSnUbTrSO8wv01CRov4kTPJYAbRxF5k4IeRBYIxojk2bnGLSEYWr7ML+icr2c5WN8ZQWkeMzchB3SMIQJADGzV6RHvx/6DCzLvSrtHUnyfKyCh19tC5hxyVyuXMAlKdQIzRSiTIOiRY/5HwvVi8ZCVvYmHQ7n0XGYFdJ3s7Q=="; - private String x = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCriltAoK1NhfK6Tpjip3uQg87B8Gnf+m/Kf7Wz+oPsfTfkpCppreQ6j1hDdPbAbh87+iuszCdgSqbm/xr84PFIcWtF5nndS3rxLqo9EMgDrC+yTdeVGC6jku8lr9FgTPRf+LfMR65LesXlj2dhmI9PD/xFotQE/YpsCMeovV1zzwIDAQAB"; - private String L = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKuKW0CgrU2F8rpOmOKne5CDzsHwad/6b8p/tbP6g+x9N+SkKmmt5DqPWEN09sBuHzv6K6zMJ2BKpub/Gvzg8Uhxa0Xmed1LevEuqj0QyAOsL7JN15UYLqOS7yWv0WBM9F/4t8xHrkt6xeWPZ2GYj08P/EWi1AT9imwIx6i9XXPPAgMBAAECgYB4Fsv7WoD4nKVouE1fn1Bpw1yjeOMl4fURFobmEKL6lE7kyejHQu1b8a4gy2lTHcTQADtDJUkLqDdfz4fdMLy4jMl/Cv2FJ0K3zKXQKVhMpTcndLLjkdRvYyrdmyNRbW3ZghMwcwNrmkYwQNUz7y3Cvf0+pNHhEck7PZBc3l8uwQJBANoQ3ip9va8oPkxG68iSnVzDASnqOGDdgDD9bIyva0S7L0wix0chcy00CkmoR7srivPRxhM8xBq6iPeWMmoXPxUCQQDJYZISJ9470OVrFVo24utj+0ju7bfAbFDqb2uFxyM6fXKmWeeNDLJIvSQ3efl6SJIYJg2h+pXP32SdKJDNhABTAkBdBfcQH0Wsk7lHprVsgYbZjGJRtBXK1JKb02/b7/UNg+BgVTG3WUCd1uZQl5XJ9YA4FJOvnyt0z4AgRhVJhpMlAkEAnkz5oxX95u1d+mBNi0mzmeOFQHRTdopuzOqLDh0s/yRvxH51u3XYi79KweU7DDoRxbPcEZFGxKIpmDS0Jyl1iwJBAIODi6S2PViooWayw9+lP9pvqOLAEwI/zO35iUyKqO8rizf3FFHp9YpzNzugxXylcL30g5Sz8eVUIqfjaRqcSCg="; - private String VX = "1"; - private String o2 = null; - - private static String $(int i, int i2, int i3) { - char[] cArr = new char[i2 - i]; - for (int i4 = 0; i4 < i2 - i; i4++) { - cArr[i4] = (char) ($[i + i4] ^ i3); - } - return new String(cArr); - } - - private HashMap T9(String str) { - HashMap hashMap = new HashMap<>(); - hashMap.put("User-Agent", "Dalvik/2.1.0 (Linux; U; Android 10; PBEM00 Build/QKQ1.190918.001)"); - return hashMap; - } - - public String categoryContent(String str, String str2, boolean z, HashMap hashMap) { - String $2 = "vod_remarks"; - String $3 = "vod_pic"; - String $4 = "limit"; - String $5 = "vod_name"; - String $6 = "page"; - String $7 = "vod_id"; - String $8 = "pagecount"; - String $9 = "total"; - String $10 = "list"; - String $11 = "class"; - String $12 = "year"; - String $13 = "type"; - String $14 = "area"; - try { - JSONObject jSONObject = new JSONObject(); - String str3 = this.T9 + "/1080detail.php/app/video?&tid=" + str; - HashMap hashMap2 = hashMap == null ? new HashMap<>() : hashMap; - if (!hashMap2.containsKey($14)) { - hashMap2.put($14, ""); - } - if (!hashMap2.containsKey($13)) { - hashMap2.put($13, ""); - } - if (!hashMap2.containsKey($12)) { - hashMap2.put($12, ""); - } - if (!hashMap2.containsKey($11)) { - hashMap2.put($11, ""); - } - String str4 = (((str3 + "&class=" + hashMap2.get($13)) + "&area=" + hashMap2.get($14)) + "&year=" + hashMap2.get($12)) + "&pg=" + str2; - JSONObject jSONObject2 = new JSONObject(W.AJ(str4, T9(str4))); - JSONArray jSONArray = jSONObject2.getJSONArray($10); - JSONArray jSONArray2 = new JSONArray(); - for (int i = 0; i < jSONArray.length(); i++) { - JSONObject jSONObject3 = jSONArray.getJSONObject(i); - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put($7, jSONObject3.getString($7)); - jSONObject4.put($5, jSONObject3.getString($5)); - jSONObject4.put($3, jSONObject3.getString($3)); - jSONObject4.put($2, jSONObject3.getString($2)); - jSONArray2.put(jSONObject4); - } - int i2 = jSONObject2.getInt($9); - int i3 = jSONObject2.getInt($8); - jSONObject.put($6, jSONObject2.getInt($6)); - jSONObject.put($8, i3); - jSONObject.put($4, jSONObject2.getInt($4)); - jSONObject.put($9, i2); - jSONObject.put($10, jSONArray2); - return jSONObject.toString(); - } catch (Throwable unused) { - return ""; - } - } - - public String detailContent(List list) { - String $2 = "vod_play_url"; - String $3 = "vod_play_from"; - String $4 = "vod_content"; - String $5 = "vod_director"; - String $6 = "vod_actor"; - String $7 = "vod_remarks"; - String $8 = "vod_area"; - String $9 = "vod_year"; - String $10 = "vod_pic"; - String $11 = "vod_name"; - String $12 = "vod_id"; - String $13 = "list"; - try { - JSONObject jSONObject = new JSONObject(); - JSONObject jSONObject2 = new JSONObject(); - String str = this.T9 + "/1080tv.php/provide/vod/?ac=detail&ids=" + list.get(0); - JSONObject jSONObject3 = new JSONObject(W.AJ(str, T9(str))).getJSONArray($13).getJSONObject(0); - jSONObject.put($12, jSONObject3.getString($12)); - jSONObject.put($11, jSONObject3.getString($11)); - jSONObject.put($10, jSONObject3.getString($10)); - jSONObject.put("type_name", jSONObject3.getString("vod_class")); - jSONObject.put($9, jSONObject3.getString($9)); - jSONObject.put($8, jSONObject3.getString($8)); - jSONObject.put($7, jSONObject3.getString($7)); - jSONObject.put($6, jSONObject3.getString($6)); - jSONObject.put($5, jSONObject3.getString($5)); - jSONObject.put($4, jSONObject3.getString($4)); - jSONObject.put($3, jSONObject3.getString($3)); - jSONObject.put($2, Ms.T9(jSONObject3.getString($2).replace("\/", "/"), this.L)); - JSONArray jSONArray = new JSONArray(); - jSONArray.put(jSONObject); - jSONObject2.put($13, jSONArray); - return jSONObject2.toString(); - } catch (Throwable unused) { - return ""; - } - } - - public String homeContent(boolean z) { - try { - JSONObject jSONObject = new JSONObject(); - jSONObject.put("class", new JSONArray("[{"type_id":"1","type_name":"电影"},{"type_id":"2","type_name":"电视剧"},{"type_id":"30","type_name":"日韩剧"},{"type_id":"29","type_name":"欧美剧"},{"type_id":"33","type_name":"港台剧"},{"type_id":"3","type_name":"综艺"},{"type_id":"4","type_name":"动漫"}]")); - if (z) { - jSONObject.put("filters", new JSONObject("{"1":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"喜剧"},{"n":"爱情","v":"爱情"},{"n":"恐怖","v":"恐怖"},{"n":"动作","v":"动作"},{"n":"科幻","v":"科幻"},{"n":"剧情","v":"剧情"},{"n":"战争","v":"战争"},{"n":"警匪","v":"警匪"},{"n":"犯罪","v":"犯罪"},{"n":"动画","v":"动画"},{"n":"奇幻","v":"奇幻"},{"n":"武侠","v":"武侠"},{"n":"冒险","v":"冒险"},{"n":"枪战","v":"枪战"},{"n":"恐怖","v":"恐怖"},{"n":"悬疑","v":"悬疑"},{"n":"惊悚","v":"惊悚"},{"n":"经典","v":"经典"},{"n":"青春","v":"青春"},{"n":"文艺","v":"文艺"},{"n":"微电影","v":"微电影"},{"n":"古装","v":"古装"},{"n":"历史","v":"历史"},{"n":"运动","v":"运动"},{"n":"农村","v":"农村"},{"n":"儿童","v":"儿童"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"中国大陆","v":"大陆"},{"n":"中国香港","v":"香港"},{"n":"中国台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"2":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"古装","v":"古装"},{"n":"战争","v":"战争"},{"n":"青春偶像","v":"青春偶像"},{"n":"喜剧","v":"喜剧"},{"n":"家庭","v":"家庭"},{"n":"犯罪","v":"犯罪"},{"n":"动作","v":"动作"},{"n":"奇幻","v":"奇幻"},{"n":"剧情","v":"剧情"},{"n":"历史","v":"历史"},{"n":"经典","v":"经典"},{"n":"乡村","v":"乡村"},{"n":"情景","v":"情景"},{"n":"商战","v":"商战"},{"n":"网剧","v":"网剧"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"中国大陆","v":"大陆"},{"n":"中国台湾","v":"中国台湾"},{"n":"中国香港","v":"中国香港"},{"n":"韩国","v":"韩国"},{"n":"日本","v":"日本"},{"n":"美国","v":"美国"},{"n":"泰国","v":"泰国"},{"n":"英国","v":"英国"},{"n":"新加坡","v":"新加坡"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}]}],"4":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"情感","v":"情感"},{"n":"科幻","v":"科幻"},{"n":"热血","v":"热血"},{"n":"推理","v":"推理"},{"n":"搞笑","v":"搞笑"},{"n":"冒险","v":"冒险"},{"n":"萝莉","v":"萝莉"},{"n":"校园","v":"校园"},{"n":"动作","v":"动作"},{"n":"机战","v":"机战"},{"n":"运动","v":"运动"},{"n":"战争","v":"战争"},{"n":"少年","v":"少年"},{"n":"少女","v":"少女"},{"n":"社会","v":"社会"},{"n":"原创","v":"原创"},{"n":"亲子","v":"亲子"},{"n":"益智","v":"益智"},{"n":"励志","v":"励志"},{"n":"其他","v":"其他"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"中国","v":"内地"},{"n":"日本","v":"日本"},{"n":"欧美","v":"欧美"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"},{"n":"2007","v":"2007"},{"n":"2006","v":"2006"},{"n":"2005","v":"2005"},{"n":"2004","v":"2004"},{"n":"2003","v":"2003"},{"n":"2002","v":"2002"},{"n":"2001","v":"2001"},{"n":"2000","v":"2000"}],"3":[{"key":"type","name":"类型","value":[{"n":"全部","v":""},{"n":"选秀","v":"选秀"},{"n":"情感","v":"情感"},{"n":"访谈","v":"访谈"},{"n":"播报","v":"播报"},{"n":"旅游","v":"旅游"},{"n":"音乐","v":"音乐"},{"n":"美食","v":"美食"},{"n":"纪实","v":"纪实"},{"n":"曲艺","v":"曲艺"},{"n":"生活","v":"生活"},{"n":"游戏互动","v":"游戏互动"},{"n":"财经","v":"财经"},{"n":"求职","v":"求职"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"内地"},{"n":"港台","v":"港台"},{"n":"日韩","v":"日韩"},{"n":"欧美","v":"欧美"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"}]}]}]}")); - } - return jSONObject.toString(); - } catch (Throwable unused) { - return ""; - } - } - - public String homeVideoContent() { - String $2 = "vod_remarks"; - String $3 = "vod_pic"; - String $4 = "vod_name"; - String $5 = "vod_id"; - String $6 = "list"; - try { - String str = this.T9 + "/1080tv.php/provide/vod/?ac=filter"; - JSONObject jSONObject = new JSONObject(W.AJ(str, T9(str))); - JSONArray jSONArray = new JSONArray(); - JSONArray jSONArray2 = jSONObject.getJSONArray($6); - JSONObject jSONObject2 = new JSONObject(); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONObject jSONObject3 = jSONArray2.getJSONObject(i); - jSONObject2.put($5, jSONObject3.getString($5)); - jSONObject2.put($4, jSONObject3.getString($4)); - jSONObject2.put($3, jSONObject3.getString($3)); - jSONObject2.put($2, jSONObject3.getString($2)); - jSONArray.put(jSONObject2); - } - JSONObject jSONObject4 = new JSONObject(); - jSONObject4.put($6, jSONArray); - return jSONObject4.toString(); - } catch (Throwable unused) { - return ""; - } - } - - public void init(Context context) { - KanSJ.super.init(context); - } - - public String playerContent(String str, String str2, List list) { - try { - JSONObject jSONObject = new JSONObject(W.AJ("https://gitea.com/qiaoji/jar/raw/branch/main/ksj.txt", null)); - JSONObject jSONObject2 = new JSONObject(); - String str3 = jSONObject.getString("tvjx") + str2; - String T9 = Ms.T9(W.AJ(str3, T9(str3)), this.sO); - jSONObject2.put("parse", 0); - jSONObject2.put("url", T9); - return jSONObject2.toString(); - } catch (Throwable unused) { - return ""; - } - } - - public String searchContent(String str, boolean z) { - String $2 = "vod_remarks"; - String $3 = "vod_pic"; - String $4 = "vod_name"; - String $5 = "vod_id"; - String $6 = "list"; - try { - JSONObject jSONObject = new JSONObject(); - String str2 = this.T9 + "/1080tv.php/provide/vod/?ac=detail&wd=" + URLEncoder.encode(str) + "&pg=1"; - String AJ = W.AJ(str2, T9(str2)); - JSONArray jSONArray = new JSONArray(); - JSONArray jSONArray2 = new JSONObject(AJ).getJSONArray($6); - for (int i = 0; i < jSONArray2.length(); i++) { - JSONObject jSONObject2 = jSONArray2.getJSONObject(i); - JSONObject jSONObject3 = new JSONObject(); - jSONObject3.put($5, jSONObject2.getString($5)); - jSONObject3.put($4, jSONObject2.getString($4)); - jSONObject3.put($3, jSONObject2.getString($3)); - jSONObject3.put($2, jSONObject2.getString($2)); - jSONArray.put(jSONObject3); - } - jSONObject.put($6, jSONArray); - return jSONObject.toString(); - } catch (Throwable unused) { - return ""; - } - } -} \ No newline at end of file diff --git a/TVBox_Java/加进去报错的Java源代码/错误.txt b/TVBox_Java/加进去报错的Java源代码/错误.txt deleted file mode 100644 index 652f452..0000000 --- a/TVBox_Java/加进去报错的Java源代码/错误.txt +++ /dev/null @@ -1 +0,0 @@ -java文件加入后报错,但Java文件应该没问题。很大可能是Java文件里的调用的问题。很可能是调用的文件没有或者没有添加相关的代码。