This commit is contained in:
xxx 2023-01-31 15:43:10 +08:00
parent d065bb0093
commit b36113c116
2 changed files with 319 additions and 144 deletions

View File

@ -1,144 +0,0 @@
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,319 @@
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 com.github.catvod.utils.Misc;
import com.github.catvod.utils.okhttp.OkHttpUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class Bili12 extends Spider {
private String extend;
private static final String url = "https://www.bilibili.com";
protected JSONObject ext = null;
private HashMap<String, String> header;
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);
SpiderDebug.log("bili>>fetchExt>>result:" + result);
if (!TextUtils.isEmpty(result)) extend = result;
}
private void fetchRule() {
try {
if (header.containsKey("cookie") && header.get("cookie").length() > 0) return;
SpiderDebug.log("bili>>fetchRule>>extend:" + extend);
if (extend.startsWith("http")) fetchExt();
ext = new JSONObject(extend);
setHeader();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void init(Context context, String extend) {
this.extend = extend;
this.header = new HashMap<>();
super.init(context, extend);
try {
fetchRule();
} catch (Exception e) {
}
}
@Override
public String homeContent(boolean filter) {
JSONObject results = new JSONObject();
try {
results.put("class", ext.getJSONArray("classes"));
if (filter) {
results.put("filters", ext.getJSONObject("filter"));
}
} catch (JSONException e) {
SpiderDebug.log(e);
}
return results.toString();
}
@Override
public String homeVideoContent() {
fetchRule();
return categoryContent("自驾游", "1", true, new HashMap<>());
// try {
// JSONArray videos = new JSONArray();
// try {
// String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=窗 白噪音";
// String content = OkHttpUtil.string(url, header);
// JSONObject data = new JSONObject(content).getJSONObject("data");
// JSONArray RArray = data.getJSONArray("result");
// for (int i = 0; i < RArray.length(); i++) {
// JSONObject info = RArray.getJSONObject(i);
// JSONObject result = new JSONObject();
// String pic = info.getString("pic");
// if (pic.startsWith("//")) {
// pic = "https:" + pic;
// }
// result.put("vod_id", info.getString("bvid"));
// String title = info.getString("title");
// Document KS = Jsoup.parse(title);
// String name = KS.text();
// result.put("vod_name", name);
// result.put("vod_pic", pic);
// String duration = info.getString("duration");
// String words = duration.split(":")[0];
// String remark = words + "分钟";
// result.put("vod_remarks", remark);
// videos.put(result);
// }
// } catch (Exception e) {
//
// }
// JSONObject result = new JSONObject();
// result.put("list", videos);
// return result.toString();
// } catch (Throwable th) {
//
// }
// return "";
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
try {
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=";
if (extend != null && extend.size() > 0 && extend.containsKey("tid") && extend.get("tid").length() > 0) {
url += extend.get("tid");
} else {
url += tid;
}
if (extend != null && extend.size() > 0) {
for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
String key = it.next();
String value = extend.get(key);
if (value.length() > 0) {
url += "&" + key + "=" + URLEncoder.encode(value);
}
}
}
url += "&page=" + pg;
SpiderDebug.log("bili>>categoryContent:" + url);
SpiderDebug.log("bili>>categoryContent>>header:" + header);
String content = OkHttpUtil.string(url, header);
SpiderDebug.log("bili>>categoryContent>>content:" + new JSONObject(content));
SpiderDebug.log("bili>>categoryContent>>header:" + header);
JSONObject data = new JSONObject(content).getJSONObject("data");
// JSONObject resp = new JSONObject(OkHttp.string(url, null));
// JSONArray RSArray = resp.getJSONObject("data").getJSONArray("result");
JSONArray list = new JSONArray();
JSONArray RSArray = data.getJSONArray("result");
for (int i = 0; i < RSArray.length(); i++) {
JSONObject info = RSArray.getJSONObject(i);
JSONObject result = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
result.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document doc = Jsoup.parse(title);
String name = doc.text();
result.put("vod_name", name);
result.put("vod_pic", pic);
String duration = info.getString("duration");
String Split = duration.split(":")[0];
String remark = Split + "分钟";
result.put("vod_remarks", remark);
list.put(result);
}
JSONObject result = new JSONObject();
int limit = 20;
int page = Integer.parseInt(pg);
result.put("page", page);
int pageCount = list.length() == limit ? page + 1 : page;
result.put("pagecount", pageCount);
result.put("limit", limit);
result.put("total", Integer.MAX_VALUE);
result.put("list", list);
return result.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String detailContent(List<String> ids) {
int i = 0;
try {
String str = ids.get(0);
String sb2 = "https://api.bilibili.com/x/web-interface/archive/stat?bvid=" + str;
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
JSONObject jSONObject2 = jSONObject.getJSONObject("data");
long j = jSONObject2.getLong("aid");
String sb4 = j + "";
String sb6 = "https://api.bilibili.com/x/web-interface/view?aid=" + sb4;
JSONObject jSONObject3 = new JSONObject(OkHttpUtil.string(sb6, null));
JSONObject jSONObject4 = jSONObject3.getJSONObject("data");
JSONObject v = new JSONObject();
v.put("vod_id", str);
String string = jSONObject4.getString("title");
v.put("vod_name", string);
String string2 = jSONObject4.getString("pic");
v.put("vod_pic", string2);
String string3 = jSONObject4.getString("tname");
v.put("type_name", string3);
v.put("vod_year", "");
v.put("vod_area", "");
String sb7 = jSONObject4.getLong("duration") / 60 + "分钟";
v.put("vod_remarks", sb7);
v.put("vod_actor", "");
v.put("vod_director", "");
String string4 = jSONObject4.getString("desc");
v.put("vod_content", string4);
v.put("vod_play_from", "B站");
ArrayList arrayList = new ArrayList();
JSONArray jSONArray = jSONObject4.getJSONArray("pages");
while (true) {
int length = jSONArray.length();
if (i < length) {
JSONObject jSONObject6 = jSONArray.getJSONObject(i);
String string5 = jSONObject6.getString("part");
String replace = string5.replace("$", "_").replace("#", "_");
StringBuilder sb8 = new StringBuilder();
sb8.append(replace);
sb8.append("$");
sb8.append(sb4);
sb8.append("+ ");
long j2 = jSONObject6.getLong("cid");
sb8.append(j2);
String sb9 = sb8.toString();
arrayList.add(sb9);
i++;
} else {
v.put("vod_play_url", TextUtils.join("#", arrayList));
JSONArray jSONArray2 = new JSONArray();
jSONArray2.put(v);
JSONObject jSONObject7 = new JSONObject();
jSONObject7.put("list", jSONArray2);
return jSONObject7.toString();
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String playerContent(String str, String str2, List<String> list) {
try {
String[] split = str2.split("\\+");
String str3 = split[0];
String str4 = split[1];
String sb2 = "https://api.bilibili.com/x/player/playurl?avid=" + str3 + "&cid= " + str4 + "&qn=120&fourk=1";
JSONObject jSONObject = new JSONObject(OkHttpUtil.string(sb2, null));
JSONObject jSONObject2 = new JSONObject();
jSONObject2.put("parse", "0");
jSONObject2.put("playUrl", "");
JSONObject jSONObject3 = jSONObject.getJSONObject("data");
JSONObject jSONObject4 = jSONObject3.getJSONArray("durl").getJSONObject(0);
String string = jSONObject4.getString("url");
jSONObject2.put("url", string);
jSONObject2.put("header", "{\"Referer\":\"https://www.bilibili.com\",\"User-Agent\":\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36\"}");
jSONObject2.put("contentType", "video/x-flv");
return jSONObject2.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String searchContent(String key, boolean quick) {
try {
JSONObject result = new JSONObject();
String url = "https://api.bilibili.com/x/web-interface/search/type?search_type=video&keyword=" + URLEncoder.encode(key);
String content = OkHttpUtil.string(url, null);
JSONObject data = new JSONObject(content).getJSONObject("data");
JSONArray videos = new JSONArray();
JSONArray RSArray = data.getJSONArray("result");
for (int i = 0; i < RSArray.length(); i++) {
JSONObject info = RSArray.getJSONObject(i);
JSONObject v = new JSONObject();
String pic = info.getString("pic");
if (pic.startsWith("//")) {
pic = "https:" + pic;
}
v.put("vod_id", info.getString("bvid"));
String title = info.getString("title");
Document doc = Jsoup.parse(title);
String name = doc.text();
v.put("vod_name", name);
v.put("vod_pic", pic);
String duration = info.getString("duration");
String Split = duration.split(":")[0];
String remark = Split + "分钟";
v.put("vod_remarks", remark);
videos.put(v);
}
result.put("list", videos);
return result.toString();
} catch (Exception e) {
SpiderDebug.log(e);
}
return "";
}
}