Add files via upload
增加豆瓣、SixV电影网、厂长、农民影视、哔哩兔影视、AppYsV2、飘花电影网、
This commit is contained in:
parent
987d49ec64
commit
3a73ce04a7
|
|
@ -0,0 +1,852 @@
|
||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.net.OkHttp;
|
||||||
|
import com.github.catvod.utils.Misc;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* M浏览器中的App影视
|
||||||
|
* <p>
|
||||||
|
* Author: 群友 不负此生
|
||||||
|
*/
|
||||||
|
public class AppYsV2 extends Spider {
|
||||||
|
|
||||||
|
private String[] extInfos = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context, String extend) {
|
||||||
|
super.init(context, extend);
|
||||||
|
try {
|
||||||
|
extInfos = extend.split("###");
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> getHeader(String url) {
|
||||||
|
String userAgent = getUserAgent(url);
|
||||||
|
Map<String, String> header = new HashMap<>();
|
||||||
|
header.put("User-Agent", userAgent);
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
String url = getCateUrl(getApiUrl());
|
||||||
|
JSONArray jsonArray = null;
|
||||||
|
if (!url.isEmpty()) {
|
||||||
|
String json = desc(OkHttp.string(url, getHeader(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.optString("type_name");
|
||||||
|
if (isBan(typeName))
|
||||||
|
continue;
|
||||||
|
String typeId = jObj.optString("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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
String json = desc(OkHttp.string(url, getHeader(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.optString("nextlink"));
|
||||||
|
v.put("vod_name", vObj.optString("title"));
|
||||||
|
v.put("vod_pic", vObj.optString("pic"));
|
||||||
|
v.put("vod_remarks", vObj.optString("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.optString("vod_id");
|
||||||
|
if (ids.contains(vid))
|
||||||
|
continue;
|
||||||
|
ids.add(vid);
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vid);
|
||||||
|
v.put("vod_name", vObj.optString("vod_name"));
|
||||||
|
v.put("vod_pic", vObj.optString("vod_pic"));
|
||||||
|
v.put("vod_remarks", vObj.optString("vod_remarks"));
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
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("排序") : "");
|
||||||
|
String json = desc(OkHttp.string(url, getHeader(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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
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.optString("vod_id"));
|
||||||
|
v.put("vod_name", vObj.optString("vod_name"));
|
||||||
|
v.put("vod_pic", vObj.optString("vod_pic"));
|
||||||
|
v.put("vod_remarks", vObj.optString("vod_remarks"));
|
||||||
|
videos.put(v);
|
||||||
|
} else {
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vObj.optString("nextlink"));
|
||||||
|
v.put("vod_name", vObj.optString("title"));
|
||||||
|
v.put("vod_pic", vObj.optString("pic"));
|
||||||
|
v.put("vod_remarks", vObj.optString("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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
String apiUrl = getApiUrl();
|
||||||
|
String url = getPlayUrlPrefix(apiUrl) + ids.get(0);
|
||||||
|
String json = desc(OkHttp.string(url, getHeader(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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
String apiUrl = getApiUrl();
|
||||||
|
String url = getSearchUrl(apiUrl, URLEncoder.encode(key));
|
||||||
|
String json = desc(OkHttp.string(url, getHeader(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.optString("vod_id"));
|
||||||
|
v.put("vod_name", vObj.optString("vod_name"));
|
||||||
|
v.put("vod_pic", vObj.optString("vod_pic"));
|
||||||
|
v.put("vod_remarks", vObj.optString("vod_remarks"));
|
||||||
|
videos.put(v);
|
||||||
|
} else {
|
||||||
|
JSONObject v = new JSONObject();
|
||||||
|
v.put("vod_id", vObj.optString("nextlink"));
|
||||||
|
v.put("vod_name", vObj.optString("title"));
|
||||||
|
v.put("vod_pic", vObj.optString("pic"));
|
||||||
|
v.put("vod_remarks", vObj.optString("state"));
|
||||||
|
videos.put(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
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 (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String jsonArr2Str(JSONArray array) {
|
||||||
|
try {
|
||||||
|
ArrayList<String> strings = new ArrayList<>();
|
||||||
|
for (int i = 0; i < array.length(); i++) {
|
||||||
|
strings.add(array.optString(i));
|
||||||
|
}
|
||||||
|
return TextUtils.join(",", strings);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
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 "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ######
|
||||||
|
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=\"[^\"]+?\"")
|
||||||
|
};
|
||||||
|
|
||||||
|
// ######获取 UA
|
||||||
|
private String getUserAgent(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.optString(key).replace(",", "+") + "\n";
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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.optString("vod_name"));
|
||||||
|
vod.put("vod_pic", data.optString("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.optString("name").trim();
|
||||||
|
playFlags.add(flag);
|
||||||
|
playUrls.add(from.optString("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.optString("vod_name"));
|
||||||
|
vod.put("vod_pic", data.optString("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.optString("name").trim();
|
||||||
|
playFlags.add(flag);
|
||||||
|
playUrls.add(from.optString("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.optString("vod_name"));
|
||||||
|
vod.put("vod_pic", data.optString("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.optString("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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (urlPattern1.matcher(URL).find()) {
|
||||||
|
JSONObject data = object;
|
||||||
|
vod.put("vod_id", data.optString("vod_id", vid));
|
||||||
|
vod.put("vod_name", data.optString("title"));
|
||||||
|
vod.put("vod_pic", data.optString("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.optString("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.optString("title") + "$" + url.substring(spIdx).trim());
|
||||||
|
} else {
|
||||||
|
urls.add(urlObj.optString("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(OkHttp.string(playUrl, null), (byte) 4);
|
||||||
|
if (parseUrl.contains("49.233.47.42:9898")) {
|
||||||
|
HashMap hashMap = new HashMap();
|
||||||
|
OkHttp.stringNoRedirect(playUrl, null, hashMap);
|
||||||
|
String d = OkHttp.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();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String desc(String src, byte type) {
|
||||||
|
if (extInfos.length > 1) {
|
||||||
|
String descFlag = extInfos[1];
|
||||||
|
if (descFlag.equals("nftv")) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,435 @@
|
||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Base64;
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.crawler.SpiderDebug;
|
||||||
|
import com.github.catvod.utils.AES;
|
||||||
|
import com.github.catvod.utils.CBC;
|
||||||
|
import com.github.catvod.utils.gZip;
|
||||||
|
import com.github.catvod.utils.okhttp.OKCallBack;
|
||||||
|
import com.github.catvod.utils.okhttp.OkHttpUtil;
|
||||||
|
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
|
import okhttp3.Call;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Response;
|
||||||
|
import okhttp3.ResponseBody;
|
||||||
|
|
||||||
|
public class Czsapp extends Spider {
|
||||||
|
private static final Pattern Y = Pattern.compile("\"([^\"]+)\";var [\\d\\w]+=function dncry.*md5.enc.Utf8.parse\\(\"([\\d\\w]+)\".*md5.enc.Utf8.parse\\(([\\d]+)\\)");
|
||||||
|
private static final Pattern pY = Pattern.compile("video: \\{url: \"([^\"]+)\"");
|
||||||
|
private static final Pattern m = Pattern.compile("subtitle: \\{url:\"([^\"]+\\.vtt)\"");
|
||||||
|
private static final Pattern Q = Pattern.compile("src: '([^']+\\.css)',");
|
||||||
|
private static final Pattern Db = Pattern.compile("/movie/(\\d+).html");
|
||||||
|
private static final Pattern I = Pattern.compile("/page/(\\d+)");
|
||||||
|
private static final Pattern d = Pattern.compile("/v_play/(.*)\\.html");
|
||||||
|
private static final Pattern K = Pattern.compile("var vkey = ['\"]([^'\"]+)['\"]");
|
||||||
|
private static final Pattern Oe = Pattern.compile("var fvkey = ['\"]([^'\"]+)['\"]");
|
||||||
|
private static final Pattern fi = Pattern.compile("var ua = ['\"]([^'\"]+)['\"]");
|
||||||
|
private static final Pattern M = Pattern.compile("var cip = ['\"]([^'\"]+)['\"]");
|
||||||
|
private static final Pattern X = Pattern.compile("var time = ['\"]([^'\"]+)['\"]");
|
||||||
|
private static final Pattern a = Pattern.compile("var url = ['\"]([^'\"]+)['\"]");
|
||||||
|
|
||||||
|
|
||||||
|
private String mmd5(String str) {
|
||||||
|
try {
|
||||||
|
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
|
||||||
|
messageDigest.update(str.getBytes());
|
||||||
|
byte[] digest = messageDigest.digest();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (byte b : digest) {
|
||||||
|
String hexString = Integer.toHexString(b & 255);
|
||||||
|
while (hexString.length() < 2) {
|
||||||
|
hexString = "0" + hexString;
|
||||||
|
}
|
||||||
|
sb.append(hexString);
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object[] loadsub(String sub) {
|
||||||
|
try {
|
||||||
|
OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResponse(Response response) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
OkHttpClient YM = OkHttpUtil.defaultClient();
|
||||||
|
OkHttpUtil.get(YM, sub, null, Headers(), callBack);
|
||||||
|
Response result = callBack.getResult();
|
||||||
|
int code = result.code();
|
||||||
|
if (code == 404) {
|
||||||
|
return new Object[]{200, "application/octet-stream", new ByteArrayInputStream("WEBVTT".getBytes())};
|
||||||
|
}
|
||||||
|
ResponseBody body = result.body();
|
||||||
|
byte[] bytes = body.bytes();
|
||||||
|
byte[] tokenkey = Arrays.copyOfRange(bytes, 0, 16);
|
||||||
|
byte[] data = Arrays.copyOfRange(bytes, 16, bytes.length);
|
||||||
|
byte[] KS = CBC.CBC(data, tokenkey, tokenkey);
|
||||||
|
String vtt = gZip.KS(KS);
|
||||||
|
|
||||||
|
|
||||||
|
vtt = vtt.replaceAll("(\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}).*", "$1");
|
||||||
|
vtt = vtt.replaceAll("(\\d{2}:\\d{2}.\\d{3}).*?( --> )(\\d{2}:\\d{2}.\\d{3}).*", "00:$1$200:$3");
|
||||||
|
vtt = vtt.replaceAll("<.*><.*>(.*)<.*><.*>", "$1");
|
||||||
|
vtt = vtt.replaceAll("&(.*);", "");
|
||||||
|
vtt = vtt.replaceAll(".*NOTE.*", "");
|
||||||
|
BufferedReader br = new BufferedReader(new StringReader(vtt));
|
||||||
|
ArrayList<String> lines = new ArrayList<>();
|
||||||
|
int captionNumber = 1;
|
||||||
|
String line = br.readLine();
|
||||||
|
while (line != null) {
|
||||||
|
if (line.matches("\\d{2}:\\d{2}:\\d{2}.\\d{3}.+\\d{2}:\\d{2}:\\d{2}.\\d{3}")) {
|
||||||
|
if (lines.get(lines.size() - 1).trim().isEmpty()) {
|
||||||
|
lines.add(captionNumber + "");
|
||||||
|
captionNumber++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lines.add(line);
|
||||||
|
line = br.readLine();
|
||||||
|
}
|
||||||
|
String join = TextUtils.join("\n", lines);
|
||||||
|
|
||||||
|
return new Object[]{200, "application/octet-stream", new ByteArrayInputStream(join.getBytes())};
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String categoryContent(String str, String str2, boolean z, HashMap<String, String> hashMap) {
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string("https://czzy.pro/" + str + "/page/" + str2, Headers()));
|
||||||
|
int parseInt = Integer.parseInt(str2);
|
||||||
|
int parseInt2 = Integer.parseInt(str2);
|
||||||
|
Matcher matcher = I.matcher(doc.select("div.pagenavi_txt > a.extend").last().attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
parseInt2 = Integer.parseInt(matcher.group(1));
|
||||||
|
}
|
||||||
|
Elements jS = doc.select("div.mi_ne_kd > ul > li");
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
for (Element next : jS) {
|
||||||
|
Matcher matcher2 = Db.matcher(next.select("a").attr("href"));
|
||||||
|
if (matcher2.find()) {
|
||||||
|
String group = matcher2.group(1);
|
||||||
|
String trim = next.select("img").attr("alt").trim();
|
||||||
|
String trim2 = next.select("img").attr("data-original").trim();
|
||||||
|
String trim3 = next.select("div.hdinfo > span").text().trim();
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
jSONObject2.put("vod_id", group);
|
||||||
|
jSONObject2.put("vod_name", trim);
|
||||||
|
jSONObject2.put("vod_pic", trim2);
|
||||||
|
jSONObject2.put("vod_remarks", trim3);
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject.put("list", jSONArray);
|
||||||
|
jSONObject.put("page", parseInt);
|
||||||
|
jSONObject.put("pagecount", parseInt2);
|
||||||
|
jSONObject.put("limit", 24);
|
||||||
|
jSONObject.put("total", parseInt2 <= 1 ? jSONArray.length() : parseInt2 * 24);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String detailContent(List<String> list) {
|
||||||
|
String str2 = "";
|
||||||
|
try {
|
||||||
|
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string("https://czzy.pro/movie/" + list.get(0) + ".html", Headers()));
|
||||||
|
String trim = doc.select("div.moviedteail_tt > h1").text().trim();
|
||||||
|
String pY2 = doc.select("div.dyimg > img").attr("src");
|
||||||
|
Iterator<Element> it = doc.select("ul.moviedteail_list > li").iterator();
|
||||||
|
String str3 = str2;
|
||||||
|
String str4 = str3;
|
||||||
|
String str5 = str4;
|
||||||
|
String str6 = str5;
|
||||||
|
String str7 = str6;
|
||||||
|
String str8 = str7;
|
||||||
|
while (it.hasNext()) {
|
||||||
|
String trim2 = it.next().text().trim();
|
||||||
|
if (trim2.length() >= 4) {
|
||||||
|
try {
|
||||||
|
String substring = trim2.substring(0, 2);
|
||||||
|
String substring2 = trim2.substring(3);
|
||||||
|
if (substring.equals("类型")) {
|
||||||
|
str3 = substring2;
|
||||||
|
} else if (substring.equals("地区")) {
|
||||||
|
str5 = substring2;
|
||||||
|
} else if (substring.equals("年份")) {
|
||||||
|
str4 = substring2;
|
||||||
|
} else if (substring.equals("导演")) {
|
||||||
|
str8 = substring2;
|
||||||
|
} else if (substring.equals("主演")) {
|
||||||
|
str7 = substring2;
|
||||||
|
} else if (substring.equals("豆瓣")) {
|
||||||
|
str6 = substring2;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject2.put("vod_id", list.get(0));
|
||||||
|
jSONObject2.put("vod_name", trim);
|
||||||
|
jSONObject2.put("vod_pic", pY2);
|
||||||
|
jSONObject2.put("type_name", str3);
|
||||||
|
jSONObject2.put("vod_year", str4);
|
||||||
|
jSONObject2.put("vod_area", str5);
|
||||||
|
jSONObject2.put("vod_remarks", str6);
|
||||||
|
jSONObject2.put("vod_actor", str7);
|
||||||
|
jSONObject2.put("vod_director", str8);
|
||||||
|
jSONObject2.put("vod_content", doc.select("div.yp_context").text().trim());
|
||||||
|
jSONObject2.put("vod_play_from", "厂长资源");
|
||||||
|
ArrayList arrayList = new ArrayList();
|
||||||
|
for (Element next : doc.select("div.paly_list_btn > a")) {
|
||||||
|
Matcher matcher = d.matcher(next.attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
arrayList.add(next.text() + "$" + matcher.group(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject2.put("vod_play_url", TextUtils.join("#", arrayList));
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
jSONObject.put("list", jSONArray);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e3) {
|
||||||
|
}return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String homeContent(boolean z) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string("https://czzy.pro", Headers()));
|
||||||
|
Elements jS = doc.select(".navlist > li > a");
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
for (Element next : jS) {
|
||||||
|
String pY2 = next.attr("href");
|
||||||
|
if (pY2.length() > 1) {
|
||||||
|
String substring = pY2.substring(1);
|
||||||
|
String trim = next.text().trim();
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
jSONObject2.put("type_id", substring);
|
||||||
|
jSONObject2.put("type_name", trim);
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject.put("class", jSONArray);
|
||||||
|
Elements jS2 = doc.select("div.mi_ne_kd > ul > li");
|
||||||
|
JSONArray jSONArray2 = new JSONArray();
|
||||||
|
for (Element next2 : jS2) {
|
||||||
|
Matcher matcher = Db.matcher(next2.select("a").attr("href"));
|
||||||
|
if (matcher.find()) {
|
||||||
|
String group = matcher.group(1);
|
||||||
|
String trim2 = next2.select("img").attr("alt").trim();
|
||||||
|
String trim3 = next2.select("img").attr("data-original").trim();
|
||||||
|
String trim4 = next2.select("div.hdinfo > span").text().trim();
|
||||||
|
JSONObject jSONObject3 = new JSONObject();
|
||||||
|
jSONObject3.put("vod_id", group);
|
||||||
|
jSONObject3.put("vod_name", trim2);
|
||||||
|
jSONObject3.put("vod_pic", trim3);
|
||||||
|
jSONObject3.put("vod_remarks", trim4);
|
||||||
|
jSONArray2.put(jSONObject3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject.put("list", jSONArray2);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static HashMap<String, String> Headers() {
|
||||||
|
HashMap<String, String> hashMap = new HashMap<>();
|
||||||
|
hashMap.put("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36");
|
||||||
|
return hashMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String playerContent(String str, String str2, List<String> list) {
|
||||||
|
String str3;
|
||||||
|
String str4;
|
||||||
|
Elements G8;
|
||||||
|
try {
|
||||||
|
String K2 = OkHttpUtil.string("https://czzy.pro/v_play/" + str2 + ".html", Headers());
|
||||||
|
Document UR = Jsoup.parse(K2);
|
||||||
|
Matcher matcher = Y.matcher(K2);
|
||||||
|
if (matcher.find()) {
|
||||||
|
String group = matcher.group(1);
|
||||||
|
String KEY = matcher.group(2);
|
||||||
|
String IV = matcher.group(3);
|
||||||
|
String str5 = AES.CBC(group, KEY, IV);
|
||||||
|
Matcher matcher2 = pY.matcher(str5);
|
||||||
|
str3 = matcher2.find() ? matcher2.group(1) : "";
|
||||||
|
Matcher matcher3 = m.matcher(str5);
|
||||||
|
str4 = matcher3.find() ? matcher3.group(1) : "";
|
||||||
|
} else {
|
||||||
|
str4 = "";
|
||||||
|
str3 = str4;
|
||||||
|
}
|
||||||
|
if (TextUtils.isEmpty(str3) && (G8 = UR.select("iframe.viframe")) != null) {
|
||||||
|
String pY2 = G8.attr("src");
|
||||||
|
if (pY2.contains("jx.xmflv.com")) {
|
||||||
|
String K3 = OkHttpUtil.string(pY2, Headers());
|
||||||
|
Matcher matcher4 = X.matcher(K3);
|
||||||
|
if (!matcher4.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group2 = matcher4.group(1);
|
||||||
|
Matcher matcher5 = a.matcher(K3);
|
||||||
|
if (!matcher5.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group3 = matcher5.group(1);
|
||||||
|
String K4 = OkHttpUtil.string("https://jx.xmflv.com/player.php?time=" + group2 + "&url=" + group3, Headers());
|
||||||
|
Matcher matcher6 = K.matcher(K4);
|
||||||
|
if (!matcher6.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group4 = matcher6.group(1);
|
||||||
|
Matcher matcher7 = Oe.matcher(K4);
|
||||||
|
if (!matcher7.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group5 = matcher7.group(1);
|
||||||
|
Matcher matcher8 = fi.matcher(K4);
|
||||||
|
if (!matcher8.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group6 = matcher8.group(1);
|
||||||
|
Matcher matcher9 = M.matcher(K4);
|
||||||
|
if (!matcher9.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group7 = matcher9.group(1);
|
||||||
|
Matcher matcher10 = X.matcher(K4);
|
||||||
|
if (!matcher10.find()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String group8 = matcher10.group(1);
|
||||||
|
byte[] bytes3 = mmd5(group5).getBytes();
|
||||||
|
byte[] bytes4 = "UVE1NTY4MDY2NQ==".getBytes();
|
||||||
|
Cipher cipher2 = Cipher.getInstance("AES/CBC/NoPadding");
|
||||||
|
cipher2.init(1, new SecretKeySpec(bytes3, "AES"), new IvParameterSpec(bytes4));
|
||||||
|
String encodeToString = Base64.encodeToString(cipher2.doFinal(group5.getBytes()), 0);
|
||||||
|
OKCallBack.OKCallBackDefault callBack = new OKCallBack.OKCallBackDefault() {
|
||||||
|
|
||||||
|
public void onResponse(Response response) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onFailure(Call call, Exception exc) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
HashMap hashMap = new HashMap();
|
||||||
|
hashMap.put("url", group3);
|
||||||
|
hashMap.put("time", group8);
|
||||||
|
hashMap.put("ua", group6);
|
||||||
|
hashMap.put("cip", group7);
|
||||||
|
hashMap.put("vkey", group4);
|
||||||
|
hashMap.put("fvkey", encodeToString);
|
||||||
|
OkHttpUtil.post(OkHttpUtil.defaultClient(), "https://jx.xmflv.com/xmflv-1.SVG", hashMap, Headers(), callBack);
|
||||||
|
str3 = new JSONObject(callBack.getResult().body().string()).getString("url");
|
||||||
|
} else {
|
||||||
|
Matcher matcher11 = Q.matcher(OkHttpUtil.string(pY2, Headers()));
|
||||||
|
if (matcher11.find()) {
|
||||||
|
str3 = matcher11.group(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
jSONObject.put("parse", "0");
|
||||||
|
jSONObject.put("playUrl", "");
|
||||||
|
jSONObject.put("url", str3);
|
||||||
|
jSONObject.put("header", "");
|
||||||
|
if (!TextUtils.isEmpty(str4)) {
|
||||||
|
jSONObject.put("subf", "/vtt/utf-8");
|
||||||
|
jSONObject.put("subt", Proxy.localProxyUrl() + "?do=czspp&url=" + URLEncoder.encode(str4));
|
||||||
|
}
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String searchContent(String str, boolean z) {
|
||||||
|
try {
|
||||||
|
JSONObject jSONObject = new JSONObject();
|
||||||
|
Elements jS = Jsoup.parse(OkHttpUtil.string("https://czzy.pro/xssearch?q=" + URLEncoder.encode(str), Headers())).select("div.mi_ne_kd > ul > li");
|
||||||
|
JSONArray jSONArray = new JSONArray();
|
||||||
|
for (Element next : jS) {
|
||||||
|
Matcher matcher = Db.matcher(next.select("a").attr("href"));
|
||||||
|
JSONObject jSONObject2 = new JSONObject();
|
||||||
|
if (matcher.find()) {
|
||||||
|
String group = matcher.group(1);
|
||||||
|
String trim = next.select("img").attr("alt").trim();
|
||||||
|
if (trim.contains(str)) {
|
||||||
|
String trim2 = next.select("img").attr("src").trim();
|
||||||
|
if (next.hasClass(".jidi")) {
|
||||||
|
String remark = next.select(".jidi span").text();
|
||||||
|
jSONObject2.put("vod_remarks", remark);
|
||||||
|
} else {
|
||||||
|
String id = next.select("a").attr("href");
|
||||||
|
Document doc = Jsoup.parse(OkHttpUtil.string(id, Headers()));
|
||||||
|
String remark = doc.select("ul.moviedteail_list li span").get(0).text();
|
||||||
|
jSONObject2.put("vod_id", group);
|
||||||
|
jSONObject2.put("vod_name", trim);
|
||||||
|
jSONObject2.put("vod_pic", trim2);
|
||||||
|
jSONObject2.put("vod_remarks", remark);
|
||||||
|
jSONArray.put(jSONObject2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jSONObject.put("list", jSONArray);
|
||||||
|
return jSONObject.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
SpiderDebug.log(e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,377 @@
|
||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.net.SSLSocketFactoryCompat;
|
||||||
|
import com.github.catvod.utils.Misc;
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author: @SDL
|
||||||
|
*/
|
||||||
|
public class Kunyu77 extends Spider {
|
||||||
|
private final String siteUrl = "http://api.tyun77.cn";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/filter";
|
||||||
|
String content = getWebContent(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 = getWebContent(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) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject();
|
||||||
|
result.put("class", classes);
|
||||||
|
if (filter) {
|
||||||
|
result.put("filters", filterConfig);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
} catch (Throwable th) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getWebContent(String targetUrl) throws IOException {
|
||||||
|
String userAgent = "okhttp/3.12.0";
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(targetUrl)
|
||||||
|
.get()
|
||||||
|
.addHeader("User-Agent", userAgent)
|
||||||
|
.build();
|
||||||
|
OkHttpClient okHttpClient = new OkHttpClient()
|
||||||
|
.newBuilder()
|
||||||
|
.sslSocketFactory(new SSLSocketFactoryCompat(), SSLSocketFactoryCompat.trustAllCert)
|
||||||
|
.build();
|
||||||
|
Response response = okHttpClient.newCall(request).execute();
|
||||||
|
if (response.body() == null) return "";
|
||||||
|
String content = response.body().string();
|
||||||
|
response.close();
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeVideoContent() {
|
||||||
|
try {
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/homeBlock?type_id=0";
|
||||||
|
String content = getWebContent(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 = getWebContent(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 (Exception e) {
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
String url = siteUrl + "/api.php/provide/videoDetail?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=&ids=" + ids.get(0);
|
||||||
|
String content = getWebContent(url);
|
||||||
|
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?devid=453CA5D864457C7DB4D0EAA93DE96E66&package=com.sevenVideo.app.android&version=&ids=" + ids.get(0);
|
||||||
|
content = getWebContent(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 = getWebContent(url);
|
||||||
|
JSONObject dataObj = new JSONObject(decryptResponse(content)).getJSONObject("data");
|
||||||
|
JSONObject playHeader = dataObj.optJSONObject("playHeader");
|
||||||
|
String jxUrl = dataObj.getString("url");
|
||||||
|
content = getWebContent(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 = getWebContent(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,236 @@
|
||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.net.OkHttp;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhixc
|
||||||
|
* 新飘花电影网
|
||||||
|
*/
|
||||||
|
public class PiaoHua extends Spider {
|
||||||
|
|
||||||
|
private final String siteURL = "https://www.xpiaohua.com";
|
||||||
|
|
||||||
|
private final String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
List<String> typeIds = Arrays.asList("/dongzuo/", "/xiju/", "/aiqing/", "/kehuan/", "/juqing/", "/xuanyi/", "/zhanzheng/", "/kongbu/", "/zainan/", "/dongman/", "/jilu/");
|
||||||
|
List<String> typeNames = Arrays.asList("动作片", "喜剧片", "爱情片", "科幻片", "剧情片", "悬疑片", "战争片", "恐怖片", "灾难片", "动漫", "纪录片");
|
||||||
|
for (int i = 0; i < typeIds.size(); i++) {
|
||||||
|
JSONObject obj = new JSONObject();
|
||||||
|
obj.put("type_id", typeIds.get(i));
|
||||||
|
obj.put("type_name", typeNames.get(i));
|
||||||
|
classes.put(obj);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("class", classes);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
// 第一页
|
||||||
|
// https://www.xpiaohua.com/column/xiju/
|
||||||
|
// 第二页
|
||||||
|
// https://www.xpiaohua.com/column/xiju/list_2.html
|
||||||
|
String cateURL = siteURL + "/column" + tid;
|
||||||
|
if (!pg.equals("1")) {
|
||||||
|
cateURL += "/list_" + pg + ".html";
|
||||||
|
}
|
||||||
|
String html = getWebContent(cateURL);
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
Elements items = Jsoup.parse(html).select("#list dl");
|
||||||
|
for (Element item : items) {
|
||||||
|
String vid = item.select("strong a").attr("href");
|
||||||
|
String name = item.select("strong").text();
|
||||||
|
String pic = item.select("img").attr("src");
|
||||||
|
JSONObject vod = new JSONObject()
|
||||||
|
.put("vod_id", vid)
|
||||||
|
.put("vod_name", name)
|
||||||
|
.put("vod_pic", pic)
|
||||||
|
.put("vod_remarks", "");
|
||||||
|
videos.put(vod);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("pagecount", 999)
|
||||||
|
.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getWebContent(String targetURL) throws Exception {
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.addHeader("User-Agent", userAgent)
|
||||||
|
.get()
|
||||||
|
.url(targetURL)
|
||||||
|
.build();
|
||||||
|
OkHttpClient okHttpClient = OkHttp.client();
|
||||||
|
Response response = okHttpClient.newCall(request).execute();
|
||||||
|
if (response.body() == null) return "";
|
||||||
|
byte[] bytes = response.body().bytes();
|
||||||
|
response.close();
|
||||||
|
return new String(bytes, "gb2312");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
String detailURL = ids.get(0);
|
||||||
|
String html = getWebContent(detailURL);
|
||||||
|
Document doc = Jsoup.parse(html);
|
||||||
|
String vod_play_url = "";
|
||||||
|
String vod_play_from = "magnet";
|
||||||
|
Elements aList = doc.select("table").get(0).select("a");
|
||||||
|
List<String> vodItems = new ArrayList<>();
|
||||||
|
for (Element element : aList) {
|
||||||
|
String episodeURL = element.attr("href");
|
||||||
|
if (!episodeURL.startsWith("magnet")) continue;
|
||||||
|
String episodeName = getEpisodeName(episodeURL);
|
||||||
|
vodItems.add(episodeName + "$" + episodeURL);
|
||||||
|
}
|
||||||
|
if (vodItems.size() > 0) {
|
||||||
|
vod_play_url = TextUtils.join("#", vodItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
String name = doc.select("h3").text();
|
||||||
|
String pic = doc.select("#showinfo img").attr("src");
|
||||||
|
String typeName = getStrByRegex(Pattern.compile("◎类 别 (.*?)<br"), html);
|
||||||
|
String year = getStrByRegex(Pattern.compile("◎年 代 (.*?)<br"), html);
|
||||||
|
String area = getStrByRegex(Pattern.compile("◎产 地 (.*?)<br"), html);
|
||||||
|
String remark = getStrByRegex(Pattern.compile("◎上映日期 (.*?)<br"), html);
|
||||||
|
String actor = getActorStr(html);
|
||||||
|
String director = getDirectorStr(Pattern.compile("◎导 演 (.*?)<br"), html);
|
||||||
|
String description = getDescription(Pattern.compile("◎简 介(.*?)◎", Pattern.CASE_INSENSITIVE | Pattern.DOTALL), html);
|
||||||
|
JSONObject vod = new JSONObject()
|
||||||
|
.put("vod_id", ids.get(0))
|
||||||
|
.put("vod_name", name)
|
||||||
|
.put("vod_pic", pic)
|
||||||
|
.put("type_name", typeName)
|
||||||
|
.put("vod_year", year)
|
||||||
|
.put("vod_area", area)
|
||||||
|
.put("vod_remarks", remark)
|
||||||
|
.put("vod_actor", actor)
|
||||||
|
.put("vod_director", director)
|
||||||
|
.put("vod_content", description);
|
||||||
|
if (vod_play_url.length() > 0) {
|
||||||
|
vod.put("vod_play_from", vod_play_from);
|
||||||
|
vod.put("vod_play_url", vod_play_url);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray jsonArray = new JSONArray().put(vod);
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("list", jsonArray);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getEpisodeName(String episodeURL) {
|
||||||
|
try {
|
||||||
|
return episodeURL.split("&dn=")[1];
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "第1集";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDescription(Pattern pattern, String html) {
|
||||||
|
return getStrByRegex(pattern, html).replaceAll("</?[^>]+>", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDirectorStr(Pattern pattern, String html) {
|
||||||
|
return getStrByRegex(pattern, html)
|
||||||
|
.replaceAll("·", "·");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getActorStr(String html) {
|
||||||
|
Pattern p1 = Pattern.compile("◎演 员 (.*?)◎");
|
||||||
|
Pattern p2 = Pattern.compile("◎主 演 (.*?)◎");
|
||||||
|
String actor = getStrByRegex(p1, html).equals("") ? getStrByRegex(p2, html) : "";
|
||||||
|
return actor.replaceAll("</?[^>]+>", "")
|
||||||
|
.replaceAll(" ", "")
|
||||||
|
.replaceAll("·", "·");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStrByRegex(Pattern pattern, String html) {
|
||||||
|
try {
|
||||||
|
Matcher matcher = pattern.matcher(html);
|
||||||
|
if (matcher.find()) return matcher.group(1);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
String searchURL = siteURL + "/plus/search.php?q=" + URLEncoder.encode(key, "GBK") + "&searchtype.x=0&searchtype.y=0";
|
||||||
|
String html = getWebContent(searchURL);
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
Elements items = Jsoup.parse(html).select("#list dl");
|
||||||
|
for (Element item : items) {
|
||||||
|
String vid = item.select("strong a").attr("href");
|
||||||
|
String name = item.select("strong").text();
|
||||||
|
String pic = item.select("img").attr("src");
|
||||||
|
JSONObject vod = new JSONObject()
|
||||||
|
.put("vod_id", vid)
|
||||||
|
.put("vod_name", name)
|
||||||
|
.put("vod_pic", pic)
|
||||||
|
.put("vod_remarks", "");
|
||||||
|
videos.put(vod);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("parse", 0)
|
||||||
|
.put("header", "")
|
||||||
|
.put("playUrl", "")
|
||||||
|
.put("url", id);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,266 @@
|
||||||
|
package com.github.catvod.spider;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import com.github.catvod.crawler.Spider;
|
||||||
|
import com.github.catvod.net.OkHttp;
|
||||||
|
import okhttp3.*;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.nodes.Element;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author zhixc
|
||||||
|
* 6V电影网(新版页面)
|
||||||
|
*/
|
||||||
|
public class SixV extends Spider {
|
||||||
|
|
||||||
|
private String siteURL;
|
||||||
|
|
||||||
|
private final String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36";
|
||||||
|
|
||||||
|
private Map<String, String> getHeader() {
|
||||||
|
Map<String, String> header = new HashMap<>();
|
||||||
|
header.put("User-Agent", userAgent);
|
||||||
|
header.put("Referer", siteURL + "/");
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> getDetailHeader() {
|
||||||
|
Map<String, String> header = new HashMap<>();
|
||||||
|
header.put("User-Agent", userAgent);
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(Context context, String extend) {
|
||||||
|
super.init(context, extend);
|
||||||
|
if (extend.endsWith("/")) {
|
||||||
|
extend = extend.substring(0, extend.lastIndexOf("/"));
|
||||||
|
}
|
||||||
|
siteURL = extend;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String homeContent(boolean filter) {
|
||||||
|
try {
|
||||||
|
JSONArray classes = new JSONArray();
|
||||||
|
List<String> typeIds = Arrays.asList("xijupian", "dongzuopian", "aiqingpian", "kehuanpian", "kongbupian", "juqingpian", "zhanzhengpian", "jilupian", "donghuapian", "dianshiju/guoju", "dianshiju/rihanju", "dianshiju/oumeiju");
|
||||||
|
List<String> typeNames = Arrays.asList("喜剧片", "动作片", "爱情片", "科幻片", "恐怖片", "剧情片", "战争片", "纪录片", "动画片", "国剧", "日韩剧", "欧美剧");
|
||||||
|
for (int i = 0; i < typeIds.size(); i++) {
|
||||||
|
JSONObject c = new JSONObject();
|
||||||
|
c.put("type_id", typeIds.get(i));
|
||||||
|
c.put("type_name", typeNames.get(i));
|
||||||
|
classes.put(c);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("class", classes);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
|
||||||
|
try {
|
||||||
|
String cateURL = siteURL + "/" + tid;
|
||||||
|
if (!pg.equals("1")) {
|
||||||
|
cateURL += "/index_" + pg + ".html";
|
||||||
|
}
|
||||||
|
String html = OkHttp.string(cateURL, getHeader());
|
||||||
|
Elements items = Jsoup.parse(html).select("#post_container .post_hover");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (Element item : items) {
|
||||||
|
Element li = item.select("[class=zoom]").get(0);
|
||||||
|
String vid = li.attr("href");
|
||||||
|
String name = li.attr("title");
|
||||||
|
String pic = li.select("img").attr("src");
|
||||||
|
String remark = item.select("[rel=category tag]").text();
|
||||||
|
|
||||||
|
JSONObject vod = new JSONObject()
|
||||||
|
.put("vod_id", vid)
|
||||||
|
.put("vod_name", name)
|
||||||
|
.put("vod_pic", pic)
|
||||||
|
.put("vod_remarks", remark);
|
||||||
|
videos.put(vod);
|
||||||
|
}
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("pagecount", 999)
|
||||||
|
.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String detailContent(List<String> ids) {
|
||||||
|
try {
|
||||||
|
String vid = ids.get(0);
|
||||||
|
String detailURL = siteURL + vid;
|
||||||
|
String html = OkHttp.string(detailURL, getDetailHeader());
|
||||||
|
Document doc = Jsoup.parse(html);
|
||||||
|
Elements sourceList = doc.select("#post_content");
|
||||||
|
|
||||||
|
String vod_play_from = "magnet";
|
||||||
|
Map<String, String> playMap = new LinkedHashMap<>();
|
||||||
|
int i = 0;
|
||||||
|
for (Element source : sourceList) {
|
||||||
|
i++;
|
||||||
|
Elements aList = source.select("table a");
|
||||||
|
List<String> vodItems = new ArrayList<>();
|
||||||
|
for (Element a : aList) {
|
||||||
|
String episodeURL = a.attr("href");
|
||||||
|
String episodeName = a.text();
|
||||||
|
if (!episodeURL.startsWith("magnet")) continue;
|
||||||
|
vodItems.add(episodeName + "$" + episodeURL);
|
||||||
|
}
|
||||||
|
if (vodItems.size() > 0) {
|
||||||
|
playMap.put(vod_play_from + i, TextUtils.join("#", vodItems));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String partHTML = doc.select(".context").html();
|
||||||
|
String name = doc.select(".article_container > h1").text();
|
||||||
|
String pic = doc.select("#post_content img").attr("src");
|
||||||
|
String typeName = getStrByRegex(Pattern.compile("◎类 别 (.*?)<br>"), partHTML);
|
||||||
|
String year = getStrByRegex(Pattern.compile("◎年 代 (.*?)<br>"), partHTML);
|
||||||
|
String area = getStrByRegex(Pattern.compile("◎产 地 (.*?)<br>"), partHTML);
|
||||||
|
String remark = getStrByRegex(Pattern.compile("◎上映日期 (.*?)<br>"), partHTML);
|
||||||
|
String actor = getActorOrDirector(Pattern.compile("◎演 员 (.*?)</p>"), partHTML);
|
||||||
|
if (actor.equals("")) {
|
||||||
|
actor = getActorOrDirector(Pattern.compile("◎主 演 (.*?)</p>"), partHTML);
|
||||||
|
}
|
||||||
|
String director = getActorOrDirector(Pattern.compile("◎导 演 (.*?)<br>"), partHTML);
|
||||||
|
String description = getDescription(Pattern.compile("◎简 介(.*?)<hr>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL), partHTML);
|
||||||
|
|
||||||
|
JSONObject vod = new JSONObject()
|
||||||
|
.put("vod_id", ids.get(0))
|
||||||
|
.put("vod_name", name)
|
||||||
|
.put("vod_pic", pic)
|
||||||
|
.put("type_name", typeName)
|
||||||
|
.put("vod_year", year)
|
||||||
|
.put("vod_area", area)
|
||||||
|
.put("vod_remarks", remark)
|
||||||
|
.put("vod_actor", actor)
|
||||||
|
.put("vod_director", director)
|
||||||
|
.put("vod_content", description);
|
||||||
|
if (playMap.size() > 0) {
|
||||||
|
vod.put("vod_play_from", TextUtils.join("$$$", playMap.keySet()));
|
||||||
|
vod.put("vod_play_url", TextUtils.join("$$$", playMap.values()));
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONArray jsonArray = new JSONArray().put(vod);
|
||||||
|
JSONObject result = new JSONObject().put("list", jsonArray);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getStrByRegex(Pattern pattern, String str) {
|
||||||
|
try {
|
||||||
|
Matcher matcher = pattern.matcher(str);
|
||||||
|
if (matcher.find()) {
|
||||||
|
return matcher.group(1).trim();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getActorOrDirector(Pattern pattern, String str) {
|
||||||
|
return getStrByRegex(pattern, str)
|
||||||
|
.replaceAll("<br>", "")
|
||||||
|
.replaceAll(" ", "")
|
||||||
|
.replaceAll("&", "")
|
||||||
|
.replaceAll("middot;", "・")
|
||||||
|
.replaceAll(" ", ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDescription(Pattern pattern, String str) {
|
||||||
|
return getStrByRegex(pattern, str)
|
||||||
|
.replaceAll("</?[^>]+>", "") // 去掉 html 标签
|
||||||
|
.replaceAll("\n", "") // 去掉换行符
|
||||||
|
.replaceAll(" ", "")
|
||||||
|
.replaceAll("&", "")
|
||||||
|
.replaceAll("middot;", "・")
|
||||||
|
.replaceAll("ldquo;", "【")
|
||||||
|
.replaceAll("rdquo;", "】");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String searchContent(String key, boolean quick) {
|
||||||
|
try {
|
||||||
|
String searchURL = siteURL + "/e/search/index.php";
|
||||||
|
RequestBody formBody = new FormBody.Builder()
|
||||||
|
.add("show", "title")
|
||||||
|
.add("tempid", "1")
|
||||||
|
.add("tbname", "article")
|
||||||
|
.add("mid", "1")
|
||||||
|
.add("dopost", "search")
|
||||||
|
.add("submit", "")
|
||||||
|
.addEncoded("keyboard", key)
|
||||||
|
.build();
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(searchURL)
|
||||||
|
.addHeader("User-Agent", userAgent)
|
||||||
|
.addHeader("Origin", siteURL)
|
||||||
|
.addHeader("Referer", siteURL + "/")
|
||||||
|
.post(formBody)
|
||||||
|
.build();
|
||||||
|
OkHttpClient okHttpClient = OkHttp.client();
|
||||||
|
Response response = okHttpClient.newCall(request).execute();
|
||||||
|
if (response.body() == null) return "";
|
||||||
|
String html = response.body().string();
|
||||||
|
response.close(); // 关闭响应资源
|
||||||
|
Elements items = Jsoup.parse(html).select("#post_container [class=zoom]");
|
||||||
|
JSONArray videos = new JSONArray();
|
||||||
|
for (Element item : items) {
|
||||||
|
String vid = item.attr("href");
|
||||||
|
String name = item.attr("title").replaceAll("</?[^>]+>", "");
|
||||||
|
String pic = item.select("img").attr("src");
|
||||||
|
JSONObject vod = new JSONObject()
|
||||||
|
.put("vod_id", vid)
|
||||||
|
.put("vod_name", name)
|
||||||
|
.put("vod_pic", pic)
|
||||||
|
.put("vod_remarks", "");
|
||||||
|
videos.put(vod);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("list", videos);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String playerContent(String flag, String id, List<String> vipFlags) {
|
||||||
|
try {
|
||||||
|
JSONObject result = new JSONObject()
|
||||||
|
.put("parse", 0)
|
||||||
|
.put("header", "")
|
||||||
|
.put("playUrl", "")
|
||||||
|
.put("url", id);
|
||||||
|
return result.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue