This commit is contained in:
lushunming 2025-04-14 11:22:50 +08:00
parent 440d5a8911
commit 59f4e60efd
17 changed files with 12327 additions and 7 deletions

View File

@ -0,0 +1,4 @@
kotlin version: 2.0.10
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
1. Kotlin compile daemon is ready

View File

@ -0,0 +1,4 @@
kotlin version: 2.0.10
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
1. Kotlin compile daemon is ready

View File

@ -0,0 +1,4 @@
kotlin version: 2.0.10
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
1. Kotlin compile daemon is ready

View File

@ -0,0 +1,4 @@
kotlin version: 2.0.10
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
1. Kotlin compile daemon is ready

View File

@ -56,6 +56,10 @@ public class TianyiApi {
tianYiHandler.setCookie(obj); tianYiHandler.setCookie(obj);
} }
} }
if (cookieJar.getCookieStore().size() == 0) {
SpiderDebug.log("CookieJar为空");
tianYiHandler.startScan();
}
getUserSizeInfo(); getUserSizeInfo();
this.sessionKey = getUserBriefInfo(); this.sessionKey = getUserBriefInfo();
} }

View File

@ -0,0 +1,150 @@
package com.github.catvod.spider;
import android.content.Context;
import com.github.catvod.bean.Class;
import com.github.catvod.bean.Result;
import com.github.catvod.bean.Vod;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Json;
import com.github.catvod.utils.Util;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BiXin extends Cloud {
private static final String siteUrl = "https://www.bixbiy.com/";
private final String hostUrl = siteUrl;
private Map<String, String> getHeader() {
Map<String, String> header = new HashMap<>();
header.put("User-Agent", Util.CHROME);
return header;
}
private Map<String, String> getHeaderWithCookie() {
Map<String, String> header = new HashMap<>();
header.put("User-Agent", Util.CHROME);
header.put("cookie", "esc_search_captcha=1; result=43");
return header;
}
@Override
public void init(Context context, String extend) throws Exception {
super.init(context, extend);
}
@Override
public String homeContent(boolean filter) {
List<Class> classes = new ArrayList<>();
String temp = siteUrl + "api/discussions?include=user%2ClastPostedUser%2Ctags%2Ctags.parent%2CfirstPost&sort&page%5Boffset%5D=0";
String resultStr = OkHttp.string(temp, getHeader());
classes.add(new Class("mv", "影视"));
return Result.string(classes, parseVodListFromDoc(resultStr));
}
private List<Vod> parseVodListFromDoc(String resultStr) {
JsonObject json = Json.safeObject(resultStr);
JsonArray arrays = json.get("data").getAsJsonArray();
List<Vod> list = new ArrayList<>();
for (JsonElement array : arrays) {
JsonObject data = array.getAsJsonObject();
String vodId = data.get("id").getAsString();
String vodPic = "";
JsonObject attributes = data.get("attributes").getAsJsonObject();
String title = attributes.get("title").getAsString();
String vodRemarks = "";
String vodName = "";
if (title.contains("")) {
vodName = title.split("")[0];
vodRemarks = title.split("")[1];
} else {
vodName = title;
vodRemarks = title;
}
list.add(new Vod(vodId, vodName, vodPic, vodRemarks));
}
return list;
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap<String, String> extend) {
int pageSize = 20;
String temp = siteUrl +//+ "api/discussions?include=user%2ClastPostedUser%2Ctags%2Ctags.parent%2CfirstPost&filter%5Btag%5D=" + tid + "&sort&page%5Boffset%5D=" + (Integer.parseInt(pg) - 1) * pageSize;
"api/discussions?include=user%2ClastPostedUser%2Ctags%2Ctags.parent%2CfirstPost%2Cuser.userBadges%2Cuser.userBadges.badge&filter%5Btag%5D=" + tid + "&sort&page%5Boffset%5D=" + (Integer.parseInt(pg) - 1) * pageSize;
String resultStr = OkHttp.string(temp, getHeader());
List<Vod> list = parseVodListFromDoc(resultStr);
int total = (Integer.parseInt(pg) + 1) * 20;
return Result.get().vod(list).page(Integer.parseInt(pg), Integer.parseInt(pg) + 1, pageSize, total).string();
}
@Override
public String detailContent(List<String> ids) throws Exception {
String vodId = ids.get(0);
Document doc = Jsoup.parse(OkHttp.string(siteUrl + "d/" + vodId, getHeader()));
Vod item = new Vod();
item.setVodId(vodId);
item.setVodName(doc.selectFirst(" div.container > h1").text());
// item.setVodPic(doc.selectFirst(" div.Post-body > p > img").attr("src"));
List<String> shareLinks = new ArrayList<>();
for (Element element : doc.select("div.Post-body > p > a")) {
if (element.attr("href").contains(YiDongYun.URL_START)) {
shareLinks.add(element.attr("href").trim());
}
}
item.setVodPlayUrl(super.detailContentVodPlayUrl(shareLinks));
item.setVodPlayFrom(super.detailContentVodPlayFrom(shareLinks));
return Result.string(item);
}
private String getStrByRegex(Pattern pattern, String str) {
Matcher matcher = pattern.matcher(str);
if (matcher.find()) return matcher.group(1).trim();
return "";
}
@Override
public String searchContent(String key, boolean quick) throws Exception {
return searchContent(key, "1");
}
@Override
public String searchContent(String key, boolean quick, String pg) throws Exception {
return searchContent(key, pg);
}
private String searchContent(String key, String pg) {
int pageSize = 20;
String temp = siteUrl + "api/discussions?include=user%2ClastPostedUser%2CmostRelevantPost%2CmostRelevantPost.user%2Ctags%2Ctags.parent%2CfirstPost&filter%5Bq%5D=" + URLEncoder.encode(key) + "&sort&page%5Boffset%5D=" + (Integer.parseInt(pg) - 1) * pageSize;
String resultStr = OkHttp.string(temp, getHeader());
return Result.string(parseVodListFromDoc(resultStr));
}
}

