This commit is contained in:
dukun 2023-01-31 14:37:38 +08:00
parent 156a734f49
commit f8fc494b25
18 changed files with 6211 additions and 3 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,144 @@
package com.github.catvod.spider;
import android.content.Context;
import android.text.TextUtils;
import com.github.catvod.bean.Class;
import com.github.catvod.bean.Result;
import com.github.catvod.bean.Vod;
import com.github.catvod.crawler.Spider;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Misc;
import com.github.catvod.utils.Trans;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* @author ColaMint & FongMi
*/
public class Bili11 extends Spider {
private static final String url = "https://www.bilibili.com";
private HashMap<String, String> header;
private JSONObject ext;
private String extend;
private String getCookie(String cookie) {
if (TextUtils.isEmpty(cookie)) return "buvid3=84B0395D-C9F2-C490-E92E-A09AB48FE26E71636infoc";
if (cookie.startsWith("http")) return OkHttp.string(cookie).replace("\n", "");
return cookie;
}
private void setHeader() throws Exception {
header.put("cookie", getCookie(ext.getString("cookie")));
header.put("User-Agent", Misc.CHROME);
header.put("Referer", url);
}
private void fetchExt() {
String result = OkHttp.string(extend);
if (!TextUtils.isEmpty(result)) extend = result;
}
private void fetchRule() throws Exception {
if (header.containsKey("cookie") && header.get("cookie").length() > 0) return;
if (extend.startsWith("http")) fetchExt();
ext = new JSONObject(extend);
setHeader();
}
@Override
public void init(Context context, String extend) {
try {
this.extend = extend;
this.header = new HashMap<>();
fetchRule();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String homeContent(boolean filter) throws Exception {
fetchRule();
return Result.string(Class.arrayFrom(ext.getJSONArray("classes").toString()), ext.getJSONObject("filter"));
}
@Override
public String homeVideoContent() throws Exception {
fetchRule();
return categoryContent("汽车 数码", "1", true, new HashMap<>());
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) throws Exception {
String duration = extend.containsKey("duration") ? extend.get("duration") : "0";
if (extend.containsKey("tid")) tid = tid + " " + extend.get("tid");
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(tid) + "&duration=" + duration + "&page=" + pg;
JSONObject resp = new JSONObject(OkHttp.string(url, header));
JSONArray result = resp.getJSONObject("data").getJSONArray("result");
List<Vod> list = new ArrayList<>();
for (int i = 0; i < result.length(); ++i) {
JSONObject object = result.getJSONObject(i);
String pic = object.getString("pic");
Vod vod = new Vod();
vod.setVodId(object.getString("bvid"));
vod.setVodName(Jsoup.parse(object.getString("title")).text());
vod.setVodRemarks(object.getString("duration").split(":")[0] + "分鐘");
vod.setVodPic(pic.startsWith("//") ? "https:" + pic : pic);
list.add(vod);
}
return Result.string(list);
}
@Override
public String detailContent(List<String> ids) throws Exception {
String bvid = ids.get(0);
String bvid2aidUrl = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + bvid;
JSONObject bvid2aidResp = new JSONObject(OkHttp.string(bvid2aidUrl, header));
String aid = bvid2aidResp.getJSONObject("data").getLong("aid") + "";
String detailUrl = "https://api.bilibili.com/x/web-interface/view?aid=" + aid;
JSONObject detailResp = new JSONObject(OkHttp.string(detailUrl, header));
JSONObject detailData = detailResp.getJSONObject("data");
List<String> playlist = new ArrayList<>();
JSONArray pages = detailData.getJSONArray("pages");
for (int i = 0; i < pages.length(); ++i) {
JSONObject page = pages.getJSONObject(i);
String title = page.getString("part").replace("$", "_").replace("#", "_");
playlist.add(Trans.get(title) + "$" + aid + "+" + page.getLong("cid"));
}
Vod vod = new Vod();
vod.setVodId(bvid);
vod.setVodName(detailData.getString("title"));
vod.setVodPic(detailData.getString("pic"));
vod.setTypeName(detailData.getString("tname"));
vod.setVodRemarks(detailData.getLong("duration") / 60 + "分鐘");
vod.setVodContent(detailData.getString("desc"));
vod.setVodPlayFrom("B站");
vod.setVodPlayUrl(TextUtils.join("#", playlist));
return Result.string(vod);
}
@Override
public String searchContent(String key, boolean quick) throws Exception {
return categoryContent(key, "1", true, new HashMap<>());
}
@Override
public String playerContent(String flag, String id, List<String> vipFlags) throws Exception {
String[] ids = id.split("\\+");
String aid = ids[0];
String cid = ids[1];
String url = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=120&fourk=1";
JSONObject resp = new JSONObject(OkHttp.string(url, header));
url = resp.getJSONObject("data").getJSONArray("durl").getJSONObject(0).getString("url");
return Result.get().url(url).header(header).string();
}
}

View File

@ -0,0 +1,372 @@
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);
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);
String content = OkHttpUtil.string(url, getHeaders(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?ids=" + ids.get(0);
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) {
if (quick)
return "";
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;
}
}

View File

