diff --git a/app/src/main/java/com/github/catvod/bean/jianpian/Data.java b/app/src/main/java/com/github/catvod/bean/jianpian/Data.java index 38db8562..0e0880ce 100644 --- a/app/src/main/java/com/github/catvod/bean/jianpian/Data.java +++ b/app/src/main/java/com/github/catvod/bean/jianpian/Data.java @@ -6,13 +6,16 @@ import com.github.catvod.bean.Vod; import com.github.catvod.utils.Util; import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Data { - @SerializedName(value = "jump_id", alternate = "id") + @SerializedName("jump_id") private String jumpId; + @SerializedName("id") + private String id; @SerializedName(value = "thumbnail", alternate = "path") private String thumbnail; @SerializedName("title") @@ -24,24 +27,30 @@ public class Data { @SerializedName("playlist") private Value playlist; @SerializedName("year") - private Value year; + private String year; @SerializedName("area") - private Value area; + private String area; @SerializedName("types") private List types; @SerializedName("actors") private List actors; @SerializedName("directors") private List directors; - @SerializedName("btbo_downlist") - private List btboDownlist; + @SerializedName("source_list_source") + private List source; + @SerializedName("dataList") + private List dataList; public String getJumpId() { return TextUtils.isEmpty(jumpId) ? "" : jumpId; } - public String getThumbnail() { - return TextUtils.isEmpty(thumbnail) ? "" : thumbnail + "@Referer=www.jianpianapp.com@User-Agent=jianpian-version362"; + public String getId() { + return TextUtils.isEmpty(id) ? "" : id; + } + + public String getThumbnail(String imgDomain) { + return TextUtils.isEmpty(thumbnail) ? "" : "http://" + imgDomain + thumbnail; } public String getTitle() { @@ -61,11 +70,11 @@ public class Data { } public String getYear() { - return year == null ? "" : year.getTitle(); + return year == null ? "" : year; } public String getArea() { - return area == null ? "" : area.getTitle(); + return area == null ? "" : area; } public String getTypes() { @@ -80,12 +89,20 @@ public class Data { return directors == null ? "" : getValues(directors, true); } - public List getBtboDownlist() { - return btboDownlist == null ? Collections.emptyList() : btboDownlist; + public List getSource() { + return source == null ? Collections.emptyList() : source; } - public Vod vod() { - return new Vod(getJumpId(), getTitle(), getThumbnail(), getMask()); + public List getDataList() { + return dataList == null ? Collections.emptyList() : dataList; + } + + public Vod homeVod(String imgDomain) { + return new Vod(getJumpId(), getTitle(), getThumbnail(imgDomain)); + } + + public Vod vod(String imgDomain) { + return new Vod(getId(), getTitle(), getThumbnail(imgDomain), getMask()); } public String getValues(List items, boolean link) { @@ -94,12 +111,6 @@ public class Data { return Util.substring(sb.toString()); } - public String getPlayUrl() { - StringBuilder sb = new StringBuilder(); - for (BtboDown value : getBtboDownlist()) sb.append(value.getVal()).append("#"); - return Util.substring(sb.toString()); - } - public static class Value { @SerializedName(value = "title", alternate = "name") @@ -118,13 +129,51 @@ public class Data { } } - public static class BtboDown { + public static class SourceListSource { - @SerializedName("val") - private String val; + @SerializedName("name") + private String name; + @SerializedName("source_list") + private List list; - public String getVal() { - return TextUtils.isEmpty(val) ? "" : val.replaceAll("ftp", "tvbox-xg:ftp"); + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + + public List getList() { + return list == null ? Collections.emptyList() : list; } } -} + + public static class SourceList { + + @SerializedName("source_name") + private String name; + @SerializedName("url") + private String url; + + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url.replaceAll("ftp", "tvbox-xg:ftp"); + } + } + + public String getVodFrom() { + List items = new ArrayList<>(); + for (SourceListSource source : getSource()) items.add(source.getName()); + return TextUtils.join("$$$", items); + } + + public String getVodUrl() { + List items = new ArrayList<>(); + for (SourceListSource source : getSource()) { + List urls = new ArrayList<>(); + for (SourceList item : source.getList()) urls.add(item.getName() + "$" + item.getUrl()); + items.add(TextUtils.join("#", urls)); + } + return TextUtils.join("$$$", items); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/bean/jianpian/Search.java b/app/src/main/java/com/github/catvod/bean/jianpian/Search.java new file mode 100644 index 00000000..0b306e34 --- /dev/null +++ b/app/src/main/java/com/github/catvod/bean/jianpian/Search.java @@ -0,0 +1,52 @@ +package com.github.catvod.bean.jianpian; + +import android.text.TextUtils; + +import com.github.catvod.bean.Vod; +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.util.Collections; +import java.util.List; + +public class Search { + + @SerializedName("data") + private List data; + @SerializedName("id") + private String id; + @SerializedName(value = "thumbnail", alternate = "path") + private String thumbnail; + @SerializedName("title") + private String title; + @SerializedName("mask") + private String mask; + + public static Search objectFrom(String str) { + return new Gson().fromJson(str, Search.class); + } + + public String getId() { + return TextUtils.isEmpty(id) ? "" : id; + } + + public String getThumbnail(String imgDomain) { + return TextUtils.isEmpty(thumbnail) ? "" : "http://" + imgDomain + thumbnail; + } + + public String getTitle() { + return TextUtils.isEmpty(title) ? "" : title; + } + + public String getMask() { + return TextUtils.isEmpty(mask) ? "" : mask; + } + + public Vod vod(String imgDomain) { + return new Vod(getId(), getTitle(), getThumbnail(imgDomain), getMask()); + } + + public List getData() { + return data == null ? Collections.emptyList() : data; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/spider/Jianpian.java b/app/src/main/java/com/github/catvod/spider/Jianpian.java index 36e2e8c9..4080d4ff 100644 --- a/app/src/main/java/com/github/catvod/spider/Jianpian.java +++ b/app/src/main/java/com/github/catvod/spider/Jianpian.java @@ -1,84 +1,114 @@ 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.bean.jianpian.Data; import com.github.catvod.bean.jianpian.Detail; import com.github.catvod.bean.jianpian.Resp; +import com.github.catvod.bean.jianpian.Search; import com.github.catvod.crawler.Spider; +import com.github.catvod.crawler.SpiderDebug; import com.github.catvod.net.OkHttp; -import com.github.catvod.utils.Json; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import java.net.URLEncoder; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Qile */ public class Jianpian extends Spider { - private final String siteUrl = "http://api2.rinhome.com"; + private String siteUrl = "https://ev5356.970xw.com"; + private String imgDomain; private String extend; private Map getHeader() { Map headers = new HashMap<>(); - headers.put("User-Agent", "jianpian-android/360"); - headers.put("JPAUTH", "y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiEv"); + headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 9; V2196A Build/PQ3A.190705.08211809; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36;webank/h5face;webank/1.0;netType:NETWORK_WIFI;appVersion:416;packageName:com.jp3.xg3"); + headers.put("Referer", siteUrl); return headers; } @Override public void init(Context context, String extend) throws Exception { this.extend = extend; + JsonObject domains = new Gson().fromJson(OkHttp.string("https://dns.alidns.com/resolve?name=swrdsfeiujo25sw.cc&type=TXT"), JsonObject.class); + String parts = domains.getAsJsonArray("Answer").get(0).getAsJsonObject().get("data").getAsString(); + parts = parts.replace("\"", ""); + String[] domain = parts.split(","); + for (String d : domain) { + siteUrl = "https://wangerniu." + d; + String json = OkHttp.string(siteUrl + "/api/appAuthConfig"); + if (!json.isEmpty()) { + JsonObject root = new Gson().fromJson(json, JsonObject.class); + imgDomain = root.getAsJsonObject("data").get("imgDomain").getAsString(); + break; + } + } } @Override public String homeContent(boolean filter) throws Exception { List classes = new ArrayList<>(); - List typeIds = Arrays.asList("0", "1", "2", "3", "4"); - List typeNames = Arrays.asList("全部", "电影", "电视剧", "动漫", "综艺"); + List typeIds = Arrays.asList("1", "2", "3", "4", "50", "99"); + List typeNames = Arrays.asList("電影", "電視劇", "動漫", "綜藝", "紀錄片", "Netflix"); for (int i = 0; i < typeIds.size(); i++) classes.add(new Class(typeIds.get(i), typeNames.get(i))); - return Result.string(classes, Json.parse(OkHttp.string(extend))); + return Result.string(classes, JsonParser.parseString(OkHttp.string(extend))); } @Override public String homeVideoContent() { List list = new ArrayList<>(); - String url = siteUrl + "/api/slide/list?code=unknown9039b6856c3a3306&pos_id=888&channel=wandoujia"; + String url = siteUrl + "/api/slide/list?pos_id=88"; Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader())); - for (Data data : resp.getData()) list.add(data.vod()); + for (Data data : resp.getData()) list.add(data.homeVod(imgDomain)); return Result.string(list); } @Override public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { if (tid.endsWith("/{pg}")) return searchContent(tid.split("/")[0], pg); - List list = new ArrayList<>(); - HashMap ext = new HashMap<>(); - if (extend != null && extend.size() > 0) ext.putAll(extend); - String cateId = ext.get("cateId") == null ? tid : ext.get("cateId"); - String area = ext.get("area") == null ? "0" : ext.get("area"); - String year = ext.get("year") == null ? "0" : ext.get("year"); - String by = ext.get("by") == null ? "hot" : ext.get("by"); - String url = siteUrl + String.format("/api/crumb/list?area=%s&category_id=%s&page=%s&type=0&limit=24&sort=%s&year=%s", area, cateId, pg, by, year); - Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader())); - for (Data data : resp.getData()) list.add(data.vod()); - return Result.string(Integer.parseInt(pg), Integer.parseInt(pg) + 1, 24, Integer.MAX_VALUE, list); + if (tid.equals("50") || tid.equals("99") || tid.equals("111")) { + List list = new ArrayList<>(); + String url = siteUrl + String.format("/api/dyTag/list?category_id=%s&page=%s", tid, pg); + Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader())); + for (Data data : resp.getData()) for (Data dataList : data.getDataList()) list.add(dataList.vod(imgDomain)); + return Result.get().page().vod(list).string(); + } else { + List list = new ArrayList<>(); + HashMap ext = new HashMap<>(); + if (extend != null && !extend.isEmpty()) ext.putAll(extend); + String area = ext.get("area") == null ? "0" : ext.get("area"); + String year = ext.get("year") == null ? "0" : ext.get("year"); + String by = ext.get("by") == null ? "updata" : ext.get("by"); + String url = siteUrl + String.format("/api/crumb/list?fcate_pid=%s&area=%s&year=%s&type=0&sort=%s&page=%s&category_id=", tid, area, year, by, pg); + Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader())); + for (Data data : resp.getData()) list.add(data.vod(imgDomain)); + return Result.string(list); + } } @Override public String detailContent(List ids) throws Exception { - String url = siteUrl + "/api/node/detail?channel=wandoujia&token=&id=" + ids.get(0); + String url = siteUrl + "/api/video/detailv2?id=" + ids.get(0); Data data = Detail.objectFrom(OkHttp.string(url, getHeader())).getData(); - Vod vod = data.vod(); - vod.setVodPlayFrom("Jianpian"); + Vod vod = data.vod(imgDomain); + vod.setVodPlayFrom(data.getVodFrom()); vod.setVodYear(data.getYear()); vod.setVodArea(data.getArea()); vod.setTypeName(data.getTypes()); vod.setVodActor(data.getActors()); - vod.setVodPlayUrl(data.getPlayUrl()); + vod.setVodPlayUrl(data.getVodUrl()); vod.setVodDirector(data.getDirectors()); vod.setVodContent(data.getDescription()); return Result.string(vod); @@ -101,9 +131,9 @@ public class Jianpian extends Spider { public String searchContent(String key, String pg) throws Exception { List list = new ArrayList<>(); - String url = siteUrl + "/api/video/search?page=" + pg + "&key=" + URLEncoder.encode(key); - Resp resp = Resp.objectFrom(OkHttp.string(url, getHeader())); - for (Data data : resp.getData()) list.add(data.vod()); + String url = siteUrl + String.format("/api/v2/search/videoV2?key=%s&category_id=88&page=%s&pageSize=20", URLEncoder.encode(key), pg); + Search search = Search.objectFrom(OkHttp.string(url, getHeader())); + for (Search data : search.getData()) list.add(data.vod(imgDomain)); return Result.string(list); } } \ No newline at end of file diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index b55ccfc9..b7d79b80 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 7541d0b5..eb78f631 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -8c76ee60eb0363060a2d78fb8dc2f0b6 +7df1f46baf40c21051abe0182086bef4 diff --git a/json/index.json b/json/index.json index b475209a..994a0557 100644 --- a/json/index.json +++ b/json/index.json @@ -1,5 +1,5 @@ { - "spider": "https://andoridspidermt.netlify.app/jar/custom_spider.jar;md5;153fe041f1a364fef8f53545dd52588a", + "spider": "https://andoridspidermt.netlify.app/jar/custom_spider.jar;md5;7df1f46baf40c21051abe0182086bef4", "lives": [ { "name": "电视直播", diff --git a/settings.gradle b/settings.gradle index 72fd0782..f1e9c1d5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,7 @@ pluginManagement { repositories { + maven { url 'https://mirrors.huaweicloud.com/repository/maven/' } maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/google/' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' } @@ -19,6 +20,7 @@ dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { + maven { url 'https://mirrors.huaweicloud.com/repository/maven/' } maven { url 'https://maven.aliyun.com/repository/public/' } maven { url 'https://maven.aliyun.com/repository/google/' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin/' }