View File

@ -34,7 +34,7 @@ public class Introduce extends Spider {
String name2 = "本接口不收费,请不要付费,谢谢!"; String name2 = "本接口不收费,请不要付费,谢谢!";
list.add(new Vod("https://androidcatvodspider.netlify.app/wechat.png", name2, pic2)); list.add(new Vod("https://androidcatvodspider.netlify.app/wechat.png", name2, pic2));
String pic3 = "https://androidcatvodspider.netlify.app/wechat.png"; String pic3 = "https://androidcatvodspider.netlify.app/wechat.png";
String name3 = "2025-04-11 10:53"; String name3 = "2025-04-14 11:00";
list.add(new Vod("https://androidcatvodspider.netlify.app/wechat.png", name3, pic3)); list.add(new Vod("https://androidcatvodspider.netlify.app/wechat.png", name3, pic3));
return Result.string(classes, list); return Result.string(classes, list);
} }

View File

@ -0,0 +1,99 @@
import android.app.Application;
import com.github.catvod.server.Server;
import com.github.catvod.spider.BiXin;
import com.github.catvod.spider.Init;
import com.github.catvod.spider.PanTa;
import com.github.catvod.utils.Json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.Arrays;
@RunWith(RobolectricTestRunner.class)
public class BiXinTest {
private Application mockContext;
private BiXin spider;
@org.junit.Before
public void setUp() throws Exception {
mockContext = RuntimeEnvironment.application;
Init.init(mockContext);
spider = new BiXin();
//Server.get().start();
spider.init(mockContext,"");
// spider.init(mockContext, "{\"cookie\":\"b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; _UP_A4A_11_=wb9661c6dfb642f88f73d8e0c7edd398; b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; ctoken=wla6p3EUOLyn1FSB8IKp1SEW; grey-id=5583e32b-39df-4bf0-f39f-1adf83f604a2; grey-id.sig=p8ReBIMG2BeZu1sYvsuOAZxYbx-MVrsfKEiCv87MsTM; isQuark=true; isQuark.sig=hUgqObykqFom5Y09bll94T1sS9abT1X-4Df_lzgl8nM; _UP_F7E_8D_=ZkyvVHnrBLp1A1NFJIjWi0PwKLOVbxJPcg0RzQPI6KmBtV6ZMgPh38l93pgubgHDQqhaZ2Sfc0qv%2BRantbfg1mWGAUpRMP4RqXP78Wvu%2FCfvkWWGc5NhCTV71tGOIGgDBR3%2Bu6%2Fjj44KlE5biSNDOWW7Bigcz27lvOTidzNw8s%2FWtKAIxWbnCzZn4%2FJMBUub1SIMcW89g57k4mfPmDlCgpZKzxwl6beSfdtZ4RUWXmZOn5v5NkxVKhU4wR0Pq7NklczEGdRq2nIAcu7v22Uw2o%2FxMY0xBdeC9Korm5%2FNHnxl6K%2Bd6FXSoT9a3XIMQO359auZPiZWzrNlZe%2BqnOahXcx7KAhQIRqSOapSmL4ygJor4r5isJhRuDoXy7vJAVuH%2FRDtEJJ8rZTq0BdC23Bz%2B0MrsdgbK%2BiW; _UP_D_=pc; __wpkreporterwid_=3d3f74a7-99b7-4916-3f78-911fc2eb9d87; tfstk=fIoZNxjnbhKwPOu0TWZ4LsaRqirTcudSSmNbnxD0C5VgClMm8xMyB-GsnSu4tjpOflAOmSD-9PNiGl120XrgkVNb1SrqHbJBN3tSBAEYoQOWVUUg9qZ8n1bGGkD3CqGYINKSBABhjnXgp3_Vywz6gSc0Syj3BWf0mr2DLW24eZfiiovEKWefj1q0swq3E82iNEMinMy7SLrcpA4Fh3z_ZAViCfih3PbtdW5N_DuU77AaTijmYRkL2Wq54ENoy5a7ZXxCbok33XzS7QSZgxD-oyoVsdGotql0p2dVu7umC4nLStbiLmParc4FELHrI-c0u2dPVRrs8zoZWKCnIbNZrlHfUCMUz2z8KyXVSlgSFmUojh58OzeqTzgwaGll4YCYKwctDV5coP2LL79eKHxpNTXHmre1kZU32JPWCR_AkP2LL79eLZQY-WeUNdw1.; __pus=2051c82285199d8be553be41dd5a2100AAQ+mmv35G4FDDZ5x+3Mhe2OMbNgweQ1ODbW8zDt9YuP1LQVqHUuAAz9KWLsPjpNtim0AVGHusN4MCosTmbq/khM; __kp=e6604120-6051-11ef-bfe4-c31b6cdd0766; __kps=AATcZArVgS76EPn0FMaV4HEj; __ktd=sii/iz4ePzEaoVirXul7QQ==; __uid=AATcZArVgS76EPn0FMaV4HEj; __itrace_wid=5829b95d-dac1-48d3-bfd5-f60cd9462786; __puus=7da0b96cb710fa1b376934485f977e05AATp/q8/QupT7IiBR1GWqZhxlIRT677smMvoHlLxQA0Lk6CkP0YJBOTl+p9DZgzlMz6w4hPXPgWsokukk8PW7ZfhFfPmv8tKMgLpCGLW+tk57luhNghmSdTeVPkAF59STtyCPBEtiNzNAd/zZJ6qILJDi5ywEBAAAg+gOyWHoLHNUR+QxeHRuQa8g5WWA95J8jebIlrr8rCvI1vjTbtiYktT\",\"token\":\"26fc6787afff43e78b78992e782502f1\"}");
}
@org.junit.Test
public void homeContent() throws Exception {
String content = spider.homeContent(true);
JsonObject map = Json.safeObject(content);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("homeContent--" + gson.toJson(map));
//Assert.assertFalse(map.getAsJsonArray("list").isEmpty());
}
@org.junit.Test
public void homeVideoContent() throws Exception {
String content = spider.homeVideoContent();
JsonObject map = Json.safeObject(content);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("homeVideoContent--" + gson.toJson(map));
// Assert.assertFalse(map.getAsJsonArray("list").isEmpty());
}
@org.junit.Test
public void categoryContent() throws Exception {
String content = spider.categoryContent("mv", "2", true, null);
JsonObject map = Json.safeObject(content);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("categoryContent--" + gson.toJson(map));
Assert.assertFalse(map.getAsJsonArray("list").isEmpty());
}
@org.junit.Test
public void detailContent() throws Exception {
String content = spider.detailContent(Arrays.asList("3614"));
System.out.println("detailContent--" + content);
JsonObject map = Json.safeObject(content);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("detailContent--" + gson.toJson(map));
Assert.assertFalse(map.getAsJsonArray("list").isEmpty());
}
@org.junit.Test
public void playerContent() throws Exception {
String content = spider.playerContent("移动0", "FqijauTCWHB5yHIgvTglMzr-0MoIhFgie++2mknZaFTuu0p6", new ArrayList<>());
System.out.println("playerContent--" + content);
JsonObject map = Json.safeObject(content);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("playerContent--" + gson.toJson(map));
Assert.assertFalse(map.getAsJsonPrimitive("url").getAsString().isEmpty());
}
@org.junit.Test
public void searchContent() throws Exception {
String content = spider.searchContent("值得爱", false);
JsonObject map = Json.safeObject(content);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("searchContent--" + gson.toJson(map));
Assert.assertFalse(map.getAsJsonArray("list").isEmpty());
}
}

BIN
jar/GM.jar Normal file

Binary file not shown.

7668
jar/GM.jobf Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1 +1 @@
36608b16ea95ec345af695415b76803c e50473a2b1a8d4b3447ca6b265c68f0e

4383
jar/custom_spider.jobf Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;36608b16ea95ec345af695415b76803c", "spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;e50473a2b1a8d4b3447ca6b265c68f0e",
"lives": [ "lives": [
{ {
"name": "电视直播", "name": "电视直播",

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;36608b16ea95ec345af695415b76803c", "spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;e50473a2b1a8d4b3447ca6b265c68f0e",
"lives": [ "lives": [
{ {
"name": "直播ipv6", "name": "直播ipv6",

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;36608b16ea95ec345af695415b76803c", "spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;e50473a2b1a8d4b3447ca6b265c68f0e",
"lives": [ "lives": [
{ {
"name": "直播ipv6", "name": "直播ipv6",

View File

@ -1,5 +1,5 @@
{ {
"spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;36608b16ea95ec345af695415b76803c", "spider": "https://androidcatvodspider.netlify.app/jar/custom_spider.jar;md5;e50473a2b1a8d4b3447ca6b265c68f0e",
"lives": [ "lives": [
{ {
"name": "直播", "name": "直播",