diff --git a/app/src/main/java/com/github/catvod/spider/KuaKeS.java b/app/src/main/java/com/github/catvod/spider/KuaKeS.java new file mode 100644 index 00000000..55c2d657 --- /dev/null +++ b/app/src/main/java/com/github/catvod/spider/KuaKeS.java @@ -0,0 +1,153 @@ +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.JsonObject; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.net.URLEncoder; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 夸克社 + * + * @author lushunming + * @createdate 2024-12-03 + */ +public class KuaKeS extends Cloud { + + private final String siteUrl = "https://kuakes.com"; + + + private Map getHeader() { + Map header = new HashMap<>(); + header.put("User-Agent", Util.CHROME); + return header; + } + + private Map getHeaderWithCookie() { + Map 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 classes = new ArrayList<>(); + Document doc = Jsoup.parse(OkHttp.string(siteUrl, getHeader())); + Elements elements = doc.select(" #J_topNav a"); + for (Element e : elements) { + String url = e.attr("href"); + String name = e.text(); + if (url.contains(siteUrl)) { + classes.add(new Class(url, name)); + } + + } + + return Result.string(classes, parseVodListFromDoc(doc)); + } + + private List parseVodListFromDoc(Document doc) { + List list = new ArrayList<>(); + Elements elements = doc.select(" div.articles-list > article.post"); + for (Element e : elements) { + String vodId = e.selectFirst(" a.post-title").attr("href"); + String vodPic = e.selectFirst(" img").attr("data-lazy-src"); + if (!vodPic.startsWith("http")) { + vodPic = siteUrl + vodPic; + } + String vodName = e.selectFirst("a.post-title").text(); + String vodRemarks = Objects.nonNull(e.selectFirst("span.db_score")) ? e.selectFirst("span.db_score").text() : ""; + ; + list.add(new Vod(vodId, vodName, vodPic, vodRemarks)); + } + return list; + } + + @Override + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { + + Document doc = Jsoup.parse(OkHttp.string(String.format("%s/page/%s", tid, pg), getHeader())); + List list = parseVodListFromDoc(doc); + int total = (Integer.parseInt(pg) + 1) * 19; + return Result.get().vod(list).page(Integer.parseInt(pg), Integer.parseInt(pg) + 1, 19, total).string(); + } + + + @Override + public String detailContent(List ids) throws Exception { + String vodId = ids.get(0); + Document doc = Jsoup.parse(OkHttp.string(vodId, getHeader())); + + Vod item = new Vod(); + item.setVodId(vodId); + item.setVodName(doc.selectFirst(" h1.title-detail").text()); + item.setVodPic(doc.selectFirst("div.media-pic img").attr("data-lazy-src")); + String html = doc.select("div.wp-block-media-text__content > p").text(); + item.setVodDirector(getStrByRegex(Pattern.compile("导演:(.*?)编剧:"), html)); + item.setVodArea(getStrByRegex(Pattern.compile("地区:(.*?)语言:"), html)); + item.setVodActor(getStrByRegex(Pattern.compile("主演:(.*?)类型:"), html)); + item.setVodYear(getStrByRegex(Pattern.compile("上映日期:(.*?)\\()"), html)); + item.setTypeName(getStrByRegex(Pattern.compile("类型:(.*?)制片"), html)); + item.setVodRemarks(""); + item.setVodContent(doc.select("div.article-detail > p").text()); + + List shareLinks = new ArrayList<>(); + Elements elements = doc.select("div.magicpost-cont-bd > a"); + String rid = elements.attr("data-rid"); + String pid = elements.attr("data-pid"); + String action = "wb_mpdl_front"; + + String result = OkHttp.post("https://kuakes.com/wp-admin/admin-ajax.php", Map.of("action", action, "rid", rid, "pid", pid)); + JsonObject object = Json.safeObject(result); + JsonObject data = object.get("data").getAsJsonObject(); + String url = data.get("url").getAsString(); + shareLinks.add(url); + 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) { + String searchURL = siteUrl + String.format("/?s=%s", URLEncoder.encode(key)); + String html = OkHttp.string(searchURL, getHeaderWithCookie()); + Document doc = Jsoup.parse(html); + + return Result.string(parseVodListFromDoc(doc)); + } +} \ No newline at end of file diff --git a/app/src/test/java/KuaKeSTest.java b/app/src/test/java/KuaKeSTest.java new file mode 100644 index 00000000..e9f93bdd --- /dev/null +++ b/app/src/test/java/KuaKeSTest.java @@ -0,0 +1,102 @@ +import android.app.Application; +import com.github.catvod.server.Server; + +import com.github.catvod.spider.Init; +import com.github.catvod.spider.KuaKeS; +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 KuaKeSTest { + + private Application mockContext; + + private KuaKeS spider; + + @org.junit.Before + public void setUp() throws Exception { + mockContext = RuntimeEnvironment.application; + Init.init(mockContext); + spider = new KuaKeS(); + Server.get().start(); + // 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\"}"); + // spider.init(mockContext, "{\"cookie\":\"ctoken=rldVUeNBAbGyhJdbpC4wEUE-;__pus=75e54cf66f9ea5ed1497838782a90a78AATTBUV9c9w7KXUiHDEl6VdV8Wxki4L9R5kIIjSKQnX1wedJe3s8weva95YKUkRqI1aBY/MA+YBNvaTO0JkXvLp+;__kp=be6b9e10-74f8-11ef-aa08-7d8956cd7603;__kps=AATcZArVgS76EPn0FMaV4HEj;__ktd=sii/iz4ePzEaoVirXul7QQ==;__uid=AATcZArVgS76EPn0FMaV4HEj\"}"); + // spider.init(mockContext, ""); + spider.init(mockContext, "{\"site\": [\"https://www.wogg.net/\",\"https://wogg.xxooo.cf/\"],\"uccookie\":\"_UP_28A_52_=381;_UP_BT_=html5;_UP_F7E_8D_=ZkyvVHnrBLp1A1NFJIjWi0PwKLOVbxJPcg0RzQPI6Kl8ttcYB1X9Nkx0DnGMyJVLgv0M%2FCztZQaIhZhKaI%2F0Fa%2F5Fqe1t%2BDWF1o9sO71vnupc%2Fvxa%2B78J%2B%2BRZYZzk2EJNXvW0Y4gaAMFHf67r%2BOPjtggEPU7aNnlZbsGKBzPbuW85OJ3M3Dyz9a0oAjFZucLNmfj8kwFS5su6ugGZUgH1RU4wR0Pq7NklczEGdRq2nIAcu7v22Uw2o%2FxMY0xBdeC9Korm5%2FNHnxl6K%2Bd6FXSoT9a3XIMQO359auZPiZWzrNlZe%2BqnOahXcx7KAhQIRqSHYYCfquwtPWx%2FgYBqTnLfzoXy7vJAVuH%2FRDtEJJ8rZTq0BdC23Bz%2B0MrsdgbK%2BiW;_UP_6D1_64_=069;_UP_A4A_11_=wb96b12a16f941809f5af993726ba192;_UP_D_=mobilectoken=oxJV13ITm7aa7_rsplIXC-_v;__pus=cef2cc2dfd5d8af70df36bcedf83995cAAT3ZYhqlLos+yCaVQYYC944c4HEQnHz8uEpdQner0OcqISOpBObxl2kck65MGceRIDBd+MLtDxsNqwXvgDIFpYU;__kp=0d340990-9b39-11ef-ae54-4f733858896a;__kps=AAQXoZxLp9Oe2Ps0d/hNBJl4;__ktd=2gPNadz6Z9c+2+FyQyQZUw==;__uid=AAQXoZxLp9Oe2Ps0d/hNBJl4;UDRIVE_TRANSFER_SESS=UpLXXX2HAXJNW0AHgDcMurpazcqTbU-EQWnKG6RKtkdhdqZgHGTM-BSulf_oo1nmMMjo6hFdByLlm-bEiwjByMbIIEehsxhuuV00b96SSaPExn0wMcQ8SmzJa-YwonEE2MEVWCHcRYuW4Z-ljMOgab7qaGtQUpqjkl-p6OTv23BW-4gM6y7DNKvGeaMv_3NX\"," + + "\"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("https://kuakes.com/films", "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("https://kuakes.com/2422.html")); + 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("quark4K", "81c9aa49887d4b07aba861d7dd76d0ac++0ec2d75805f83bd045434f0d22f71489++4be1d75e17aa++wGlrbmw95nBbzO2rbCcEicZ8f4a+z5aKiuyoLQLA5SQ=", 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()); + } + + +} \ No newline at end of file diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 1f904333..7819e444 100644 Binary files a/jar/custom_spider.jar and b/jar/custom_spider.jar differ diff --git a/jar/custom_spider.jar.md5 b/jar/custom_spider.jar.md5 index e1c0fdfc..2472f3ee 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -476072459de884c114120e7e7375c42c +fc8f8fde90c2943674e0e38b00053bd5 diff --git a/json/index.json b/json/index.json index 03f1004f..938e414b 100644 --- a/json/index.json +++ b/json/index.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;476072459de884c114120e7e7375c42c", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;fc8f8fde90c2943674e0e38b00053bd5", "lives": [ { "name": "直播", @@ -92,6 +92,16 @@ "changeable": 1, "ext": {} }, + { + "key": "KuaKeS", + "name": "夸克网盘社", + "type": 3, + "api": "csp_KuaKeS", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { "key": "XuanFeng", "name": "旋风影视", diff --git a/json/index1.json b/json/index1.json index bd8de9f2..b6beb24d 100644 --- a/json/index1.json +++ b/json/index1.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;476072459de884c114120e7e7375c42c", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;fc8f8fde90c2943674e0e38b00053bd5", "lives": [ { "name": "直播ipv6", diff --git a/json/index2.json b/json/index2.json index 4bb49040..ccf80103 100644 --- a/json/index2.json +++ b/json/index2.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;476072459de884c114120e7e7375c42c", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;fc8f8fde90c2943674e0e38b00053bd5", "lives": [ { "name": "直播ipv6", @@ -125,6 +125,16 @@ "changeable": 1, "ext": {} }, + { + "key": "KuaKeS", + "name": "夸克网盘社", + "type": 3, + "api": "csp_KuaKeS", + "searchable": 1, + "changeable": 1, + "ext": {} + }, + { "key": "XuanFeng", "name": "旋风影视", diff --git a/json/test.json b/json/test.json index 7bc76d4f..b2ced5f9 100644 --- a/json/test.json +++ b/json/test.json @@ -1,5 +1,5 @@ { - "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;476072459de884c114120e7e7375c42c", + "spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;fc8f8fde90c2943674e0e38b00053bd5", "lives": [ { "name": "直播",