From 0fec835a98068ebde8d897c54de49b92609b501d Mon Sep 17 00:00:00 2001 From: yangqiang3504 <412594121@qq.com> Date: Fri, 2 Sep 2022 11:27:20 +0800 Subject: [PATCH] add - bili90 --- .../java/com/github/catvod/spider/Anime1.java | 460 ++++++++++++ .../java/com/github/catvod/spider/Auete.java | 540 ++++++++++++++ .../java/com/github/catvod/spider/Cokemv.java | 468 ++++++++++++ .../java/com/github/catvod/spider/Czsapp.java | 435 +++++++++++ .../com/github/catvod/spider/Gitcafe.java | 309 ++++++++ .../java/com/github/catvod/spider/IKan.java | 234 ++++++ .../java/com/github/catvod/spider/Juhi.java | 472 ++++++++++++ .../java/com/github/catvod/spider/Kmys.java | 651 +++++++++++++++++ .../com/github/catvod/spider/Kuaikan.java | 681 ++++++++++++++++++ .../com/github/catvod/spider/LiteApple.java | 466 ++++++++++++ .../java/com/github/catvod/spider/Nfyun.java | 503 +++++++++++++ .../java/com/github/catvod/spider/SP360.java | 345 +++++++++ .../java/com/github/catvod/spider/Smdyy.java | 514 +++++++++++++ 13 files changed, 6078 insertions(+) create mode 100644 app/src/main/java/com/github/catvod/spider/Anime1.java create mode 100644 app/src/main/java/com/github/catvod/spider/Auete.java create mode 100644 app/src/main/java/com/github/catvod/spider/Cokemv.java create mode 100644 app/src/main/java/com/github/catvod/spider/Czsapp.java create mode 100644 app/src/main/java/com/github/catvod/spider/Gitcafe.java create mode 100644 app/src/main/java/com/github/catvod/spider/IKan.java create mode 100644 app/src/main/java/com/github/catvod/spider/Juhi.java create mode 100644 app/src/main/java/com/github/catvod/spider/Kmys.java create mode 100644 app/src/main/java/com/github/catvod/spider/Kuaikan.java create mode 100644 app/src/main/java/com/github/catvod/spider/LiteApple.java create mode 100644 app/src/main/java/com/github/catvod/spider/Nfyun.java create mode 100644 app/src/main/java/com/github/catvod/spider/SP360.java create mode 100644 app/src/main/java/com/github/catvod/spider/Smdyy.java diff --git a/app/src/main/java/com/github/catvod/spider/Anime1.java b/app/src/main/java/com/github/catvod/spider/Anime1.java new file mode 100644 index 0000000..034c3d5 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Anime1.java @@ -0,0 +1,460 @@ +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/app/src/main/java/com/github/catvod/spider/Auete.java b/app/src/main/java/com/github/catvod/spider/Auete.java new file mode 100644 index 0000000..2f96e71 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Auete.java @@ -0,0 +1,540 @@ +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.com"; + private static final String siteHost = "auete.com"; + + /** + * 播放源配置 + */ + 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/app/src/main/java/com/github/catvod/spider/Cokemv.java b/app/src/main/java/com/github/catvod/spider/Cokemv.java new file mode 100644 index 0000000..28ce911 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Cokemv.java @@ -0,0 +1,468 @@ +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; + +import okhttp3.Headers; + +public class Cokemv extends Spider { + private static final String siteUrl = "https://cokemv.me"; + private static final String siteHost = "cokemv.me"; + + /** + * 播放源配置 + */ + 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("{\"cokemv0555\":{\"sh\":\"COKEMV\",\"pu\":\"\",\"sn\":0,\"or\":999},\"cokeqie01\":{\"sh\":\"極速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"xin\":{\"sh\":\"高速路線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"90mm\":{\"sh\":\"藍光號路\",\"pu\":\"\",\"sn\":0,\"or\":999},\"age01\":{\"sh\":\"動漫一線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"age02\":{\"sh\":\"動漫二線\",\"pu\":\"\",\"sn\":0,\"or\":999},\"mahua\":{\"sh\":\"海外(禁國內)\",\"pu\":\"\",\"sn\":0,\"or\":999},\"toutiao\":{\"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, 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("综艺"); + 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"); + 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"; + 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 = 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("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, Headers())); + JSONObject result = new JSONObject(); + JSONObject vodList = new JSONObject(); + + // 取基本数据 + Elements sourcediv = doc.select("div.module-item-cover>div"); + String cover = sourcediv.get(0).select("div.module-item-pic>img").attr("data-original"); + String title = sourcediv.get(0).select("div.module-item-pic>img").attr("alt"); + String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = ""; + Elements data = doc.select("div.module-info-tag-link"); + category = data.get(2).select("a").text(); + area = data.get(1).select("a").text(); + year = data.get(0).select("a").text(); + remark = doc.select("div.module-info-item-content").get(4).text(); + List actors = new ArrayList<>(); + Elements aa = doc.select("div.module-info-item-content").get(2).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("div.module-info-item-content").get(0).select("a"); + for (int j = 0; j < bb.size(); j++) { + directors.add(bb.get(j).text()); + } + director = TextUtils.join(",", directors); + desc = doc.selectFirst("div.module-info-introduction-content>p").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.module-tab-items-box>div>span"); + Elements sourceList = doc.select("div.module-list>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 = 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"); + 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 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 { + //Google搜索镜像 + String url = "https://google.1qi777.com/search?q=site%3Acokemv.me%2Fvoddetail+" + URLEncoder.encode(key); + Document docs = Jsoup.parse(OkHttpUtil.string(url, sHeaders())); + JSONObject result = new JSONObject(); + JSONArray videos = new JSONArray(); + JSONObject v = new JSONObject(); + Elements list = docs.select("div.NJo7tc div.yuRUbf"); + for (int i = 0; i < list.size(); i++) { + Element doc = list.get(i); + String sourceName = doc.select("div.yuRUbf a h3").text(); + if (sourceName.contains(key)) { + String list1 = doc.select("div.yuRUbf a").attr("href"); + Document link = Jsoup.parse(OkHttpUtil.string(list1, getHeaders(url))); + Matcher matcher = regexVid.matcher(list1); + if (matcher.find()) { + + String group = matcher.group(1); + String cover = link.select("div.module-item-pic>img").attr("data-original"); + String title = link.select("div.module-item-pic>img").attr("alt"); + String remark = link.select("div.module-info-item-content").get(4).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/app/src/main/java/com/github/catvod/spider/Czsapp.java b/app/src/main/java/com/github/catvod/spider/Czsapp.java new file mode 100644 index 0000000..60f0e5a --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Czsapp.java @@ -0,0 +1,435 @@ +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://czspp.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://czspp.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://czspp.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://czspp.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://czspp.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 ""; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/spider/Gitcafe.java b/app/src/main/java/com/github/catvod/spider/Gitcafe.java new file mode 100644 index 0000000..71c97ec --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Gitcafe.java @@ -0,0 +1,309 @@ +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 = 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/app/src/main/java/com/github/catvod/spider/IKan.java b/app/src/main/java/com/github/catvod/spider/IKan.java new file mode 100644 index 0000000..6a43855 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/IKan.java @@ -0,0 +1,234 @@ +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/app/src/main/java/com/github/catvod/spider/Juhi.java b/app/src/main/java/com/github/catvod/spider/Juhi.java new file mode 100644 index 0000000..8d33a94 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Juhi.java @@ -0,0 +1,472 @@ +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/app/src/main/java/com/github/catvod/spider/Kmys.java b/app/src/main/java/com/github/catvod/spider/Kmys.java new file mode 100644 index 0000000..8d21813 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Kmys.java @@ -0,0 +1,651 @@ +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 = "5"; // 飞瓜 1 酷猫 5 + + 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(); + getkey(); + 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(); + getkey(); + 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(); + getkey(); + 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(); + getkey(); + 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; + } + + public static void getkey(){ + if (signPlayerStr.isEmpty()){ + ////https://video-api.kumaoys.cn/api/v2/b/83708861 + String url = "https://mtv.stvmts.com/api/v2/b/"+((int) (Math.random() * 100000000)); + HashMap hashMap = new HashMap(); + hashMap.put("versionNumber", "360"); + hashMap.put("versionName", "3.6.0"); + hashMap.put("device", "1a7348ae45f8f6de4d798614fc07e7271657392501986"); + //hashMap.put("appId", "5"); + hashMap.put("platformId", "7"); + hashMap.put("User-Agent", "okhttp/3.14.7"); + hashMap.put("Pragma", "Pragma:: no-cache"); + hashMap.put("Cache-Control", "no-cache"); + hashMap.put("Host", "mtv.stvmts.com"); + hashMap.put("Content-Type", "application/json; charser=utf-8"); + JSONObject jsonObject = new JSONObject(); + try { + int random = (int)(Math.random()*1.0E8d); + int time = (int)(System.currentTimeMillis()/1000); + String signBefore = "p=com.feigua.yingshi&t=" + time + "&r=" + random + "&s=36eff39894f62d333fd3f488cffbf364&pl=1"; + jsonObject.put("s",Misc.MD5(signBefore,Misc.CharsetUTF8)); + jsonObject.put("t",time); + jsonObject.put("r",random); + jsonObject.put("i",5); + jsonObject.put("p",1); + OkHttpUtil.postJson(OkHttpUtil.defaultClient(), url, jsonObject.toString(), hashMap, new OKCallBack.OKCallBackString() { + @Override + public void onFailure(Call call, Exception e) { + } + + @Override + public void onResponse(String response) { + try { + + JSONObject jsonObject = new JSONObject(response).getJSONObject("data"); + String a = new String(Base64.decode(jsonObject.getString("a"), Base64.DEFAULT)); + String k = new String(Base64.decode(jsonObject.getString("k"), Base64.DEFAULT)); + String z = new String(Base64.decode(jsonObject.getString("z"), Base64.DEFAULT)); + String data = rsa2(k+z+a); + signPlayerStr = new JSONObject(data).optString("key"); + } catch (JSONException e) { + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } catch (JSONException e) { + e.printStackTrace(); + } + } + + } + + 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 ""; + } + + public static String rsa2(String in) { + try { + RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCt/dLGQj1Iimj0LIUMUXgBGUjsfrm6o1/pZjXXVLL3py2vLktNtSoJU+69v1tUXZqiU9BqMHApVmMOtOnkL5J+ENdLIX3bXnNtfNJpYX4Iz8OBMqKdDch80gN8rLkTPReFkBGsMAndKpc0iMdgd6nts/gQ3wUBNJKpmOG35UateQIDAQAB", 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 = ""; + 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/app/src/main/java/com/github/catvod/spider/Kuaikan.java b/app/src/main/java/com/github/catvod/spider/Kuaikan.java new file mode 100644 index 0000000..2f47a15 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Kuaikan.java @@ -0,0 +1,681 @@ +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/app/src/main/java/com/github/catvod/spider/LiteApple.java b/app/src/main/java/com/github/catvod/spider/LiteApple.java new file mode 100644 index 0000000..452b824 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/LiteApple.java @@ -0,0 +1,466 @@ +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/app/src/main/java/com/github/catvod/spider/Nfyun.java b/app/src/main/java/com/github/catvod/spider/Nfyun.java new file mode 100644 index 0000000..857644f --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Nfyun.java @@ -0,0 +1,503 @@ +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/app/src/main/java/com/github/catvod/spider/SP360.java b/app/src/main/java/com/github/catvod/spider/SP360.java new file mode 100644 index 0000000..674e201 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/SP360.java @@ -0,0 +1,345 @@ +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/app/src/main/java/com/github/catvod/spider/Smdyy.java b/app/src/main/java/com/github/catvod/spider/Smdyy.java new file mode 100644 index 0000000..51fc818 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Smdyy.java @@ -0,0 +1,514 @@ +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 ""; + } +}