add - bili删除

This commit is contained in:
yangqiang3504
2022-09-02 10:49:15 +08:00
parent 704772249c
commit 1cb65c0e98
21 changed files with 10 additions and 8006 deletions
@@ -1,460 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import okhttp3.Call;
import okhttp3.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Calendar;
import java.net.URLDecoder;
public class Anime1 extends Spider {
private String cookies = "";
private String authority = "";
private JSONArray srcArray = new JSONArray();
@Override
public void init(Context context) {
super.init(context);
}
@Override
public String homeContent(boolean filter) {
try {
long a = System.currentTimeMillis();
String srcurl = "https://d1zquzjgwo9yb.cloudfront.net/?_=" + a;
String srcOrignstr = OkHttpUtil.string(srcurl, getHeaders3(srcurl));
JSONArray srcOrign = new JSONArray(srcOrignstr);
int srclen = srcOrign.length();
for (int i = 0; i < srclen; i++){
JSONObject subobj= new JSONObject();
subobj.put("link", srcOrign.getJSONArray(i).get(0).toString());
subobj.put("name", srcOrign.getJSONArray(i).get(1).toString());
subobj.put("hit" , srcOrign.getJSONArray(i).get(2).toString());
subobj.put("year", srcOrign.getJSONArray(i).get(3).toString());
subobj.put("season", srcOrign.getJSONArray(i).get(4).toString());
subobj.put("team", srcOrign.getJSONArray(i).get(5).toString());
srcArray.put(subobj);
}
JSONObject result = new JSONObject();
JSONArray classes = new JSONArray();
Calendar cal = Calendar.getInstance();
int doy = cal.get(Calendar.YEAR) + 1;
for (int i = 0; i < 8; i++) {
JSONObject cateobj = new JSONObject();
String istr = Integer.toString(i);
if (i == 0) {
cateobj.put("type_name", "最近更新");
cateobj.put("type_id", istr);
} else if (i < 7) {
doy = doy - 1;
String year = Integer.toString(doy);
cateobj.put("type_name", year);
cateobj.put("type_id", istr);
} else {
cateobj.put("type_name", "更早");
cateobj.put("type_id", istr);
}
classes.put(cateobj);
}
result.put("class", classes);
JSONArray videos = new JSONArray();
for (int i = 0; i < 10; i++) {
JSONObject v = new JSONObject();
String id = srcArray.getJSONObject(i).getString("link");
String name = srcArray.getJSONObject(i).getString("name");
String mark = srcArray.getJSONObject(i).getString("hit");
v.put("vod_id", id);
v.put("vod_name", name);
v.put("vod_pic","https://sta.anicdn.com/playerImg/8.jpg");
v.put("vod_remarks", mark);
videos.put(v);
}
result.put("list", videos);
return result.toString();
} catch (
Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> 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<String> 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<String, String> 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<String> vodItems = new ArrayList<>();
Set<Map.Entry<String,String>> entrySet = vod_play_Order.entrySet();
for(Map.Entry<String,String> 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<String, String> 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<String> 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<String, String> 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<String, List<String>> 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<String, String> getHeaders3(String url) {
HashMap<String, String> 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<String, String> getHeaders2(String url) {
HashMap<String, String> 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<String, String> getHeaders1(String url) {
HashMap<String, String> 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 "";
}
}
@@ -1,540 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Auete extends Spider {
private static final String siteUrl = "https://auete.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<String, String> getHeaders(String url) {
HashMap<String, String> 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<String, String> extend) {
// 获取分类数据的url
String url = "";
try {
if (extend != null && extend.size() > 0) {
for (Iterator<String> 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<String> 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<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@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<String> 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<String> 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<String> 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 "";
}
}
@@ -1,273 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class Bili extends Spider {
protected JSONObject ext = null;
@Override
public void init(Context context, String extend) {
super.init(context, extend);
try {
String content = OkHttpUtil.string(extend, null);
ext = new JSONObject(content);
} catch (JSONException ex) {
ex.printStackTrace();
}
}
@Override
public String homeContent(boolean filter) {
JSONObject results = new JSONObject();
try {
results.put("class", ext.getJSONArray("classes"));
if (filter) {
results.put("filters", ext.getJSONObject("filter"));
}
} catch (JSONException e) {
SpiderDebug.log(e);
}
return results.toString();
}
@Override
public String homeVideoContent() {
try {
JSONArray videos = new JSONArray();
try {
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=窗 白噪音";
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray RArray = data.getJSONArray("result");
for (int i = 0; i < RArray.length(); i++) {
JSONObject info = RArray.getJSONObject(i);
JSONObject result = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
result.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document KS = Jsoup.parse(title);
String name = KS.text();
result.put("vod_name", name);
result.put("vod_pic", pic);
String duration = info.getString("duration");
String words = duration.split(":")[0];
String remark = words + "分钟";
result.put("vod_remarks", remark);
videos.put(result);
}
} catch (Exception e) {
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
} catch (Throwable th) {
}
return "";
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=";
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
url += extend.get("tid");
} else {
url += tid;
}
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
if (value.length() > 0) {
url += "&" + key + "=" + URLEncoder.encode(value);
}
}
}
url += "&page=" + pg;
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray list = new JSONArray();
JSONArray RSArray = data.getJSONArray("result");
for (int i = 0; i < RSArray.length(); i++) {
JSONObject info = RSArray.getJSONObject(i);
JSONObject result = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
result.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document doc = Jsoup.parse(title);
String name = doc.text();
result.put("vod_name", name);
result.put("vod_pic", pic);
String duration = info.getString("duration");
String Split = duration.split(":")[0];
String remark = Split + "分钟";
result.put("vod_remarks", remark);
list.put(result);
}
JSONObject result = new JSONObject();
int limit = 20;
int page = Integer.parseInt(pg);
result.put("page", page);
int pageCount = list.length() == limit ? page + 1 : page;
result.put("pagecount", pageCount);
result.put("limit", limit);
result.put("total", Integer.MAX_VALUE);
result.put("list", list);
return result.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String detailContent(List<String> ids) {
int i = 0;
try {
String str = ids.get(0);
String sb2 = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + str;
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
JSONObject jSONObject2 = jSONObject.getJSONObject("data");
long j = jSONObject2.getLong("aid");
String sb4 = j + "";
String sb6 = "https://api.bilibili.com/x/web-interface/view?aid=" + sb4;
JSONObject jSONObject3 = new JSONObject(OkHttpUtil.string(sb6, null));
JSONObject jSONObject4 = jSONObject3.getJSONObject("data");
JSONObject v = new JSONObject();
v.put("vod_id", str);
String string = jSONObject4.getString("title");
v.put("vod_name", string);
String string2 = jSONObject4.getString("pic");
v.put("vod_pic", string2);
String string3 = jSONObject4.getString("tname");
v.put("type_name", string3);
v.put("vod_year", "");
v.put("vod_area", "");
String sb7 = jSONObject4.getLong("duration") / 60 + "分钟";
v.put("vod_remarks", sb7);
v.put("vod_actor", "");
v.put("vod_director", "");
String string4 = jSONObject4.getString("desc");
v.put("vod_content", string4);
v.put("vod_play_from", "B站");
ArrayList arrayList = new ArrayList();
JSONArray jSONArray = jSONObject4.getJSONArray("pages");
while (true) {
int length = jSONArray.length();
if (i < length) {
JSONObject jSONObject6 = jSONArray.getJSONObject(i);
String string5 = jSONObject6.getString("part");
String replace = string5.replace("$", "_").replace("#", "_");
StringBuilder sb8 = new StringBuilder();
sb8.append(replace);
sb8.append("$");
sb8.append(sb4);
sb8.append("+ ");
long j2 = jSONObject6.getLong("cid");
sb8.append(j2);
String sb9 = sb8.toString();
arrayList.add(sb9);
i++;
} else {
v.put("vod_play_url", TextUtils.join("#", arrayList));
JSONArray jSONArray2 = new JSONArray();
jSONArray2.put(v);
JSONObject jSONObject7 = new JSONObject();
jSONObject7.put("list", jSONArray2);
return jSONObject7.toString();
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String playerContent(String str, String str2, List<String> list) {
try {
String[] split = str2.split("\\+");
String str3 = split[0];
String str4 = split[1];
String sb2 = "https://api.bilibili.com/x/player/playurl?avid=" + str3 + "&cid= " + str4 + "&qn=120&fourk=1";
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
JSONObject jSONObject2 = new JSONObject();
jSONObject2.put("parse", "0");
jSONObject2.put("playUrl", "");
JSONObject jSONObject3 = jSONObject.getJSONObject("data");
JSONObject jSONObject4 = jSONObject3.getJSONArray("durl").getJSONObject(0);
String string = jSONObject4.getString("url");
jSONObject2.put("url", string);
jSONObject2.put("header", "{\"Referer\":\"https://www.bilibili.com\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"}");
jSONObject2.put("contentType", "video/x-flv");
return jSONObject2.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String searchContent(String key, boolean quick) {
try {
JSONObject result = new JSONObject();
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(key);
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray videos = new JSONArray();
JSONArray RSArray = data.getJSONArray("result");
for (int i = 0; i < RSArray.length(); i++) {
JSONObject info = RSArray.getJSONObject(i);
JSONObject v = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
v.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document doc = Jsoup.parse(title);
String name = doc.text();
v.put("vod_name", name);
v.put("vod_pic", pic);
String duration = info.getString("duration");
String Split = duration.split(":")[0];
String remark = Split + "分钟";
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
}
@@ -1,468 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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<String, String> Headers() {
HashMap<String, String> 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<String, String> getHeaders(String url) {
HashMap<String, String> 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<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> 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<String> 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<String> 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<String> 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<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@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<String> 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<String> 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<String> 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<String, String> sHeaders() {
HashMap<String, String> 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 "";
}
}
@@ -1,435 +0,0 @@
package com.github.catvod.spider;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.AES;
import com.github.catvod.utils.CBC;
import com.github.catvod.utils.gZip;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Czsapp extends Spider {
private static final Pattern Y = Pattern.compile("\"([^\"]+)\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\"([\\d\\w]+)\".*md5.enc.Utf8.parse\\(([\\d]+)\\)");
private static final Pattern pY = Pattern.compile("video: \\{url: \"([^\"]+)\"");
private static final Pattern m = Pattern.compile("subtitle: \\{url:\"([^\"]+\\.vtt)\"");
private static final Pattern Q = Pattern.compile("src: '([^']+\\.css)',");
private static final Pattern Db = Pattern.compile("/movie/(\\d+).html");
private static final Pattern I = Pattern.compile("/page/(\\d+)");
private static final Pattern d = Pattern.compile("/v_play/(.*)\\.html");
private static final Pattern K = Pattern.compile("var vkey = ['\"]([^'\"]+)['\"]");
private static final Pattern Oe = Pattern.compile("var fvkey = ['\"]([^'\"]+)['\"]");
private static final Pattern fi = Pattern.compile("var ua = ['\"]([^'\"]+)['\"]");
private static final Pattern M = Pattern.compile("var cip = ['\"]([^'\"]+)['\"]");
private static final Pattern X = Pattern.compile("var time = ['\"]([^'\"]+)['\"]");
private static final Pattern a = Pattern.compile("var url = ['\"]([^'\"]+)['\"]");
private String mmd5(String str) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(str.getBytes());
byte[] digest = messageDigest.digest();
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
String hexString = Integer.toHexString(b & 255);
while (hexString.length() < 2) {
hexString = "0" + hexString;
}
sb.append(hexString);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
public static Object[] loadsub(String sub) {
try {
OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
@Override
protected void onFailure(Call call, Exception e) {
}
@Override
protected void onResponse(Response response) {
}
};
OkHttpClient YM = OkHttpUtil.defaultClient();
OkHttpUtil.get(YM, sub, null, Headers(), callBack);
Response result = callBack.getResult();
int code = result.code();
if (code == 404) {
return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())};
}
ResponseBody body = result.body();
byte[] bytes = body.bytes();
byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16);
byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length);
byte[] KS = CBC.CBC(data, tokenkey, tokenkey);
String vtt = gZip.KS(KS);
vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1");
vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3");
vtt = vtt.replaceAll("<.*><.*>(.*)<.*><.*>", "$1");
vtt = vtt.replaceAll("&(.*);", "");
vtt = vtt.replaceAll(".*NOTE.*", "");
BufferedReader br = new BufferedReader(new StringReader(vtt));
ArrayList<String> 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<String, String> 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<String> 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<Element> 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<String, String> Headers() {
HashMap<String, String> 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<String> 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 "";
}
}
}
@@ -1,309 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.util.TimeUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONObject;
public class Gitcafe extends Spider {
private Map<String, JSONObject> a;
private List<String> 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<String> list = this.b;
list.add("hyds");
List<String> list2 = this.b;
list2.add("hydy");
List<String> list3 = this.b;
list3.add("omdm");
List<String> list4 = this.b;
list4.add("omds");
List<String> list5 = this.b;
list5.add("omdy");
List<String> list6 = this.b;
list6.add("rhdm");
List<String> list7 = this.b;
list7.add("rhds");
List<String> list8 = this.b;
list8.add("rhdy");
List<String> list9 = this.b;
list9.add("qtds");
List<String> list10 = this.b;
list10.add("qtdy");
List<String> list11 = this.b;
list11.add("qtsp");
List<String> list12 = this.b;
list12.add("jlp");
List<String> list13 = this.b;
list13.add("zyp");
}
protected HashMap<String, String> LT() {
HashMap<String, String> 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<String, String> hashMap) {
try {
Map allData = getAllData(this, this, this);
JSONArray jSONArray = new JSONArray();
Set<String> 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<String> 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<String, JSONObject> map;
obj.getClass();
obj2.getClass();
obj3.getClass();
synchronized (this) {
try {
if (a == null) {
HashMap hashMap = new HashMap();
HashMap<String, String> LT = LT();
for (Iterator<String> 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<String, String> 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<String> list = b;
Iterator<String> 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<String> 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<String> 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<String> 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 "";
}
}
}
@@ -1,234 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import okhttp3.Call;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
public class IKan extends AppYsV2 {
private final OkHttpClient y;
private boolean K = false;
private Context cccc = null;
public IKan() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
TimeUnit timeUnit = TimeUnit.SECONDS;
y = builder.readTimeout(15L, timeUnit).writeTimeout(15L, timeUnit).connectTimeout(15L, timeUnit).cookieJar(new CookieJar() {
final List<Cookie> Mf = new ArrayList();
public List<Cookie> 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<Cookie> 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<String, String> getHeaders(String URL) {
HashMap<String, String> 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<String> 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<String, List<String>> 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");
}
}
@@ -1,472 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Juhi extends Spider {
private static final String siteUrl = "https://www.juhi.cc/";
private static final String siteHost = "juhi.cc";
protected JSONObject playerConfig;
protected JSONObject filterConfig;
protected Pattern regexCategory = Pattern.compile("/vodtype/(\\d+)/");
protected Pattern regexVid = Pattern.compile("/voddetail/(\\d+)/");
protected Pattern regexPlay = Pattern.compile("/vodplay/(\\d+)-(\\d+)-(\\d+)/");
protected Pattern regexPage = Pattern.compile("/vodshow/(\\S+)/");
@Override
public void init(Context context) {
super.init(context);
try {
playerConfig = new JSONObject("{\"tkm3u8\":{\"sh\":\"✦剧嗨专线\",\"pu\":\"https://jx.huishij.com/yun/?url=\",\"sn\":1,\"or\":999},\"if101\":{\"sh\":\"✦蓝光超清\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbm3u8\":{\"sh\":\"北美高清①\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dbyun\":{\"sh\":\"北美高清②\",\"pu\":\"\",\"sn\":0,\"or\":999},\"wjm3u8\":{\"sh\":\"北美高清③\",\"pu\":\"\",\"sn\":0,\"or\":999},\"kbm3u8\":{\"sh\":\"全球线路①\",\"pu\":\"\",\"sn\":0,\"or\":999},\"hnyun\":{\"sh\":\"全球线路②\",\"pu\":\"\",\"sn\":0,\"or\":999},\"hnm3u8\":{\"sh\":\"全球线路③\",\"pu\":\"\",\"sn\":0,\"or\":999},\"kbzy\":{\"sh\":\"全球线路④\",\"pu\":\"\",\"sn\":0,\"or\":999},\"fanqie\":{\"sh\":\"全球线路⑤\",\"pu\":\"\",\"sn\":0,\"or\":999},\"kuaiyun\":{\"sh\":\"快速线路\",\"pu\":\"https://qimihe.com/?url=\",\"sn\":1,\"or\":999},\"leyum3u8\":{\"sh\":\"午夜专线1\",\"pu\":\"\",\"sn\":0,\"or\":999},\"lym3u8\":{\"sh\":\"午夜专线2\",\"pu\":\"\",\"sn\":0,\"or\":999},\"dplayer\":{\"sh\":\"DPlayer-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"videojs\":{\"sh\":\"videojs-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"iva\":{\"sh\":\"iva-H5播放器\",\"pu\":\"\",\"sn\":0,\"or\":999},\"iframe\":{\"sh\":\"iframe外链数据\",\"pu\":\"\",\"sn\":0,\"or\":999},\"link\":{\"sh\":\"外链数据\",\"pu\":\"\",\"sn\":0,\"or\":999},\"swf\":{\"sh\":\"Flash文件\",\"pu\":\"\",\"sn\":0,\"or\":999},\"flv\":{\"sh\":\"Flv文件\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bjyun\":{\"sh\":\"bjyun\",\"pu\":\"\",\"sn\":0,\"or\":999},\"bjm3u8\":{\"sh\":\"bjm3u8\",\"pu\":\"\",\"sn\":0,\"or\":999},\"wasu\":{\"sh\":\"华数直连\",\"pu\":\"\",\"sn\":0,\"or\":999},\"funshion\":{\"sh\":\"风行直连\",\"pu\":\"\",\"sn\":0,\"or\":999},\"pptv\":{\"sh\":\"PPTV直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"letv\":{\"sh\":\"乐视直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"mgtv\":{\"sh\":\"芒果直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"youku\":{\"sh\":\"优酷直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"qiyi\":{\"sh\":\"爱奇艺直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"qq\":{\"sh\":\"腾讯直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"m1905\":{\"sh\":\"M1905直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999},\"sohu\":{\"sh\":\"搜狐直连\",\"pu\":\"https://jx.m3u8.tv/jiexi/?url=\",\"sn\":1,\"or\":999}}");
filterConfig = new JSONObject("{\"20\":[{\"key\":\"0\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"20\"},{\"n\":\"动作片\",\"v\":\"24\"},{\"n\":\"喜剧片\",\"v\":\"25\"},{\"n\":\"愛情片\",\"v\":\"26\"},{\"n\":\"科幻片\",\"v\":\"27\"},{\"n\":\"恐怖片\",\"v\":\"28\"},{\"n\":\"劇情片\",\"v\":\"11\"},{\"n\":\"戰爭片\",\"v\":\"30\"},{\"n\":\"动画电影\",\"v\":\"33\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"21\":[{\"key\":\"tid\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产剧\",\"v\":\"34\"},{\"n\":\"港剧\",\"v\":\"35\"},{\"n\":\"韩剧\",\"v\":\"37\"},{\"n\":\"欧美剧\",\"v\":\"36\"},{\"n\":\"日本剧\",\"v\":\"38\"},{\"n\":\"台湾剧\",\"v\":\"39\"},{\"n\":\"海外剧\",\"v\":\"40\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"22\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"22\"},{\"n\":\"大陆综艺\",\"v\":\"41\"},{\"n\":\"港台综艺\",\"v\":\"42\"},{\"n\":\"日韩综艺\",\"v\":\"43\"},{\"n\":\"欧美综艺\",\"v\":\"44\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"23\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"23\"},{\"n\":\"国产动漫\",\"v\":\"45\"},{\"n\":\"日本动漫\",\"v\":\"46\"},{\"n\":\"欧美动漫\",\"v\":\"47\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
/**
* 爬虫headers
*
* @param url
* @return
*/
protected HashMap<String, String> getHeaders(String url) {
HashMap<String, String> 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<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> 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<String> 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<String> 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<String> 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<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@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<String> 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<String> 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<String> 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&timestamp=" + 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 "";
}
}
@@ -1,651 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.net.URLEncoder;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.crypto.Cipher;
import okhttp3.Call;
import okhttp3.Headers;
import okhttp3.Response;
/**
* Author: @SDL
*/
public class Kmys extends Spider {
private String apiDomain = "";
private String staticDomain = "";
private String appId = "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<String, String> getHeaders(String url) {
HashMap<String, String> 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<String, String> 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<String, String> 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<String> 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<String> playFrom = new ArrayList<>();
ArrayList<String> 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<String> 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<String> 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<String, String> 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<String, String> 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;
}
}
@@ -1,681 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class Kuaikan extends Spider {
private static String Cb;
private static long QH;
private static String dW;
private HashMap<String, ArrayList<String>> 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<String, String> j(long j) {
HashMap<String, String> 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<String, String> 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<String> 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<String> list) {
try {
Q();
String[] split = new String(Base64.decode(str2, 10), "UTF-8").split("\\|");
ArrayList<String> arrayList = this.Ji.get(split[2]);
final JSONObject jSONObject = new JSONObject();
if (arrayList != null && arrayList.size() > 0) {
Iterator<String> 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 "";
}
}
}
@@ -31,6 +31,12 @@ public class Kunyu77 extends Spider {
private HashMap<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("user-agent", uAgent);
String t = String.valueOf(System.currentTimeMillis()/ 1000) ;
String zuhe=url+t+"XSpeUFjJ";
String TK=Misc.MD5(zuhe, Misc.CharsetUTF8);
headers.put("TK",TK);
headers.put("t",t);
return headers;
}
@@ -224,8 +230,9 @@ public class Kunyu77 extends Spider {
@Override
public String detailContent(List<String> ids) {
try {
String url = siteUrl + "/api.php/provide/videoDetail?ids=" + ids.get(0);
String content = OkHttpUtil.string(url, getHeaders(url));
String url = siteUrl + "/api.php/provide/videoDetail?ids=" + ids.get(0) + "&version=2.0.4&sj=1661957675";
String urlx="/api.php/provide/videoDetail" + ids.get(0);
String content = OkHttpUtil.string(url, getHeaders(urlx));
JSONObject dataObject = new JSONObject(decryptResponse(content));
JSONObject vObj = dataObject.getJSONObject("data");
JSONObject result = new JSONObject();
@@ -243,7 +250,7 @@ public class Kunyu77 extends Spider {
vodAtom.put("vod_director", vObj.getString("director"));
vodAtom.put("vod_content", vObj.getString("brief").trim());
url = siteUrl + "/api.php/provide/videoPlaylist?ids=" + ids.get(0);
url = siteUrl + "/api.php/provide/videoPlaylist?ids=" + ids.get(0) + "&version=2.0.4&sj=1661957675";
content = OkHttpUtil.string(url, getHeaders(url));
JSONArray episodes = new JSONObject(content).getJSONObject("data").getJSONArray("episodes");
LinkedHashMap<String, ArrayList<String>> playlist = new LinkedHashMap<>();
@@ -1,504 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lib extends Spider {
private static final String siteUrl = "https://www.libvio.me/";
private static final String siteHost = "www.libvio.me";
/**
* 播放源配置
*/
private JSONObject playerConfig;
/**
* 筛选配置
*/
private JSONObject filterConfig;
private Pattern regexCategory = Pattern.compile("/type/(\\d+).html");
private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
private Pattern regexPlay = Pattern.compile("/play/(\\d+)-(\\d+)-(\\d+).html");
private Pattern regexPage = Pattern.compile("/show/(\\S+).html");
protected String ext = null;
@Override
public void init(Context context) {
super.init(context);
try {
playerConfig = new JSONObject("{\"LINE405\":{\"sh\":\"LINE405\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE406\":{\"sh\":\"LINE406\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/zm.php?url=\",\"sn\":1,\"or\":999},\"LINE407\":{\"sh\":\"LINE407\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"LINE408\":{\"sh\":\"LINE408\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p300\":{\"sh\":\"LINE300\",\"pu\":\"\",\"sn\":0,\"or\":999},\"p301\":{\"sh\":\"LINE301\",\"pu\":\"\",\"sn\":0,\"or\":999},\"line402-日语\":{\"sh\":\"LINE402\",\"pu\":\"\",\"sn\":0,\"or\":999},\"LINE400\":{\"sh\":\"LINE400\",\"pu\":\"https://sh-data-s01.chinaeast2.cloudapp.chinacloudapi.cn/lb.php?url=\",\"sn\":1,\"or\":999},\"line401\":{\"sh\":\"LINE401\",\"pu\":\"\",\"sn\":0,\"or\":999}}");
filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国大陆\",\"v\":\"中国大陆\"},{\"n\":\"中国香港\",\"v\":\"中国香港\"},{\"n\":\"中国台湾\",\"v\":\"中国台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"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\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"中国\",\"v\":\"中国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"15\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"16\":[{\"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\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
protected static HashMap<String, String> Headers() {
HashMap<String, String> 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<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("method", "GET");
headers.put("Upgrade-Insecure-Requests", "1");
headers.put("DNT", "1");
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
return headers;
}
/**
* 获取分类数据 + 首页最近更新视频列表数据
*
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
* @return
*/
@Override
public String homeContent(boolean filter) {
try {
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
// 分类节点
Elements elements = doc.select("ul.stui-header__menu li a");
JSONArray classes = new JSONArray();
for (Element ele : elements) {
String name = ele.text();
boolean show = name.equals("电影") ||
name.equals("剧集") ||
name.equals("动漫") ||
name.equals("日韩剧") ||
name.equals("欧美剧");
if (show) {
Matcher mather = regexCategory.matcher(ele.attr("href"));
if (!mather.find())
continue;
// 把分类的id和名称取出来加到列表里
String id = mather.group(1).trim();
JSONObject jsonObject = new JSONObject();
jsonObject.put("type_id", id);
jsonObject.put("type_name", name);
classes.put(jsonObject);
}
}
JSONObject result = new JSONObject();
if (filter) {
result.put("filters", filterConfig);
}
result.put("class", classes);
try {
// 取首页推荐视频列表
Element homeList = doc.select("ul.stui-vodlist").get(0);
Elements list = homeList.select("div.stui-vodlist__box");
JSONArray videos = new JSONArray();
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
} catch (Exception e) {
SpiderDebug.log(e);
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 获取分类信息数据
*
* @param tid 分类id
* @param pg 页数
* @param filter 同homeContent方法中的filter
* @param extend 筛选参数{k:v, k1:v1}
* @return
*/
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
}
}
// 获取分类数据的url
String url = siteUrl + "show/" + TextUtils.join("-", urlParams) + ".html";
String html = OkHttpUtil.string(url, getHeaders(url));
Document doc = Jsoup.parse(html);
JSONObject result = new JSONObject();
int pageCount = 0;
int page = -1;
// 取页码相关信息
Elements pageInfo = doc.select("ul.stui-page__item li");
if (pageInfo.size() == 0) {
page = Integer.parseInt(pg);
pageCount = page;
} else {
for (int i = 0; i < pageInfo.size(); i++) {
Element li = pageInfo.get(i);
Element a = li.selectFirst("a");
if (a == null)
continue;
String name = a.text();
if (page == -1 && li.hasClass("active")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("哈哈"+matcher.group(1));
page = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
page = 0;
}
}
if (name.equals("尾页")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("尾页" + matcher.group(1));
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
pageCount = 0;
}
break;
}
}
}
JSONArray videos = new JSONArray();
if (!html.contains("没有找到您想要的结果哦")) {
// 取当前分类页的视频列表
Elements list = doc.select("div.stui-vodlist__box");
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
}
result.put("page", page);
result.put("pagecount", pageCount);
result.put("limit", 48);
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 视频详情信息
*
* @param ids 视频id
* @return
*/
@Override
public String detailContent(List<String> ids) {
try {
// 视频详情url
String url = siteUrl + "/detail/" + ids.get(0) + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
JSONObject result = new JSONObject();
JSONObject vodList = new JSONObject();
// 取基本数据
String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
String title = doc.select("div.stui-content__detail h1").text();
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
Elements data = doc.select("p.data");
Pattern cate = Pattern.compile("类型:(\\S+)");
category = doReplaceRegex(cate, data.get(0).text());
Pattern areas = Pattern.compile("地区:(\\S+)");
area = doReplaceRegex(areas, data.get(0).text());
Pattern years = Pattern.compile("年份:(\\S+)");
year = doReplaceRegex(years, data.get(0).text());
Pattern rms = Pattern.compile("更新:(\\S+)");
remark = doReplaceRegex(rms, data.get(3).text());
Pattern acs = Pattern.compile("主演:(\\S+)");
actor = doReplaceRegex(acs, data.get(1).text());
Pattern dis = Pattern.compile("导演:(\\S+)");
director = doReplaceRegex(dis, data.get(1).text());
desc = doc.selectFirst("span.detail-content").text().trim();
vodList.put("vod_id", ids.get(0));
vodList.put("vod_name", title);
vodList.put("vod_pic", cover);
vodList.put("type_name", category);
vodList.put("vod_year", year);
vodList.put("vod_area", area);
vodList.put("vod_remarks", remark);
vodList.put("vod_actor", actor);
vodList.put("vod_director", director);
vodList.put("vod_content", desc);
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
if (sort1 == sort2) {
return 1;
}
return sort1 - sort2 > 0 ? 1 : -1;
} catch (JSONException e) {
SpiderDebug.log(e);
}
return 1;
}
});
// 取播放列表数据
Elements sources = doc.select("div.stui-vodlist__head h3");
Elements sourceList = doc.select("ul.stui-content__playlist");
for (int i = 0; i < sources.size(); i++) {
Element source = sources.get(i);
String sourceName = source.text();
boolean found = false;
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
String flag = it.next();
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
sourceName = flag;
found = true;
break;
}
}
if (!found)
continue;
String playList = "";
Elements playListA = sourceList.get(i).select("li a");
List<String> 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<String> vipFlags) {
try {
//定义播放用的headers
JSONObject headers = new JSONObject();
headers.put("origin", " https://www.libvio.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");
headers.put("referer", " https://www.libvio.me/");
// 播放页 url
String url = siteUrl + "/play/" + id + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
Elements allScript = doc.select("script");
for (int i = 0; i < allScript.size(); i++) {
String scContent = allScript.get(i).html().trim();
if (scContent.startsWith("var player_")) { // 取直链
int start = scContent.indexOf('{');
int end = scContent.lastIndexOf('}') + 1;
String json = scContent.substring(start, end);
JSONObject player = new JSONObject(json);
if (playerConfig.has(player.getString("from"))) {
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
if (player.getString("from").contains("LINE")) {
String videoUrl = pCfg.getString("pu") + player.getString("url");
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, Headers()));
Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
Elements allScripts = docs.select("body script");
for (int j = 0; j < allScripts.size(); j++) {
String scContents = allScripts.get(j).html().trim();
Matcher matcher = pattern.matcher(scContents);
if (matcher.find()) {
JSONObject result = new JSONObject();
String players = matcher.group(0);
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", players);
return result.toString();
}
}
}
else {
SpiderDebug.log(url);
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", url);
// result.put("header", "{\"Referer\", \"https://www.libvio.me/\"}");
return result.toString();
}
break;
}
}
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
protected static HashMap<String, String> sHeaders() {
HashMap<String, String> headers = new HashMap<>();
headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
headers.put("Accept-encoding", "gzip, deflate, br");
headers.put("Accept-language", "zh-SG,zh;q=0.9,en-GB;q=0.8,en;q=0.7,zh-CN;q=0.6");
return headers;
}
@Override
public String searchContent(String key, boolean quick) {
try {
String url = "https://google.1qi777.com/search?q=site%3Alibvio.me%2Fdetail+" + 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);
Elements data = link.select("p.data");
if (matcher.find()) {
String group = matcher.group(1);
String cover = link.select("div.stui-content__thumb a img").attr("data-original");
String title = link.select("div.stui-content__detail h1").text();
Pattern rms = Pattern.compile("更新:(\\S+)");
String remark = doReplaceRegex(rms, data.get(3).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 "";
}
private static String doReplaceRegex(Pattern pattern, String src) {
if (pattern == null)
return src;
try {
Matcher matcher = pattern.matcher(src);
if (matcher.find()) {
return matcher.group(1).trim();
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return src;
}
}
@@ -1,466 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.Set;
import okhttp3.Call;
public class LiteApple extends Spider {
private static final String siteUrl = "http://ht.grelighting.cn/api.php";
private HashMap<String, String> getHeaders(String url, String data) {
HashMap<String, String> 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<String, String> 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<String> 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<String> 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<String> 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<String> 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;
}
}
}
@@ -1,503 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Nfyun extends Spider {
private static final String siteUrl = "https://yanaifei.cn";
private static final String siteHost = "yanaifei.cn";
private static Pattern pic = Pattern.compile("(?<=url=).*");
/**
* 播放源配置
*/
private JSONObject playerConfig;
/**
* 筛选配置
*/
private JSONObject filterConfig;
private Pattern regexCategory = Pattern.compile("/vod/type/(\\d+).html");
private Pattern regexVid = Pattern.compile("/vod/detail/(\\d+).html");
private Pattern regexPlay = Pattern.compile("/vod/play/(\\d+)-(\\d+)-(\\d+).html");
private Pattern regexPage = Pattern.compile("/vod/show/(\\S+).html");
protected String ext = null;
@Override
public void init(Context context) {
super.init(context);
try {
playerConfig = new JSONObject("{\"VIP\":{\"sh\":\"VIP\",\"pu\":\"https://yanaifei.cn/player/?url=\",\"sn\":0,\"or\":999}}");
filterConfig = new JSONObject("{\"1\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"1\"},{\"n\":\"动作片\",\"v\":\"6\"},{\"n\":\"喜剧片\",\"v\":\"7\"},{\"n\":\"爱情片\",\"v\":\"8\"},{\"n\":\"科幻片\",\"v\":\"9\"},{\"n\":\"恐怖片\",\"v\":\"10\"},{\"n\":\"剧情片\",\"v\":\"11\"},{\"n\":\"战争片\",\"v\":\"12\"},{\"n\":\"动画片\",\"v\":\"32\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"枪战\",\"v\":\"枪战\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"微电影\",\"v\":\"微电影\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"农村\",\"v\":\"农村\"},{\"n\":\"儿童\",\"v\":\"儿童\"},{\"n\":\"网络电影\",\"v\":\"网络电影\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"意大利\",\"v\":\"意大利\"},{\"n\":\"西班牙\",\"v\":\"西班牙\"},{\"n\":\"加拿大\",\"v\":\"加拿大\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"2\"},{\"n\":\"国产剧\",\"v\":\"13\"},{\"n\":\"港台剧\",\"v\":\"14\"},{\"n\":\"日韩剧\",\"v\":\"15\"},{\"n\":\"欧美剧\",\"v\":\"16\"},{\"n\":\"泰国剧\",\"v\":\"20\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"青春偶像\",\"v\":\"青春偶像\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"家庭\",\"v\":\"家庭\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"乡村\",\"v\":\"乡村\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"商战\",\"v\":\"商战\"},{\"n\":\"网剧\",\"v\":\"网剧\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"3\"},{\"n\":\"大陆综艺\",\"v\":\"22\"},{\"n\":\"港台综艺\",\"v\":\"23\"},{\"n\":\"日韩综艺\",\"v\":\"24\"},{\"n\":\"欧美综艺\",\"v\":\"25\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"旅游\",\"v\":\"旅游\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"游戏互动\",\"v\":\"游戏互动\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"求职\",\"v\":\"求职\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"港台\",\"v\":\"港台\"},{\"n\":\"日韩\",\"v\":\"日韩\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":0,\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"4\"},{\"n\":\"大陆动漫\",\"v\":\"26\"},{\"n\":\"港台动漫\",\"v\":\"27\"},{\"n\":\"日韩动漫\",\"v\":\"28\"},{\"n\":\"欧美动漫\",\"v\":\"29\"}]},{\"key\":3,\"name\":\"剧情\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":1,\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":4,\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"普通话\",\"v\":\"普通话\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"闽南语\",\"v\":\"闽南语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":11,\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"}]},{\"key\":5,\"name\":\"字母\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"A\",\"v\":\"A\"},{\"n\":\"B\",\"v\":\"B\"},{\"n\":\"C\",\"v\":\"C\"},{\"n\":\"D\",\"v\":\"D\"},{\"n\":\"E\",\"v\":\"E\"},{\"n\":\"F\",\"v\":\"F\"},{\"n\":\"G\",\"v\":\"G\"},{\"n\":\"H\",\"v\":\"H\"},{\"n\":\"I\",\"v\":\"I\"},{\"n\":\"J\",\"v\":\"J\"},{\"n\":\"K\",\"v\":\"K\"},{\"n\":\"L\",\"v\":\"L\"},{\"n\":\"M\",\"v\":\"M\"},{\"n\":\"N\",\"v\":\"N\"},{\"n\":\"O\",\"v\":\"O\"},{\"n\":\"P\",\"v\":\"P\"},{\"n\":\"Q\",\"v\":\"Q\"},{\"n\":\"R\",\"v\":\"R\"},{\"n\":\"S\",\"v\":\"S\"},{\"n\":\"T\",\"v\":\"T\"},{\"n\":\"U\",\"v\":\"U\"},{\"n\":\"V\",\"v\":\"V\"},{\"n\":\"W\",\"v\":\"W\"},{\"n\":\"X\",\"v\":\"X\"},{\"n\":\"Y\",\"v\":\"Y\"},{\"n\":\"Z\",\"v\":\"Z\"},{\"n\":\"0-9\",\"v\":\"0-9\"}]},{\"key\":2,\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
protected static HashMap<String, String> Headers() {
HashMap<String, String> 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<String, String> getHeaders(String url) {
HashMap<String, String> 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<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> 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<String> 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<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@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<String> 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<String> 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<String> 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&timestamp=" + 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;
}
}
@@ -1,345 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class SP360 extends Spider {
protected JSONObject ext = null;
private static final String SiteHost = "https://api.web.360kan.com/v1/rank?cat=1";
private static final String SiteFilter = "https://api.web.360kan.com/v1/filter/list";
private static final String SiteDetail = "https://api.web.360kan.com/v1/detail";
private static final String SiteSearch = "https://api.so.360kan.com/index?force_v=1&kw=%s&from=&pageno=1&v_ap=1&tab=all";
@Override
public void init(Context context) {
super.init(context);
try {
ext = new JSONObject("{\"classes\":[{\"type_name\":\"电影\",\"type_id\":\"1\"},{\"type_name\":\"电视剧\",\"type_id\":\"2\"},{\"type_name\":\"综艺\",\"type_id\":\"3\"},{\"type_name\":\"动漫\",\"type_id\":\"4\"}],\"filter\":{\"1\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"纪录\",\"v\":\"纪录\"},{\"n\":\"传记\",\"v\":\"传记\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"2\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"军事\",\"v\":\"军事\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"神话\",\"v\":\"神话\"},{\"n\":\"谍战\",\"v\":\"谍战\"},{\"n\":\"青春\",\"v\":\"青春剧\"},{\"n\":\"家庭\",\"v\":\"家庭剧\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"其他\",\"v\":\"其他\"},{\"n\":\"全部\",\"v\":\"\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"3\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"脱口秀\",\"v\":\"脱口秀\"},{\"n\":\"真人秀\",\"v\":\"真人秀\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"八卦\",\"v\":\"八卦\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"晚会\",\"v\":\"晚会\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"职场\",\"v\":\"职场\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"时尚\",\"v\":\"时尚\"},{\"n\":\"游戏\",\"v\":\"游戏\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"体育\",\"v\":\"体育\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"科教\",\"v\":\"科教\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"汽车\",\"v\":\"汽车\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}],\"4\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"美少女\",\"v\":\"美少女\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"恋爱\",\"v\":\"恋爱\"},{\"n\":\"治愈\",\"v\":\"治愈\"},{\"n\":\"幻想\",\"v\":\"幻想\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动物\",\"v\":\"动物\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"儿歌\",\"v\":\"儿歌\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"怪物\",\"v\":\"怪物\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"童话\",\"v\":\"童话\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"友情\",\"v\":\"友情\"},{\"n\":\"真人版\",\"v\":\"真人版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"新番动画\",\"v\":\"新番动画\"},{\"n\":\"完结动画\",\"v\":\"完结动画\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"更早\",\"v\":\"更早\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}]}}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
protected HashMap<String, String> Headers() {
HashMap<String, String> 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<String, String> extend) {
String cover;
String remark;
try {
String url = SiteFilter + "?catid=" + tid + "&pageno=" + pg;
Set<String> 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<String> 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<String> 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<String> 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();
}
}
@@ -1,514 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OKCallBack;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import okhttp3.Call;
/**
* 神马影院
* <p>
* 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<String, String> getHeaders(String url) {
HashMap<String, String> 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<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> 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<String> 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<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@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<String> 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<String> 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<String> 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&timestamp=" + 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 "";
}
}
@@ -1,37 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import com.github.catvod.xpath.XPathRule;
import org.json.JSONArray;
import org.json.JSONObject;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class XPathMacTvgook extends XPathMac {
@Override
public boolean manualVideoCheck() {
return rule.getHomeUrl().contains("tvgook.com");
}
@Override
public boolean isVideoFormat(String url) {
return Misc.isVideoFormat(url)||(url.contains("/ppvod/")&&!url.contains("skipl=1"));
}
}
@@ -1,154 +0,0 @@
package com.github.catvod.spider;
import android.text.TextUtils;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.seimicrawler.xpath.JXDocument;
import org.seimicrawler.xpath.JXNode;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class XPbd extends XPath {
@Override
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
String cateUrl = rule.getCateUrl();
if (filter && extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
if (value.length() > 0) {
cateUrl = cateUrl.replace("{" + key + "}", URLEncoder.encode(value));
}
}
}
cateUrl = cateUrl.replace("{cateId}", tid).replace("{catePg}", pg);
Matcher m = Pattern.compile("\\{(.*?)\\}").matcher(cateUrl);
while (m.find()) {
String n = m.group(0).replace("{", "").replace("}", "");
cateUrl = cateUrl.replace(m.group(0), "").replace("/" + n + "/", "");
}
return cateUrl;
}
@Override
public String detailContent(List<String> ids) {
try {
String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0));
String webContent = fetch(webUrl);
JXDocument doc = JXDocument.create(webContent);
JXNode vodNode = doc.selNOne(rule.getDetailNode());
JSONObject vodAtom = new JSONObject();
String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = "";
title = vodNode.selOne(rule.getDetailName()).asString().trim();
title = rule.getDetailNameR(title);
cover = vodNode.selOne(rule.getDetailImg()).asString().trim();
cover = rule.getDetailImgR(cover);
cover = Misc.fixUrl(webUrl, cover);
if (!rule.getDetailCate().isEmpty()) {
try {
category = vodNode.selOne(rule.getDetailCate()).asString().trim();
category = rule.getDetailCateR(category);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailYear().isEmpty()) {
try {
year = vodNode.selOne(rule.getDetailYear()).asString().trim();
year = rule.getDetailYearR(year);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailArea().isEmpty()) {
try {
area = vodNode.selOne(rule.getDetailArea()).asString().trim();
area = rule.getDetailAreaR(area);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailMark().isEmpty()) {
try {
remark = vodNode.selOne(rule.getDetailMark()).asString().trim();
remark = rule.getDetailMarkR(remark);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailActor().isEmpty()) {
try {
actor = vodNode.selOne(rule.getDetailActor()).asString().trim();
actor = rule.getDetailActorR(actor);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailDirector().isEmpty()) {
try {
director = vodNode.selOne(rule.getDetailDirector()).asString().trim();
director = rule.getDetailDirectorR(director);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!rule.getDetailDesc().isEmpty()) {
try {
desc = vodNode.selOne(rule.getDetailDesc()).asString().trim();
desc = rule.getDetailDescR(desc);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
vodAtom.put("vod_name", title);
vodAtom.put("vod_pic", cover);
vodAtom.put("type_name", category);
vodAtom.put("vod_year", year);
vodAtom.put("vod_area", area);
vodAtom.put("vod_remarks", remark);
vodAtom.put("vod_actor", actor);
vodAtom.put("vod_director", director);
vodAtom.put("vod_content", desc);
List<JXNode> urlListNodes = doc.selN(rule.getDetailUrlNode());
for (int i = 0; i < urlListNodes.size(); i++) {
List<JXNode> urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode());
for (int j = 0; j < urlNodes.size(); j++) {
String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim();
id = rule.getDetailUrlIdR(id);
JSONObject result = new JSONObject();
JSONArray lists = new JSONArray();
vodAtom.put("vod_id", id);
vodAtom.put("vod_play_from", "磁力测试");
vodAtom.put("vod_play_url", "网站没资源$" + id);
lists.put(vodAtom);
result.put("list", lists);
return result.toString();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return "";
}
}
@@ -1,77 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Pattern;
public class Xxys extends AppYsV2 {
@Override
protected JSONObject getFinalVideo(String flag, ArrayList<String> parseUrls, String url) throws JSONException {
String htmlPlayUrl = "";
for (String parseUrl : parseUrls) {
if (parseUrl.isEmpty() || parseUrl.equals("null"))
continue;
String playUrl = parseUrl + url;
String content = desc(OkHttpUtil.string(playUrl, null), (byte) 4);
try {
HashMap hashMap = new HashMap();
OkHttpUtil.stringNoRedirect(playUrl, null, hashMap);
String d = OkHttpUtil.getRedirectLocation(hashMap);
JSONObject result = new JSONObject();
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", d);
return result;
} catch (JSONException e) {
e.printStackTrace();
}
JSONObject tryJson = null;
try {
tryJson = Misc.jsonParse(url, content);
} catch (Throwable th) {
}
if (tryJson != null && tryJson.has("url") && tryJson.has("header")) {
tryJson.put("header", tryJson.getJSONObject("header").toString());
return tryJson;
}
if (content.contains("<html")) {
boolean sniffer = false;
for (Pattern p : htmlVideoKeyMatch) {
if (p.matcher(content).find()) {
sniffer = true;
break;
}
}
if (sniffer) {
htmlPlayUrl = parseUrl;
}
}
}
if (!htmlPlayUrl.isEmpty()) {
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", htmlPlayUrl);
result.put("url", url);
return result;
}
return null;
}
@Override
public void init(Context context, String str) {
super.init(context, "http://tvht.lanrentk.cc/api.php/iptv/vod");
}
}
@@ -1,394 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 影视工厂
* <p>
* Author: 小黄瓜
*/
public class Ysgc extends Spider {
private static final String siteUrl = "https://www.ik4.cc";
private static final String siteHost = "www.ik4.cc";
protected JSONObject playerConfig = new JSONObject();
@Override
public void init(Context context) {
super.init(context);
}
protected HashMap<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("user-agent", "Dart/2.14 (dart:io)");
headers.put("version", "1.9.8");
headers.put("copyright", "xiaogui");
headers.put("host", siteHost);
headers.put("platform", "android");
return headers;
}
@Override
public String homeContent(boolean filter) {
try {
String url = siteUrl + "/xgapp.php/v1/nav?token=";
JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONArray jsonArray = jsonObject.getJSONArray("data");
JSONArray classes = new JSONArray();
JSONObject filterConfig = new JSONObject();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jObj = jsonArray.getJSONObject(i);
String typeName = jObj.getString("type_name");
if (typeName.equals("电视直播"))
continue;
String typeId = jObj.getString("type_id");
JSONObject newCls = new JSONObject();
newCls.put("type_id", typeId);
newCls.put("type_name", typeName);
classes.put(newCls);
try {
JSONObject typeExtend = jObj.getJSONObject("type_extend");
Iterator<String> typeExtendKeys = typeExtend.keys();
JSONArray extendsAll = new JSONArray();
while (typeExtendKeys.hasNext()) {
String typeExtendKey = typeExtendKeys.next();
String typeExtendName = null;
switch (typeExtendKey) {
case "class":
typeExtendName = "类型";
break;
case "area":
typeExtendName = "地区";
break;
case "lang":
typeExtendName = "语言";
break;
case "year":
typeExtendName = "年代";
break;
}
if (typeExtendName == null) {
SpiderDebug.log(typeExtendKey);
continue;
}
String typeExtendStr = typeExtend.getString(typeExtendKey);
if (typeExtendStr.trim().length() == 0)
continue;
String[] newTypeExtendKeys = typeExtendStr.split(",");
JSONObject newTypeExtend = new JSONObject();
newTypeExtend.put("key", typeExtendKey);
newTypeExtend.put("name", typeExtendName);
JSONArray newTypeExtendKV = new JSONArray();
{
JSONObject kvAll = new JSONObject();
kvAll.put("n", "全部");
kvAll.put("v", "");
newTypeExtendKV.put(kvAll);
}
for (String k : newTypeExtendKeys) {
if (typeExtendName.equals("伦理"))
continue;
JSONObject kv = new JSONObject();
kv.put("n", k);
kv.put("v", k);
newTypeExtendKV.put(kv);
}
newTypeExtend.put("value", newTypeExtendKV);
extendsAll.put(newTypeExtend);
}
filterConfig.put(typeId, extendsAll);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
JSONObject result = new JSONObject();
result.put("class", classes);
if (filter) {
result.put("filters", filterConfig);
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String homeVideoContent() {
try {
String url = siteUrl + "/xgapp.php/v1/index_video?token=";
JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONArray jsonArray = jsonObject.getJSONArray("data");
JSONArray videos = new JSONArray();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jObj = jsonArray.getJSONObject(i);
JSONArray videoList = jObj.getJSONArray("vlist");
for (int j = 0; j < videoList.length() && j < 6; j++) {
JSONObject vObj = videoList.getJSONObject(j);
JSONObject v = new JSONObject();
v.put("vod_id", vObj.getString("vod_id"));
v.put("vod_name", vObj.getString("vod_name"));
v.put("vod_pic", vObj.getString("vod_pic"));
v.put("vod_remarks", vObj.getString("vod_remarks"));
videos.put(v);
}
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String url = siteUrl + "/xgapp.php/v1/video?tid=" + tid + "&pg=" + pg + "&token=";
Set<String> keys = extend.keySet();
for (String key : keys) {
url += "&" + key + "=" + URLEncoder.encode(extend.get(key));
}
JSONObject dataObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONArray jsonArray = dataObject.getJSONArray("data");
JSONArray videos = new JSONArray();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject vObj = jsonArray.getJSONObject(i);
JSONObject v = new JSONObject();
v.put("vod_id", vObj.getString("vod_id"));
v.put("vod_name", vObj.getString("vod_name"));
v.put("vod_pic", vObj.getString("vod_pic"));
v.put("vod_remarks", vObj.getString("vod_remarks"));
videos.put(v);
}
JSONObject result = new JSONObject();
int limit = 20;
int page = dataObject.getInt("page");
int total = dataObject.getInt("total");
int pageCount = dataObject.getInt("pagecount");
result.put("page", page);
result.put("pagecount", pageCount);
result.put("limit", limit);
result.put("total", total);
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String detailContent(List<String> ids) {
try {
String url = siteUrl + "/xgapp.php/v1/video_detail?id=" + ids.get(0) + "&token=";
JSONObject jsonObject = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
JSONObject dataObject = jsonObject.getJSONObject("data");
if (dataObject.has("vod_info")) {
try {
dataObject = dataObject.getJSONObject("vod_info");
} catch (Exception e) {
}
}
JSONObject vodList = new JSONObject();
vodList.put("vod_id", dataObject.getString("vod_id"));
vodList.put("vod_name", dataObject.getString("vod_name"));
vodList.put("vod_pic", dataObject.getString("vod_pic"));
vodList.put("type_name", dataObject.getString("vod_class"));
vodList.put("vod_year", dataObject.getString("vod_year"));
vodList.put("vod_area", dataObject.getString("vod_area"));
vodList.put("vod_remarks", dataObject.getString("vod_remarks"));
vodList.put("vod_actor", dataObject.getString("vod_actor"));
vodList.put("vod_director", dataObject.getString("vod_director"));
vodList.put("vod_content", dataObject.getString("vod_content"));
JSONArray playerList = dataObject.getJSONArray("vod_url_with_player");
List<String> playFlags = new ArrayList<>();
HashMap<String, String> playUrls = new HashMap<>();
for (int i = 0; i < playerList.length(); i++) {
JSONObject playerListObj = playerList.getJSONObject(i);
String from = playerListObj.getString("code");
playUrls.put(from, playerListObj.getString("url"));
playerListObj.remove("url");
playerConfig.put(from, playerListObj);
playFlags.add(from);
}
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int sort1 = playFlags.indexOf(o1);
int sort2 = playFlags.indexOf(o2);
if (sort1 == sort2) {
return 1;
}
return sort1 - sort2 > 0 ? 1 : -1;
}
});
String[] vod_play_from_list = dataObject.getString("vod_play_from").split("\\$\\$\\$");
String[] vod_play_url_list = dataObject.getString("vod_play_url").split("\\$\\$\\$");
for (int i = 0; i < vod_play_from_list.length; i++) {
String from = vod_play_from_list[i];
if (i >= vod_play_url_list.length || vod_play_url_list[i].trim().length() == 0) {
if (playUrls.containsKey(from) && playUrls.get(from).trim().length() > 0) {
vod_play.put(vod_play_from_list[i], playUrls.get(from));
}
continue;
}
vod_play.put(vod_play_from_list[i], vod_play_url_list[i]);
}
String vod_play_from = TextUtils.join("$$$", vod_play.keySet());
String vod_play_url = TextUtils.join("$$$", vod_play.values());
vodList.put("vod_play_from", vod_play_from);
vodList.put("vod_play_url", vod_play_url);
JSONObject result = new JSONObject();
JSONArray list = new JSONArray();
list.put(vodList);
result.put("list", list);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private HashMap<String, String> getHeaderJxs(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("platform_version", "LMY47I");
headers.put("user-agent", "Dart/2.12 (dart:io)");
headers.put("version", "1.6.4");
headers.put("copyright", "xiaogui");
headers.put("platform", "android");
headers.put("client_name", "6L+95Ymn6L6+5Lq6");
return headers;
}
@Override
public String playerContent(String flag, String id, List<String> vipFlags) {
try {
JSONObject result = new JSONObject();
if (id.contains("hsl.ysgc.xyz")) {
String uuu = "https://www.ysgc.cc/static/player/dplayer.php?url=" + id;
HashMap<String, String> headers = new HashMap();
headers.put("referer", "https://www.ysgc.cc/");
String content = OkHttpUtil.string(uuu, headers);
Matcher matcher = Pattern.compile("url: url\\+'(.+?)',").matcher(content);
if (matcher.find()) {
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", id + matcher.group(1));
result.put("header", "{\"Referer\":\" https://www.ysgc.cc\"}");
} else {
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", uuu);
result.put("header", "{\"Referer\":\"https://www.ysgc.cc/\"}");
}
return result.toString();
} else if (id.contains("duoduozy.com") || id.contains("m3u8.cache.suoyo.cc")) {
String uuu = "https://www.6080kan.cc/app.php?url=" + id;
String content = OkHttpUtil.string(uuu, null);
return Misc.jsonParse(id, content).toString();
}
if (vipFlags.contains(flag)) {
try {
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", id);
return result.toString();
} catch (Exception ee) {
SpiderDebug.log(ee);
}
}
JSONObject playerObj = playerConfig.getJSONObject(flag);
String parseUrl = playerObj.getString("parse_api") + id;
String content = OkHttpUtil.string(parseUrl, getHeaderJxs(parseUrl));
JSONObject playerData = new JSONObject(content);
JSONObject headers = new JSONObject();
String ua = playerData.optString("user-agent", "");
if (ua.trim().length() > 0) {
headers.put("User-Agent", " " + ua);
}
String referer = playerData.optString("referer", "");
if (referer.trim().length() > 0) {
headers.put("Referer", " " + referer);
}
result.put("parse", 0);
result.put("header", headers.toString());
result.put("playUrl", "");
result.put("url", playerData.getString("url"));
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
if (vipFlags.contains(flag)) {
try {
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", id);
return result.toString();
} catch (Exception ee) {
SpiderDebug.log(ee);
}
}
}
return "";
}
@Override
public String searchContent(String key, boolean quick) {
if (quick)
return "";
try {
String url = siteUrl + "/xgapp.php/v1/search?text=" + URLEncoder.encode(key) + "&pg=1";
String content = OkHttpUtil.string(url, getHeaders(url));
JSONObject dataObject = new JSONObject(content);
JSONArray jsonArray = dataObject.getJSONArray("data");
JSONArray videos = new JSONArray();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject vObj = jsonArray.getJSONObject(i);
JSONObject v = new JSONObject();
v.put("vod_id", vObj.getString("vod_id"));
v.put("vod_name", vObj.getString("vod_name"));
v.put("vod_pic", vObj.getString("vod_pic"));
v.put("vod_remarks", vObj.getString("vod_remarks"));
videos.put(v);
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
}
@@ -1,486 +0,0 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Zxzj extends Spider {
private static final String siteUrl = "https://zxzj.vip/";
/**
* 播放源配置
*/
private JSONObject playerConfig;
/**
* 筛选配置
*/
private JSONObject filterConfig;
private Pattern regexCategory = Pattern.compile("/list/(\\d+).html");
private Pattern regexVid = Pattern.compile("/detail/(\\d+).html");
private Pattern regexPlay = Pattern.compile("/video/(\\d+)-(\\d+)-(\\d+).html");
private Pattern regexPage = Pattern.compile("/vodshow/(\\S+).html");
protected String ext = null;
@Override
public void init(Context context) {
super.init(context);
try {
playerConfig = new JSONObject("{\"dpp\":{\"sh\":\"DP播放\",\"pu\":\"https://jx.zxzj.vip/dplayer.php?url=\",\"sn\":1,\"or\":999}}");
filterConfig = new JSONObject("{\"1\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"情色\",\"v\":\"情色\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"大陆\",\"v\":\"大陆\"},{\"n\":\"香港\",\"v\":\"香港\"},{\"n\":\"台湾\",\"v\":\"台湾\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"俄罗斯\",\"v\":\"俄罗斯\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"韩语\",\"v\":\"韩语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"法语\",\"v\":\"法语\"},{\"n\":\"泰语\",\"v\":\"泰语\"},{\"n\":\"德语\",\"v\":\"德语\"},{\"n\":\"印度语\",\"v\":\"印度语\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"粤语\",\"v\":\"粤语\"},{\"n\":\"俄语\",\"v\":\"俄语\"},{\"n\":\"西班牙语\",\"v\":\"西班牙语\"},{\"n\":\"意大利语\",\"v\":\"意大利语\"},{\"n\":\"其它\",\"v\":\"其它\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"2\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"法语\",\"v\":\"法语\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"3\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"4\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"6\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"萝莉\",\"v\":\"萝莉\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"少年\",\"v\":\"少年\"},{\"n\":\"少女\",\"v\":\"少女\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"原创\",\"v\":\"原创\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"1\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国产\",\"v\":\"国产\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"4\",\"name\":\"语言\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"国语\",\"v\":\"国语\"},{\"n\":\"日语\",\"v\":\"日语\"},{\"n\":\"英语\",\"v\":\"英语\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}],\"5\":[{\"key\":\"3\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"11\",\"name\":\"年份\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"2003\",\"v\":\"2003\"},{\"n\":\"2002\",\"v\":\"2002\"},{\"n\":\"2001\",\"v\":\"2001\"},{\"n\":\"2000\",\"v\":\"2000\"}]},{\"key\":\"2\",\"name\":\"排序\",\"value\":[{\"n\":\"时间\",\"v\":\"time\"},{\"n\":\"人气\",\"v\":\"hits\"},{\"n\":\"评分\",\"v\":\"score\"}]}]}");
} catch (JSONException e) {
SpiderDebug.log(e);
}
}
protected static HashMap<String, String> Headers() {
HashMap<String, String> 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<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
headers.put("method", "GET");
headers.put("Upgrade-Insecure-Requests", "1");
headers.put("DNT", "1");
headers.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
return headers;
}
/**
* 获取分类数据 + 首页最近更新视频列表数据
*
* @param filter 是否开启筛选 关联的是 软件设置中 首页数据源里的筛选开关
* @return
*/
@Override
public String homeContent(boolean filter) {
try {
Document doc = Jsoup.parse(OkHttpUtil.string(siteUrl, getHeaders(siteUrl)));
// 分类节点
Elements elements = doc.select("ul.stui-header__menu li a");
JSONArray classes = new JSONArray();
for (Element ele : elements) {
String name = ele.text();
boolean show = name.equals("电影") ||
name.equals("美剧") ||
name.equals("韩剧") ||
name.equals("日剧") ||
name.equals("泰剧") ||
name.equals("动漫");
if (show) {
Matcher mather = regexCategory.matcher(ele.attr("href"));
if (!mather.find())
continue;
// 把分类的id和名称取出来加到列表里
String id = mather.group(1).trim();
JSONObject jsonObject = new JSONObject();
jsonObject.put("type_id", id);
jsonObject.put("type_name", name);
classes.put(jsonObject);
}
}
JSONObject result = new JSONObject();
if (filter) {
result.put("filters", filterConfig);
}
result.put("class", classes);
try {
// 取首页推荐视频列表
Element homeList = doc.select("ul.stui-vodlist").get(0);
Elements list = homeList.select("div.stui-vodlist__box");
JSONArray videos = new JSONArray();
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
} catch (Exception e) {
SpiderDebug.log(e);
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 获取分类信息数据
*
* @param tid 分类id
* @param pg 页数
* @param filter 同homeContent方法中的filter
* @param extend 筛选参数{k:v, k1:v1}
* @return
*/
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String[] urlParams = new String[]{"", "", "", "", "", "", "", "", "", "", "", ""};
urlParams[0] = tid;
urlParams[8] = pg;
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
urlParams[Integer.parseInt(key)] = URLEncoder.encode(value);
}
}
// 获取分类数据的url
String url = siteUrl + "vodshow/" + TextUtils.join("-", urlParams) + ".html";
String html = OkHttpUtil.string(url, getHeaders(url));
Document doc = Jsoup.parse(html);
JSONObject result = new JSONObject();
int pageCount = 0;
int page = -1;
// 取页码相关信息
Elements pageInfo = doc.select("ul.stui-page__item li");
if (pageInfo.size() == 0) {
page = Integer.parseInt(pg);
pageCount = page;
} else {
for (int i = 0; i < pageInfo.size(); i++) {
Element li = pageInfo.get(i);
Element a = li.selectFirst("a");
if (a == null)
continue;
String name = a.text();
if (page == -1 && li.hasClass("active")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("哈哈"+matcher.group(1));
page = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
page = 0;
}
}
if (name.equals("尾页")) {
Matcher matcher = regexPage.matcher(a.attr("href"));
if (matcher.find()) {
//System.out.println("尾页" + matcher.group(1));
pageCount = Integer.parseInt(matcher.group(1).split("-")[8]);
} else {
pageCount = 0;
}
break;
}
}
}
JSONArray videos = new JSONArray();
if (!html.contains("没有找到您想要的结果哦")) {
// 取当前分类页的视频列表
Elements list = doc.select("div.stui-vodlist__box");
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
String cover = vod.select("a").attr("data-original");
String remark = vod.select("a .pic-text").text();
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
}
result.put("page", page);
result.put("pagecount", pageCount);
result.put("limit", 48);
result.put("total", pageCount <= 1 ? videos.length() : pageCount * 48);
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 视频详情信息
*
* @param ids 视频id
* @return
*/
@Override
public String detailContent(List<String> ids) {
try {
// 视频详情url
String url = siteUrl + "/detail/" + ids.get(0) + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
JSONObject result = new JSONObject();
JSONObject vodList = new JSONObject();
// 取基本数据
String cover = doc.select("div.stui-content__thumb a img").attr("data-original");
String title = doc.select("div.stui-content__detail h1").text();
String category = "", area = "", year = "", remark = "", director = "", actor = "", desc = "";
Elements data = doc.select("p.data");
Pattern cate = Pattern.compile("类型:(\\S+)");
category = doReplaceRegex(cate, data.get(0).text());
Pattern areas = Pattern.compile("地区:(\\S+)");
area = doReplaceRegex(areas, data.get(0).text());
Pattern years = Pattern.compile("年份:(\\S+)");
year = doReplaceRegex(years, data.get(0).text());
Pattern rms = Pattern.compile("更新:(\\S+)");
remark = doReplaceRegex(rms, data.get(3).text());
Pattern acs = Pattern.compile("主演:(\\S+)");
actor = doReplaceRegex(acs, data.get(1).text());
Pattern dis = Pattern.compile("导演:(\\S+)");
director = doReplaceRegex(dis, data.get(2).text());
desc = doc.selectFirst("span.detail-content").text().trim();
vodList.put("vod_id", ids.get(0));
vodList.put("vod_name", title);
vodList.put("vod_pic", cover);
vodList.put("type_name", category);
vodList.put("vod_year", year);
vodList.put("vod_area", area);
vodList.put("vod_remarks", remark);
vodList.put("vod_actor", actor);
vodList.put("vod_director", director);
vodList.put("vod_content", desc);
Map<String, String> vod_play = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
int sort1 = playerConfig.getJSONObject(o1).getInt("or");
int sort2 = playerConfig.getJSONObject(o2).getInt("or");
if (sort1 == sort2) {
return 1;
}
return sort1 - sort2 > 0 ? 1 : -1;
} catch (JSONException e) {
SpiderDebug.log(e);
}
return 1;
}
});
// 取播放列表数据
Elements sources = doc.select("div.stui-vodlist__head h3");
Elements sourceList = doc.select("ul.stui-content__playlist");
for (int i = 0; i < sources.size(); i++) {
Element source = sources.get(i);
String sourceName = source.text();
boolean found = false;
for (Iterator<String> it = playerConfig.keys(); it.hasNext(); ) {
String flag = it.next();
if (playerConfig.getJSONObject(flag).getString("sh").equals(sourceName)) {
sourceName = flag;
found = true;
break;
}
}
if (!found)
continue;
String playList = "";
Elements playListA = sourceList.get(i).select("li a");
List<String> 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<String> vipFlags) {
try {
//定义播放用的headers
JSONObject headers = new JSONObject();
//headers.put("Host", " cokemv.co");
headers.put("origin", " https://zxzj.vip");
headers.put("User-Agent", " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36");
headers.put("Accept", " */*");
headers.put("Accept-Language", " zh-CN,zh;q=0.9,en-US;q=0.3,en;q=0.7");
headers.put("Accept-Encoding", " gzip, deflate");
// 播放页 url
String url = siteUrl + "/video/" + id + ".html";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
Elements allScript = doc.select("script");
JSONObject result = new JSONObject();
for (int i = 0; i < allScript.size(); i++) {
String scContent = allScript.get(i).html().trim();
if (scContent.startsWith("var player_")) { // 取直链
int start = scContent.indexOf('{');
int end = scContent.lastIndexOf('}') + 1;
String json = scContent.substring(start, end);
JSONObject player = new JSONObject(json);
if (playerConfig.has(player.getString("from"))) {
JSONObject pCfg = playerConfig.getJSONObject(player.getString("from"));
String videoUrl = pCfg.getString("pu") + player.getString("url");
Document docs = Jsoup.parse(OkHttpUtil.string(videoUrl, getHeaders(videoUrl)));
Pattern pattern = Pattern.compile("(?<=urls\\s=\\s').*?(?=')");
Elements allScripts = docs.select("body script");
for (int j = 0; j < allScripts.size(); j++) {
String scContents = allScripts.get(j).html().trim();
Matcher matcher = pattern.matcher(scContents);
if (matcher.find()) {
String players = matcher.group(0);
result.put("parse", 0);
result.put("playUrl", "");
result.put("url", players);
result.put("header", headers.toString());
}
break;
}
}
}
}
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
/**
* 搜索
*
* @param key
* @param quick 是否播放页的快捷搜索
* @return
*/
@Override
public String searchContent(String key, boolean quick) {
try {
String url = siteUrl + "/vodsearch/-------------.html?wd=" + URLEncoder.encode(key) + "&submit=";
Document doc = Jsoup.parse(OkHttpUtil.string(url, getHeaders(url)));
JSONObject result = new JSONObject();
JSONArray videos = new JSONArray();
Elements list = doc.select("div.stui-vodlist__box");
for (int i = 0; i < list.size(); i++) {
Element vod = list.get(i);
String title = vod.select("a").attr("title");
if (title.contains(key)) {
String cover = vod.select("a").attr("data-original");
Matcher matcher = regexVid.matcher(vod.select("a").attr("href"));
if (!matcher.find())
continue;
String id = matcher.group(1);
JSONObject v = new JSONObject();
String remark = vod.select("a span.pic-text").text();
v.put("vod_id", id);
v.put("vod_name", title);
v.put("vod_pic", cover);
v.put("vod_remarks", remark);
videos.put(v);
}
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private static String doReplaceRegex(Pattern pattern, String src) {
if (pattern == null)
return src;
try {
Matcher matcher = pattern.matcher(src);
if (matcher.find()) {
return matcher.group(1).trim();
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return src;
}
}