add - 无效
This commit is contained in:
@@ -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,1124 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* M浏览器中的App影视
|
|
||||||
* <p>
|
|
||||||
* Author: 群友 不负此生
|
|
||||||
*/
|
|
||||||
public class AppYs extends Spider {
|
|
||||||
|
|
||||||
private String extString = "";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
this.extString = extend;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
String url = getCateUrl(extString);
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
if (!url.isEmpty()) {
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
} else { // 通过filter列表读分类
|
|
||||||
String filterStr = getFilterTypes(url, null);
|
|
||||||
String[] classes = filterStr.split("\n")[0].split("\\+");
|
|
||||||
jsonArray = new JSONArray();
|
|
||||||
for (int i = 1; i < classes.length; i++) {
|
|
||||||
String[] kv = classes[i].trim().split("=");
|
|
||||||
if (kv.length < 2)
|
|
||||||
continue;
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_name", kv[0].trim());
|
|
||||||
newCls.put("type_id", kv[1].trim());
|
|
||||||
jsonArray.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject jObj = jsonArray.getJSONObject(i);
|
|
||||||
String typeName = jObj.getString("type_name");
|
|
||||||
if (isBan(typeName))
|
|
||||||
continue;
|
|
||||||
String typeId = jObj.getString("type_id");
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_id", typeId);
|
|
||||||
newCls.put("type_name", typeName);
|
|
||||||
JSONObject typeExtend = jObj.optJSONObject("type_extend");
|
|
||||||
if (filter) {
|
|
||||||
String filterStr = getFilterTypes(url, typeExtend);
|
|
||||||
String[] filters = filterStr.split("\n");
|
|
||||||
JSONArray filterArr = new JSONArray();
|
|
||||||
for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) {
|
|
||||||
String l = filters[k].trim();
|
|
||||||
if (l.isEmpty())
|
|
||||||
continue;
|
|
||||||
String[] oneLine = l.split("\\+");
|
|
||||||
String type = oneLine[0].trim();
|
|
||||||
String typeN = type;
|
|
||||||
if (type.contains("筛选")) {
|
|
||||||
type = type.replace("筛选", "");
|
|
||||||
if (type.equals("class"))
|
|
||||||
typeN = "类型";
|
|
||||||
else if (type.equals("area"))
|
|
||||||
typeN = "地区";
|
|
||||||
else if (type.equals("lang"))
|
|
||||||
typeN = "语言";
|
|
||||||
else if (type.equals("year"))
|
|
||||||
typeN = "年份";
|
|
||||||
}
|
|
||||||
JSONObject jOne = new JSONObject();
|
|
||||||
jOne.put("key", type);
|
|
||||||
jOne.put("name", typeN);
|
|
||||||
JSONArray valueArr = new JSONArray();
|
|
||||||
for (int j = 1; j < oneLine.length; j++) {
|
|
||||||
JSONObject kvo = new JSONObject();
|
|
||||||
String kv = oneLine[j].trim();
|
|
||||||
int sp = kv.indexOf("=");
|
|
||||||
if (sp == -1) {
|
|
||||||
if (isBan(kv))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", kv);
|
|
||||||
kvo.put("v", kv);
|
|
||||||
} else {
|
|
||||||
String n = kv.substring(0, sp);
|
|
||||||
if (isBan(n))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", n.trim());
|
|
||||||
kvo.put("v", kv.substring(sp + 1).trim());
|
|
||||||
}
|
|
||||||
valueArr.put(kvo);
|
|
||||||
}
|
|
||||||
jOne.put("value", valueArr);
|
|
||||||
filterArr.put(jOne);
|
|
||||||
}
|
|
||||||
if (!result.has("filters")) {
|
|
||||||
result.put("filters", new JSONObject());
|
|
||||||
}
|
|
||||||
result.getJSONObject("filters").put(typeId, filterArr);
|
|
||||||
}
|
|
||||||
classes.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getRecommendUrl(apiUrl);
|
|
||||||
boolean isTV = false;
|
|
||||||
if (url.isEmpty()) {
|
|
||||||
url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start=";
|
|
||||||
isTV = true;
|
|
||||||
}
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (isTV) {
|
|
||||||
JSONArray jsonArray = obj.getJSONArray("data");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ArrayList<JSONArray> arrays = new ArrayList<>();
|
|
||||||
findJsonArray(obj, "vlist", arrays);
|
|
||||||
if (arrays.isEmpty()) {
|
|
||||||
findJsonArray(obj, "vod_list", arrays);
|
|
||||||
}
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
for (JSONArray jsonArray : arrays) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
String vid = vObj.getString("vod_id");
|
|
||||||
if (ids.contains(vid))
|
|
||||||
continue;
|
|
||||||
ids.add(vid);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vid);
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl);
|
|
||||||
url = url.replace("#PN#", pg);
|
|
||||||
url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : "");
|
|
||||||
url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : "");
|
|
||||||
url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : "");
|
|
||||||
url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : "");
|
|
||||||
url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : "");
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
int totalPg = Integer.MAX_VALUE;
|
|
||||||
try {
|
|
||||||
if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("totalpage");
|
|
||||||
} else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("pagecount");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject &&
|
|
||||||
(obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer &&
|
|
||||||
obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) {
|
|
||||||
int limit = obj.getJSONObject("data").getInt("limit");
|
|
||||||
int total = obj.getJSONObject("data").getInt("total");
|
|
||||||
totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", totalPg);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
genPlayList(apiUrl, obj, json, vod, ids.get(0));
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
|
|
||||||
String json = OkHttpUtil.string(url, getHeaders(url));
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
String apiUrl = extString;
|
|
||||||
String parseUrl = getParseUrl(apiUrl, flag);
|
|
||||||
String playerUrl = getPlayerUrl(apiUrl, parseUrl, id);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
getFinalVideo(playerUrl, result);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void findJsonArray(JSONObject obj, String match, ArrayList<JSONArray> result) {
|
|
||||||
Iterator<String> keys = obj.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String k = keys.next();
|
|
||||||
try {
|
|
||||||
Object o = obj.get(k);
|
|
||||||
if (k.equals(match) && o instanceof JSONArray)
|
|
||||||
result.add((JSONArray) o);
|
|
||||||
if (o instanceof JSONObject) {
|
|
||||||
findJsonArray((JSONObject) o, match, result);
|
|
||||||
} else if (o instanceof JSONArray) {
|
|
||||||
JSONArray array = (JSONArray) o;
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
findJsonArray(array.getJSONObject(i), match, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String jsonArr2Str(JSONArray array) {
|
|
||||||
try {
|
|
||||||
ArrayList<String> strings = new ArrayList<>();
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
strings.add(array.getString(i));
|
|
||||||
}
|
|
||||||
return TextUtils.join(",", strings);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private static HashMap<String, String> fakeVips = null;
|
|
||||||
private static final Object lock = new Object();
|
|
||||||
|
|
||||||
private static String stopVipFlag(String flag) {
|
|
||||||
synchronized (lock) {
|
|
||||||
if (fakeVips == null) {
|
|
||||||
fakeVips = new HashMap<>();
|
|
||||||
fakeVips.put("youku", "优酷M");
|
|
||||||
fakeVips.put("qq", "腾讯M");
|
|
||||||
fakeVips.put("iqiyi", "爱奇艺M");
|
|
||||||
fakeVips.put("qiyi", "奇艺M");
|
|
||||||
fakeVips.put("letv", "乐视M");
|
|
||||||
fakeVips.put("sohu", "搜狐M");
|
|
||||||
fakeVips.put("tudou", "土豆M");
|
|
||||||
fakeVips.put("pptv", "PPTVM");
|
|
||||||
fakeVips.put("mgtv", "芒果TVM");
|
|
||||||
fakeVips.put("wasu", "华数M");
|
|
||||||
fakeVips.put("bilibili", "哔哩M");
|
|
||||||
}
|
|
||||||
if (fakeVips.containsKey(flag)) {
|
|
||||||
return fakeVips.get(flag);
|
|
||||||
}
|
|
||||||
return flag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String URL) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", UA(URL));
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBan(String key) {
|
|
||||||
return key.equals("伦理") || key.equals("情色") || key.equals("福利");
|
|
||||||
}
|
|
||||||
|
|
||||||
// M 扩展方法
|
|
||||||
|
|
||||||
// ######重组搜索
|
|
||||||
private String getSearchUrl(String URL, String KEY) {
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?wd=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "search?text=" + KEY + "&pg=";
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
if (URL.contains("esellauto")
|
|
||||||
|| URL.contains("1.14.63.101")
|
|
||||||
|| URL.contains("zjys")
|
|
||||||
|| URL.contains("dcd")
|
|
||||||
|| URL.contains("lxue")
|
|
||||||
|| URL.contains("weetai.cn")
|
|
||||||
|| URL.contains("haokanju1")
|
|
||||||
|| URL.contains("fit:8")
|
|
||||||
|| URL.contains("zjj.life")
|
|
||||||
|| URL.contains("love9989")
|
|
||||||
|| URL.contains("8d8q")
|
|
||||||
|| URL.contains("lk.pxun")
|
|
||||||
|| URL.contains("hgyx")
|
|
||||||
|| URL.contains("521x5")
|
|
||||||
|| URL.contains("lxyyy")
|
|
||||||
|| URL.contains("0818tv")
|
|
||||||
|| URL.contains("diyoui")
|
|
||||||
|| URL.contains("diliktv")
|
|
||||||
|| URL.contains("ppzhu")
|
|
||||||
|| URL.contains("aitesucai")
|
|
||||||
|| URL.contains("zz.ci")
|
|
||||||
|| URL.contains("chxjon")
|
|
||||||
|| URL.contains("watchmi")
|
|
||||||
|| URL.contains("vipbp")
|
|
||||||
|| URL.contains("bhtv")
|
|
||||||
|| URL.contains("xfykl")) {
|
|
||||||
return URL + "?ac=list&" + "wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&" + "zm=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######UA
|
|
||||||
private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod");
|
|
||||||
private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod");
|
|
||||||
private static final Pattern parsePattern = Pattern.compile("/.+\\?.+=");
|
|
||||||
private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)=");
|
|
||||||
private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*");
|
|
||||||
private static final Pattern[] parseMatchForDotVod = new Pattern[]{
|
|
||||||
Pattern.compile("jx\\.+huimaojia\\.+com/player"),
|
|
||||||
Pattern.compile("py\\.+789pan\\.+cn/player/tm\\.php\\?url="),
|
|
||||||
Pattern.compile("ztys\\.+waruanzy\\.+com/player/\\?url="),
|
|
||||||
Pattern.compile("yingshi\\.+waruanzy\\.+com/789pan/\\?url="),
|
|
||||||
Pattern.compile("vip\\.+parwix\\.+com:4433/player/\\?url="),
|
|
||||||
Pattern.compile("api\\.+cxitco\\.+cn"),
|
|
||||||
Pattern.compile("/vip\\.+renrenmi.cc"),
|
|
||||||
Pattern.compile("yanbing\\.+parwix\\.+com:4433/player"),
|
|
||||||
Pattern.compile("json\\.+cantin\\.+cc/apijson\\.php"),
|
|
||||||
Pattern.compile("ffdm\\.+miaoletv\\.+com/\\?url="),
|
|
||||||
Pattern.compile("vip\\.+sylwl\\.+cn/api/\\?key="),
|
|
||||||
Pattern.compile("jx\\.+dikotv\\.+com/\\?url="),
|
|
||||||
Pattern.compile("zly\\.+xjqxz\\.+top/player/\\?url="),
|
|
||||||
Pattern.compile("5znn\\.+xyz/m3u8\\.+php"),
|
|
||||||
Pattern.compile("uid=1735&my="),
|
|
||||||
Pattern.compile("api\\.+xkvideo\\.+design/m3u8\\.+php\\?url="),
|
|
||||||
Pattern.compile("play\\.+szbodankyy\\.+com/xxoocnmb"),
|
|
||||||
Pattern.compile("vip\\.+fj6080\\.+xyz/player/\\?url="),
|
|
||||||
Pattern.compile("a\\.+dxzj88\\.+com/jiexi"),
|
|
||||||
Pattern.compile("host\\.+q-q\\.+wang/api"),
|
|
||||||
Pattern.compile("保佑")
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final Pattern[] htmlVideoKeyMatch = new Pattern[]{
|
|
||||||
Pattern.compile("player=new"),
|
|
||||||
Pattern.compile("<div id=\"video\""),
|
|
||||||
Pattern.compile("<div id=\"[^\"]*?player\""),
|
|
||||||
Pattern.compile("//视频链接"),
|
|
||||||
Pattern.compile("HlsJsPlayer\\("),
|
|
||||||
Pattern.compile("<iframe[\\s\\S]*?src=\"[^\"]+?\""),
|
|
||||||
Pattern.compile("<video[\\s\\S]*?src=\"[^\"]+?\"")
|
|
||||||
};
|
|
||||||
|
|
||||||
private String UA(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp") || URL.contains("freekan")) {
|
|
||||||
return "Dart/2.14 (dart:io)";
|
|
||||||
} else if (URL.contains("zsb") || URL.contains("fkxs") || URL.contains("xays") || URL.contains("xcys") || URL.contains("szys") || URL.contains("dxys") || URL.contains("ytys") || URL.contains("qnys")) {
|
|
||||||
return "Dart/2.15 (dart:io)";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "okhttp/4.1.0";
|
|
||||||
} else {
|
|
||||||
return "Dalvik/2.1.0";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######POST
|
|
||||||
String post(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######cookie
|
|
||||||
String cookie(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######获取分类地址
|
|
||||||
String getCateUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "nav?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?type";
|
|
||||||
} else {
|
|
||||||
return URL + "/types";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选前缀地址
|
|
||||||
String getCateFilterUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "http://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video?tid=";
|
|
||||||
} else {
|
|
||||||
return URL + "video?tid=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/list?type=";
|
|
||||||
} else {
|
|
||||||
return URL + "?type=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&class=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选后缀地址
|
|
||||||
String getCateFilterUrlSuffix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&limit=18&pg=#PN#";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&by=排序&limit=18&page=#PN#";
|
|
||||||
} else {
|
|
||||||
return "&page=#PN#&area=筛选area&type=筛选class&start=筛选year";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######筛选内容
|
|
||||||
String getFilterTypes(String URL, JSONObject typeExtend) {
|
|
||||||
String str = "";
|
|
||||||
if (typeExtend != null) {
|
|
||||||
Iterator<String> typeExtendKeys = typeExtend.keys();
|
|
||||||
while (typeExtendKeys.hasNext()) {
|
|
||||||
String key = typeExtendKeys.next();
|
|
||||||
if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) {
|
|
||||||
try {
|
|
||||||
str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n";
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
} else {
|
|
||||||
str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######推荐地址
|
|
||||||
String getRecommendUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "index_video?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return URL + "/vodPhbAll";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######播放器前缀地址
|
|
||||||
String getPlayUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "https://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else if (URL.contains("1010dy")) {
|
|
||||||
URL = "http://www.1010dy.cc/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else {
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/detailID?vod_id=";
|
|
||||||
} else {
|
|
||||||
return URL + "/detail?vod_id=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######选集
|
|
||||||
private final HashMap<String, String> parseUrlMap = new HashMap<>();
|
|
||||||
|
|
||||||
private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException {
|
|
||||||
ArrayList<String> playUrls = new ArrayList<>();
|
|
||||||
ArrayList<String> playFlags = new ArrayList<>();
|
|
||||||
if (URL.contains("api.php/app/")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = stopVipFlag(from.getString("name"));
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api");
|
|
||||||
if (purl.contains("jpg.hou.lu/jm/za/index.php")) {
|
|
||||||
purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url=";
|
|
||||||
}
|
|
||||||
parseUrlMap.put(flag, purl);
|
|
||||||
}
|
|
||||||
} else if (URL.contains("xgapp")) {
|
|
||||||
JSONObject data = object.getJSONObject("data").getJSONObject("vod_info");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = stopVipFlag(from.getString("name"));
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api");
|
|
||||||
if (purl.contains("jpg.hou.lu/jm/za/index.php")) {
|
|
||||||
purl = "http://vip.mengx.vip/home/api?type=ys&uid=3249696&key=aefqrtuwxyEFHKNOQY&url=";
|
|
||||||
}
|
|
||||||
parseUrlMap.put(flag, purl);
|
|
||||||
}
|
|
||||||
} else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = stopVipFlag(from.getJSONObject("player_info").getString("show"));
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
try {
|
|
||||||
ArrayList<String> parses = new ArrayList<>();
|
|
||||||
String[] parse1 = from.getJSONObject("player_info").optString("parse").split(",");
|
|
||||||
String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(",");
|
|
||||||
for (String p : parse1) {
|
|
||||||
if (parsePattern.matcher(p).find()) {
|
|
||||||
boolean add = true;
|
|
||||||
for (Pattern pt : parseMatchForDotVod) {
|
|
||||||
if (pt.matcher(p).find()) {
|
|
||||||
add = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (add) {
|
|
||||||
parses.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (String p : parse2) {
|
|
||||||
if (parsePattern.matcher(p).find()) {
|
|
||||||
boolean add = true;
|
|
||||||
for (Pattern pt : parseMatchForDotVod) {
|
|
||||||
if (pt.matcher(p).find()) {
|
|
||||||
add = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (add) {
|
|
||||||
parses.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (parses.size() > 0 && parses.get(0).contains("=")) {
|
|
||||||
String purl = parses.get(0);
|
|
||||||
if (purl.contains("http")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = matcher.group(0).replace("..", ".").replace("vip.aotian.love", "vip.gaotian.love");
|
|
||||||
}
|
|
||||||
} else if (purl.contains("//")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = "http:" + matcher.group(0).replace("..", ".");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Matcher matcher = parsePattern2.matcher(URL);
|
|
||||||
if (matcher.find()) {
|
|
||||||
Matcher matcher1 = parsePattern1.matcher(URL);
|
|
||||||
if (matcher1.find()) {
|
|
||||||
purl = matcher.group(0) + matcher1.group(0).replace("..", ".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parseUrlMap.put(flag, purl);
|
|
||||||
} else {
|
|
||||||
parseUrlMap.put(flag, "http://1.117.152.239:39000/?url=");
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
JSONObject data = object;
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("title"));
|
|
||||||
vod.put("vod_pic", data.getString("img_url"));
|
|
||||||
vod.put("type_name", jsonArr2Str(data.optJSONArray("type")));
|
|
||||||
vod.put("vod_year", data.optString("pubtime"));
|
|
||||||
vod.put("vod_area", jsonArr2Str(data.optJSONArray("area")));
|
|
||||||
vod.put("vod_remarks", data.optString("trunk"));
|
|
||||||
vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor")));
|
|
||||||
vod.put("vod_director", jsonArr2Str(data.optJSONArray("director")));
|
|
||||||
vod.put("vod_content", data.optString("intro"));
|
|
||||||
JSONObject playList = data.getJSONObject("videolist");
|
|
||||||
Iterator<String> playListKeys = playList.keys();
|
|
||||||
while (playListKeys.hasNext()) {
|
|
||||||
String from = playListKeys.next();
|
|
||||||
JSONArray playListUrls = playList.getJSONArray(from);
|
|
||||||
ArrayList<String> urls = new ArrayList<>();
|
|
||||||
for (int j = 0; j < playListUrls.length(); j++) {
|
|
||||||
JSONObject urlObj = playListUrls.getJSONObject(j);
|
|
||||||
urls.add(urlObj.getString("title") + "$" + urlObj.getString("url"));
|
|
||||||
}
|
|
||||||
playFlags.add(stopVipFlag(from));
|
|
||||||
playUrls.add(TextUtils.join("#", urls));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for (int i = 0; i < playFlags.size(); i++) {
|
|
||||||
// String pu = playUrls.get(i).split("#")[0].split("\\$")[1];
|
|
||||||
// System.out.println(pu + " is video?" + isVideoFormat(pu));
|
|
||||||
// playerContent(playFlags.get(i), pu, new ArrayList<>());
|
|
||||||
// }
|
|
||||||
vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
|
|
||||||
vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getParseUrl(String URL, String flag) {
|
|
||||||
String parseUrl = "";
|
|
||||||
if (urlPattern2.matcher(URL).find()) {
|
|
||||||
if (parseUrlMap.containsKey(flag))
|
|
||||||
parseUrl = parseUrlMap.get(flag);
|
|
||||||
} else if (URL.contains("api.php/app/") || URL.contains("xgapp")) {
|
|
||||||
if (parseUrlMap.containsKey(flag))
|
|
||||||
parseUrl = parseUrlMap.get(flag);
|
|
||||||
} else {
|
|
||||||
parseUrl = URL;
|
|
||||||
}
|
|
||||||
if (parseUrl.contains("svip.jhyun.jx.cn") || parseUrl.contains("svip.jhdyw.vip")) {
|
|
||||||
if (flag.contains("人人迷")) {
|
|
||||||
parseUrl = "http://www.1080kan.cc/jiexi/rrmi.php?url=";
|
|
||||||
} else if (flag.contains("人人")) {
|
|
||||||
parseUrl = "http://www.1080kan.cc/jiexi/rr.php?url=";
|
|
||||||
} else if (flag.contains("番茄")) {
|
|
||||||
parseUrl = "http://www.1080kan.cc/jiexi/fq.php?url=";
|
|
||||||
} else {
|
|
||||||
parseUrl = "https://jx.parwix.com:4433/player/?url=";
|
|
||||||
}
|
|
||||||
} else if (parseUrl.contains("jhsj.manduhu.com") || parseUrl.contains("v.jhdyw.vip/nhdz666")) {
|
|
||||||
parseUrl = "https://jx.parwix.com:4433/player/?url=";
|
|
||||||
} else if (parseUrl.contains("x-n.cc")) {
|
|
||||||
parseUrl = "https://jx.parwix.com:4433/player/?url=";
|
|
||||||
}
|
|
||||||
return parseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getPlayerUrl(String URL, String parseUrl, String playUrl) {
|
|
||||||
if (URL.contains("xgapp") || URL.contains("api.php/app/") || /*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
|
|
||||||
if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) {
|
|
||||||
if (playUrl.contains("url=")) {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains("RongXingVR")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://fast.rongxingvr.cn:8866/api/?key=nShWumGdMIbTwngTbI&url=" + playUrl;
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains("LT")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://f7.pyxddc.com/bcjx/4k.php?url=" + playUrl;
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains("renrenmi")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://kuba.renrenmi.cc:2266/api/?key=Y6UYLYtjImTCKe98JD&url=" + playUrl;
|
|
||||||
} else if (!parseUrl.contains("url=") && playUrl.contains(".html")) {
|
|
||||||
return "https://www.baidu.com/s?wd=http://1.117.152.239:39000/?url=" + playUrl;
|
|
||||||
} else if (playUrl.contains("xfy")) {
|
|
||||||
return "https://www.baidu.com/s?wd=http://jiexi.yunl.cc/api/?key=xYNESYSvHp1DV2ckKs&url=" + playUrl;
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + parseUrl + playUrl;
|
|
||||||
}
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
if (playUrl.indexOf(".m3u8") > 15 || playUrl.indexOf(".mp4") > 15 || playUrl.contains("/obj/tos")) {
|
|
||||||
if (playUrl.contains("url=")) {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
} else if (playUrl.contains("xfy")) {
|
|
||||||
if (playUrl.contains("url=")) {
|
|
||||||
return "https://www.baidu.com/s?wd=http://cache.dmtt.xyz/xfyjx/xfyjx.php?url=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=https://json.hfyrw.com/mao.go?url=" + playUrl;
|
|
||||||
}
|
|
||||||
} else if (playUrl.contains("www.bilibili.com")) {
|
|
||||||
String spUrl = playUrl.split("url=")[1];
|
|
||||||
return "https://www.baidu.com/s?wd=https://jx.parwix.com:4433/player/?url=" + spUrl;
|
|
||||||
} else if (URL.contains("zhenfy") || URL.contains("cztv") || URL.contains("1.14.63.101") || URL.contains("fit:8") || URL.contains("diliktv.xyz") || URL.contains("ppzhu.vip") || URL.contains("api.8d8q.com") || URL.contains("haokanju1.cc") || URL.contains("cztv")) {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl + "&app=10000&account=272775028&password=qq272775028";
|
|
||||||
} else if (URL.contains("lxyyy") || URL.contains("j.zjj.life") || URL.contains("lktv") || URL.contains("0818tv") || URL.contains("ruoxinew")) {
|
|
||||||
return "https://www.baidu.com/s?wd=https://play.tkys.tv/?url=" + playUrl.split("url=")[1];
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "https://www.baidu.com/s?wd=" + playUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######视频地址
|
|
||||||
private void getFinalVideo(String uu, JSONObject result) throws JSONException {
|
|
||||||
if (uu.contains("baidu.com")) {
|
|
||||||
String playurl = uu.split("wd=")[1];
|
|
||||||
if (playurl.contains("duoduozy.com") || playurl.contains("suoyo.cc")) {
|
|
||||||
String uuu = "https://www.6080kan.cc/app.php?url=" + playurl;
|
|
||||||
String content = OkHttpUtil.string(uuu, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", obj.getString("url"));
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0\",\"referer\":\" https://player.duoduozy.com\",\"origin\":\" https://dp.duoduozy.com\",\"Host\":\" cache.m3u8.suoyo.cc\"}");
|
|
||||||
} else if (playurl.contains("xfy")) {
|
|
||||||
String content = OkHttpUtil.string(playurl, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", obj.getString("url"));
|
|
||||||
result.put("header", "{\"referer\":\" appguapi.lihaoyun.top:11543\",\"User-Agent\":\" Dart/2.14 (dart:io)\"}}");
|
|
||||||
} else if (playurl.contains("api.iopenyun.com:88")) {
|
|
||||||
if (playurl.contains("html")) {
|
|
||||||
String content = OkHttpUtil.string("https://api.m3u8.tv:5678/home/api?type=ys&uid=233711&key=dgilouvFKNRSWX2467&url=" + playurl.split("=")[1], null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String ppurl = obj.getString("url");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", ppurl);
|
|
||||||
} else {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
result.put("ua", "Mozilla/5.0 Windows10");
|
|
||||||
result.put("header", "{\"Referer\":\"https://user.iopenyun.com:520/user/video/\"}");
|
|
||||||
}
|
|
||||||
} else if (playurl.contains("cat.wkfile.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
result.put("header", "{\"User-Agent\":\" Lavf/58.12.100\",\"Referer\":\" wkfile.com\"}");
|
|
||||||
} else if (!playurl.contains("=") && playurl.indexOf(".m3u8") > 15 || playurl.indexOf(".mp4") > 15 || playurl.contains("/obj/tos")) {
|
|
||||||
if (playurl.contains("hsl.ysgc.xyz")) {
|
|
||||||
String content = OkHttpUtil.string("https://jx.ysgc.xyz/?url=" + playurl, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String ppurl = obj.getString("url");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", ppurl);
|
|
||||||
result.put("header", "{\"Referer\":\" https://ysgc.cc\"}");
|
|
||||||
} else if (playurl.contains("1.ruifenglb.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
result.put("header", "{\"Referer\":\" https://1.ruifenglb.com\"}");
|
|
||||||
} else {
|
|
||||||
Matcher matcher = Pattern.compile(".*(http.*)").matcher(playurl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", matcher.group(1));
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (playurl.contains("=")) {
|
|
||||||
HashMap<String, String> headers = new HashMap();
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 Android");
|
|
||||||
Map<String, List<String>> respHeaders = new TreeMap<>();
|
|
||||||
String content = OkHttpUtil.stringNoRedirect(playurl, headers, respHeaders);
|
|
||||||
String redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
|
|
||||||
if (redLoc != null) {
|
|
||||||
String finalurl = "";
|
|
||||||
while (redLoc != null) {
|
|
||||||
finalurl = redLoc;
|
|
||||||
if (redLoc.indexOf(".mp4") > 30) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
headers.put("User-Agent", "Mozilla/5.0 Android");
|
|
||||||
content = OkHttpUtil.stringNoRedirect(finalurl, headers, respHeaders);
|
|
||||||
redLoc = OkHttpUtil.getRedirectLocation(respHeaders);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String realurl = finalurl;
|
|
||||||
if (realurl.contains("=http") || realurl.contains("url=")) {
|
|
||||||
if (content.contains("<html")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
} else {
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String ppurl = obj.getString("url");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", ppurl);
|
|
||||||
if (realurl.contains("mgtv.com")) {
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
|
|
||||||
} else if (realurl.contains("bilibili.com")) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (playurl.contains("www.mgtv.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (content.contains("<html")) {
|
|
||||||
boolean sniffer = false;
|
|
||||||
for (Pattern p : htmlVideoKeyMatch) {
|
|
||||||
if (p.matcher(content).find()) {
|
|
||||||
sniffer = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sniffer) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
} else {
|
|
||||||
if (playurl.split("url=")[1].contains("http")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://1.117.152.239:39000/?url=" + playurl.split("url=")[1]);
|
|
||||||
} else if (playurl.split("url=")[1].contains("renrenmi")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://www.1080kan.cc/jiexi/rrmi.php?url=" + playurl.split("url=")[1]);
|
|
||||||
result.put("header", "{\"Referer\":\"http://www.1080kan.cc/\"}");
|
|
||||||
} else {
|
|
||||||
String id = playurl.split("url=")[1];
|
|
||||||
/*
|
|
||||||
String uuu = "https://vip.gaotian.love/api/?key=sRy0QAq8hqXRlrEtrq&url=" + id;
|
|
||||||
content = OkHttpUtil.string(uuu, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String realurl = obj.optString("url", "");
|
|
||||||
if (realurl.isEmpty())
|
|
||||||
realurl = obj.optString("msg", "");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
*/
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "https://jx.banyung.xyz:7799/player/?url=" + playurl.split("url=")[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
String jsonUrl = "";
|
|
||||||
try {
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
jsonUrl = obj.optString("url");
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
if (jsonUrl.length() > 1) {
|
|
||||||
String realurl = jsonUrl;
|
|
||||||
if (playurl.contains("mgtv.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
result.put("header", "{\"User-Agent\":\" Mozilla/5.0\", \"Referer\":\" \"}");
|
|
||||||
} else if (playurl.contains("bilibili.com")) {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
}
|
|
||||||
} else if (playurl.split("url=")[1].contains("http")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://1.117.152.239:39000/?url=" + playurl.split("url=")[1]);
|
|
||||||
} else if (playurl.split("url=")[1].contains("renrenmi")) {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "http://www.1080kan.cc/jiexi/rrmi.php?url=" + playurl.split("url=")[1]);
|
|
||||||
result.put("header", "{\"Referer\":\"http://www.1080kan.cc/\"}");
|
|
||||||
} else {
|
|
||||||
String id = playurl.split("url=")[1];
|
|
||||||
/*
|
|
||||||
String uuu = "https://vip.gaotian.love/api/?key=sRy0QAq8hqXRlrEtrq&url=" + id;
|
|
||||||
content = OkHttpUtil.string(uuu, null);
|
|
||||||
JSONObject obj = new JSONObject(content);
|
|
||||||
String realurl = obj.optString("url", "");
|
|
||||||
if (realurl.isEmpty())
|
|
||||||
realurl = obj.optString("msg", "");
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", realurl);
|
|
||||||
*/
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", "https://jx.banyung.xyz:7799/player/?url=" + playurl.split("url=")[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", playurl);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", uu);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean manualVideoCheck() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVideoFormat(String url) {
|
|
||||||
return Misc.isVideoFormat(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,845 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* M浏览器中的App影视
|
|
||||||
* <p>
|
|
||||||
* Author: 群友 不负此生
|
|
||||||
*/
|
|
||||||
public class AppYsV2 extends Spider {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
try {
|
|
||||||
extInfos = extend.split("###");
|
|
||||||
} catch (Throwable th) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
String url = getCateUrl(getApiUrl());
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
if (!url.isEmpty()) {
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 0);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
} else { // 通过filter列表读分类
|
|
||||||
String filterStr = getFilterTypes(url, null);
|
|
||||||
String[] classes = filterStr.split("\n")[0].split("\\+");
|
|
||||||
jsonArray = new JSONArray();
|
|
||||||
for (int i = 1; i < classes.length; i++) {
|
|
||||||
String[] kv = classes[i].trim().split("=");
|
|
||||||
if (kv.length < 2)
|
|
||||||
continue;
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_name", kv[0].trim());
|
|
||||||
newCls.put("type_id", kv[1].trim());
|
|
||||||
jsonArray.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject jObj = jsonArray.getJSONObject(i);
|
|
||||||
String typeName = jObj.getString("type_name");
|
|
||||||
if (isBan(typeName))
|
|
||||||
continue;
|
|
||||||
String typeId = jObj.getString("type_id");
|
|
||||||
JSONObject newCls = new JSONObject();
|
|
||||||
newCls.put("type_id", typeId);
|
|
||||||
newCls.put("type_name", typeName);
|
|
||||||
JSONObject typeExtend = jObj.optJSONObject("type_extend");
|
|
||||||
if (filter) {
|
|
||||||
String filterStr = getFilterTypes(url, typeExtend);
|
|
||||||
String[] filters = filterStr.split("\n");
|
|
||||||
JSONArray filterArr = new JSONArray();
|
|
||||||
for (int k = url.isEmpty() ? 1 : 0; k < filters.length; k++) {
|
|
||||||
String l = filters[k].trim();
|
|
||||||
if (l.isEmpty())
|
|
||||||
continue;
|
|
||||||
String[] oneLine = l.split("\\+");
|
|
||||||
String type = oneLine[0].trim();
|
|
||||||
String typeN = type;
|
|
||||||
if (type.contains("筛选")) {
|
|
||||||
type = type.replace("筛选", "");
|
|
||||||
if (type.equals("class"))
|
|
||||||
typeN = "类型";
|
|
||||||
else if (type.equals("area"))
|
|
||||||
typeN = "地区";
|
|
||||||
else if (type.equals("lang"))
|
|
||||||
typeN = "语言";
|
|
||||||
else if (type.equals("year"))
|
|
||||||
typeN = "年份";
|
|
||||||
}
|
|
||||||
JSONObject jOne = new JSONObject();
|
|
||||||
jOne.put("key", type);
|
|
||||||
jOne.put("name", typeN);
|
|
||||||
JSONArray valueArr = new JSONArray();
|
|
||||||
for (int j = 1; j < oneLine.length; j++) {
|
|
||||||
JSONObject kvo = new JSONObject();
|
|
||||||
String kv = oneLine[j].trim();
|
|
||||||
int sp = kv.indexOf("=");
|
|
||||||
if (sp == -1) {
|
|
||||||
if (isBan(kv))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", kv);
|
|
||||||
kvo.put("v", kv);
|
|
||||||
} else {
|
|
||||||
String n = kv.substring(0, sp);
|
|
||||||
if (isBan(n))
|
|
||||||
continue;
|
|
||||||
kvo.put("n", n.trim());
|
|
||||||
kvo.put("v", kv.substring(sp + 1).trim());
|
|
||||||
}
|
|
||||||
valueArr.put(kvo);
|
|
||||||
}
|
|
||||||
jOne.put("value", valueArr);
|
|
||||||
filterArr.put(jOne);
|
|
||||||
}
|
|
||||||
if (!result.has("filters")) {
|
|
||||||
result.put("filters", new JSONObject());
|
|
||||||
}
|
|
||||||
result.getJSONObject("filters").put(typeId, filterArr);
|
|
||||||
}
|
|
||||||
classes.put(newCls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getRecommendUrl(apiUrl);
|
|
||||||
boolean isTV = false;
|
|
||||||
if (url.isEmpty()) {
|
|
||||||
url = getCateFilterUrlPrefix(apiUrl) + "movie&page=1&area=&type=&start=";
|
|
||||||
isTV = true;
|
|
||||||
}
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 1);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (isTV) {
|
|
||||||
JSONArray jsonArray = obj.getJSONArray("data");
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ArrayList<JSONArray> arrays = new ArrayList<>();
|
|
||||||
findJsonArray(obj, "vlist", arrays);
|
|
||||||
if (arrays.isEmpty()) {
|
|
||||||
findJsonArray(obj, "vod_list", arrays);
|
|
||||||
}
|
|
||||||
List<String> ids = new ArrayList<>();
|
|
||||||
for (JSONArray jsonArray : arrays) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
String vid = vObj.getString("vod_id");
|
|
||||||
if (ids.contains(vid))
|
|
||||||
continue;
|
|
||||||
ids.add(vid);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vid);
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getCateFilterUrlPrefix(apiUrl) + tid + getCateFilterUrlSuffix(apiUrl);
|
|
||||||
url = url.replace("#PN#", pg);
|
|
||||||
url = url.replace("筛选class", (extend != null && extend.containsKey("class")) ? extend.get("class") : "");
|
|
||||||
url = url.replace("筛选area", (extend != null && extend.containsKey("area")) ? extend.get("area") : "");
|
|
||||||
url = url.replace("筛选lang", (extend != null && extend.containsKey("lang")) ? extend.get("lang") : "");
|
|
||||||
url = url.replace("筛选year", (extend != null && extend.containsKey("year")) ? extend.get("year") : "");
|
|
||||||
url = url.replace("排序", (extend != null && extend.containsKey("排序")) ? extend.get("排序") : "");
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 2);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
int totalPg = Integer.MAX_VALUE;
|
|
||||||
try {
|
|
||||||
if (obj.has("totalpage") && obj.get("totalpage") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("totalpage");
|
|
||||||
} else if (obj.has("pagecount") && obj.get("pagecount") instanceof Integer) {
|
|
||||||
totalPg = obj.getInt("pagecount");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject &&
|
|
||||||
(obj.getJSONObject("data").has("total") && obj.getJSONObject("data").get("total") instanceof Integer &&
|
|
||||||
obj.getJSONObject("data").has("limit") && obj.getJSONObject("data").get("limit") instanceof Integer)) {
|
|
||||||
int limit = obj.getJSONObject("data").getInt("limit");
|
|
||||||
int total = obj.getJSONObject("data").getInt("total");
|
|
||||||
totalPg = total % limit == 0 ? (total / limit) : (total / limit + 1);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", totalPg);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
|
|
||||||
SpiderDebug.log(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 3);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
genPlayList(apiUrl, obj, json, vod, ids.get(0));
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
String apiUrl = getApiUrl();
|
|
||||||
String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
|
|
||||||
//System.out.println(url);
|
|
||||||
String json = desc(OkHttpUtil.string(url, getHeaders(url)), (byte) 5);
|
|
||||||
JSONObject obj = new JSONObject(json);
|
|
||||||
JSONArray jsonArray = null;
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (obj.has("list") && obj.get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONObject && obj.getJSONObject("data").has("list") && obj.getJSONObject("data").get("list") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONObject("data").getJSONArray("list");
|
|
||||||
} else if (obj.has("data") && obj.get("data") instanceof JSONArray) {
|
|
||||||
jsonArray = obj.getJSONArray("data");
|
|
||||||
}
|
|
||||||
if (jsonArray != null) {
|
|
||||||
for (int i = 0; i < jsonArray.length(); i++) {
|
|
||||||
JSONObject vObj = jsonArray.getJSONObject(i);
|
|
||||||
if (vObj.has("vod_id")) {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("vod_id"));
|
|
||||||
v.put("vod_name", vObj.getString("vod_name"));
|
|
||||||
v.put("vod_pic", vObj.getString("vod_pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("vod_remarks"));
|
|
||||||
videos.put(v);
|
|
||||||
} else {
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", vObj.getString("nextlink"));
|
|
||||||
v.put("vod_name", vObj.getString("title"));
|
|
||||||
v.put("vod_pic", vObj.getString("pic"));
|
|
||||||
v.put("vod_remarks", vObj.getString("state"));
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null)
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
if (!parseUrls.isEmpty()) {
|
|
||||||
JSONObject result = getFinalVideo(flag, parseUrls, id);
|
|
||||||
if (result != null)
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
if (Misc.isVideoFormat(id)) {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
} else {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("url", id);
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void findJsonArray(JSONObject obj, String match, ArrayList<JSONArray> result) {
|
|
||||||
Iterator<String> keys = obj.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String k = keys.next();
|
|
||||||
try {
|
|
||||||
Object o = obj.get(k);
|
|
||||||
if (k.equals(match) && o instanceof JSONArray)
|
|
||||||
result.add((JSONArray) o);
|
|
||||||
if (o instanceof JSONObject) {
|
|
||||||
findJsonArray((JSONObject) o, match, result);
|
|
||||||
} else if (o instanceof JSONArray) {
|
|
||||||
JSONArray array = (JSONArray) o;
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
findJsonArray(array.getJSONObject(i), match, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String jsonArr2Str(JSONArray array) {
|
|
||||||
try {
|
|
||||||
ArrayList<String> strings = new ArrayList<>();
|
|
||||||
for (int i = 0; i < array.length(); i++) {
|
|
||||||
strings.add(array.getString(i));
|
|
||||||
}
|
|
||||||
return TextUtils.join(",", strings);
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashMap<String, String> getHeaders(String URL) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", UA(URL));
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isBan(String key) {
|
|
||||||
return key.equals("伦理") || key.equals("情色") || key.equals("福利");
|
|
||||||
}
|
|
||||||
|
|
||||||
// M 扩展方法
|
|
||||||
|
|
||||||
// ######重组搜索
|
|
||||||
private String getSearchUrl(String URL, String KEY) {
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?wd=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "search?text=" + KEY + "&pg=";
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
if (URL.contains("esellauto")
|
|
||||||
|| URL.contains("1.14.63.101")
|
|
||||||
|| URL.contains("zjys")
|
|
||||||
|| URL.contains("dcd")
|
|
||||||
|| URL.contains("lxue")
|
|
||||||
|| URL.contains("weetai.cn")
|
|
||||||
|| URL.contains("haokanju1")
|
|
||||||
|| URL.contains("fit:8")
|
|
||||||
|| URL.contains("zjj.life")
|
|
||||||
|| URL.contains("love9989")
|
|
||||||
|| URL.contains("8d8q")
|
|
||||||
|| URL.contains("lk.pxun")
|
|
||||||
|| URL.contains("hgyx")
|
|
||||||
|| URL.contains("521x5")
|
|
||||||
|| URL.contains("lxyyy")
|
|
||||||
|| URL.contains("0818tv")
|
|
||||||
|| URL.contains("diyoui")
|
|
||||||
|| URL.contains("diliktv")
|
|
||||||
|| URL.contains("ppzhu")
|
|
||||||
|| URL.contains("aitesucai")
|
|
||||||
|| URL.contains("zz.ci")
|
|
||||||
|| URL.contains("chxjon")
|
|
||||||
|| URL.contains("watchmi")
|
|
||||||
|| URL.contains("vipbp")
|
|
||||||
|| URL.contains("bhtv")
|
|
||||||
|| URL.contains("xfykl")) {
|
|
||||||
return URL + "?ac=list&" + "wd=" + KEY + "&page=";
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&" + "zm=" + KEY + "&page=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######UA
|
|
||||||
private static final Pattern urlPattern1 = Pattern.compile("api\\.php/.*?/vod");
|
|
||||||
private static final Pattern urlPattern2 = Pattern.compile("api\\.php/.+?\\.vod");
|
|
||||||
private static final Pattern parsePattern = Pattern.compile("/.+\\?.+=");
|
|
||||||
private static final Pattern parsePattern1 = Pattern.compile(".*(url|v|vid|php\\?id)=");
|
|
||||||
private static final Pattern parsePattern2 = Pattern.compile("https?://[^/]*");
|
|
||||||
|
|
||||||
protected static final Pattern[] htmlVideoKeyMatch = new Pattern[]{
|
|
||||||
Pattern.compile("player=new"),
|
|
||||||
Pattern.compile("<div id=\"video\""),
|
|
||||||
Pattern.compile("<div id=\"[^\"]*?player\""),
|
|
||||||
Pattern.compile("//视频链接"),
|
|
||||||
Pattern.compile("HlsJsPlayer\\("),
|
|
||||||
Pattern.compile("<iframe[\\s\\S]*?src=\"[^\"]+?\""),
|
|
||||||
Pattern.compile("<video[\\s\\S]*?src=\"[^\"]+?\"")
|
|
||||||
};
|
|
||||||
|
|
||||||
private String UA(String URL) {
|
|
||||||
if (URL.contains("vod.9e03.com")) {
|
|
||||||
return "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";
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp") || URL.contains("freekan")) {
|
|
||||||
return "Dart/2.14 (dart:io)";
|
|
||||||
} else if (URL.contains("zsb") || URL.contains("fkxs") || URL.contains("xays") || URL.contains("xcys") || URL.contains("szys") || URL.contains("dxys") || URL.contains("ytys") || URL.contains("qnys")) {
|
|
||||||
return "Dart/2.15 (dart:io)";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "okhttp/4.1.0";
|
|
||||||
} else {
|
|
||||||
return "Dalvik/2.1.0";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######获取分类地址
|
|
||||||
String getCateUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "nav?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun.com")) {
|
|
||||||
return URL + "/list?type";
|
|
||||||
} else {
|
|
||||||
return URL + "/types";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选前缀地址
|
|
||||||
String getCateFilterUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "http://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video?tid=";
|
|
||||||
} else {
|
|
||||||
return URL + "video?tid=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/list?type=";
|
|
||||||
} else {
|
|
||||||
return URL + "?type=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return URL + "?ac=list&class=";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######分类筛选后缀地址
|
|
||||||
String getCateFilterUrlSuffix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&limit=18&pg=#PN#";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&by=排序&limit=18&page=#PN#";
|
|
||||||
} else {
|
|
||||||
return "&page=#PN#&area=筛选area&type=筛选class&start=筛选year";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######筛选内容
|
|
||||||
String getFilterTypes(String URL, JSONObject typeExtend) {
|
|
||||||
String str = "";
|
|
||||||
if (typeExtend != null) {
|
|
||||||
Iterator<String> typeExtendKeys = typeExtend.keys();
|
|
||||||
while (typeExtendKeys.hasNext()) {
|
|
||||||
String key = typeExtendKeys.next();
|
|
||||||
if (key.equals("class") || key.equals("area") || key.equals("lang") || key.equals("year")) {
|
|
||||||
try {
|
|
||||||
str = str + "筛选" + key + "+全部=+" + typeExtend.getString(key).replace(",", "+") + "\n";
|
|
||||||
} catch (JSONException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (URL.contains(".vod")) {
|
|
||||||
str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
|
|
||||||
} else if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
} else {
|
|
||||||
str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######推荐地址
|
|
||||||
String getRecommendUrl(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
return URL + "index_video?token=";
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
return URL + "/vodPhbAll";
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######播放器前缀地址
|
|
||||||
String getPlayUrlPrefix(String URL) {
|
|
||||||
if (URL.contains("api.php/app") || URL.contains("xgapp")) {
|
|
||||||
if (URL.contains("dijiaxia")) {
|
|
||||||
URL = "https://www.dijiaxia.com/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else if (URL.contains("1010dy")) {
|
|
||||||
URL = "http://www.1010dy.cc/api.php/app/";
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
} else {
|
|
||||||
return URL + "video_detail?id=";
|
|
||||||
}
|
|
||||||
} else if (URL.contains(".vod")) {
|
|
||||||
if (URL.contains("iopenyun")) {
|
|
||||||
return URL + "/detailID?vod_id=";
|
|
||||||
} else {
|
|
||||||
return URL + "/detail?vod_id=";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######选集
|
|
||||||
protected final HashMap<String, ArrayList<String>> parseUrlMap = new HashMap<>();
|
|
||||||
|
|
||||||
private void genPlayList(String URL, JSONObject object, String json, JSONObject vod, String vid) throws JSONException {
|
|
||||||
ArrayList<String> playUrls = new ArrayList<>();
|
|
||||||
ArrayList<String> playFlags = new ArrayList<>();
|
|
||||||
if (URL.contains("api.php/app/")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = from.optString("code").trim();
|
|
||||||
if (flag.isEmpty())
|
|
||||||
flag = from.getString("name").trim();
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api").trim();
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
if (!purl.isEmpty() && !parseUrls.contains(purl))
|
|
||||||
parseUrls.add(purl);
|
|
||||||
}
|
|
||||||
} else if (URL.contains("xgapp")) {
|
|
||||||
JSONObject data = object.getJSONObject("data").getJSONObject("vod_info");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_url_with_player");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = from.optString("code").trim();
|
|
||||||
if (flag.isEmpty())
|
|
||||||
flag = from.getString("name").trim();
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
String purl = from.optString("parse_api").trim();
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
if (!purl.isEmpty() && !parseUrls.contains(purl))
|
|
||||||
parseUrls.add(purl);
|
|
||||||
}
|
|
||||||
} else if (/*urlPattern2.matcher(URL).find()*/URL.contains(".vod")) {
|
|
||||||
JSONObject data = object.getJSONObject("data");
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("vod_name"));
|
|
||||||
vod.put("vod_pic", data.getString("vod_pic"));
|
|
||||||
vod.put("type_name", data.optString("vod_class"));
|
|
||||||
vod.put("vod_year", data.optString("vod_year"));
|
|
||||||
vod.put("vod_area", data.optString("vod_area"));
|
|
||||||
vod.put("vod_remarks", data.optString("vod_remarks"));
|
|
||||||
vod.put("vod_actor", data.optString("vod_actor"));
|
|
||||||
vod.put("vod_director", data.optString("vod_director"));
|
|
||||||
vod.put("vod_content", data.optString("vod_content"));
|
|
||||||
JSONArray vodUrlWithPlayer = data.getJSONArray("vod_play_list");
|
|
||||||
for (int i = 0; i < vodUrlWithPlayer.length(); i++) {
|
|
||||||
JSONObject from = vodUrlWithPlayer.getJSONObject(i);
|
|
||||||
String flag = from.getJSONObject("player_info").optString("from").trim();
|
|
||||||
if (flag.isEmpty())
|
|
||||||
flag = from.getJSONObject("player_info").optString("show").trim();
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(from.getString("url"));
|
|
||||||
try {
|
|
||||||
ArrayList<String> parses = new ArrayList<>();
|
|
||||||
String[] parse1 = from.getJSONObject("player_info").optString("parse").split(",");
|
|
||||||
String[] parse2 = from.getJSONObject("player_info").optString("parse2").split(",");
|
|
||||||
parses.addAll(Arrays.asList(parse1));
|
|
||||||
parses.addAll(Arrays.asList(parse2));
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
for (String purl : parses) {
|
|
||||||
if (purl.contains("http")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = matcher.group(0);
|
|
||||||
}
|
|
||||||
} else if (purl.contains("//")) {
|
|
||||||
Matcher matcher = parsePattern1.matcher(purl);
|
|
||||||
if (matcher.find()) {
|
|
||||||
purl = "http:" + matcher.group(0);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Matcher matcher = parsePattern2.matcher(URL);
|
|
||||||
if (matcher.find()) {
|
|
||||||
Matcher matcher1 = parsePattern1.matcher(URL);
|
|
||||||
if (matcher1.find()) {
|
|
||||||
purl = matcher.group(0) + matcher1.group(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
purl = purl.replace("..", ".").trim();
|
|
||||||
if (!purl.isEmpty() && !parseUrls.contains(purl))
|
|
||||||
parseUrls.add(purl);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (urlPattern1.matcher(URL).find()) {
|
|
||||||
JSONObject data = object;
|
|
||||||
vod.put("vod_id", data.optString("vod_id", vid));
|
|
||||||
vod.put("vod_name", data.getString("title"));
|
|
||||||
vod.put("vod_pic", data.getString("img_url"));
|
|
||||||
vod.put("type_name", jsonArr2Str(data.optJSONArray("type")));
|
|
||||||
vod.put("vod_year", data.optString("pubtime"));
|
|
||||||
vod.put("vod_area", jsonArr2Str(data.optJSONArray("area")));
|
|
||||||
vod.put("vod_remarks", data.optString("trunk"));
|
|
||||||
vod.put("vod_actor", jsonArr2Str(data.optJSONArray("actor")));
|
|
||||||
vod.put("vod_director", jsonArr2Str(data.optJSONArray("director")));
|
|
||||||
vod.put("vod_content", data.optString("intro"));
|
|
||||||
JSONObject playList = data.getJSONObject("videolist");
|
|
||||||
Iterator<String> playListKeys = playList.keys();
|
|
||||||
while (playListKeys.hasNext()) {
|
|
||||||
String flag = playListKeys.next();
|
|
||||||
ArrayList<String> parseUrls = parseUrlMap.get(flag);
|
|
||||||
if (parseUrls == null) {
|
|
||||||
parseUrls = new ArrayList<>();
|
|
||||||
parseUrlMap.put(flag, parseUrls);
|
|
||||||
}
|
|
||||||
JSONArray playListUrls = playList.getJSONArray(flag);
|
|
||||||
ArrayList<String> urls = new ArrayList<>();
|
|
||||||
for (int j = 0; j < playListUrls.length(); j++) {
|
|
||||||
JSONObject urlObj = playListUrls.getJSONObject(j);
|
|
||||||
String url = urlObj.getString("url");
|
|
||||||
if (url.contains("url=")) {
|
|
||||||
int spIdx = url.indexOf("url=") + 4;
|
|
||||||
String pUrl = url.substring(0, spIdx).trim();
|
|
||||||
if (!pUrl.isEmpty() && !parseUrls.contains(pUrl))
|
|
||||||
parseUrls.add(pUrl);
|
|
||||||
urls.add(urlObj.getString("title") + "$" + url.substring(spIdx).trim());
|
|
||||||
} else {
|
|
||||||
urls.add(urlObj.getString("title") + "$" + url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
playFlags.add(flag);
|
|
||||||
playUrls.add(TextUtils.join("#", urls));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vod.put("vod_play_from", TextUtils.join("$$$", playFlags));
|
|
||||||
vod.put("vod_play_url", TextUtils.join("$$$", playUrls));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ######视频地址
|
|
||||||
protected JSONObject getFinalVideo(String flag, ArrayList<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);
|
|
||||||
if (parseUrl.contains("49.233.47.42:9898")) {
|
|
||||||
|
|
||||||
HashMap hashMap = new HashMap();
|
|
||||||
OkHttpUtil.stringNoRedirect(playUrl,null, hashMap);
|
|
||||||
String d = OkHttpUtil.getRedirectLocation(hashMap);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", d);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
JSONObject tryJson = null;
|
|
||||||
try {
|
|
||||||
tryJson = Misc.jsonParse(url, content);
|
|
||||||
} catch (Throwable th) {
|
|
||||||
|
|
||||||
}
|
|
||||||
if (tryJson != null && tryJson.has("url") && tryJson.has("header")) {
|
|
||||||
tryJson.put("header", tryJson.getJSONObject("header").toString());
|
|
||||||
return tryJson;
|
|
||||||
}
|
|
||||||
if (content.contains("<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 boolean manualVideoCheck() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVideoFormat(String url) {
|
|
||||||
return Misc.isVideoFormat(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getApiUrl() {
|
|
||||||
if (extInfos == null || extInfos.length < 1)
|
|
||||||
return "";
|
|
||||||
return extInfos[0].trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[] extInfos = null;
|
|
||||||
|
|
||||||
protected String desc(String src, byte type) {
|
|
||||||
if (extInfos.length > 1) {
|
|
||||||
String descFlag = extInfos[1];
|
|
||||||
if (descFlag.equals("nftv")) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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,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×tamp=" + currentTime;
|
|
||||||
//Document doc = Jsoup.parse(srr.content);
|
|
||||||
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (searchResult.getInt("total") > 0) {
|
|
||||||
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
|
||||||
for (int i = 0; i < lists.length(); i++) {
|
|
||||||
JSONObject vod = lists.getJSONObject(i);
|
|
||||||
String id = vod.getString("id");
|
|
||||||
String title = vod.getString("name");
|
|
||||||
String cover = vod.getString("pic");
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,377 @@
|
|||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.Misc;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author: @SDL
|
||||||
|
*/
|
||||||
|
public class Kunyu77 extends Spider {
|
||||||
|
private static final String siteUrl = "http://api.kunyu77.com";
|
||||||
|
|
||||||
|
private String uAgent = "Dalvik/2.1.0 (Linux; U; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")";
|
||||||
|
|
||||||
|
private HashMap<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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/filter";
|
||||||
|
String content = OkHttpUtil.string(url, getHeaders(url));
|
||||||
|
JSONObject jsonObject = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
||||||
|
Iterator<String> keys = jsonObject.keys();
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
JSONObject filterConfig = new JSONObject();
|
||||||
|
JSONArray extendsAll = null;
|
||||||
|
while (keys.hasNext()) {
|
||||||
|
String typeId = keys.next();
|
||||||
|
String typeName = jsonObject.getJSONArray(typeId).getJSONObject(0).getString("cat");
|
||||||
|
JSONObject newCls = new JSONObject();
|
||||||
|
newCls.put("type_id", typeId);
|
||||||
|
newCls.put("type_name", typeName);
|
||||||
|
classes.put(newCls);
|
||||||
|
try {
|
||||||
|
if (extendsAll == null) {
|
||||||
|
String filterUrl = siteUrl + "/api.php/provide/searchFilter?type_id=0&pagenum=1&pagesize=1";
|
||||||
|
String filterContent = OkHttpUtil.string(filterUrl, getHeaders(filterUrl));
|
||||||
|
JSONObject filterObj = new JSONObject(filterContent).getJSONObject("data").getJSONObject("conditions");
|
||||||
|
extendsAll = new JSONArray();
|
||||||
|
// 年份
|
||||||
|
JSONObject newTypeExtend = new JSONObject();
|
||||||
|
newTypeExtend.put("key", "year");
|
||||||
|
newTypeExtend.put("name", "年份");
|
||||||
|
JSONArray newTypeExtendKV = new JSONArray();
|
||||||
|
JSONObject kv = new JSONObject();
|
||||||
|
kv.put("n", "全部");
|
||||||
|
kv.put("v", "");
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", "2022");
|
||||||
|
kv.put("v", "2022");
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", "2021");
|
||||||
|
kv.put("v", "2021");
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
JSONArray years = filterObj.getJSONArray("y");
|
||||||
|
for (int j = 0; j < years.length(); j++) {
|
||||||
|
JSONObject child = years.getJSONObject(j);
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", child.getString("name"));
|
||||||
|
kv.put("v", child.getString("value"));
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
}
|
||||||
|
newTypeExtend.put("value", newTypeExtendKV);
|
||||||
|
extendsAll.put(newTypeExtend);
|
||||||
|
// 地区
|
||||||
|
newTypeExtend = new JSONObject();
|
||||||
|
newTypeExtend.put("key", "area");
|
||||||
|
newTypeExtend.put("name", "地区");
|
||||||
|
newTypeExtendKV = new JSONArray();
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", "全部");
|
||||||
|
kv.put("v", "");
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
JSONArray areas = filterObj.getJSONArray("a");
|
||||||
|
for (int j = 0; j < areas.length(); j++) {
|
||||||
|
JSONObject child = areas.getJSONObject(j);
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", child.getString("name"));
|
||||||
|
kv.put("v", child.getString("value"));
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
}
|
||||||
|
newTypeExtend.put("value", newTypeExtendKV);
|
||||||
|
extendsAll.put(newTypeExtend);
|
||||||
|
// 类型
|
||||||
|
newTypeExtend = new JSONObject();
|
||||||
|
newTypeExtend.put("key", "category");
|
||||||
|
newTypeExtend.put("name", "类型");
|
||||||
|
newTypeExtendKV = new JSONArray();
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", "全部");
|
||||||
|
kv.put("v", "");
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
JSONArray scat = filterObj.getJSONArray("scat");
|
||||||
|
for (int j = 0; j < scat.length(); j++) {
|
||||||
|
JSONObject child = scat.getJSONObject(j);
|
||||||
|
kv = new JSONObject();
|
||||||
|
kv.put("n", child.getString("name"));
|
||||||
|
kv.put("v", child.getString("value"));
|
||||||
|
newTypeExtendKV.put(kv);
|
||||||
|
}
|
||||||
|
newTypeExtend.put("value", newTypeExtendKV);
|
||||||
|
extendsAll.put(newTypeExtend);
|
||||||
|
}
|
||||||
|
if (extendsAll != null && extendsAll.length() > 0) {
|
||||||
|
filterConfig.put(typeId, extendsAll);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("class", classes);
|
||||||
|
if (filter) {
|
||||||
|
result.put("filters", filterConfig);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeVideoContent() {
|
||||||
|
try {
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/homeBlock?type_id=0";
|
||||||
|
String content = OkHttpUtil.string(url, getHeaders(url));
|
||||||
|
JSONObject jsonObject = new JSONObject(decryptResponse(content));
|
||||||
|
JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("blocks");
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject blockObj = jsonArray.getJSONObject(i);
|
||||||
|
String blockName = blockObj.getString("block_name");
|
||||||
|
if (!blockName.startsWith("热播")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JSONArray contents = blockObj.getJSONArray("contents");
|
||||||
|
for (int j = 0; j < contents.length() && j < 3; j++) {
|
||||||
|
JSONObject vObj = contents.getJSONObject(j);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vObj.getString("id"));
|
||||||
|
v.put("vod_name", vObj.getString("title"));
|
||||||
|
v.put("vod_pic", vObj.getString("videoCover"));
|
||||||
|
v.put("vod_remarks", vObj.getString("msg"));
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/searchFilter?type_id=" + tid + "&pagenum=" + pg + "&pagesize=24";
|
||||||
|
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));
|
||||||
|
JSONObject dataObject = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
||||||
|
JSONArray jsonArray = dataObject.getJSONArray("result");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject vObj = jsonArray.getJSONObject(i);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vObj.getString("id"));
|
||||||
|
v.put("vod_name", vObj.getString("title"));
|
||||||
|
v.put("vod_pic", vObj.getString("videoCover"));
|
||||||
|
v.put("vod_remarks", vObj.getString("msg"));
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
int limit = 24;
|
||||||
|
int page = Integer.parseInt(dataObject.getString("page"));
|
||||||
|
int total = dataObject.getInt("total");
|
||||||
|
int pageCount = dataObject.getInt("pagesize");
|
||||||
|
result.put("page", page);
|
||||||
|
result.put("pagecount", pageCount);
|
||||||
|
result.put("limit", limit);
|
||||||
|
result.put("total", total);
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
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();
|
||||||
|
JSONArray list = new JSONArray();
|
||||||
|
JSONObject vodAtom = new JSONObject();
|
||||||
|
String title = vObj.getString("videoName");
|
||||||
|
vodAtom.put("vod_id", vObj.getString("id"));
|
||||||
|
vodAtom.put("vod_name", title);
|
||||||
|
vodAtom.put("vod_pic", vObj.getString("videoCover"));
|
||||||
|
vodAtom.put("type_name", vObj.getString("subCategory"));
|
||||||
|
vodAtom.put("vod_year", vObj.getString("year"));
|
||||||
|
vodAtom.put("vod_area", vObj.getString("area"));
|
||||||
|
vodAtom.put("vod_remarks", vObj.getString("msg"));
|
||||||
|
vodAtom.put("vod_actor", vObj.getString("actor"));
|
||||||
|
vodAtom.put("vod_director", vObj.getString("director"));
|
||||||
|
vodAtom.put("vod_content", vObj.getString("brief").trim());
|
||||||
|
|
||||||
|
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<>();
|
||||||
|
for (int i = 0; i < episodes.length(); i++) {
|
||||||
|
JSONArray playurls = episodes.getJSONObject(i).getJSONArray("playurls");
|
||||||
|
for (int j = 0; j < playurls.length(); j++) {
|
||||||
|
JSONObject purl = playurls.getJSONObject(j);
|
||||||
|
String from = purl.getString("playfrom");
|
||||||
|
ArrayList<String> urls = playlist.get(from);
|
||||||
|
if (urls == null) {
|
||||||
|
urls = new ArrayList<>();
|
||||||
|
playlist.put(from, urls);
|
||||||
|
}
|
||||||
|
String name = purl.getString("title").replace(title, "").trim();
|
||||||
|
if (name.isEmpty()) {
|
||||||
|
name = (i + 1) + "";
|
||||||
|
}
|
||||||
|
String pid = purl.getString("playurl");
|
||||||
|
urls.add(name + "$" + pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String vod_play_from = TextUtils.join("$$$", playlist.keySet());
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
Iterator<ArrayList<String>> iter = playlist.values().iterator();
|
||||||
|
short fromSize = (short) playlist.size();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
fromSize--;
|
||||||
|
ArrayList<String> urls = iter.next();
|
||||||
|
sb.append(TextUtils.join("#", urls));
|
||||||
|
if (fromSize > 0)
|
||||||
|
sb.append("$$$");
|
||||||
|
}
|
||||||
|
vodAtom.put("vod_play_from", vod_play_from);
|
||||||
|
vodAtom.put("vod_play_url", sb.toString());
|
||||||
|
list.put(vodAtom);
|
||||||
|
result.put("list", list);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
String videoUrl = id;
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/parserUrl?url=" + id;
|
||||||
|
String content = OkHttpUtil.string(url, getHeaders(url));
|
||||||
|
JSONObject dataObj = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
||||||
|
JSONObject playHeader = dataObj.optJSONObject("playHeader");
|
||||||
|
String jxUrl = dataObj.getString("url");
|
||||||
|
content = OkHttpUtil.string(jxUrl, getHeaders(jxUrl));
|
||||||
|
JSONObject result = Misc.jsonParse(jxUrl, content);
|
||||||
|
if (result != null) {
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
if (playHeader != null) {
|
||||||
|
JSONObject header = result.getJSONObject("header");
|
||||||
|
Iterator<String> iter = playHeader.keys();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
String key = iter.next();
|
||||||
|
header.put(key, " " + playHeader.getString(key));
|
||||||
|
}
|
||||||
|
result.put("header", header.toString());
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
if (Misc.isVip(videoUrl)) {
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("parse", 1);
|
||||||
|
result.put("jx", "1");
|
||||||
|
result.put("url", videoUrl);
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("parse", 0);
|
||||||
|
result.put("playUrl", "");
|
||||||
|
result.put("url", id);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/searchVideo?searchName=" + URLEncoder.encode(key);
|
||||||
|
String content = OkHttpUtil.string(url, getHeaders(url));
|
||||||
|
JSONObject dataObject = new JSONObject(decryptResponse(content));
|
||||||
|
JSONArray jsonArray = dataObject.getJSONArray("data");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
JSONObject vObj = jsonArray.getJSONObject(i);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
String title = vObj.getString("videoName");
|
||||||
|
if (!title.contains(key))
|
||||||
|
continue;
|
||||||
|
v.put("vod_id", vObj.getString("id"));
|
||||||
|
v.put("vod_name", title);
|
||||||
|
v.put("vod_pic", vObj.getString("videoCover"));
|
||||||
|
v.put("vod_remarks", vObj.getString("msg"));
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String decryptResponse(String src) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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,178 +1,178 @@
|
|||||||
package com.github.catvod.parser;
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
import com.github.catvod.utils.Misc;
|
import com.github.catvod.utils.Misc;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
public class MixWeb {
|
public class MixWeb {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
"parses": [
|
"parses": [
|
||||||
{
|
{
|
||||||
"name": "聚合",
|
"name": "聚合",
|
||||||
"type": 3,
|
"type": 3,
|
||||||
"url": "Demo"
|
"url": "Demo"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "解析",
|
"name": "解析",
|
||||||
"type": 1,
|
"type": 1,
|
||||||
"url": "https://192.168.10.88/jx.php?url=",
|
"url": "https://192.168.10.88/jx.php?url=",
|
||||||
"ext": {
|
"ext": {
|
||||||
"flag": [
|
"flag": [
|
||||||
"qq",
|
"qq",
|
||||||
"iqiyi",
|
"iqiyi",
|
||||||
"qiyi",
|
"qiyi",
|
||||||
"爱奇艺",
|
"爱奇艺",
|
||||||
"腾讯",
|
"腾讯",
|
||||||
"letv",
|
"letv",
|
||||||
"sohu",
|
"sohu",
|
||||||
"tudou",
|
"tudou",
|
||||||
"pptv",
|
"pptv",
|
||||||
"mgtv",
|
"mgtv",
|
||||||
"wasu",
|
"wasu",
|
||||||
"bilibili"
|
"bilibili"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public static HashMap<String, ArrayList<String>> flagWebJx = new HashMap<>();
|
public static HashMap<String, ArrayList<String>> flagWebJx = new HashMap<>();
|
||||||
|
|
||||||
static HashMap<String, ArrayList<String>> configs = null;
|
static HashMap<String, ArrayList<String>> configs = null;
|
||||||
|
|
||||||
public static JSONObject parse(LinkedHashMap<String, HashMap<String, String>> jx, String nameMe, String flag, String url) {
|
public static JSONObject parse(LinkedHashMap<String, HashMap<String, String>> jx, String nameMe, String flag, String url) {
|
||||||
try {
|
try {
|
||||||
if (configs == null) {
|
if (configs == null) {
|
||||||
configs = new HashMap<>();
|
configs = new HashMap<>();
|
||||||
Iterator<String> keys = jx.keySet().iterator();
|
Iterator<String> keys = jx.keySet().iterator();
|
||||||
while (keys.hasNext()) {
|
while (keys.hasNext()) {
|
||||||
String key = keys.next();
|
String key = keys.next();
|
||||||
HashMap<String, String> parseBean = jx.get(key);
|
HashMap<String, String> parseBean = jx.get(key);
|
||||||
String type = parseBean.get("type");
|
String type = parseBean.get("type");
|
||||||
if (type.equals("0")) {
|
if (type.equals("0")) {
|
||||||
try {
|
try {
|
||||||
//取出单个解析的flags列表
|
//取出单个解析的flags列表
|
||||||
JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag");
|
JSONArray flags = new JSONObject(parseBean.get("ext")).getJSONArray("flag");
|
||||||
for (int j = 0; j < flags.length(); j++) {
|
for (int j = 0; j < flags.length(); j++) {
|
||||||
//获取单个flags
|
//获取单个flags
|
||||||
String flagKey = flags.getString(j);
|
String flagKey = flags.getString(j);
|
||||||
//取出configs中对应flags的解析
|
//取出configs中对应flags的解析
|
||||||
ArrayList<String> flagJx = configs.get(flagKey);
|
ArrayList<String> flagJx = configs.get(flagKey);
|
||||||
//如果configs中没有这个flags,则插入一个空的值
|
//如果configs中没有这个flags,则插入一个空的值
|
||||||
if (flagJx == null) {
|
if (flagJx == null) {
|
||||||
flagJx = new ArrayList<>();
|
flagJx = new ArrayList<>();
|
||||||
configs.put(flagKey, flagJx);
|
configs.put(flagKey, flagJx);
|
||||||
}
|
}
|
||||||
//如果有就在flagJx中增加解析
|
//如果有就在flagJx中增加解析
|
||||||
flagJx.add(key);
|
flagJx.add(key);
|
||||||
}
|
}
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 通过上面的配置获得解析列表
|
// 通过上面的配置获得解析列表
|
||||||
ArrayList<String> webJx = new ArrayList<>();
|
ArrayList<String> webJx = new ArrayList<>();
|
||||||
ArrayList<String> flagJx = configs.get(flag);
|
ArrayList<String> flagJx = configs.get(flag);
|
||||||
//如果flagJx不为空
|
//如果flagJx不为空
|
||||||
if (flagJx != null && !flagJx.isEmpty()) {
|
if (flagJx != null && !flagJx.isEmpty()) {
|
||||||
for (int i = 0; i < flagJx.size(); i++) {
|
for (int i = 0; i < flagJx.size(); i++) {
|
||||||
String key = flagJx.get(i);
|
String key = flagJx.get(i);
|
||||||
HashMap<String, String> parseBean = jx.get(key);
|
HashMap<String, String> parseBean = jx.get(key);
|
||||||
String type = parseBean.get("type");
|
String type = parseBean.get("type");
|
||||||
if (type.equals("0")) {
|
if (type.equals("0")) {
|
||||||
//将json解析放入webJx
|
//将json解析放入webJx
|
||||||
webJx.add(parseBean.get("url"));
|
webJx.add(parseBean.get("url"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Iterator<String> keys = jx.keySet().iterator();
|
Iterator<String> keys = jx.keySet().iterator();
|
||||||
while (keys.hasNext()) {
|
while (keys.hasNext()) {
|
||||||
String key = keys.next();
|
String key = keys.next();
|
||||||
HashMap<String, String> parseBean = jx.get(key);
|
HashMap<String, String> parseBean = jx.get(key);
|
||||||
String type = parseBean.get("type");
|
String type = parseBean.get("type");
|
||||||
if (type.equals("0")) {
|
if (type.equals("0")) {
|
||||||
webJx.add(parseBean.get("url"));
|
webJx.add(parseBean.get("url"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!webJx.isEmpty()) {
|
if (!webJx.isEmpty()) {
|
||||||
flagWebJx.put(flag, webJx);
|
flagWebJx.put(flag, webJx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// json解析没有得到结果 用webview解析
|
// json解析没有得到结果 用webview解析
|
||||||
if (!webJx.isEmpty()) {
|
if (!webJx.isEmpty()) {
|
||||||
JSONObject webResult = new JSONObject();
|
JSONObject webResult = new JSONObject();
|
||||||
webResult.put("url", "proxy://do=MixWeb&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP));
|
webResult.put("url", "proxy://do=MixWeb&flag=" + flag + "&url=" + Base64.encodeToString(url.getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP));
|
||||||
webResult.put("parse", 1);
|
webResult.put("parse", 1);
|
||||||
webResult.put("ua", Misc.UaWinChrome);
|
webResult.put("ua", Misc.UaWinChrome);
|
||||||
return webResult;
|
return webResult;
|
||||||
}
|
}
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
SpiderDebug.log(th);
|
SpiderDebug.log(th);
|
||||||
}
|
}
|
||||||
return new JSONObject();
|
return new JSONObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static Object[] loadHtml(String flag, String url) {
|
public static Object[] loadHtml(String flag, String url) {
|
||||||
try {
|
try {
|
||||||
url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
|
url = new String(Base64.decode(url, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP), "UTF-8");
|
||||||
String html = "\n" +
|
String html = "\n" +
|
||||||
"<!doctype html>\n" +
|
"<!doctype html>\n" +
|
||||||
"<html>\n" +
|
"<html>\n" +
|
||||||
"<head>\n" +
|
"<head>\n" +
|
||||||
"<title>解析</title>\n" +
|
"<title>解析</title>\n" +
|
||||||
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" +
|
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" +
|
||||||
"<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE10\" />\n" +
|
"<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE10\" />\n" +
|
||||||
"<meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n" +
|
"<meta name=\"renderer\" content=\"webkit|ie-comp|ie-stand\">\n" +
|
||||||
"<meta name=\"viewport\" content=\"width=device-width\">\n" +
|
"<meta name=\"viewport\" content=\"width=device-width\">\n" +
|
||||||
"</head>\n" +
|
"</head>\n" +
|
||||||
"<body>\n" +
|
"<body>\n" +
|
||||||
"<script>\n" +
|
"<script>\n" +
|
||||||
"var apiArray=[#jxs#];\n" +
|
"var apiArray=[#jxs#];\n" +
|
||||||
"var urlPs=\"#url#\";\n" +
|
"var urlPs=\"#url#\";\n" +
|
||||||
"var iframeHtml=\"\";\n" +
|
"var iframeHtml=\"\";\n" +
|
||||||
"for(var i=0;i<apiArray.length;i++){\n" +
|
"for(var i=0;i<apiArray.length;i++){\n" +
|
||||||
"var URL=apiArray[i]+urlPs;\n" +
|
"var URL=apiArray[i]+urlPs;\n" +
|
||||||
"iframeHtml=iframeHtml+\"<iframe sandbox='allow-scripts allow-same-origin allow-forms' frameborder='0' allowfullscreen='true' webkitallowfullscreen='true' mozallowfullscreen='true' src=\"+URL+\"></iframe>\";\n" +
|
"iframeHtml=iframeHtml+\"<iframe sandbox='allow-scripts allow-same-origin allow-forms' frameborder='0' allowfullscreen='true' webkitallowfullscreen='true' mozallowfullscreen='true' src=\"+URL+\"></iframe>\";\n" +
|
||||||
"}\n" +
|
"}\n" +
|
||||||
"document.write(iframeHtml);\n" +
|
"document.write(iframeHtml);\n" +
|
||||||
"</script>\n" +
|
"</script>\n" +
|
||||||
"</body>\n" +
|
"</body>\n" +
|
||||||
"</html>";
|
"</html>";
|
||||||
|
|
||||||
StringBuilder jxs = new StringBuilder();
|
StringBuilder jxs = new StringBuilder();
|
||||||
if (flagWebJx.containsKey(flag)) {
|
if (flagWebJx.containsKey(flag)) {
|
||||||
ArrayList<String> jxUrls = flagWebJx.get(flag);
|
ArrayList<String> jxUrls = flagWebJx.get(flag);
|
||||||
for (int i = 0; i < jxUrls.size(); i++) {
|
for (int i = 0; i < jxUrls.size(); i++) {
|
||||||
jxs.append("\"");
|
jxs.append("\"");
|
||||||
jxs.append(jxUrls.get(i));
|
jxs.append(jxUrls.get(i));
|
||||||
jxs.append("\"");
|
jxs.append("\"");
|
||||||
if (i < jxUrls.size() - 1) {
|
if (i < jxUrls.size() - 1) {
|
||||||
jxs.append(",");
|
jxs.append(",");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
html = html.replace("#url#", url).replace("#jxs#", jxs.toString());
|
html = html.replace("#url#", url).replace("#jxs#", jxs.toString());
|
||||||
Object[] result = new Object[3];
|
Object[] result = new Object[3];
|
||||||
result[0] = 200;
|
result[0] = 200;
|
||||||
result[1] = "text/html; charset=\"UTF-8\"";
|
result[1] = "text/html; charset=\"UTF-8\"";
|
||||||
ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8"));
|
ByteArrayInputStream baos = new ByteArrayInputStream(html.toString().getBytes("UTF-8"));
|
||||||
result[2] = baos;
|
result[2] = baos;
|
||||||
return result;
|
return result;
|
||||||
} catch (Throwable th) {
|
} catch (Throwable th) {
|
||||||
th.printStackTrace();
|
th.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,345 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
|
|
||||||
public class SP360 extends Spider {
|
|
||||||
protected JSONObject ext = null;
|
|
||||||
private static final String SiteHost = "https://api.web.360kan.com/v1/rank?cat=1";
|
|
||||||
private static final String SiteFilter = "https://api.web.360kan.com/v1/filter/list";
|
|
||||||
private static final String SiteDetail = "https://api.web.360kan.com/v1/detail";
|
|
||||||
private static final String SiteSearch = "https://api.so.360kan.com/index?force_v=1&kw=%s&from=&pageno=1&v_ap=1&tab=all";
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
try {
|
|
||||||
ext = new JSONObject("{\"classes\":[{\"type_name\":\"电影\",\"type_id\":\"1\"},{\"type_name\":\"电视剧\",\"type_id\":\"2\"},{\"type_name\":\"综艺\",\"type_id\":\"3\"},{\"type_name\":\"动漫\",\"type_id\":\"4\"}],\"filter\":{\"1\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"爱情\",\"v\":\"爱情\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"恐怖\",\"v\":\"恐怖\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"犯罪\",\"v\":\"犯罪\"},{\"n\":\"奇幻\",\"v\":\"奇幻\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"动画\",\"v\":\"动画\"},{\"n\":\"文艺\",\"v\":\"文艺\"},{\"n\":\"纪录\",\"v\":\"纪录\"},{\"n\":\"传记\",\"v\":\"传记\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"惊悚\",\"v\":\"惊悚\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"法国\",\"v\":\"法国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"德国\",\"v\":\"德国\"},{\"n\":\"印度\",\"v\":\"印度\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"2\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"言情\",\"v\":\"言情\"},{\"n\":\"剧情\",\"v\":\"剧情\"},{\"n\":\"伦理\",\"v\":\"伦理\"},{\"n\":\"喜剧\",\"v\":\"喜剧\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"都市\",\"v\":\"都市\"},{\"n\":\"偶像\",\"v\":\"偶像\"},{\"n\":\"古装\",\"v\":\"古装\"},{\"n\":\"军事\",\"v\":\"军事\"},{\"n\":\"警匪\",\"v\":\"警匪\"},{\"n\":\"历史\",\"v\":\"历史\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"神话\",\"v\":\"神话\"},{\"n\":\"谍战\",\"v\":\"谍战\"},{\"n\":\"青春\",\"v\":\"青春剧\"},{\"n\":\"家庭\",\"v\":\"家庭剧\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"情景\",\"v\":\"情景\"},{\"n\":\"武侠\",\"v\":\"武侠\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"其他\",\"v\":\"其他\"},{\"n\":\"全部\",\"v\":\"\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"更早\",\"v\":\"lt_year\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"内地\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"泰国\",\"v\":\"泰国\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"韩国\",\"v\":\"韩国\"},{\"n\":\"美国\",\"v\":\"美国\"},{\"n\":\"英国\",\"v\":\"英国\"},{\"n\":\"新加坡\",\"v\":\"新加坡\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"},{\"n\":\"最受好评\",\"v\":\"rankpoint\"}]}],\"3\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"脱口秀\",\"v\":\"脱口秀\"},{\"n\":\"真人秀\",\"v\":\"真人秀\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"选秀\",\"v\":\"选秀\"},{\"n\":\"八卦\",\"v\":\"八卦\"},{\"n\":\"访谈\",\"v\":\"访谈\"},{\"n\":\"情感\",\"v\":\"情感\"},{\"n\":\"生活\",\"v\":\"生活\"},{\"n\":\"晚会\",\"v\":\"晚会\"},{\"n\":\"音乐\",\"v\":\"音乐\"},{\"n\":\"职场\",\"v\":\"职场\"},{\"n\":\"美食\",\"v\":\"美食\"},{\"n\":\"时尚\",\"v\":\"时尚\"},{\"n\":\"游戏\",\"v\":\"游戏\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"体育\",\"v\":\"体育\"},{\"n\":\"纪实\",\"v\":\"纪实\"},{\"n\":\"科教\",\"v\":\"科教\"},{\"n\":\"曲艺\",\"v\":\"曲艺\"},{\"n\":\"歌舞\",\"v\":\"歌舞\"},{\"n\":\"财经\",\"v\":\"财经\"},{\"n\":\"汽车\",\"v\":\"汽车\"},{\"n\":\"播报\",\"v\":\"播报\"},{\"n\":\"其他\",\"v\":\"其他\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"中国香港\",\"v\":\"香港\"},{\"n\":\"中国台湾\",\"v\":\"台湾\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"欧美\",\"v\":\"欧美\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}],\"4\":[{\"key\":\"cat\",\"name\":\"类型\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"热血\",\"v\":\"热血\"},{\"n\":\"科幻\",\"v\":\"科幻\"},{\"n\":\"美少女\",\"v\":\"美少女\"},{\"n\":\"魔幻\",\"v\":\"魔幻\"},{\"n\":\"经典\",\"v\":\"经典\"},{\"n\":\"励志\",\"v\":\"励志\"},{\"n\":\"少儿\",\"v\":\"少儿\"},{\"n\":\"冒险\",\"v\":\"冒险\"},{\"n\":\"搞笑\",\"v\":\"搞笑\"},{\"n\":\"推理\",\"v\":\"推理\"},{\"n\":\"恋爱\",\"v\":\"恋爱\"},{\"n\":\"治愈\",\"v\":\"治愈\"},{\"n\":\"幻想\",\"v\":\"幻想\"},{\"n\":\"校园\",\"v\":\"校园\"},{\"n\":\"动物\",\"v\":\"动物\"},{\"n\":\"机战\",\"v\":\"机战\"},{\"n\":\"亲子\",\"v\":\"亲子\"},{\"n\":\"儿歌\",\"v\":\"儿歌\"},{\"n\":\"运动\",\"v\":\"运动\"},{\"n\":\"悬疑\",\"v\":\"悬疑\"},{\"n\":\"怪物\",\"v\":\"怪物\"},{\"n\":\"战争\",\"v\":\"战争\"},{\"n\":\"益智\",\"v\":\"益智\"},{\"n\":\"青春\",\"v\":\"青春\"},{\"n\":\"童话\",\"v\":\"童话\"},{\"n\":\"竞技\",\"v\":\"竞技\"},{\"n\":\"动作\",\"v\":\"动作\"},{\"n\":\"社会\",\"v\":\"社会\"},{\"n\":\"友情\",\"v\":\"友情\"},{\"n\":\"真人版\",\"v\":\"真人版\"},{\"n\":\"电影版\",\"v\":\"电影版\"},{\"n\":\"OVA版\",\"v\":\"OVA版\"},{\"n\":\"TV版\",\"v\":\"TV版\"},{\"n\":\"新番动画\",\"v\":\"新番动画\"},{\"n\":\"完结动画\",\"v\":\"完结动画\"}]},{\"key\":\"year\",\"name\":\"年代\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"2022\",\"v\":\"2022\"},{\"n\":\"2021\",\"v\":\"2021\"},{\"n\":\"2020\",\"v\":\"2020\"},{\"n\":\"2019\",\"v\":\"2019\"},{\"n\":\"2018\",\"v\":\"2018\"},{\"n\":\"2017\",\"v\":\"2017\"},{\"n\":\"2016\",\"v\":\"2016\"},{\"n\":\"2015\",\"v\":\"2015\"},{\"n\":\"2014\",\"v\":\"2014\"},{\"n\":\"2013\",\"v\":\"2013\"},{\"n\":\"2012\",\"v\":\"2012\"},{\"n\":\"2011\",\"v\":\"2011\"},{\"n\":\"2010\",\"v\":\"2010\"},{\"n\":\"2009\",\"v\":\"2009\"},{\"n\":\"2008\",\"v\":\"2008\"},{\"n\":\"2007\",\"v\":\"2007\"},{\"n\":\"2006\",\"v\":\"2006\"},{\"n\":\"2005\",\"v\":\"2005\"},{\"n\":\"2004\",\"v\":\"2004\"},{\"n\":\"更早\",\"v\":\"更早\"}]},{\"key\":\"area\",\"name\":\"地区\",\"value\":[{\"n\":\"全部\",\"v\":\"\"},{\"n\":\"内地\",\"v\":\"大陆\"},{\"n\":\"日本\",\"v\":\"日本\"},{\"n\":\"美国\",\"v\":\"美国\"}]},{\"key\":\"rank\",\"name\":\"排序\",\"value\":[{\"n\":\"最近热映\",\"v\":\"rankhot\"},{\"n\":\"最近上映\",\"v\":\"ranklatest\"}]}]}}");
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HashMap<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×tamp=" + currentTime;
|
|
||||||
JSONObject searchResult = new JSONObject(OkHttpUtil.string(url, getHeaders(url)));
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
if (searchResult.getInt("total") > 0) {
|
|
||||||
JSONArray lists = new JSONArray(searchResult.getString("list"));
|
|
||||||
for (int i = 0; i < lists.length(); i++) {
|
|
||||||
JSONObject vod = lists.getJSONObject(i);
|
|
||||||
String id = vod.getString("id");
|
|
||||||
String title = vod.getString("name");
|
|
||||||
String cover = vod.getString("pic");
|
|
||||||
if (!TextUtils.isEmpty(cover) && !cover.startsWith("http")) {
|
|
||||||
cover = siteUrl + cover;
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", title);
|
|
||||||
v.put("vod_pic", cover);
|
|
||||||
v.put("vod_remarks", "");
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,474 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.Spider;
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
|
||||||
import com.github.catvod.xpath.XPathRule;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.seimicrawler.xpath.JXDocument;
|
|
||||||
import org.seimicrawler.xpath.JXNode;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class XPath extends Spider {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(Context context) {
|
|
||||||
super.init(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
this.ext = extend;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray classes = new JSONArray();
|
|
||||||
if (rule.getCateManual().size() > 0) {
|
|
||||||
Set<String> keys = rule.getCateManual().keySet();
|
|
||||||
for (String k : keys) {
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_name", k);
|
|
||||||
jsonObject.put("type_id", rule.getCateManual().get(k));
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
String webUrl = rule.getHomeUrl();
|
|
||||||
JXDocument doc = JXDocument.create(fetch(webUrl));
|
|
||||||
if (rule.getCateManual().size() == 0) {
|
|
||||||
List<JXNode> navNodes = doc.selN(rule.getCateNode());
|
|
||||||
for (int i = 0; i < navNodes.size(); i++) {
|
|
||||||
String name = navNodes.get(i).selOne(rule.getCateName()).asString().trim();
|
|
||||||
name = rule.getCateNameR(name);
|
|
||||||
String id = navNodes.get(i).selOne(rule.getCateId()).asString().trim();
|
|
||||||
id = rule.getCateIdR(id);
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
|
||||||
jsonObject.put("type_id", id);
|
|
||||||
jsonObject.put("type_name", name);
|
|
||||||
classes.put(jsonObject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getHomeVodNode().isEmpty()) {
|
|
||||||
try {
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
List<JXNode> vodNodes = doc.selN(rule.getHomeVodNode());
|
|
||||||
for (int i = 0; i < vodNodes.size(); i++) {
|
|
||||||
String name = vodNodes.get(i).selOne(rule.getHomeVodName()).asString().trim();
|
|
||||||
name = rule.getHomeVodNameR(name);
|
|
||||||
String id = vodNodes.get(i).selOne(rule.getHomeVodId()).asString().trim();
|
|
||||||
id = rule.getHomeVodIdR(id);
|
|
||||||
String pic = vodNodes.get(i).selOne(rule.getHomeVodImg()).asString().trim();
|
|
||||||
pic = rule.getHomeVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = "";
|
|
||||||
if (!rule.getHomeVodMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = vodNodes.get(i).selOne(rule.getHomeVodMark()).asString().trim();
|
|
||||||
mark = rule.getHomeVodMarkR(mark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
result.put("class", classes);
|
|
||||||
if (filter && rule.getFilter() != null) {
|
|
||||||
result.put("filters", rule.getFilter());
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
} catch (
|
|
||||||
Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HashMap<String, String> getHeaders(String url) {
|
|
||||||
HashMap<String, String> headers = new HashMap<>();
|
|
||||||
headers.put("User-Agent", rule.getUa().isEmpty()
|
|
||||||
? "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
|
|
||||||
: rule.getUa());
|
|
||||||
return headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeVideoContent() {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
return rule.getCateUrl().replace("{cateId}", tid).replace("{catePg}", pg);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = categoryUrl(tid, pg, filter, extend);
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
JXDocument doc = JXDocument.create(fetch(webUrl));
|
|
||||||
List<JXNode> vodNodes = doc.selN(rule.getCateVodNode());
|
|
||||||
for (int i = 0; i < vodNodes.size(); i++) {
|
|
||||||
String name = vodNodes.get(i).selOne(rule.getCateVodName()).asString().trim();
|
|
||||||
name = rule.getCateVodNameR(name);
|
|
||||||
String id = vodNodes.get(i).selOne(rule.getCateVodId()).asString().trim();
|
|
||||||
id = rule.getCateVodIdR(id);
|
|
||||||
String pic = vodNodes.get(i).selOne(rule.getCateVodImg()).asString().trim();
|
|
||||||
pic = rule.getCateVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = "";
|
|
||||||
if (!rule.getCateVodMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = vodNodes.get(i).selOne(rule.getCateVodMark()).asString().trim();
|
|
||||||
mark = rule.getCateVodMarkR(mark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("page", pg);
|
|
||||||
result.put("pagecount", Integer.MAX_VALUE);
|
|
||||||
result.put("limit", 90);
|
|
||||||
result.put("total", Integer.MAX_VALUE);
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void detailContentExt(String content, JSONObject vod) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = rule.getDetailUrl().replace("{vid}", ids.get(0));
|
|
||||||
String webContent = fetch(webUrl);
|
|
||||||
JXDocument doc = JXDocument.create(webContent);
|
|
||||||
JXNode vodNode = doc.selNOne(rule.getDetailNode());
|
|
||||||
|
|
||||||
String cover = "", title = "", desc = "", category = "", area = "", year = "", remark = "", director = "", actor = "";
|
|
||||||
|
|
||||||
title = vodNode.selOne(rule.getDetailName()).asString().trim();
|
|
||||||
title = rule.getDetailNameR(title);
|
|
||||||
|
|
||||||
cover = vodNode.selOne(rule.getDetailImg()).asString().trim();
|
|
||||||
cover = rule.getDetailImgR(cover);
|
|
||||||
cover = Misc.fixUrl(webUrl, cover);
|
|
||||||
|
|
||||||
if (!rule.getDetailCate().isEmpty()) {
|
|
||||||
try {
|
|
||||||
category = vodNode.selOne(rule.getDetailCate()).asString().trim();
|
|
||||||
category = rule.getDetailCateR(category);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailYear().isEmpty()) {
|
|
||||||
try {
|
|
||||||
year = vodNode.selOne(rule.getDetailYear()).asString().trim();
|
|
||||||
year = rule.getDetailYearR(year);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailArea().isEmpty()) {
|
|
||||||
try {
|
|
||||||
area = vodNode.selOne(rule.getDetailArea()).asString().trim();
|
|
||||||
area = rule.getDetailAreaR(area);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
remark = vodNode.selOne(rule.getDetailMark()).asString().trim();
|
|
||||||
remark = rule.getDetailMarkR(remark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailActor().isEmpty()) {
|
|
||||||
try {
|
|
||||||
actor = vodNode.selOne(rule.getDetailActor()).asString().trim();
|
|
||||||
actor = rule.getDetailActorR(actor);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailDirector().isEmpty()) {
|
|
||||||
try {
|
|
||||||
director = vodNode.selOne(rule.getDetailDirector()).asString().trim();
|
|
||||||
director = rule.getDetailDirectorR(director);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!rule.getDetailDesc().isEmpty()) {
|
|
||||||
try {
|
|
||||||
desc = vodNode.selOne(rule.getDetailDesc()).asString().trim();
|
|
||||||
desc = rule.getDetailDescR(desc);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject vod = new JSONObject();
|
|
||||||
vod.put("vod_id", ids.get(0));
|
|
||||||
vod.put("vod_name", title);
|
|
||||||
vod.put("vod_pic", cover);
|
|
||||||
vod.put("type_name", category);
|
|
||||||
vod.put("vod_year", year);
|
|
||||||
vod.put("vod_area", area);
|
|
||||||
vod.put("vod_remarks", remark);
|
|
||||||
vod.put("vod_actor", actor);
|
|
||||||
vod.put("vod_director", director);
|
|
||||||
vod.put("vod_content", desc);
|
|
||||||
|
|
||||||
ArrayList<String> playFrom = new ArrayList<>();
|
|
||||||
|
|
||||||
List<JXNode> fromNodes = doc.selN(rule.getDetailFromNode());
|
|
||||||
for (int i = 0; i < fromNodes.size(); i++) {
|
|
||||||
String name = fromNodes.get(i).selOne(rule.getDetailFromName()).asString().trim();
|
|
||||||
name = rule.getDetailFromNameR(name);
|
|
||||||
playFrom.add(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ArrayList<String> playList = new ArrayList<>();
|
|
||||||
List<JXNode> urlListNodes = doc.selN(rule.getDetailUrlNode());
|
|
||||||
for (int i = 0; i < urlListNodes.size(); i++) {
|
|
||||||
List<JXNode> urlNodes = urlListNodes.get(i).sel(rule.getDetailUrlSubNode());
|
|
||||||
List<String> vodItems = new ArrayList<>();
|
|
||||||
for (int j = 0; j < urlNodes.size(); j++) {
|
|
||||||
String name = urlNodes.get(j).selOne(rule.getDetailUrlName()).asString().trim();
|
|
||||||
name = rule.getDetailUrlNameR(name);
|
|
||||||
String id = urlNodes.get(j).selOne(rule.getDetailUrlId()).asString().trim();
|
|
||||||
id = rule.getDetailUrlIdR(id);
|
|
||||||
vodItems.add(name + "$" + id);
|
|
||||||
}
|
|
||||||
// 排除播放列表为空的播放源
|
|
||||||
if (vodItems.size() == 0 && playFrom.size() > i) {
|
|
||||||
playFrom.set(i, "");
|
|
||||||
}
|
|
||||||
playList.add(TextUtils.join("#", vodItems));
|
|
||||||
}
|
|
||||||
// 排除播放列表为空的播放源
|
|
||||||
for (int i = playFrom.size() - 1; i >= 0; i--) {
|
|
||||||
if (playFrom.get(i).isEmpty())
|
|
||||||
playFrom.remove(i);
|
|
||||||
}
|
|
||||||
for (int i = playList.size() - 1; i >= 0; i--) {
|
|
||||||
if (playList.get(i).isEmpty())
|
|
||||||
playList.remove(i);
|
|
||||||
}
|
|
||||||
for (int i = playList.size() - 1; i >= 0; i--) {
|
|
||||||
if (i >= playFrom.size())
|
|
||||||
playList.remove(i);
|
|
||||||
}
|
|
||||||
String vod_play_from = TextUtils.join("$$$", playFrom);
|
|
||||||
String vod_play_url = TextUtils.join("$$$", playList);
|
|
||||||
vod.put("vod_play_from", vod_play_from);
|
|
||||||
vod.put("vod_play_url", vod_play_url);
|
|
||||||
|
|
||||||
detailContentExt(webContent, vod);
|
|
||||||
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray list = new JSONArray();
|
|
||||||
list.put(vod);
|
|
||||||
result.put("list", list);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id);
|
|
||||||
SpiderDebug.log(webUrl);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
if (!rule.getPlayUa().isEmpty()) {
|
|
||||||
result.put("ua", rule.getPlayUa());
|
|
||||||
}
|
|
||||||
result.put("url", webUrl);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String searchContent(String key, boolean quick) {
|
|
||||||
try {
|
|
||||||
fetchRule();
|
|
||||||
if (rule.getSearchUrl().isEmpty()) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
String webUrl = rule.getSearchUrl().replace("{wd}", URLEncoder.encode(key));
|
|
||||||
String webContent = fetch(webUrl);
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
JSONArray videos = new JSONArray();
|
|
||||||
// add maccms suggest search api support
|
|
||||||
if (rule.getSearchVodNode().startsWith("json:")) {
|
|
||||||
String[] node = rule.getSearchVodNode().substring(5).split(">");
|
|
||||||
JSONObject data = new JSONObject(webContent);
|
|
||||||
for (int i = 0; i < node.length; i++) {
|
|
||||||
if (i == node.length - 1) {
|
|
||||||
JSONArray vodArray = data.getJSONArray(node[i]);
|
|
||||||
for (int j = 0; j < vodArray.length(); j++) {
|
|
||||||
JSONObject vod = vodArray.getJSONObject(j);
|
|
||||||
String name = vod.optString(rule.getSearchVodName()).trim();
|
|
||||||
name = rule.getSearchVodNameR(name);
|
|
||||||
String id = vod.optString(rule.getSearchVodId()).trim();
|
|
||||||
id = rule.getSearchVodIdR(id);
|
|
||||||
String pic = vod.optString(rule.getSearchVodImg()).trim();
|
|
||||||
pic = rule.getSearchVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = vod.optString(rule.getSearchVodMark()).trim();
|
|
||||||
mark = rule.getSearchVodMarkR(mark);
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
data = data.getJSONObject(node[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
JXDocument doc = JXDocument.create(webContent);
|
|
||||||
List<JXNode> vodNodes = doc.selN(rule.getSearchVodNode());
|
|
||||||
for (int i = 0; i < vodNodes.size(); i++) {
|
|
||||||
String name = vodNodes.get(i).selOne(rule.getSearchVodName()).asString().trim();
|
|
||||||
name = rule.getSearchVodNameR(name);
|
|
||||||
String id = vodNodes.get(i).selOne(rule.getSearchVodId()).asString().trim();
|
|
||||||
id = rule.getSearchVodIdR(id);
|
|
||||||
String pic = vodNodes.get(i).selOne(rule.getSearchVodImg()).asString().trim();
|
|
||||||
pic = rule.getSearchVodImgR(pic);
|
|
||||||
pic = Misc.fixUrl(webUrl, pic);
|
|
||||||
String mark = "";
|
|
||||||
if (!rule.getCateVodMark().isEmpty()) {
|
|
||||||
try {
|
|
||||||
mark = vodNodes.get(i).selOne(rule.getSearchVodMark()).asString().trim();
|
|
||||||
mark = rule.getSearchVodMarkR(mark);
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSONObject v = new JSONObject();
|
|
||||||
v.put("vod_id", id);
|
|
||||||
v.put("vod_name", name);
|
|
||||||
v.put("vod_pic", pic);
|
|
||||||
v.put("vod_remarks", mark);
|
|
||||||
videos.put(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.put("list", videos);
|
|
||||||
return result.toString();
|
|
||||||
} catch (
|
|
||||||
Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean manualVideoCheck() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv"};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isVideoFormat(String url) {
|
|
||||||
url = url.toLowerCase();
|
|
||||||
if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (String format : videoFormatList) {
|
|
||||||
if (url.contains(format)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String ext = null;
|
|
||||||
protected XPathRule rule = null;
|
|
||||||
|
|
||||||
protected void fetchRule() {
|
|
||||||
if (rule == null) {
|
|
||||||
if (ext != null) {
|
|
||||||
if (ext.startsWith("http")) {
|
|
||||||
String json = OkHttpUtil.string(ext, null);
|
|
||||||
rule = XPathRule.fromJson(json);
|
|
||||||
loadRuleExt(json);
|
|
||||||
} else {
|
|
||||||
rule = XPathRule.fromJson(ext);
|
|
||||||
loadRuleExt(ext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void loadRuleExt(String json) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String fetch(String webUrl) {
|
|
||||||
SpiderDebug.log(webUrl);
|
|
||||||
return OkHttpUtil.string(webUrl, getHeaders(webUrl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPathFilter extends XPath {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void loadRuleExt(String json) {
|
|
||||||
super.loadRuleExt(json);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Base64;
|
|
||||||
|
|
||||||
import com.github.catvod.crawler.SpiderDebug;
|
|
||||||
import com.github.catvod.utils.Misc;
|
|
||||||
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.net.URLDecoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPathMac extends XPath {
|
|
||||||
// 尝试分析直连
|
|
||||||
private boolean decodePlayUrl;
|
|
||||||
// 尝试匹配官源标识以调用应用配置中的解析列表
|
|
||||||
private boolean decodeVipFlag;
|
|
||||||
// 播放器配置js
|
|
||||||
private String playerConfigJs = "";
|
|
||||||
// 播放器配置js取值正则
|
|
||||||
private String playerConfigJsRegex = "[\\W|\\S|.]*?MacPlayerConfig.player_list[\\W|\\S|.]*?=([\\W|\\S|.]*?),MacPlayerConfig.downer_list";
|
|
||||||
// 站点里播放源对应的真实官源
|
|
||||||
private HashMap<String, String> show2VipFlag = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mac cms 直连和官源调用应用内播放列表支持
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param extend
|
|
||||||
*/
|
|
||||||
public void init(Context context, String extend) {
|
|
||||||
super.init(context, extend);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void loadRuleExt(String json) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonObj = new JSONObject(json);
|
|
||||||
decodePlayUrl = jsonObj.optBoolean("dcPlayUrl", false);
|
|
||||||
decodeVipFlag = jsonObj.optBoolean("dcVipFlag", false);
|
|
||||||
JSONObject dcShow2Vip = jsonObj.optJSONObject("dcShow2Vip");
|
|
||||||
if (dcShow2Vip != null) {
|
|
||||||
Iterator<String> keys = dcShow2Vip.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String name = keys.next();
|
|
||||||
show2VipFlag.put(name.trim(), dcShow2Vip.getString(name).trim());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
playerConfigJs = jsonObj.optString("pCfgJs").trim();
|
|
||||||
playerConfigJsRegex = jsonObj.optString("pCfgJsR", playerConfigJsRegex).trim();
|
|
||||||
} catch (JSONException e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String homeContent(boolean filter) {
|
|
||||||
String result = super.homeContent(filter);
|
|
||||||
if (result.length() > 0 && playerConfigJs.length() > 0) { // 尝试通过playerConfigJs获取展示和flag匹配关系
|
|
||||||
String webContent = fetch(playerConfigJs);
|
|
||||||
Matcher matcher = Pattern.compile(playerConfigJsRegex).matcher(webContent);
|
|
||||||
if (matcher.find()) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonObject = new JSONObject(matcher.group(1));
|
|
||||||
Iterator<String> keys = jsonObject.keys();
|
|
||||||
while (keys.hasNext()) {
|
|
||||||
String key = keys.next();
|
|
||||||
JSONObject keyObj = jsonObject.optJSONObject(key);
|
|
||||||
if (keyObj == null)
|
|
||||||
continue;
|
|
||||||
String show = keyObj.optString("show").trim();
|
|
||||||
if (show.isEmpty())
|
|
||||||
continue;
|
|
||||||
show2VipFlag.put(show, key);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// SpiderDebug.log(webContent);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String detailContent(List<String> ids) {
|
|
||||||
String result = super.detailContent(ids);
|
|
||||||
if (decodeVipFlag && result.length() > 0) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonObject = new JSONObject(result);
|
|
||||||
String playFrom[] = jsonObject.optJSONArray("list").getJSONObject(0).optString("vod_play_from").split("\\$\\$\\$");
|
|
||||||
if (playFrom.length > 0) {
|
|
||||||
for (int i = 0; i < playFrom.length; i++) {
|
|
||||||
if (show2VipFlag.containsKey(playFrom[i])) {
|
|
||||||
playFrom[i] = show2VipFlag.get(playFrom[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
jsonObject.optJSONArray("list").getJSONObject(0).put("vod_play_from", TextUtils.join("$$$", playFrom));
|
|
||||||
result = jsonObject.toString();
|
|
||||||
}
|
|
||||||
} catch (Throwable th) {
|
|
||||||
SpiderDebug.log(th);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String playerContent(String flag, String id, List<String> vipFlags) {
|
|
||||||
fetchRule();
|
|
||||||
String webUrl = rule.getPlayUrl().isEmpty() ? id : rule.getPlayUrl().replace("{playUrl}", id);
|
|
||||||
String videoUrl = null;
|
|
||||||
// 尝试分析直连
|
|
||||||
if (decodePlayUrl) {
|
|
||||||
try {
|
|
||||||
Document doc = Jsoup.parse(fetch(webUrl));
|
|
||||||
Elements allScript = doc.select("script");
|
|
||||||
for (int i = 0; i < allScript.size(); i++) {
|
|
||||||
String scContent = allScript.get(i).html().trim();
|
|
||||||
if (scContent.startsWith("var player_")) {
|
|
||||||
int start = scContent.indexOf('{');
|
|
||||||
int end = scContent.lastIndexOf('}') + 1;
|
|
||||||
String json = scContent.substring(start, end);
|
|
||||||
JSONObject player = new JSONObject(json);
|
|
||||||
String videoUrlTmp = player.getString("url");
|
|
||||||
if (player.has("encrypt")) {
|
|
||||||
int encrypt = player.getInt("encrypt");
|
|
||||||
if (encrypt == 1) {
|
|
||||||
videoUrlTmp = URLDecoder.decode(videoUrlTmp);
|
|
||||||
} else if (encrypt == 2) {
|
|
||||||
videoUrlTmp = new String(Base64.decode(videoUrlTmp, Base64.DEFAULT));
|
|
||||||
videoUrlTmp = URLDecoder.decode(videoUrlTmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
videoUrl = videoUrlTmp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (videoUrl != null) {
|
|
||||||
// 适配2.0.6的调用应用内解析列表的支持, 需要配合直连分析和匹配官源解析一起使用,参考cjt影视和极品直连
|
|
||||||
if (decodeVipFlag && Misc.isVip(videoUrl)) { // 使用jx:1
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("jx", "1");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
} else if (decodeVipFlag && vipFlags.contains(flag)) { // 是否使用应用内解析列表解析官源
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 1);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 如果是视频直连 直接返回免解
|
|
||||||
else if (isVideoFormat(videoUrl)) {
|
|
||||||
try {
|
|
||||||
JSONObject result = new JSONObject();
|
|
||||||
result.put("parse", 0);
|
|
||||||
result.put("playUrl", "");
|
|
||||||
result.put("url", videoUrl);
|
|
||||||
result.put("header", "");
|
|
||||||
return result.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
SpiderDebug.log(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 上述都失败了就按默认模式走
|
|
||||||
return super.playerContent(flag, id, vipFlags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package com.github.catvod.spider;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class XPathMacFilter extends XPathMac {
|
|
||||||
@Override
|
|
||||||
protected String categoryUrl(String tid, String pg, boolean filter, HashMap<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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user