From 20248d874a0a8bd7927988c4eb092c1c4d0598ae Mon Sep 17 00:00:00 2001 From: xxx Date: Tue, 31 Jan 2023 16:21:04 +0800 Subject: [PATCH] as --- .../java/com/github/catvod/spider/Bili01.java | 334 ++++++++++++++++++ .../java/com/github/catvod/spider/Bili11.java | 144 ++++++++ 2 files changed, 478 insertions(+) create mode 100644 app/src/main/java/com/github/catvod/spider/Bili01.java create mode 100644 app/src/main/java/com/github/catvod/spider/Bili11.java diff --git a/app/src/main/java/com/github/catvod/spider/Bili01.java b/app/src/main/java/com/github/catvod/spider/Bili01.java new file mode 100644 index 00000000..1b8a25aa --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Bili01.java @@ -0,0 +1,334 @@ +package com.github.catvod.spider; + +import android.content.Context; +import android.text.TextUtils; + +import com.github.catvod.bean.Result; +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 Bili01 extends Spider { + private String extend; + private static final String url = "https://www.bilibili.com"; + protected JSONObject ext = null; + private HashMap 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 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 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 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 list) { + + String[] ids = str2.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 = null; + try { + resp = new JSONObject(OkHttp.string(url, header)); + + url = resp.getJSONObject("data").getJSONArray("durl").getJSONObject(0).getString("url"); + } catch (JSONException e) { + throw new RuntimeException(e); + } + return Result.get().url(url).header(header).string(); +// 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 ""; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/spider/Bili11.java b/app/src/main/java/com/github/catvod/spider/Bili11.java new file mode 100644 index 00000000..a1ffb61c --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/Bili11.java @@ -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 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 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 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 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 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 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(); + } +}