diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml
new file mode 100644
index 00000000..5020a965
--- /dev/null
+++ b/.github/workflows/Build.yml
@@ -0,0 +1,61 @@
+name: Spider
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: set up JDK
+ uses: actions/setup-java@v3.11.0
+ with:
+ java-version: '18'
+ distribution: 'temurin'
+
+ - name: Clone project
+ run: |
+ rm -rf project
+ rm -rf jar/custom_spider.jar
+ git clone --recurse-submodules https://github.com/fatkun/CatVodSpider project
+
+# - name: Customize Spider
+# working-directory: ./project
+# run: |
+# sed -i 's/gradle-7.4.2-all/gradle-7.5-bin/g' gradle/wrapper/gradle-wrapper.properties
+
+ - name: Build the app
+ working-directory: ./project
+ run: |
+ chmod +x gradlew
+ ./gradlew assemblerelease --build-cache --parallel --daemon --warning-mode all
+
+ - name: Customize Spider Jar
+ working-directory: ./project
+ run: |
+ rm -rf jar/custom_spider.jar
+ rm -rf jar/spider.jar/original/META-INF
+ curl -L https://github.com/iBotPeaches/Apktool/releases/download/v2.7.0/apktool_2.7.0.jar > jar/3rd/apktool_2.7.0.jar
+ java -jar jar/3rd/baksmali-2.5.2.jar d app/build/intermediates/dex/release/minifyReleaseWithR8/classes.dex -o jar/Smali_classes
+ mkdir -p jar/spider.jar/smali/com/github/catvod/
+ mv jar/Smali_classes/com/github/catvod/spider jar/spider.jar/smali/com/github/catvod/
+ java -jar jar/3rd/apktool_2.7.0.jar b jar/spider.jar -c
+ mv jar/spider.jar/dist/dex.jar ../jar/custom_spider.jar
+ #md5=($(md5sum ../jar/custom_spider.jar))
+ echo $(md5sum ../jar/custom_spider.jar | awk '{print $1}') > ../jar/custom_spider.jar.md5
+
+ - name: Upload APK
+ uses: actions/upload-artifact@v3.1.2
+ with:
+ name: Spider
+ path: ./jar/custom_spider.jar
+
+ - name: Update spider jar
+ uses: EndBug/add-and-commit@v9.1.3
+ with:
+ default_author: github_actions
+ message: 'update spider jar'
+ add: "['./jar/custom_spider.jar', './jar/custom_spider.jar.md5']"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 34e4ff12..d931369d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -22,6 +22,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/debug/MainActivity.java b/app/src/main/java/com/github/catvod/debug/MainActivity.java
index a831c581..4c0178c5 100644
--- a/app/src/main/java/com/github/catvod/debug/MainActivity.java
+++ b/app/src/main/java/com/github/catvod/debug/MainActivity.java
@@ -6,6 +6,7 @@ import android.widget.Button;
import com.github.catvod.R;
import com.github.catvod.crawler.Spider;
+import com.github.catvod.spider.Hsck;
import com.github.catvod.spider.Init;
import com.github.catvod.spider.Yingshiche;
import com.orhanobut.logger.AndroidLogAdapter;
@@ -46,7 +47,7 @@ public class MainActivity extends Activity {
private void initSpider() {
try {
Init.init(getApplicationContext());
- spider = new Yingshiche();
+ spider = new Hsck();
spider.init(this, "");
} catch (Throwable e) {
e.printStackTrace();
@@ -71,7 +72,7 @@ public class MainActivity extends Activity {
public void categoryContent() {
try {
- Logger.t("categoryContent").d(spider.categoryContent("tid", "1", true, new HashMap<>()));
+ Logger.t("categoryContent").d(spider.categoryContent("8", "1", true, new HashMap<>()));
} catch (Throwable e) {
e.printStackTrace();
}
@@ -79,7 +80,7 @@ public class MainActivity extends Activity {
public void detailContent() {
try {
- Logger.t("detailContent").d(spider.detailContent(Arrays.asList("/voddetail/5553.html")));
+ Logger.t("detailContent").d(spider.detailContent(Arrays.asList("http://hsck770.cc/vodplay/42872-1-1.html")));
} catch (Throwable e) {
e.printStackTrace();
}
diff --git a/app/src/main/java/com/github/catvod/debug/Test18AVActivity.java b/app/src/main/java/com/github/catvod/debug/Test18AVActivity.java
new file mode 100644
index 00000000..ad00ab96
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/debug/Test18AVActivity.java
@@ -0,0 +1,104 @@
+package com.github.catvod.debug;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.Button;
+
+import com.github.catvod.R;
+import com.github.catvod.crawler.Spider;
+import com.github.catvod.spider.A18av;
+import com.github.catvod.spider.Hsck;
+import com.github.catvod.spider.Init;
+import com.orhanobut.logger.AndroidLogAdapter;
+import com.orhanobut.logger.Logger;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class Test18AVActivity extends Activity {
+
+ private ExecutorService executor;
+ private Spider spider;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ Button homeContent = findViewById(R.id.homeContent);
+ Button homeVideoContent = findViewById(R.id.homeVideoContent);
+ Button categoryContent = findViewById(R.id.categoryContent);
+ Button detailContent = findViewById(R.id.detailContent);
+ Button playerContent = findViewById(R.id.playerContent);
+ Button searchContent = findViewById(R.id.searchContent);
+ homeContent.setOnClickListener(view -> executor.execute(this::homeContent));
+ homeVideoContent.setOnClickListener(view -> executor.execute(this::homeVideoContent));
+ categoryContent.setOnClickListener(view -> executor.execute(this::categoryContent));
+ detailContent.setOnClickListener(view -> executor.execute(this::detailContent));
+ playerContent.setOnClickListener(view -> executor.execute(this::playerContent));
+ searchContent.setOnClickListener(view -> executor.execute(this::searchContent));
+ Logger.addLogAdapter(new AndroidLogAdapter());
+ executor = Executors.newCachedThreadPool();
+ executor.execute(this::initSpider);
+ }
+
+ private void initSpider() {
+ try {
+ Init.init(getApplicationContext());
+ spider = new A18av();
+ spider.init(this, "");
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void homeContent() {
+ try {
+ Logger.t("homeContent").d(spider.homeContent(true));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void homeVideoContent() {
+ try {
+ Logger.t("homeVideoContent").d(spider.homeVideoContent());
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void categoryContent() {
+ try {
+ Logger.t("categoryContent").d(spider.categoryContent("zh/chinese_list/all", "1", true, new HashMap<>()));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void detailContent() {
+ try {
+ Logger.t("detailContent").d(spider.detailContent(Arrays.asList("https://mjv002.com/zh/chinese_content/49105/SNIS-815.html")));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void playerContent() {
+ try {
+ Logger.t("playerContent").d(spider.playerContent("轉存原畫", "kahf2rw5Uuk+652f55f6943ee2f75d8e4fa590b4ec65fd007f8c", new ArrayList<>()));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void searchContent() {
+ try {
+ Logger.t("searchContent").d(spider.searchContent("我的人间烟火", false));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/github/catvod/net/OkHttp.java b/app/src/main/java/com/github/catvod/net/OkHttp.java
index 24cbf34b..74932779 100644
--- a/app/src/main/java/com/github/catvod/net/OkHttp.java
+++ b/app/src/main/java/com/github/catvod/net/OkHttp.java
@@ -3,6 +3,7 @@ package com.github.catvod.net;
import com.github.catvod.crawler.Spider;
import java.io.IOException;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@@ -65,6 +66,10 @@ public class OkHttp {
return url.startsWith("http") ? new OkRequest(GET, url, params, header).execute(client).getBody() : "";
}
+ public static OkResult get(String url, Map header) {
+ return new OkRequest(GET, url, new HashMap<>(), header).execute(client());
+ }
+
public static String post(String url, Map params) {
return post(client(), url, params, null).getBody();
}
diff --git a/app/src/main/java/com/github/catvod/spider/A18av.java b/app/src/main/java/com/github/catvod/spider/A18av.java
new file mode 100644
index 00000000..026dcdfa
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/A18av.java
@@ -0,0 +1,154 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+import android.net.Uri;
+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.Util;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Qile
+ */
+
+public class A18av extends Spider {
+
+ private String siteUrl = "https://mjv002.com";
+ //private String siteUrl = "https://18av.mm-cg.com";
+ private String cookie = "";
+ @Override
+ public void init(Context context, String extend) throws Exception {
+ cookie = getCookie();
+ if(!extend.isEmpty())
+ siteUrl = extend;
+ }
+
+ private Map getHeader() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", Util.CHROME);
+ header.put("Referer", siteUrl+"/");
+ header.put("Cookie", cookie);
+ return header;
+ }
+
+ @Override
+ public String homeContent(boolean filter) throws Exception {
+ List classes = new ArrayList<>();
+ List typeIds = Arrays.asList("/zh/chinese_list/all");
+ List typeNames = Arrays.asList("中文");
+ for (int i = 0; i < typeIds.size(); i++)
+ classes.add(new Class(typeIds.get(i), typeNames.get(i)));
+ return Result.string(classes, fetchVodList(siteUrl));
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend)
+ throws Exception {
+ String cateUrl = getPageUrl(siteUrl + tid, pg);
+ return Result.string(fetchVodList(cateUrl));
+ }
+
+ private List fetchVodList(String url) {
+ Document doc = Jsoup.parse(OkHttp.string(url, getHeader()));
+ List list = new ArrayList<>();
+ for (Element li : doc.select("div.post")) {
+ String vid = li.select("h3 a").attr("href");
+ String name = li.select("h3").text();
+ String pic = li.select("img").attr("src");
+ String remarks = String.format("%s", li.select(".meta").text());
+ list.add(new Vod(vid, name, pic, remarks));
+ }
+ return list;
+ }
+
+ @Override
+ public String detailContent(List ids) throws Exception {
+ Document doc = Jsoup.parse(OkHttp.string(ids.get(0), getHeader()));
+ if(doc.text().contains("歡迎登入")) return Result.error("该资源需要登入");
+ List vodItems = new ArrayList<>();
+ Elements sourceList = doc.select(".item.columns");
+ for (Element a : sourceList) {
+ String episodeUrl = a.select("div a").attr("href");
+ String episodeName = a.select("div a").text();
+ vodItems.add(episodeName + "$" + episodeUrl);
+ }
+ Elements elements = doc.select(".panel-block");
+ String classifyName = "";
+ String year = "";
+ String area = "";
+ String remark = "";
+ String actors = "";
+ for (Element element : elements) {
+ String text = element.text();
+ if (text.startsWith("類別:")) {
+ classifyName = element.select("span a").text();
+ } else if (text.startsWith("片商:")) {
+ area = element.select("span a").text();
+ } else if (text.startsWith("日期:")) {
+ year = element.select("span").text();
+ } else if (text.startsWith("評分:")) {
+ remark = element.select("span").text();
+ } else if (text.startsWith("演員:")) {
+ actors = element.select("span").text();
+ }
+ }
+ Vod vod = new Vod();
+ vod.setVodId(ids.get(0));
+ vod.setVodYear(year);
+ vod.setVodArea(area);
+ vod.setVodRemarks(remark);
+ vod.setTypeName(classifyName);
+ vod.setVodContent(String.format("网址:%s\n类别:%s\n演员:%s", ids.get(0), classifyName, actors));
+ vod.setVodPlayFrom("磁力");
+ vod.setVodPlayUrl(TextUtils.join("#", vodItems));
+ return Result.string(vod);
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) throws Exception {
+ String searchUrl = siteUrl + "/search?q=" + Uri.encode(key) + "&f=all";
+ Document doc = Jsoup.parse(OkHttp.string(searchUrl, getHeader()));
+ List list = new ArrayList<>();
+ for (Element li : doc.select(".item")) {
+ String vid = siteUrl + li.select("a").attr("href");
+ String name = li.select("a").attr("title");
+ String pic = li.select("img").attr("src");
+ list.add(new Vod(vid, name, pic));
+ }
+ return Result.string(list);
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) throws Exception {
+ return Result.get().url(id).header(getHeader()).string();
+ }
+
+ private String getPageUrl(String urlPrefix, String pg) {
+ return String.format("%s/%s.html", urlPrefix, pg);
+ }
+
+ private String getCookie() {
+ Map headers = new HashMap<>();
+ headers.put("User-Agent", Util.CHROME);
+ headers.put("Referer", siteUrl);
+ StringBuilder sb = new StringBuilder();
+ Map> resp = OkHttp.get(siteUrl + "/zh/chinese_IamOverEighteenYearsOld/19/index.html", headers).getResp();
+ for (String item : resp.get("set-cookie")) sb.append(item.split(";")[0]).append(";");
+ return sb.toString();
+ }
+}
diff --git a/app/src/main/java/com/github/catvod/spider/Hsck.java b/app/src/main/java/com/github/catvod/spider/Hsck.java
new file mode 100644
index 00000000..6152a4b3
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/Hsck.java
@@ -0,0 +1,149 @@
+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.Util;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Hsck extends Spider {
+ private String siteUrl = "http://hsck.net";
+ Pattern playUrlPattern = Pattern.compile(".*(https:\\\\/\\\\/[a-zA-Z0-9-]+.cdn2020\\.com.*\\.m3u8).*");
+ // 重定向的地址
+ Pattern redirectPattern = Pattern.compile(".*strU=\\\"(https:\\/\\/.*?\\/).*");
+
+ @Override
+ public void init(Context context, String extend) throws Exception {
+ if(!extend.isEmpty()) {
+ this.siteUrl = extend;
+ }
+ }
+
+ private Map getHeader() {
+ Map header = new HashMap<>();
+ header.put("User-Agent", Util.CHROME);
+ header.put("Referer", siteUrl+"/");
+ return header;
+ }
+
+ private boolean checkRealLocation(String content) throws IOException {
+ if (content.contains("id=\"hao123\"")) {
+ Matcher matcher = redirectPattern.matcher(content);
+ if (matcher.matches()) {
+ String url = matcher.group(1);
+ String redirectUrl = String.format("%s?u=http://hsck.net&p=", url);
+ this.siteUrl = OkHttp.getLocation(redirectUrl, getHeader());
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String homeContent(boolean filter) throws Exception {
+
+ List list = fetchVodList("", "");
+ List classes = new ArrayList<>();
+ List typeIds = Arrays.asList("15", "8", "9", "10", "7", "21", "22", "");
+ List typeNames = Arrays.asList("国产", "日本无码中文", "日本有码中文", "日本无码", "日本有码", "欧美", "动漫", siteUrl);
+ for (int i = 0; i < typeIds.size(); i++)
+ classes.add(new Class(typeIds.get(i), typeNames.get(i)));
+ return Result.string(classes, list);
+ }
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception {
+ return Result.string(fetchVodList(tid, pg));
+ }
+
+ private String getPageUrl(String tid, String page) {
+ if ("".equals(tid)) {
+ return siteUrl;
+ }
+ if ("".equals(page)) page = "1";
+ return String.format("%s/vodtype/%s-%s.html", siteUrl, tid, page);
+ }
+
+ private List fetchVodList(String tid, String pg) throws IOException {
+ String url = getPageUrl(tid, pg);
+ String content = OkHttp.string(url, getHeader());
+ boolean urlIsChanged = checkRealLocation(content);
+ if (urlIsChanged) {
+ url = getPageUrl(tid, pg);
+ content = OkHttp.string(url, getHeader());
+ }
+
+ Document doc = Jsoup.parse(content);
+ List list = new ArrayList<>();
+ for (Element li : doc.select("ul.stui-vodlist li")) {
+ String href = li.select("a.stui-vodlist__thumb").attr("href");
+ if (!href.startsWith("/")) {
+ continue;
+ }
+ String vid = this.siteUrl + href;
+ String name = li.select(".stui-vodlist__detail a").text();
+ String pic = li.select("a.stui-vodlist__thumb").attr("data-original");
+ String remarks = "";
+ list.add(new Vod(vid, name, pic, remarks));
+ }
+ return list;
+ }
+
+ @Override
+ public String detailContent(List ids) throws Exception {
+ String url = ids.get(0);
+ Document doc = Jsoup.parse(OkHttp.string(url, getHeader()));
+ String playUrl = getPlayUrl(doc);
+
+ List vodItems = new ArrayList<>();
+ vodItems.add("播放$" + playUrl);
+
+ Vod vod = new Vod();
+ vod.setVodId(ids.get(0));
+ vod.setVodYear("");
+ vod.setVodArea("");
+ vod.setVodRemarks("");
+ vod.setTypeName("");
+ vod.setVodContent(String.format("网址:%s\n播放地址:%s", url, playUrl));
+ vod.setVodPlayFrom("磁力");
+ vod.setVodPlayUrl(TextUtils.join("#", vodItems));
+
+ return Result.string(vod);
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) throws Exception {
+ return Result.get().url(id).header(getHeader()).string();
+ }
+
+ public String getPlayUrl(Document doc) {
+ for (Element script : doc.select("script")) {
+ String content = script.html();
+ if (content.contains("player_aaaa")) {
+ Matcher matcher = playUrlPattern.matcher(content);
+ if (matcher.matches()) {
+ return matcher.group(1).replace("\\/", "/");
+ }
+ }
+ }
+ return "";
+ }
+
+}
diff --git a/app/src/main/java/com/github/catvod/spider/JavDb.java b/app/src/main/java/com/github/catvod/spider/JavDb.java
index 2ef318d4..7b7a554a 100644
--- a/app/src/main/java/com/github/catvod/spider/JavDb.java
+++ b/app/src/main/java/com/github/catvod/spider/JavDb.java
@@ -11,11 +11,13 @@ import com.github.catvod.crawler.Spider;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Util;
+import org.apache.commons.lang3.StringUtils;
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.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -28,7 +30,7 @@ import java.util.Map;
public class JavDb extends Spider {
- private static String siteUrl = "https://javdb523.com";
+ private static String siteUrl = "https://javdb524.com";
@Override
public void init(Context context, String extend) throws Exception {
if(!extend.isEmpty())
@@ -45,40 +47,48 @@ public class JavDb extends Spider {
@Override
public String homeContent(boolean filter) throws Exception {
List classes = new ArrayList<>();
- List typeIds = Arrays.asList("", "censored", "uncensored", "western");
- List typeNames = Arrays.asList("全部", "有码", "无码", "欧美");
+ List typeIds = Arrays.asList("censored", "uncensored", "western",
+ "rankings/movies?p=daily&t=censored",
+ "rankings/movies?p=weekly&t=censored",
+ "rankings/movies?p=daily&t=uncensored",
+ "rankings/movies?p=weekly&t=uncensored");
+ List typeNames = Arrays.asList("有码", "无码", "欧美", "有码日榜", "有码周榜", "无码日榜", "无码周榜");
for (int i = 0; i < typeIds.size(); i++)
classes.add(new Class(typeIds.get(i), typeNames.get(i)));
- Document doc = Jsoup.parse(OkHttp.string(siteUrl, getHeader()));
- List list = new ArrayList<>();
- for (Element li : doc.select(".item")) {
- String vid = siteUrl + li.select("a").attr("href");
- String name = li.select("a").attr("title");
- String pic = li.select("img").attr("src");
- list.add(new Vod(vid, name, pic));
- }
- return Result.string(classes, list);
+ return Result.string(classes, fetchVodList(siteUrl));
}
@Override
public String categoryContent(String tid, String pg, boolean filter, HashMap extend)
throws Exception {
- String cateUrl = siteUrl + String.format("/%s?page=%s", tid, pg);
- Document doc = Jsoup.parse(OkHttp.string(cateUrl, getHeader()));
+ // 排行榜没有分页
+ if (tid.contains("rankings") && Integer.parseInt(pg) > 1) {
+ return Result.get().vod(new ArrayList()).page().string();
+ }
+
+ Map params = new HashMap<>();
+ params.put("page", pg);
+ String cateUrl = urlAddParam(siteUrl + String.format("/%s", tid) , params);
+ return Result.string(fetchVodList(cateUrl));
+ }
+
+ private List fetchVodList(String url) {
+ Document doc = Jsoup.parse(OkHttp.string(url, getHeader()));
List list = new ArrayList<>();
for (Element li : doc.select(".item")) {
String vid = siteUrl + li.select("a").attr("href");
- String name = li.select("a").attr("title");
+ String name = li.select(".video-title").text();
String pic = li.select("img").attr("src");
- list.add(new Vod(vid, name, pic));
+ String remarks = String.format("%s %s", li.select(".meta").text(), li.select(".score").text());
+ list.add(new Vod(vid, name, pic, remarks));
}
- return Result.string(list);
+ return list;
}
@Override
public String detailContent(List ids) throws Exception {
Document doc = Jsoup.parse(OkHttp.string(ids.get(0), getHeader()));
- if(doc.text().contains("歡迎登入")) return Result.error("该资源需要登入");;
+ if(doc.text().contains("歡迎登入")) return Result.error("该资源需要登入");
List vodItems = new ArrayList<>();
Elements sourceList = doc.select(".item.columns");
for (Element a : sourceList) {
@@ -91,6 +101,7 @@ public class JavDb extends Spider {
String year = "";
String area = "";
String remark = "";
+ String actors = "";
for (Element element : elements) {
String text = element.text();
if (text.startsWith("類別:")) {
@@ -99,8 +110,10 @@ public class JavDb extends Spider {
area = element.select("span a").text();
} else if (text.startsWith("日期:")) {
year = element.select("span").text();
- } else if (text.startsWith("時長:")) {
+ } else if (text.startsWith("評分:")) {
remark = element.select("span").text();
+ } else if (text.startsWith("演員:")) {
+ actors = element.select("span").text();
}
}
Vod vod = new Vod();
@@ -109,8 +122,8 @@ public class JavDb extends Spider {
vod.setVodArea(area);
vod.setVodRemarks(remark);
vod.setTypeName(classifyName);
- vod.setVodContent(ids.get(0));
- vod.setVodPlayFrom("Qile");
+ vod.setVodContent(String.format("网址:%s\n类别:%s\n演员:%s", ids.get(0), classifyName, actors));
+ vod.setVodPlayFrom("磁力");
vod.setVodPlayUrl(TextUtils.join("#", vodItems));
return Result.string(vod);
}
@@ -133,4 +146,18 @@ public class JavDb extends Spider {
public String playerContent(String flag, String id, List vipFlags) throws Exception {
return Result.get().url(id).header(getHeader()).string();
}
+
+ private String urlAddParam(String url, Map params) {
+ if (params == null) {
+ return url;
+ }
+
+ Uri uri = Uri.parse(url);
+ Uri.Builder builder = uri.buildUpon();
+ for (String key : params.keySet()) {
+ String val = params.get(key);
+ builder.appendQueryParameter(key, val);
+ }
+ return builder.build().toString();
+ }
}
diff --git a/app/src/main/java/com/github/catvod/spider/JavDb2.java b/app/src/main/java/com/github/catvod/spider/JavDb2.java
new file mode 100644
index 00000000..e8c75362
--- /dev/null
+++ b/app/src/main/java/com/github/catvod/spider/JavDb2.java
@@ -0,0 +1,182 @@
+package com.github.catvod.spider;
+
+import android.content.Context;
+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 org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class JavDb2 extends Spider {
+
+ private static String siteUrl = "https://javdb524.com";
+ @Override
+ public void init(Context context, String extend) throws Exception {
+ super.init(context, extend);
+ if(!extend.isEmpty()){
+ this.siteUrl = extend;
+ }
+ }
+
+ /*
+ * 爬虫headers
+ */
+ private static HashMap getHeaders(String url) {
+ HashMap headers = new HashMap<>();
+ headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36");
+ headers.put("Referer", siteUrl+"/");
+ return headers;
+ }
+
+
+ @Override
+ public String homeContent(boolean z) throws Exception {
+ try {
+ JSONArray classes = new JSONArray();
+ String[] fenleis = new String[] {"全部", "有码", "无码", "欧美",
+ "有码周榜",
+ "无码周榜"};
+ String[] fenleisval = new String[] {"/", "/censored", "/uncensored", "/western",
+ "/rankings/movies?p=weekly&t=censored",
+ "/rankings/movies?p=weekly&t=uncensored",
+ };
+ //String[] fenleis = "全部&有玛&无玛&欧美&有玛周榜".split("&");
+ //String[] fenleisval = "/&/censored&/uncensored&/western&/rankings/movies?p=weekly&t=censored".split("&");
+ for (int i = 0; i < fenleis.length; i++) {
+ JSONObject fenjson = new JSONObject();
+ fenjson.put("type_id", fenleisval[i]);
+ fenjson.put("type_name", fenleis[i]);
+ fenjson.put("type_flag", "2");
+ classes.put(fenjson);
+ }
+ JSONObject jSONObject4 = new JSONObject();
+ jSONObject4.put("class", classes);
+ if(z) {
+ jSONObject4.put("filters", new JSONObject("{}"));
+ }
+ return jSONObject4.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+
+
+ @Override
+ public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception {
+ try {
+ JSONObject result = new JSONObject();
+ JSONArray videos = new JSONArray();
+ if(tid.startsWith("/v/")){
+ if(!pg.equals("1")) return "";
+ String webUrl = siteUrl+tid;
+ String html = OkHttp.string(webUrl, getHeaders(siteUrl));
+ Document doc = Jsoup.parse(html);
+ String cover = doc.select("div.column-video-cover img").attr("src");
+ String vodtitle = doc.select("div.video-detail>h2").text();
+ if(html.contains("id=\"magnets-content")){
+ Elements lists = doc.select("div#magnets-content div.item");
+ for (int i = 0; i < lists.size(); i++) {
+ Element vod = lists.get(i);
+ //String title = vod.select("a").text();
+ String title = vod.select("a span.meta").text() + " " + vod.select("a span.name").text();
+ String link = vod.select("a").attr("href");
+ JSONObject v = new JSONObject();
+ v.put("vod_tag", "file");
+ v.put("vod_pic", "");
+ v.put("vod_id", vodtitle+"$$$"+cover+"$$$"+link);
+ v.put("vod_name", title);
+ videos.put(v);
+ }
+ }
+ }else{
+ String webUrl = siteUrl+tid+"?page="+pg;
+ String html = OkHttp.string(webUrl, getHeaders(siteUrl));
+ Document doc = Jsoup.parse(html);
+
+ Elements list = doc.select("div.movie-list div.item");
+ for (int i = 0; i < list.size(); i++) {
+ Element vod = list.get(i);
+ String title = vod.select(".video-title").text();
+ String cover = vod.select("img").attr("src");
+ String remarks = vod.select(".meta").text();
+ String id = vod.select("a").attr("href");
+ JSONObject v = new JSONObject();
+ v.put("vod_tag", "folder");
+ v.put("vod_id", id);
+ v.put("vod_name", title);
+ v.put("vod_pic", cover);
+ v.put("vod_remarks", remarks);
+ videos.put(v);
+ }
+ }
+ result.put("page", pg);
+ result.put("pagecount", Integer.MAX_VALUE);
+ result.put("limit", videos.length());
+ result.put("total", Integer.MAX_VALUE);
+ result.put("list", videos);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String detailContent(List ids) throws Exception {
+ try {
+ String pgurl = ids.get(0).trim();
+ String cover = pgurl.split("\\$\\$\\$")[1];
+ String url = pgurl.split("\\$\\$\\$")[2];
+ String name = pgurl.split("\\$\\$\\$")[0];
+
+ JSONObject result = new JSONObject();
+ JSONArray list = new JSONArray();
+ JSONObject vodAtom = new JSONObject();
+ vodAtom.put("vod_id", pgurl);
+ vodAtom.put("vod_name", !name.equals("") ? name : url);
+ vodAtom.put("vod_pic", cover);
+ vodAtom.put("type_name", "磁力链接");
+ vodAtom.put("vod_content", url);
+ vodAtom.put("vod_play_from", "magnet");
+ vodAtom.put("vod_play_url", "立即播放$" + url);
+ list.put(vodAtom);
+ result.put("list", list);
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String playerContent(String flag, String id, List vipFlags) throws Exception {
+ try {
+ JSONObject result = new JSONObject();
+ result.put("url", id);
+ result.put("parse", 0);
+ result.put("playUrl", "");
+ return result.toString();
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+
+ @Override
+ public String searchContent(String key, boolean quick) throws Exception {
+ try {
+ return "";
+ } catch (Exception e) {
+ SpiderDebug.log(e);
+ }
+ return "";
+ }
+}
diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar
index a2791b56..d61db38f 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 c60565dc..4747e562 100644
--- a/jar/custom_spider.jar.md5
+++ b/jar/custom_spider.jar.md5
@@ -1 +1 @@
-b3 12 0d 7a 56 20 43 aa 14 d9 2f bf 5a d1 79 ee
+6b0424b428877822187f0b96df602e38