Nekk.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. package com.github.catvod.spider;
  2. import android.content.Context;
  3. import android.text.TextUtils;
  4. import android.util.Base64;
  5. import com.github.catvod.crawler.Spider;
  6. import com.github.catvod.crawler.SpiderDebug;
  7. import com.github.catvod.utils.okhttp.OKCallBack;
  8. import com.github.catvod.utils.okhttp.OkHttpUtil;
  9. import org.json.JSONArray;
  10. import org.json.JSONException;
  11. import org.json.JSONObject;
  12. import org.jsoup.Jsoup;
  13. import org.jsoup.nodes.Document;
  14. import org.jsoup.nodes.Element;
  15. import org.jsoup.select.Elements;
  16. import java.io.UnsupportedEncodingException;
  17. import java.net.URLDecoder;
  18. import java.net.URLEncoder;
  19. import java.util.ArrayList;
  20. import java.util.Comparator;
  21. import java.util.HashMap;
  22. import java.util.Iterator;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.TreeMap;
  26. import java.util.regex.Matcher;
  27. import java.util.regex.Pattern;
  28. import okhttp3.Call;
  29. import okhttp3.Headers;
  30. import okhttp3.Response;
  31. public class Nekk extends Spider {
  32. private static final String siteUrl = "https://www.9ela.com";
  33. private static final String siteHost = "www.9ela.com";
  34. protected JSONObject playerConfig;
  35. protected JSONObject filterConfig;
  36. protected Pattern regexCategory = Pattern.compile("/vodshow/(\\S+).html");
  37. protected Pattern regexVid = Pattern.compile("/voddetail/(\\d+).html");
  38. protected Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+).html");
  39. protected Pattern regexPage = Pattern.compile("\\S+/page/(\\d+)\\S+");
  40. @Override
  41. public void init(Context context) {
  42. super.init(context);
  43. try {
  44. 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}}");
  45. 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\"}]}]}");
  46. } catch (JSONException e) {
  47. SpiderDebug.log(e);
  48. }
  49. }
  50. /**
  51. * 爬虫headers
  52. *
  53. * @param url
  54. * @return
  55. */
  56. protected HashMap<String, String> getHeaders(String url) {
  57. HashMap<String, String> headers = new HashMap<>();
  58. headers.put("method", "GET");
  59. headers.put("Host", siteHost);
  60. headers.put("Upgrade-Insecure-Requests", "1");
  61. headers.put("DNT", "1");
  62. 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");
  63. headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
  64. 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");
  65. return headers;
  66. }
  67. @Override
  68. public String homeContent(boolean filter) {
  69. try {
  70. String url = siteUrl + '/';
  71. Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
  72. Elements elements = doc.select("ul.nav-list > li a");
  73. JSONArray classes = new JSONArray();
  74. ArrayList<String> allClass = new ArrayList<>();
  75. for (Element ele : elements) {
  76. String name = ele.text();
  77. boolean show = !filter || (name.equals("电影") || name.equals("连续剧") || name.equals("综艺") || name.equals("动漫"));
  78. if (allClass.contains(name))
  79. show = false;
  80. if (show) {
  81. allClass.add(name);
  82. Matcher mather = regexCategory.matcher(ele.attr("href"));
  83. if (!mather.find())
  84. continue;
  85. String id = mather.group(1).trim();
  86. JSONObject jsonObject = new JSONObject();
  87. jsonObject.put("type_id", id);
  88. jsonObject.put("type_name", name);
  89. classes.put(jsonObject);
  90. }
  91. }
  92. JSONObject result = new JSONObject();
  93. if (filter) {
  94. result.put("filters", filterConfig);
  95. }
  96. result.put("class", classes);
  97. try {
  98. Elements list = doc.select("div.col-lg-wide-75 > ul.myui-vodlist li div.myui-vodlist__box");
  99. JSONArray videos = new JSONArray();
  100. for (int i = 0; i < list.size(); i++) {
  101. Element vod = list.get(i);
  102. String title = vod.selectFirst(".title").text();
  103. String cover = fixCover(vod.selectFirst(".myui-vodlist__thumb").attr("data-original"));
  104. String remark = vod.selectFirst("span.pic-text").text();
  105. Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href"));
  106. if (!matcher.find())
  107. continue;
  108. String id = matcher.group(1);
  109. JSONObject v = new JSONObject();
  110. v.put("vod_id", id);
  111. v.put("vod_name", title);
  112. v.put("vod_pic", cover);
  113. v.put("vod_remarks", remark);
  114. videos.put(v);
  115. }
  116. result.put("list", videos);
  117. } catch (Exception e) {
  118. SpiderDebug.log(e);
  119. }
  120. return result.toString();
  121. } catch (Exception e) {
  122. SpiderDebug.log(e);
  123. }
  124. return "";
  125. }
  126. @Override
  127. public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
  128. try {
  129. String url = siteUrl + "/vodshow/";
  130. if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
  131. url += extend.get("tid");
  132. } else {
  133. url += tid;
  134. }
  135. if (extend != null && extend.size() > 0) {
  136. for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
  137. String key = it.next();
  138. String value = extend.get(key);
  139. if (value.length() > 0) {
  140. url += "/" + key + "/" + URLEncoder.encode(value);
  141. }
  142. }
  143. }
  144. url += "/page/" + pg + ".html";
  145. String html = OkHttpUtil.string(url, getHeaders(url));
  146. Document doc = Jsoup.parse(html);
  147. JSONObject result = new JSONObject();
  148. int pageCount = 0;
  149. int page = -1;
  150. Elements pageInfo = doc.select(".myui-page li a");
  151. if (pageInfo.size() == 0) {
  152. page = Integer.parseInt(pg);
  153. pageCount = page;
  154. } else {
  155. for (int i = 0; i < pageInfo.size(); i++) {
  156. Element a = pageInfo.get(i);
  157. String name = a.text();
  158. if (page == -1 && a.hasClass("btn-warm")) {
  159. Matcher matcher = regexPage.matcher(a.attr("href"));
  160. if (matcher.find()) {
  161. page = Integer.parseInt(matcher.group(1).trim());
  162. } else {
  163. page = 0;
  164. }
  165. }
  166. if (name.equals("尾页")) {
  167. Matcher matcher = regexPage.matcher(a.attr("href"));
  168. if (matcher.find()) {
  169. pageCount = Integer.parseInt(matcher.group(1).trim());
  170. } else {
  171. pageCount = 0;
  172. }
  173. break;
  174. }
  175. }
  176. }
  177. JSONArray videos = new JSONArray();
  178. if (!html.contains("没有找到您想要的结果哦")) {
  179. Elements list = doc.select("ul.myui-vodlist li div.myui-vodlist__box");
  180. for (int i = 0; i < list.size(); i++) {
  181. Element vod = list.get(i);
  182. String title = vod.selectFirst(".title").text();
  183. String cover = fixCover(vod.selectFirst(".myui-vodlist__thumb").attr("data-original"));
  184. String remark = vod.selectFirst("span.pic-text").text();
  185. Matcher matcher = regexVid.matcher(vod.selectFirst(".myui-vodlist__thumb").attr("href"));
  186. if (!matcher.find())
  187. continue;
  188. String id = matcher.group(1);
  189. JSONObject v = new JSONObject();
  190. v.put("vod_id", id);
  191. v.put("vod_name", title);
  192. v.put("vod_pic", cover);
  193. v.put("vod_remarks", remark);
  194. videos.put(v);
  195. }
  196. }
  197. result.put("page", page);
  198. result.put("pagecount", pageCount);
  199. result.put("limit", 48);
  200. result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
  201. result.put("list", videos);
  202. return result.toString();
  203. } catch (Exception e) {
  204. SpiderDebug.log(e);
  205. }
  206. return "";
  207. }
  208. @Override
  209. public String detailContent(List<String> ids) {
  210. try {
  211. String url = siteUrl + "/voddetail/" + ids.get(0) + ".html";
  212. Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
  213. JSONObject result = new JSONObject();
  214. JSONObject vodList = new JSONObject();
  215. String vid = doc.selectFirst("span.mac_hits").attr("data-id");
  216. String cover = fixCover(doc.selectFirst("a.myui-vodlist__thumb img").attr("data-original"));
  217. String title = doc.selectFirst("div.myui-content__detail h1.title").text();
  218. String desc = Jsoup.parse(doc.selectFirst("meta[name=description]").attr("content")).text();
  219. String category = "", area = "", year = "", remark = "", director = "", actor = "";
  220. Elements span_text_muted = doc.select("div.myui-content__detail span.text-muted");
  221. for (int i = 0; i < span_text_muted.size(); i++) {
  222. Element text = span_text_muted.get(i);
  223. String info = text.text();
  224. if (info.equals("分类:")) {
  225. category = text.nextElementSibling().text();
  226. } else if (info.equals("年份:")) {
  227. year = text.nextElementSibling().text();
  228. } else if (info.equals("地区:")) {
  229. area = text.nextElementSibling().text();
  230. } else if (info.equals("更新:")) {
  231. remark = text.nextElementSibling().text();
  232. } else if (info.equals("导演:")) {
  233. List<String> directors = new ArrayList<>();
  234. Elements aa = text.parent().select("a");
  235. for (int j = 0; j < aa.size(); j++) {
  236. directors.add(aa.get(j).text());
  237. }
  238. director = TextUtils.join(",", directors);
  239. } else if (info.equals("主演:")) {
  240. List<String> actors = new ArrayList<>();
  241. Elements aa = text.parent().select("a");
  242. for (int j = 0; j < aa.size(); j++) {
  243. actors.add(aa.get(j).text());
  244. }
  245. actor = TextUtils.join(",", actors);
  246. }
  247. }
  248. vodList.put("vod_id", vid);
  249. vodList.put("vod_name", title);
  250. vodList.put("vod_pic", cover);
  251. vodList.put("type_name", category);
  252. vodList.put("vod_year", year);
  253. vodList.put("vod_area", area);
  254. vodList.put("vod_remarks", remark);
  255. vodList.put("vod_actor", actor);
  256. vodList.put("vod_director", director);
  257. vodList.put("vod_content", desc);
  258. Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
  259. @Override
  260. public int compare(String o1, String o2) {
  261. try {
  262. int sort1 = playerConfig.getJSONObject(o1).getInt("or");
  263. int sort2 = playerConfig.getJSONObject(o2).getInt("or");
  264. if (sort1 == sort2) {
  265. return 1;
  266. }
  267. return sort1 - sort2 > 0 ? 1 : -1;
  268. } catch (JSONException e) {
  269. SpiderDebug.log(e);
  270. }
  271. return 1;
  272. }
  273. });
  274. Elements sources = doc.select("a[data-toggle=tab]");
  275. for (int i = 0; i < sources.size(); i++) {
  276. Element source = sources.get(i);
  277. String sourceName = source.text();
  278. String tabHref = source.attr("href");
  279. boolean found = false;
  280. for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
  281. String flag = it.next();
  282. if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
  283. sourceName = flag;
  284. found = true;
  285. break;
  286. }
  287. }
  288. if (!found)
  289. continue;
  290. String playList = "";
  291. Elements playListA = doc.select("div" + tabHref + " ul > li a");
  292. List<String> vodItems = new ArrayList<>();
  293. for (int j = 0; j < playListA.size(); j++) {
  294. Element vod = playListA.get(j);
  295. Matcher matcher = regexPlay.matcher(vod.attr("href"));
  296. if (!matcher.find())
  297. continue;
  298. String playURL = matcher.group(1) + "-" + matcher.group(2) + "-" + matcher.group(3);
  299. vodItems.add(vod.text() + "$" + playURL);
  300. }
  301. if (vodItems.size() > 0)
  302. playList = TextUtils.join("#", vodItems);
  303. if (playList.length() == 0)
  304. continue;
  305. vod_play.put(sourceName, playList);
  306. }
  307. if (vod_play.size() > 0) {
  308. String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
  309. String vod_play_url = TextUtils.join("$$$", vod_play.values());
  310. vodList.put("vod_play_from", vod_play_from);
  311. vodList.put("vod_play_url", vod_play_url);
  312. }
  313. JSONArray list = new JSONArray();
  314. list.put(vodList);
  315. result.put("list", list);
  316. return result.toString();
  317. } catch (Exception e) {
  318. SpiderDebug.log(e);
  319. }
  320. return "";
  321. }
  322. @Override
  323. public String playerContent(String flag, String id, List<String> vipFlags) {
  324. try {
  325. String url = siteUrl + "/vodplay/" + id + ".html";
  326. Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
  327. Elements allScript = doc.select("script");
  328. JSONObject result = new JSONObject();
  329. for (int i = 0; i < allScript.size(); i++) {
  330. String scContent = allScript.get(i).html().trim();
  331. if (scContent.startsWith("var player_")) {
  332. int start = scContent.indexOf('{');
  333. int end = scContent.lastIndexOf('}') + 1;
  334. String json = scContent.substring(start, end);
  335. JSONObject player = new JSONObject(json);
  336. if (playerConfig.has(player.getString("from"))) {
  337. JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
  338. String videoUrl = player.getString("url");
  339. if (player.has("encrypt")) {
  340. int encrypt = player.getInt("encrypt");
  341. if (encrypt == 1) {
  342. videoUrl = URLDecoder.decode(videoUrl);
  343. } else if (encrypt == 2) {
  344. videoUrl = new String(Base64.decode(videoUrl, Base64.DEFAULT));
  345. videoUrl = URLDecoder.decode(videoUrl);
  346. }
  347. }
  348. String playUrl = pCfg.getString("pu");
  349. result.put("parse", pCfg.getInt("sn"));
  350. result.put("playUrl", playUrl);
  351. result.put("url", videoUrl);
  352. if (flag.equals("9ekk")) {
  353. JSONObject headers = new JSONObject();
  354. 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");
  355. headers.put("Accept", " */*");
  356. headers.put("Connection", " keep-alive");
  357. result.put("header", headers.toString());
  358. } else {
  359. result.put("header", "");
  360. }
  361. }
  362. break;
  363. }
  364. }
  365. return result.toString();
  366. } catch (Exception e) {
  367. SpiderDebug.log(e);
  368. }
  369. return "";
  370. }
  371. @Override
  372. public String searchContent(String key, boolean quick) {
  373. try {
  374. if (quick)
  375. return "";
  376. long currentTime = System.currentTimeMillis();
  377. String url = siteUrl + "/index.php/ajax/suggest?mid=1&wd=" + URLEncoder.encode(key) + "&limit=10&timestamp=" + currentTime;
  378. JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
  379. JSONObject result = new JSONObject();
  380. JSONArray videos = new JSONArray();
  381. if (searchResult.getInt("total") > 0) {
  382. JSONArray lists = new JSONArray(searchResult.getString("list"));
  383. for (int i = 0; i < lists.length(); i++) {
  384. JSONObject vod = lists.getJSONObject(i);
  385. String id = vod.getString("id");
  386. String title = vod.getString("name");
  387. String cover = fixCover(vod.getString("pic"));
  388. JSONObject v = new JSONObject();
  389. v.put("vod_id", id);
  390. v.put("vod_name", title);
  391. v.put("vod_pic", cover);
  392. v.put("vod_remarks", "");
  393. videos.put(v);
  394. }
  395. }
  396. result.put("list", videos);
  397. return result.toString();
  398. } catch (Exception e) {
  399. SpiderDebug.log(e);
  400. }
  401. return "";
  402. }
  403. protected String fixCover(String cover) {
  404. try {
  405. return "proxy://do=nekk&pic=" + Base64.encodeToString(cover.getBytes("UTF-8"), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP);
  406. } catch (UnsupportedEncodingException e) {
  407. e.printStackTrace();
  408. }
  409. return cover;
  410. }
  411. private static HashMap<String, String> nekkPicHeader = null;
  412. public static Object[] loadPic(String pic) {
  413. try {
  414. pic = new String(Base64.decode(pic, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
  415. if (nekkPicHeader == null) {
  416. nekkPicHeader = new HashMap<>();
  417. 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");
  418. nekkPicHeader.put("referer", siteUrl + "/");
  419. }
  420. OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
  421. @Override
  422. protected void onFailure(Call call, Exception e) {
  423. }
  424. @Override
  425. protected void onResponse(Response response) {
  426. }
  427. };
  428. OkHttpUtil.get(OkHttpUtil.defaultClient(), pic, null, nekkPicHeader, callBack);
  429. if (callBack.getResult().code() == 200) {
  430. Headers headers = callBack.getResult().headers();
  431. String type = headers.get("Content-Type");
  432. if (type == null) {
  433. type = "application/octet-stream";
  434. }
  435. Object[] result = new Object[3];
  436. result[0] = 200;
  437. result[1] = type;
  438. System.out.println(pic);
  439. System.out.println(type);
  440. result[2] = callBack.getResult().body().byteStream();
  441. return result;
  442. }
  443. } catch (Throwable th) {
  444. th.printStackTrace();
  445. }
  446. return null;
  447. }
  448. }