@ -13,7 +13,7 @@ public class Live extends Spider {
private int delay;
@Override
public void init(Context context, String extend) {
public void init(Context context, String extend) {
super.init(context, extend);
this.delay = delay(extend);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,528 @@
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.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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import okhttp3.Call;
public class XBiubiu 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();
String[] fenleis = getRuleVal("fenlei", "").split("#");
for (String fenlei : fenleis) {
String[] info = fenlei.split("\\$");
JSONObject jsonObject = new JSONObject();
jsonObject.put("type_name", info[0]);
jsonObject.put("type_id", info[1]);
classes.put(jsonObject);
}
result.put("class", classes);
return result.toString();
} catch (
Exception e) {
SpiderDebug.log(e);
}
return "";
}
protected HashMap<String, String> getHeaders(String url) {
HashMap<String, String> headers = new HashMap<>();
String ua = getRuleVal("ua", Misc.CHROME).trim();
if (ua.isEmpty())
ua = Misc.CHROME;
headers.put("User-Agent", ua);
return headers;
}
@Override
public String homeVideoContent() {
try {
fetchRule();
if (getRuleVal("shouye").equals("1")) {
JSONArray videos = new JSONArray();
String[] fenleis = getRuleVal("fenlei", "").split("#");
for (String fenlei : fenleis) {
String[] info = fenlei.split("\\$");
JSONObject data = category(info[1], "1", false, new HashMap<>());
if (data != null) {
JSONArray vids = data.optJSONArray("list");
if (vids != null) {
for (int i = 0; i < vids.length() && i < 5; i++) {
videos.put(vids.getJSONObject(i));
}
}
}
if (videos.length() >= 30)
break;
}
JSONObject result = new JSONObject();
result.put("list", videos);
return result.toString();
}
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private JSONObject category(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
fetchRule();
if (tid.equals(""))
tid = "";
String qishiye = rule.optString("qishiye", "nil");
if (qishiye.equals(""))
pg = "";
else if (!qishiye.equals("nil")) {
pg = String.valueOf(Integer.parseInt(pg) - 1 + Integer.parseInt(qishiye));
}
String webUrl = getRuleVal("url") + tid + pg + getRuleVal("houzhui");
String html = fetch(webUrl);
html = removeUnicode(html);
String parseContent = html;
boolean shifouercijiequ = getRuleVal("shifouercijiequ").equals("1");
if (shifouercijiequ) {
String jiequqian = getRuleVal("jiequqian");
String jiequhou = getRuleVal("jiequhou");
parseContent = subContent(html, jiequqian, jiequhou).get(0);
}
String jiequshuzuqian = getRuleVal("jiequshuzuqian");
String jiequshuzuhou = getRuleVal("jiequshuzuhou");
JSONArray videos = new JSONArray();
ArrayList<String> jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou);
for (int i = 0; i < jiequContents.size(); i++) {
try {
String jiequContent = jiequContents.get(i);
String title = removeHtml(subContent(jiequContent, getRuleVal("biaotiqian"), getRuleVal("biaotihou")).get(0));
String pic = "";
String tupianqian = getRuleVal("tupianqian").toLowerCase();
if (tupianqian.startsWith("http://") || tupianqian.startsWith("https://")) {
pic = getRuleVal("tupianqian");
} else {
pic = subContent(jiequContent, getRuleVal("tupianqian"), getRuleVal("tupianhou")).get(0);
}
pic = Misc.fixUrl(webUrl, pic);
String link = subContent(jiequContent, getRuleVal("lianjieqian"), getRuleVal("lianjiehou")).get(0);
link = getRuleVal("ljqianzhui").isEmpty() ? (link + getRuleVal("ljhouzhui")) : ("x:" + getRuleVal("ljqianzhui")) + link + getRuleVal("ljhouzhui");
String remark = !getRuleVal("fubiaotiqian").isEmpty() && !getRuleVal("fubiaotihou").isEmpty() ?
removeHtml(subContent(jiequContent, getRuleVal("fubiaotiqian"), getRuleVal("fubiaotihou")).get(0)) : "";
JSONObject v = new JSONObject();
v.put("vod_id", title + "$$$" + pic + "$$$" + link);
v.put("vod_name", title);
v.put("vod_pic", pic);
v.put("vod_remarks", remark);
videos.put(v);
} catch (Throwable th) {
th.printStackTrace();
}
}
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;
} catch (Exception e) {
SpiderDebug.log(e);
}
return null;
}
private static String removeUnicode(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\w{4}))");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
String full = matcher.group(1);
String ucode = matcher.group(2);
char c = (char) Integer.parseInt(ucode, 16);
str = str.replace(full, c + "");
}
return str;
}
String removeHtml(String text) {
return Jsoup.parse(text).text();
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
JSONObject obj = category(tid, pg, filter, extend);
return obj != null ? obj.toString() : "";
}
@Override
public String detailContent(List<String> ids) {
try {
fetchRule();
String[] idInfo = ids.get(0).split("\\$\\$\\$");
String webUrl = idInfo[2].startsWith("x:") ? idInfo[2] : getRuleVal("url") + idInfo[2];
String html = fetch(webUrl.startsWith("x:") ? webUrl.substring(2) : webUrl);
String parseContent = html;
boolean bfshifouercijiequ = getRuleVal("bfshifouercijiequ").equals("1");
if (bfshifouercijiequ) {
String jiequqian = getRuleVal("bfjiequqian");
String jiequhou = getRuleVal("bfjiequhou");
parseContent = subContent(html, jiequqian, jiequhou).get(0);
}
ArrayList<String> playList = new ArrayList<>();
boolean playDirect = getRuleVal("直接播放").equals("1");
if (!playDirect) {
String jiequshuzuqian = getRuleVal("bfjiequshuzuqian");
String jiequshuzuhou = getRuleVal("bfjiequshuzuhou");
boolean bfyshifouercijiequ = getRuleVal("bfyshifouercijiequ").equals("1");
ArrayList<String> jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou);
for (int i = 0; i < jiequContents.size(); i++) {
try {
String jiequContent = jiequContents.get(i);
String parseJqContent = bfyshifouercijiequ ? subContent(jiequContent, getRuleVal("bfyjiequqian"), getRuleVal("bfyjiequhou")).get(0) : jiequContent;
ArrayList<String> lastParseContents = subContent(parseJqContent, getRuleVal("bfyjiequshuzuqian"), getRuleVal("bfyjiequshuzuhou"));
List<String> vodItems = new ArrayList<>();
for (int j = 0; j < lastParseContents.size(); j++) {
String title = subContent(lastParseContents.get(j), getRuleVal("bfbiaotiqian"), getRuleVal("bfbiaotihou")).get(0);
String link = subContent(lastParseContents.get(j), getRuleVal("bflianjieqian"), getRuleVal("bflianjiehou")).get(0);
String bfqianzhui = getRuleVal("bfqianzhui");
if (!bfqianzhui.isEmpty()) {
link = bfqianzhui + link;
}
vodItems.add(title + "$" + link);
}
playList.add(TextUtils.join("#", vodItems));
} catch (Throwable th) {
th.printStackTrace();
}
}
} else {
playList.add(idInfo[0] + "$" + idInfo[2]);
}
String cover = idInfo[1], title = idInfo[0], desc = "", category = "", area = "", year = "", remark = "", director = "", actor = "";
if (!getRuleVal("leixinqian").isEmpty() && !getRuleVal("leixinhou").isEmpty()) {
try {
category = subContent(html, getRuleVal("leixinqian"), getRuleVal("leixinhou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!getRuleVal("niandaiqian").isEmpty() && !getRuleVal("niandaihou").isEmpty()) {
try {
year = subContent(html, getRuleVal("niandaiqian"), getRuleVal("niandaihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!getRuleVal("zhuangtaiqian").isEmpty() && !getRuleVal("zhuangtaihou").isEmpty()) {
try {
remark = subContent(html, getRuleVal("zhuangtaiqian"), getRuleVal("zhuangtaihou")).get(0);
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!getRuleVal("zhuyanqian").isEmpty() && !getRuleVal("zhuyanhou").isEmpty()) {
try {
actor = subContent(html, getRuleVal("zhuyanqian"), getRuleVal("zhuyanhou")).get(0).replaceAll("\\s+", "");
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!getRuleVal("daoyanqian").isEmpty() && !getRuleVal("daoyanhou").isEmpty()) {
try {
director = subContent(html, getRuleVal("daoyanqian"), getRuleVal("daoyanhou")).get(0).replaceAll("\\s+", "");
} catch (Exception e) {
SpiderDebug.log(e);
}
}
if (!getRuleVal("juqingqian").isEmpty() && !getRuleVal("juqinghou").isEmpty()) {
try {
desc = subContent(html, getRuleVal("juqingqian"), getRuleVal("juqinghou")).get(0);
} 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<>();
String xlparseContent = html;
if(getRuleVal("xlbiaotiqian").isEmpty() && getRuleVal("xlbiaotihou").isEmpty()){
for (int i = 0; i < playList.size(); i++) {
playFrom.add("播放列表" + (i + 1));
}
}else{
boolean xlshifouercijiequ = getRuleVal("xlshifouercijiequ").equals("1");
if (xlshifouercijiequ) {
String xljiequqian = getRuleVal("xljiequqian");
String xljiequhou = getRuleVal("xljiequhou");
xlparseContent = subContent(html, xljiequqian, xljiequhou).get(0);
}
String xljiequshuzuqian = getRuleVal("xljiequshuzuqian");
String xljiequshuzuhou = getRuleVal("xljiequshuzuhou");
ArrayList<String> xljiequContents = subContent(xlparseContent, xljiequshuzuqian, xljiequshuzuhou);
for (int i = 0; i < playList.size(); i++) {
try {
String xltitle = subContent(xljiequContents.get(i), getRuleVal("xlbiaotiqian"), getRuleVal("xlbiaotihou")).get(0);
playFrom.add(xltitle);
} catch (Throwable th) {
th.printStackTrace();
break;
}
}
}
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);
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 = id.startsWith("x:") ? id.substring(2) : getRuleVal("url") + id;
JSONObject result = new JSONObject();
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", webUrl);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String searchContent(String key, boolean quick) {
try {
fetchRule();
boolean ssmoshiJson = getRuleVal("ssmoshi").equals("0");
String webUrlTmp = getRuleVal("url") + getRuleVal("sousuoqian") + key + getRuleVal("sousuohou");
String webUrl = webUrlTmp.split(";")[0];
String webContent = webUrlTmp.contains(";post") ? fetchPost(webUrl) : fetch(webUrl);
JSONObject result = new JSONObject();
JSONArray videos = new JSONArray();
if (ssmoshiJson) {
JSONObject data = new JSONObject(webContent);
JSONArray vodArray = data.getJSONArray("list");
for (int j = 0; j < vodArray.length(); j++) {
JSONObject vod = vodArray.getJSONObject(j);
String name = vod.optString(getRuleVal("jsname")).trim();
String id = vod.optString(getRuleVal("jsid")).trim();
String pic = vod.optString(getRuleVal("jspic")).trim();
pic = Misc.fixUrl(webUrl, pic);
String link = getRuleVal("sousuohouzhui") + id;
link = getRuleVal("ssljqianzhui").isEmpty() ? (link + getRuleVal("ssljhouzhui")) : ("x:" + getRuleVal("ssljqianzhui")) + link + getRuleVal("ssljhouzhui");
JSONObject v = new JSONObject();
v.put("vod_id", name + "$$$" + pic + "$$$" + link);
v.put("vod_name", name);
v.put("vod_pic", pic);
v.put("vod_remarks", "");
videos.put(v);
}
} else {
String parseContent = webContent;
boolean shifouercijiequ = getRuleVal("sousuoshifouercijiequ").equals("1");
if (shifouercijiequ) {
String jiequqian = getRuleVal("ssjiequqian");
String jiequhou = getRuleVal("ssjiequhou");
parseContent = subContent(webContent, jiequqian, jiequhou).get(0);
}
String jiequshuzuqian = getRuleVal("ssjiequshuzuqian");
String jiequshuzuhou = getRuleVal("ssjiequshuzuhou");
ArrayList<String> jiequContents = subContent(parseContent, jiequshuzuqian, jiequshuzuhou);
for (int i = 0; i < jiequContents.size(); i++) {
try {
String jiequContent = jiequContents.get(i);
String title = subContent(jiequContent, getRuleVal("ssbiaotiqian"), getRuleVal("ssbiaotihou")).get(0);
String pic = subContent(jiequContent, getRuleVal("sstupianqian"), getRuleVal("sstupianhou")).get(0);
pic = Misc.fixUrl(webUrl, pic);
String link = subContent(jiequContent, getRuleVal("sslianjieqian"), getRuleVal("sslianjiehou")).get(0);
link = getRuleVal("ssljqianzhui").isEmpty() ? (link + getRuleVal("ssljhouzhui")) : ("x:" + getRuleVal("ssljqianzhui")) + link + getRuleVal("ssljhouzhui");
String remark = "";
if (!getRuleVal("ssfubiaotiqian").isEmpty() && !getRuleVal("ssfubiaotihou").isEmpty()) {
try {
remark = subContent(jiequContent, getRuleVal("ssfubiaotiqian"), getRuleVal("ssfubiaotihou")).get(0).replaceAll("\\s+", "").replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "").replaceAll("[(/>)<]", "");
} catch (Exception e) {
SpiderDebug.log(e);
}
}
JSONObject v = new JSONObject();
v.put("vod_id", title + "$$$" + pic + "$$$" + link);
v.put("vod_name", title);
v.put("vod_pic", pic);
v.put("vod_remarks", remark);
videos.put(v);
} catch (Throwable th) {
th.printStackTrace();
break;
}
}
}
result.put("list", videos);
return result.toString();
} catch (
Exception e) {
SpiderDebug.log(e);
}
return "";
}
protected String ext = null;
protected JSONObject rule = null;
protected void fetchRule() {
if (rule == null) {
if (ext != null) {
try {
if (ext.startsWith("http")) {
String json = OkHttpUtil.string(ext, null);
rule = new JSONObject(json);
} else {
rule = new JSONObject(ext);
}
} catch (JSONException e) {
}
}
}
}
protected String fetch(String webUrl) {
SpiderDebug.log(webUrl);
return OkHttpUtil.string(webUrl, getHeaders(webUrl)).replaceAll("\r|\n", "");
}
protected String fetchPost(String webUrl) {
SpiderDebug.log(webUrl);
OKCallBack.OKCallBackString callBack = new OKCallBack.OKCallBackString() {
@Override
protected void onFailure(Call call, Exception e) {
}
@Override
protected void onResponse(String response) {
}
};
OkHttpUtil.post(OkHttpUtil.defaultClient(), webUrl, callBack);
return callBack.getResult().replaceAll("\r|\n", "");
}
private String getRuleVal(String key, String defaultVal) {
String v = rule.optString(key);
if (v.isEmpty() || v.equals(""))
return defaultVal;
return v;
}
private String getRuleVal(String key) {
return getRuleVal(key, "");
}
private ArrayList<String> subContent(String content, String startFlag, String endFlag) {
ArrayList<String> result = new ArrayList<>();
if (startFlag.isEmpty() && endFlag.isEmpty()) {
result.add(content);
return result;
}
try {
Pattern pattern = Pattern.compile(escapeExprSpecialWord(startFlag) + "(.*?)" + escapeExprSpecialWord(endFlag));
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
result.add(matcher.group(1));
}
} catch (Throwable th) {
th.printStackTrace();
}
return result;
}
String escapeExprSpecialWord(String regexStr) {
if (!regexStr.isEmpty()) {
String[] fbsArr = {"\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|"};
for (String key : fbsArr) {
if (regexStr.contains(key)) {
regexStr = regexStr.replace(key, "\\" + key);
}
}
}
return regexStr;
}
//修复软件不支持的格式无法嗅探的问题
@Override
public boolean manualVideoCheck() {
return true;
}
private String[] videoFormatList = new String[]{".m3u8", ".mp4", ".mpeg", ".flv", ".m4a",".mp3",".wma",".wmv"};
@Override
public boolean isVideoFormat(String url) {
url = url.toLowerCase();
if (url.contains("=http") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) {
return false;
}
for (String format : videoFormatList) {
if (url.contains(format)) {
return true;
}
}
return false;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,398 @@
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.net.OkHttp;
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.List;
import java.util.Map;
import java.util.TreeMap;
public class Yj1211 extends Spider {
@Override
public void init(Context context) {
super.init(context);
}
@Override
public String homeContent(boolean filter) {
try {
String srcurl = "http://live.yj1211.work/api/live/getRecommend?page=1&size=20";
String srcOrignstr ="";
for(int i=0 ; i<3 ; i++){
srcOrignstr = OkHttp.string(srcurl, getHeaders());
if(srcOrignstr.length()>0){
break;
}else{
Thread.sleep(1000);
}
}
JSONObject srcori = new JSONObject(srcOrignstr);
JSONArray srcoria = srcori.getJSONArray("data");
JSONObject result = new JSONObject();
JSONArray classes = new JSONArray();
String catestr ="{\"推荐\":\"?\",\"斗鱼\":\"ByPlatform?platform=douyu&\",\"哔哩哔哩\":\"ByPlatform?platform=bilibili&\",\"虎牙\":\"ByPlatform?platform=huya&\",\"网易CC\":\"ByPlatform?platform=cc&\"}";
JSONObject catedef = new JSONObject(catestr);
Iterator it = catedef.keys();
while(it.hasNext()){
JSONObject jsonObject = new JSONObject();
String key =(String) it.next();
jsonObject.put("type_name", key);
jsonObject.put("type_id", catedef.getString(key));
classes.put(jsonObject);
}
result.put("class", classes);
JSONObject filterConfig = new JSONObject();
String geta ="http://live.yj1211.work/api/live/getAllAreas";
String aaid = "";
for(int i=0 ; i<3 ; i++){
aaid = OkHttp.string(geta, getHeaders());
if(aaid.length()>0){
break;
}else{
Thread.sleep(1000);
}
}
JSONObject aido = new JSONObject(aaid);
JSONArray aidoa = aido.getJSONArray("data");
JSONArray extendsAll = new JSONArray();
for (int j=0 ; j< 13;j++){
JSONObject newTypeExtend = new JSONObject();
String typeName = aidoa.getJSONArray(j).getJSONObject(0).getString("typeName");
newTypeExtend.put("key", "typeName" + j);
newTypeExtend.put("name", typeName);
JSONArray newTypeExtendKV = new JSONArray();
int fg = Math.min(aidoa.getJSONArray(j).length(), 20);
JSONObject kv = new JSONObject();
kv.put("n", "全部");
kv.put("v", typeName + "=" + "all");
newTypeExtendKV.put(kv);
for (int k=0 ; k< fg ; k++){
kv = new JSONObject();
String areaName = aidoa.getJSONArray(j).getJSONObject(k).getString("areaName");
kv.put("n", areaName);
kv.put("v", typeName + "=" + areaName);
newTypeExtendKV.put(kv);
}
newTypeExtend.put("value", newTypeExtendKV);
extendsAll.put(newTypeExtend);
}
for (int i = 0 ; i < 5 ; i++){
String typeId = classes.getJSONObject(i).getString("type_id");
filterConfig.put(typeId, extendsAll);
}
JSONArray videos = new JSONArray();
int ch = Math.min(srcoria.length(), 10);
for (int i = 0; i < ch; i++) {
JSONObject srchome = new JSONObject();
String platForm = srcoria.getJSONObject(i).getString("platForm");
String rd = srcoria.getJSONObject(i).getString("roomId");
String id = platForm + "&" + rd;
String name = srcoria.getJSONObject(i).getString("ownerName");
String pic = srcoria.getJSONObject(i).getString("ownerHeadPic");
String mark = srcoria.getJSONObject(i).getString("categoryName");
srchome.put("vod_id", id);
srchome.put("vod_name", name);
srchome.put("vod_pic",pic);
srchome.put("vod_remarks", mark);
videos.put(srchome);
}
if (filter) {
result.put("filters", filterConfig);
}
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 catt="";
switch (tid) {
case "?":
catt = "all";
break;
case "ByPlatform?platform=douyu&":
catt = "douyu";
break;
case "ByPlatform?platform=bilibili&":
catt = "bilibili";
break;
case "ByPlatform?platform=huya&":
catt = "huya";
break;
case "ByPlatform?platform=cc&":
catt = "cc";
break;
}
extend = extend == null ? new HashMap<>() : extend;
String srcurl="";
String[] cate= new String[13];
int pp = 0;
for(int i = 0; i < 13; i++){
cate[i] = extend.containsKey("typeName"+i) ? extend.get("typeName"+i) : ("typeName"+i + "=" + "all");
String[] info = cate[i].split("=");
String area = info[1];
if( !area.contains("all") ){
pp= pp + 1;
}
}
if(pp == 1){
for(int i = 0; i < 13; i++){
String[] info = cate[i].split("=");
String areaType = info[0];
String area = info[1];
if(!area.contains("all")) {
String urlft = "http://live.yj1211.work/api/live/getRecommendByAreaAll?areaType={areaType}&area={area}&page={pg}";
srcurl = urlft.replace("{areaType}", URLEncoder.encode(areaType)).replace("{area}", URLEncoder.encode(area)).replace("{pg}", pg);
break;
}
}
}else if( pp == 0 || pp > 1 ){
String urlft = "http://live.yj1211.work/api/live/getRecommend{tid}page={pg}&size=20";
srcurl = urlft.replace("{tid}", tid).replace("{pg}", pg);
}
String srcOrignstr = "";
for (int i = 0; i < 3; i++) {
srcOrignstr = OkHttp.string(srcurl, getHeaders());
if (srcOrignstr.length() > 0 ) {
break;
} else {
Thread.sleep(1000);
}
}
JSONObject srcori = new JSONObject(srcOrignstr);
JSONArray srcoria = srcori.getJSONArray("data");
JSONObject result = new JSONObject();
JSONArray videos = new JSONArray();
for (int i = 0; i < srcoria.length(); i++) {
JSONObject srchome = new JSONObject();
String platForm = srcoria.getJSONObject(i).getString("platForm");
if(pp == 1 && !catt.equals("all")){
if(!platForm.equals(catt) ){
continue;
}
}
String rd = srcoria.getJSONObject(i).getString("roomId");
String id = platForm + "&" + rd;
String name = srcoria.getJSONObject(i).getString("ownerName");
String pic = srcoria.getJSONObject(i).getString("ownerHeadPic");
String mark = srcoria.getJSONObject(i).getString("categoryName");
srchome.put("vod_id", id);
srchome.put("vod_name", name);
srchome.put("vod_pic", pic);
srchome.put("vod_remarks", mark);
videos.put(srchome);
}
if(videos.length() == 0 ) {
JSONObject srchome = new JSONObject();
srchome.put("vod_id", 111);
srchome.put("vod_name", "此页无符合");
srchome.put("vod_pic","");
srchome.put("vod_remarks", "nothing");
videos.put(srchome);
}
if (pp ==1 ) {
result.put("pagecount", 50);
result.put("limit",1 );
} else{
result.put("pagecount", Integer.MAX_VALUE);
result.put("limit",90 );
}
result.put("list", videos);
result.put("page", pg);
result.put("total", Integer.MAX_VALUE);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
private HashMap<String, String> getHeaders() {
HashMap<String, String> headers = new HashMap<>();
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");
return headers;
}
@Override
public String detailContent(List<String> ids) {
try {
String id = ids.get(0);
String[] info = id.split("&");
String platform = info[0];
String roomId = info[1];
String srcurl = "http://live.yj1211.work/api/live/getRoomInfo?platform="+platform+"&roomId="+roomId;
String srcplayurl = "http://live.yj1211.work/api/live/getRealUrl?platform="+platform+"&roomId="+roomId;
String srcdtlstr = OkHttp.string(srcurl, getHeaders());
String srcdtlplay = OkHttp.string(srcplayurl, getHeaders());
JSONObject srcdtl = new JSONObject(srcdtlstr);
JSONObject srcdtlo = srcdtl.getJSONObject("data");
JSONObject srcdtplay = new JSONObject(srcdtlplay);
JSONObject srcdtplayo = srcdtplay.getJSONObject("data");
String title = srcdtlo.getString("roomName");
String pic = srcdtlo.getString("roomPic");
String director = srcdtlo.getString("ownerName") + " RoomID:"+ srcdtlo.getString("roomId");
String content = srcdtlo.getString("categoryName");
String actor = "观看人数:" + srcdtlo.getString("online");
String area =srcdtlo.getString("platForm");
String typechk =srcdtlo.optString("isLive");
String type = typechk.equals("") ? "录播" : "正在直播中" ;
JSONObject result = new JSONObject();
JSONObject vodList = new JSONObject();
vodList.put("vod_id", ids.get(0));
vodList.put("vod_pic",pic);
vodList.put("vod_name", title);
vodList.put("vod_area",area );
vodList.put("type_name", type);
vodList.put("vod_actor", actor);
vodList.put("vod_director", director);
vodList.put("vod_content", content);
String playList = "";
String pl="";
List<String> vodItems = new ArrayList<>();
for(int i=0; i<5 ; i++){
String[] qq = new String[] {"OD", "HD", "SD", "LD", "FD"};
String qa = srcdtplayo.optString(qq[i]);
if (qa.isEmpty()) {
continue;
}
switch (qq[i]) {
case "OD":
pl = "原画" + "$" + qa;
break;
case "HD":
pl = "超清" + "$" + qa;
break;
case "SD":
pl = "高清" + "$" + qa;
break;
case "LD":
pl = "清晣" + "$" + qa;
break;
case "FD":
pl = "流畅" + "$" + qa;
break;
}
vodItems.add(pl);
}
if (vodItems.size() > 0)
playList = TextUtils.join("#", vodItems);
if (playList.length() == 0)
playList = "NoStream$nolink";
Map<String, String> vod_play = new TreeMap<>();
vod_play.put("YJ1211", playList);
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 {
JSONObject result = new JSONObject();
result.put("header", getHeaders());
result.put("parse", 1);
result.put("playUrl", "");
result.put("url", id);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
@Override
public String searchContent(String key, boolean quick) {
try {
String url = "http://live.yj1211.work/api/live/search?platform=all&keyWords=" + URLEncoder.encode(key) + "&isLive=0";
String content ="";
for(int i=0 ; i<3 ; i++){
content =OkHttp.string(url, getHeaders());
if(content.length() >0){
break;
}else{
Thread.sleep(1000);
}
}
JSONObject searchResult = new JSONObject(content);
JSONArray sra = searchResult.getJSONArray("data");
JSONObject result = new JSONObject();
JSONArray videos = new JSONArray();
if (sra.length() > 0) {
int ch = Math.min(sra.length(), 20);
for (int i = 0; i < ch; i++) {
JSONObject srat = new JSONObject();
String platForm = sra.getJSONObject(i).getString("platform");
String rd = sra.getJSONObject(i).getString("roomId");
String id = platForm + "&" + rd;
String name = sra.getJSONObject(i).getString("nickName");
String pic = sra.getJSONObject(i).getString("headPic");
String mark ="";
if(!sra.getJSONObject(i).isNull("cateName")){
mark = sra.getJSONObject(i).getString("cateName");
}
srat.put("vod_remarks", mark);
srat.put("vod_id", id);
srat.put("vod_name", name);
srat.put("vod_pic", pic);
videos.put(srat);
}
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
}

View File

@ -17,7 +17,9 @@ import org.json.JSONException;
import org.json.JSONObject;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
@ -25,7 +27,8 @@ import java.util.Locale;
public class Misc {
public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36";
public static Charset CharsetUTF8 = Charset.forName("UTF-8");
public static Charset CharsetIOS8859 = Charset.forName("iso-8859-1");
public static boolean isVip(String url) {
List<String> hosts = Arrays.asList("iqiyi.com", "v.qq.com", "youku.com", "le.com", "tudou.com", "mgtv.com", "sohu.com", "acfun.cn", "bilibili.com", "baofeng.com", "pptv.com");
for (String host : hosts) if (url.contains(host)) return true;
@ -138,6 +141,26 @@ public class Misc {
return "";
}
}
public static String NewMD5(String src, Charset charset) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(src.getBytes(charset));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
sb.append(0);
}
sb.append(hv);
}
return sb.toString().toLowerCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
public static DisplayMetrics getDisplayMetrics() {
return Init.context().getResources().getDisplayMetrics();

View File

@ -0,0 +1,22 @@
package com.github.catvod.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
public class gZip {
public static String KS(byte[] bArr) throws IOException {
GZIPInputStream gZIPInputStream = new GZIPInputStream(new ByteArrayInputStream(bArr));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bArr2 = new byte[1024];
while (true) {
int read = gZIPInputStream.read(bArr2);
if (read == -1) {
return byteArrayOutputStream.toString("UTF-8");
}
byteArrayOutputStream.write(bArr2, 0, read);
}
}
}

View File

@ -0,0 +1,60 @@
package com.github.catvod.utils.okhttp;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Response;
public abstract class OKCallBack<T> {
private T result = null;
public T getResult() {
return result;
}
protected void setResult(T val) {
result = val;
}
protected void onError(final Call call, final Exception e) {
onFailure(call, e);
}
protected void onSuccess(Call call, Response response) {
T obj = onParseResponse(call, response);
setResult(obj);
onResponse(obj);
}
protected abstract T onParseResponse(Call call, Response response);
protected abstract void onFailure(Call call, Exception e);
protected abstract void onResponse(T response);
public static abstract class OKCallBackDefault extends OKCallBack<Response> {
@Override
public Response onParseResponse(Call call, Response response) {
return response;
}
}
public static abstract class OKCallBackString extends OKCallBack<String> {
@Override
public void onError(Call call, Exception e) {
setResult("");
super.onError(call, e);
}
@Override
public String onParseResponse(Call call, Response response) {
try {
return response.body().string();
} catch (IOException e) {
return "";
}
}
}
}

View File

@ -0,0 +1,132 @@
package com.github.catvod.utils.okhttp;
import android.text.TextUtils;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.Response;
class OKRequest {
private final String mMethodType;
private String mUrl;
private Object mTag = null;
private final Map<String, String> mParamsMap;
private final String mJsonStr;
private final Map<String, String> mHeaderMap;
private final OKCallBack mCallBack;
private okhttp3.Request mOkHttpRequest;
private okhttp3.Request.Builder mRequestBuilder;
OKRequest(String methodType, String url, Map<String, String> paramsMap, Map<String, String> headerMap, OKCallBack callBack) {
this(methodType, url, null, paramsMap, headerMap, callBack);
}
OKRequest(String methodType, String url, String jsonStr, Map<String, String> headerMap, OKCallBack callBack) {
this(methodType, url, jsonStr, null, headerMap, callBack);
}
private OKRequest(String methodType, String url, String jsonStr, Map<String, String> paramsMap, Map<String, String> headerMap, OKCallBack callBack) {
mMethodType = methodType;
mUrl = url;
mJsonStr = jsonStr;
mParamsMap = paramsMap;
mHeaderMap = headerMap;
mCallBack = callBack;
getInstance();
}
public void setTag(Object tag) {
mTag = tag;
}
private void getInstance() {
mRequestBuilder = new okhttp3.Request.Builder();
switch (mMethodType) {
case OkHttpUtil.METHOD_GET:
setGetParams();
break;
case OkHttpUtil.METHOD_POST:
mRequestBuilder.post(getRequestBody());
break;
}
mRequestBuilder.url(mUrl);
if (mTag != null)
mRequestBuilder.tag(mTag);
if (mHeaderMap != null) {
setHeader();
}
mOkHttpRequest = mRequestBuilder.build();
}
private RequestBody getRequestBody() {
if (!TextUtils.isEmpty(mJsonStr)) {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
return RequestBody.create(JSON, mJsonStr);
}
FormBody.Builder formBody = new FormBody.Builder();
if (mParamsMap != null) {
for (String key : mParamsMap.keySet()) {
formBody.add(key, mParamsMap.get(key));
}
}
return formBody.build();
}
private void setGetParams() {
if (mParamsMap != null) {
mUrl = mUrl + "?";
for (String key : mParamsMap.keySet()) {
mUrl = mUrl + key + "=" + mParamsMap.get(key) + "&";
}
mUrl = mUrl.substring(0, mUrl.length() - 1);
}
}
private void setHeader() {
if (mHeaderMap != null) {
for (String key : mHeaderMap.keySet()) {
mRequestBuilder.addHeader(key, mHeaderMap.get(key));
}
}
}
void execute(OkHttpClient client) {
Call call = client.newCall(mOkHttpRequest);
try {
Response response = call.execute();
if (mCallBack != null) {
mCallBack.onSuccess(call, response);
}
} catch (IOException e) {
if (mCallBack != null) {
mCallBack.onError(call, e);
}
}
}
void call(OkHttpClient client) {
client.newCall(mOkHttpRequest).enqueue(new Callback() {
@Override
public void onFailure(final Call call, final IOException e) {
if (mCallBack != null) {
mCallBack.onError(call, e);
}
}
@Override
public void onResponse(final Call call, final Response response) throws IOException {
if (mCallBack != null) {
mCallBack.onSuccess(call, response);
}
}
});
}
}

View File

@ -0,0 +1,200 @@
package com.github.catvod.utils.okhttp;
import com.github.catvod.crawler.SpiderDebug;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Response;
public class OkHttpUtil {
public static final String METHOD_GET = "GET";
public static final String METHOD_POST = "POST";
private static final int DEFAULT_TIMEOUT = 15;
private static final Object lockO = new Object();
private static OkHttpClient defaultClient = null;
/**
* 不自动重定向
*/
private static OkHttpClient noRedirectClient = null;
public static OkHttpClient defaultClient() {
synchronized (lockO) {
if (defaultClient == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.sslSocketFactory(new SSLSocketFactoryCompat(SSLSocketFactoryCompat.trustAllCert), SSLSocketFactoryCompat.trustAllCert);
defaultClient = builder.build();
}
return defaultClient;
}
}
public static OkHttpClient noRedirectClient() {
synchronized (lockO) {
if (noRedirectClient == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.followRedirects(false)
.followSslRedirects(false)
.retryOnConnectionFailure(true)
.sslSocketFactory(new SSLSocketFactoryCompat(SSLSocketFactoryCompat.trustAllCert), SSLSocketFactoryCompat.trustAllCert);
noRedirectClient = builder.build();
}
return noRedirectClient;
}
}
public static String string(OkHttpClient client, String url, String tag, Map<String, String> paramsMap, Map<String, String> headerMap, Map<String, List<String>> respHeaderMap) {
OKCallBack<String> stringCallback = new OKCallBack<String>() {
@Override
public String onParseResponse(Call call, Response response) {
try {
if (respHeaderMap != null) {
respHeaderMap.clear();
respHeaderMap.putAll(response.headers().toMultimap());
}
return response.body().string();
} catch (IOException e) {
return "";
}
}
@Override
public void onFailure(Call call, Exception e) {
setResult("");
SpiderDebug.log(e);
}
@Override
public void onResponse(String response) {
}
};
OKRequest req = new OKRequest(METHOD_GET, url, paramsMap, headerMap, stringCallback);
req.setTag(tag);
req.execute(client);
return stringCallback.getResult();
}
public static String stringNoRedirect(String url, Map<String, String> headerMap, Map<String, List<String>> respHeaderMap) {
return string(noRedirectClient(), url, null, null, headerMap, respHeaderMap);
}
public static String string(String url, Map<String, String> headerMap, Map<String, List<String>> respHeaderMap) {
return string(defaultClient(), url, null, null, headerMap, respHeaderMap);
}
public static String string(String url, Map<String, String> headerMap) {
return string(defaultClient(), url, null, null, headerMap, null);
}
public static String string(String url, String tag, Map<String, String> headerMap) {
return string(defaultClient(), url, tag, null, headerMap, null);
}
public static void get(OkHttpClient client, String url, OKCallBack callBack) {
get(client, url, null, null, callBack);
}
public static void get(OkHttpClient client, String url, Map<String, String> paramsMap, OKCallBack callBack) {
get(client, url, paramsMap, null, callBack);
}
public static void get(OkHttpClient client, String url, Map<String, String> paramsMap, Map<String, String> headerMap, OKCallBack callBack) {
new OKRequest(METHOD_GET, url, paramsMap, headerMap, callBack).execute(client);
}
public static void post(OkHttpClient client, String url, OKCallBack callBack) {
post(client, url, null, callBack);
}
public static void post(OkHttpClient client, String url, Map<String, String> paramsMap, OKCallBack callBack) {
post(client, url, paramsMap, null, callBack);
}
public static void post(OkHttpClient client, String url, Map<String, String> paramsMap, Map<String, String> headerMap, OKCallBack callBack) {
new OKRequest(METHOD_POST, url, paramsMap, headerMap, callBack).execute(client);
}
public static void post(OkHttpClient client, String url, String tag, Map<String, String> paramsMap, Map<String, String> headerMap, OKCallBack callBack) {
OKRequest req = new OKRequest(METHOD_POST, url, paramsMap, headerMap, callBack);
req.setTag(tag);
req.execute(client);
}
public static void postJson(OkHttpClient client, String url, String jsonStr, OKCallBack callBack) {
postJson(client, url, jsonStr, null, callBack);
}
public static void postJson(OkHttpClient client, String url, String jsonStr, Map<String, String> headerMap, OKCallBack callBack) {
new OKRequest(METHOD_POST, url, jsonStr, headerMap, callBack).execute(client);
}
/**
* 根据Tag取消请求
*/
public static void cancel(OkHttpClient client, Object tag) {
if (client == null || tag == null) return;
for (Call call : client.dispatcher().queuedCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
for (Call call : client.dispatcher().runningCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
}
public static void cancel(Object tag) {
cancel(defaultClient(), tag);
}
public static void cancelAll() {
cancelAll(defaultClient());
}
/**
* 取消所有请求请求
*/
public static void cancelAll(OkHttpClient client) {
if (client == null) return;
for (Call call : client.dispatcher().queuedCalls()) {
call.cancel();
}
for (Call call : client.dispatcher().runningCalls()) {
call.cancel();
}
}
/**
* 获取重定向地址
*
* @param headers
* @return
*/
public static String getRedirectLocation(Map<String, List<String>> headers) {
if (headers == null)
return null;
if (headers.containsKey("location"))
return headers.get("location").get(0);
if (headers.containsKey("Location"))
return headers.get("Location").get(0);
return null;
}
}

View File

@ -0,0 +1,167 @@
package com.github.catvod.utils.okhttp;
import android.os.Build;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.GeneralSecurityException;
import java.security.cert.CertificateException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
public class SSLSocketFactoryCompat extends SSLSocketFactory {
private final SSLSocketFactory defaultFactory;
// Android 5.0+ (API level21) provides reasonable default settings
// but it still allows SSLv3
// https://developer.android.com/about/versions/android-5.0-changes.html#ssl
static String[] protocols = null;
static String[] cipherSuites = null;
static {
try {
SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket();
if (socket != null) {
/* set reasonable protocol versions */
// - enable all supported protocols (enables TLSv1.1 and TLSv1.2 on Android <5.0)
// - remove all SSL versions (especially SSLv3) because they're insecure now
List<String> protocols = new LinkedList<>();
for (String protocol : socket.getSupportedProtocols())
if (!protocol.toUpperCase().contains("SSL"))
protocols.add(protocol);
SSLSocketFactoryCompat.protocols = protocols.toArray(new String[protocols.size()]);
/* set up reasonable cipher suites */
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// choose known secure cipher suites
List<String> allowedCiphers = Arrays.asList(
// TLS 1.2
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
"TLS_ECHDE_RSA_WITH_AES_128_GCM_SHA256",
// maximum interoperability
"TLS_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA",
// additionally
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA");
List<String> availableCiphers = Arrays.asList(socket.getSupportedCipherSuites());
// take all allowed ciphers that are available and put them into preferredCiphers
HashSet<String> preferredCiphers = new HashSet<>(allowedCiphers);
preferredCiphers.retainAll(availableCiphers);
/* For maximum security, preferredCiphers should *replace* enabled ciphers (thus disabling
* ciphers which are enabled by default, but have become unsecure), but I guess for
* the security level of DAVdroid and maximum compatibility, disabling of insecure
* ciphers should be a server-side task */
// add preferred ciphers to enabled ciphers
HashSet<String> enabledCiphers = preferredCiphers;
enabledCiphers.addAll(new HashSet<>(Arrays.asList(socket.getEnabledCipherSuites())));
SSLSocketFactoryCompat.cipherSuites = enabledCiphers.toArray(new String[enabledCiphers.size()]);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public SSLSocketFactoryCompat(X509TrustManager tm) {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, (tm != null) ? new X509TrustManager[]{tm} : null, null);
defaultFactory = sslContext.getSocketFactory();
} catch (GeneralSecurityException e) {
throw new AssertionError(); // The system has no TLS. Just give up.
}
}
private void upgradeTLS(SSLSocket ssl) {
// Android 5.0+ (API level21) provides reasonable default settings
// but it still allows SSLv3
// https://developer.android.com/about/versions/android-5.0-changes.html#ssl
if (protocols != null) {
ssl.setEnabledProtocols(protocols);
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && cipherSuites != null) {
ssl.setEnabledCipherSuites(cipherSuites);
}
}
@Override
public String[] getDefaultCipherSuites() {
return cipherSuites;
}
@Override
public String[] getSupportedCipherSuites() {
return cipherSuites;
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
Socket ssl = defaultFactory.createSocket(s, host, port, autoClose);
if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket) ssl);
return ssl;
}
@Override
public Socket createSocket(String host, int port) throws IOException {
Socket ssl = defaultFactory.createSocket(host, port);
if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket) ssl);
return ssl;
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
Socket ssl = defaultFactory.createSocket(host, port, localHost, localPort);
if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket) ssl);
return ssl;
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
Socket ssl = defaultFactory.createSocket(host, port);
if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket) ssl);
return ssl;
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
Socket ssl = defaultFactory.createSocket(address, port, localAddress, localPort);
if (ssl instanceof SSLSocket)
upgradeTLS((SSLSocket) ssl);
return ssl;
}
//定义一个信任所有证书的TrustManager
public static final X509TrustManager trustAllCert = new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
};
}

Binary file not shown.

View File

@ -1 +1 @@
0a5952d9789ee1a8398598bea20ce488
f97e3722085c65ff04e5fe63429a7676