diff --git a/app/src/main/java/com/github/catvod/bean/bili/Data.java b/app/src/main/java/com/github/catvod/bean/bili/Data.java index 67f075c8..89e43641 100644 --- a/app/src/main/java/com/github/catvod/bean/bili/Data.java +++ b/app/src/main/java/com/github/catvod/bean/bili/Data.java @@ -12,6 +12,8 @@ public class Data { @SerializedName("result") private JsonElement result; + @SerializedName("list") + private JsonElement list; @SerializedName("isLogin") private Boolean isLogin; @SerializedName("vipType") @@ -46,6 +48,9 @@ public class Data { public JsonElement getResult() { return result; } + public JsonElement getList() { + return list; + } public boolean isLogin() { return isLogin != null && isLogin; 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 d904c1ee..614c70b2 100644 --- a/app/src/main/java/com/github/catvod/net/OkHttp.java +++ b/app/src/main/java/com/github/catvod/net/OkHttp.java @@ -3,13 +3,11 @@ package com.github.catvod.net; import com.github.catvod.crawler.Spider; import java.io.IOException; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; -import okhttp3.ConnectionSpec; import okhttp3.Dns; import okhttp3.Headers; import okhttp3.OkHttpClient; @@ -38,7 +36,7 @@ public class OkHttp { } public static OkHttpClient.Builder getBuilder() { - return new OkHttpClient.Builder().dns(safeDns()).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).connectTimeout(30, TimeUnit.SECONDS).hostnameVerifier(SSLSocketFactoryCompat.hostnameVerifier).sslSocketFactory(new SSLSocketFactoryCompat(), SSLSocketFactoryCompat.trustAllCert); + return new OkHttpClient.Builder().dns(safeDns()).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).connectTimeout(30, TimeUnit.SECONDS).hostnameVerifier(SSLCompat.VERIFIER).sslSocketFactory(new SSLCompat(), SSLCompat.TM); } public static OkHttpClient client() { diff --git a/app/src/main/java/com/github/catvod/net/SSLCompat.java b/app/src/main/java/com/github/catvod/net/SSLCompat.java new file mode 100644 index 00000000..3af1a8f1 --- /dev/null +++ b/app/src/main/java/com/github/catvod/net/SSLCompat.java @@ -0,0 +1,121 @@ +package com.github.catvod.net; + +import android.annotation.SuppressLint; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.X509TrustManager; + +public class SSLCompat extends SSLSocketFactory { + + public static final HostnameVerifier VERIFIER = (hostname, session) -> true; + private static String[] cipherSuites; + private static String[] protocols; + private SSLSocketFactory factory; + + static { + try { + SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(); + List protocols = new LinkedList<>(); + for (String protocol : socket.getSupportedProtocols()) if (!protocol.toUpperCase().contains("SSL")) protocols.add(protocol); + SSLCompat.protocols = protocols.toArray(new String[protocols.size()]); + List allowedCiphers = Arrays.asList("TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECHDE_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); + List availableCiphers = Arrays.asList(socket.getSupportedCipherSuites()); + HashSet preferredCiphers = new HashSet<>(allowedCiphers); + preferredCiphers.retainAll(availableCiphers); + preferredCiphers.addAll(new HashSet<>(Arrays.asList(socket.getEnabledCipherSuites()))); + SSLCompat.cipherSuites = preferredCiphers.toArray(new String[preferredCiphers.size()]); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public SSLCompat() { + try { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new X509TrustManager[]{TM}, null); + HttpsURLConnection.setDefaultSSLSocketFactory(factory = context.getSocketFactory()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public String[] getDefaultCipherSuites() { + return cipherSuites; + } + + @Override + public String[] getSupportedCipherSuites() { + return cipherSuites; + } + + @Override + public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { + Socket ssl = factory.createSocket(s, host, port, autoClose); + if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); + return ssl; + } + + @Override + public Socket createSocket(String host, int port) throws IOException { + Socket ssl = factory.createSocket(host, port); + if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); + return ssl; + } + + @Override + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { + Socket ssl = factory.createSocket(host, port, localHost, localPort); + if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); + return ssl; + } + + @Override + public Socket createSocket(InetAddress host, int port) throws IOException { + Socket ssl = factory.createSocket(host, port); + if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); + return ssl; + } + + @Override + public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { + Socket ssl = factory.createSocket(address, port, localAddress, localPort); + if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); + return ssl; + } + + private void upgradeTLS(SSLSocket ssl) { + if (protocols != null) ssl.setEnabledProtocols(protocols); + if (cipherSuites != null) ssl.setEnabledCipherSuites(cipherSuites); + } + + @SuppressLint({"TrustAllX509TrustManager", "CustomX509TrustManager"}) + public static final X509TrustManager TM = new X509TrustManager() { + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + }; +} diff --git a/app/src/main/java/com/github/catvod/net/SSLSocketFactoryCompat.java b/app/src/main/java/com/github/catvod/net/SSLSocketFactoryCompat.java deleted file mode 100644 index f8db4608..00000000 --- a/app/src/main/java/com/github/catvod/net/SSLSocketFactoryCompat.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.github.catvod.net; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.security.GeneralSecurityException; -import java.security.cert.X509Certificate; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.X509TrustManager; - -public class SSLSocketFactoryCompat extends SSLSocketFactory { - - public static final HostnameVerifier hostnameVerifier = (hostname, session) -> true; - - public static final X509TrustManager trustAllCert = new X509TrustManager() { - - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) { - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[]{}; - } - }; - - static String[] protocols = null; - static String[] cipherSuites = null; - - static { - try { - SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(); - if (socket != null) { - List protocols = new LinkedList<>(); - for (String protocol : socket.getSupportedProtocols()) if (!protocol.toUpperCase().contains("SSL")) protocols.add(protocol); - SSLSocketFactoryCompat.protocols = protocols.toArray(new String[protocols.size()]); - List allowedCiphers = Arrays.asList("TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECHDE_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"); - List availableCiphers = Arrays.asList(socket.getSupportedCipherSuites()); - HashSet preferredCiphers = new HashSet<>(allowedCiphers); - preferredCiphers.retainAll(availableCiphers); - preferredCiphers.addAll(new HashSet<>(Arrays.asList(socket.getEnabledCipherSuites()))); - SSLSocketFactoryCompat.cipherSuites = preferredCiphers.toArray(new String[preferredCiphers.size()]); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private final SSLSocketFactory defaultFactory; - - public SSLSocketFactoryCompat() { - try { - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, new X509TrustManager[]{SSLSocketFactoryCompat.trustAllCert}, null); - defaultFactory = sslContext.getSocketFactory(); - HttpsURLConnection.setDefaultSSLSocketFactory(defaultFactory); - } catch (GeneralSecurityException e) { - throw new AssertionError(); - } - } - - private void upgradeTLS(SSLSocket ssl) { - if (protocols != null) { - ssl.setEnabledProtocols(protocols); - } - if (cipherSuites != null) { - ssl.setEnabledCipherSuites(cipherSuites); - } - } - - @Override - public String[] getDefaultCipherSuites() { - return cipherSuites; - } - - @Override - public String[] getSupportedCipherSuites() { - return cipherSuites; - } - - @Override - public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { - Socket ssl = defaultFactory.createSocket(s, host, port, autoClose); - if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(String host, int port) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port); - if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port, localHost, localPort); - if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(InetAddress host, int port) throws IOException { - Socket ssl = defaultFactory.createSocket(host, port); - if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); - return ssl; - } - - @Override - public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { - Socket ssl = defaultFactory.createSocket(address, port, localAddress, localPort); - if (ssl instanceof SSLSocket) upgradeTLS((SSLSocket) ssl); - return ssl; - } -} diff --git a/app/src/main/java/com/github/catvod/spider/Bili.java b/app/src/main/java/com/github/catvod/spider/Bili.java index c1379978..fac245f2 100644 --- a/app/src/main/java/com/github/catvod/spider/Bili.java +++ b/app/src/main/java/com/github/catvod/spider/Bili.java @@ -29,6 +29,8 @@ import com.github.catvod.utils.QRCode; import com.github.catvod.utils.Utils; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import org.json.JSONArray; +import org.json.JSONObject; import java.io.File; import java.net.URLEncoder; @@ -109,6 +111,13 @@ public class Bili extends Spider { public String homeContent(boolean filter) throws Exception { List classes = new ArrayList<>(); LinkedHashMap> filters = new LinkedHashMap<>(); + JSONObject jSONObject = new JSONObject(); + if (extend.has("json")) { + JSONObject json = new JSONObject(OkHttp.string(extend.get("json").getAsString())); + jSONObject.put("class", json.getJSONArray("classes")); + jSONObject.put("filters", json.getJSONObject("filter")); + return jSONObject.toString(); + } String[] types = extend.get("type").getAsString().split("#"); for (String type : types) { classes.add(new Class(type)); @@ -119,6 +128,14 @@ public class Bili extends Spider { @Override public String homeVideoContent() throws Exception { + if (extend.has("json")) { + String api = "https://api.bilibili.com/x/web-interface/popular?ps=20"; + String json = OkHttp.string(api, getGuest()); + Resp resp = Resp.objectFrom(json); + List list = new ArrayList<>(); + for (Resp.Result item : Resp.Result.arrayFrom(resp.getData().getList())) list.add(item.getVod()); + return Result.string(list); + } String[] types = extend.get("type").getAsString().split("#"); return categoryContent(types[0], "1", true, new HashMap<>()); } @@ -156,23 +173,23 @@ public class Bili extends Spider { vod.setVodContent(detail.getDesc()); vod.setVodRemarks(detail.getDuration() / 60 + "分鐘"); - api = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + detail.getCid() + "&qn=127&fnval=4048&fourk=1"; - json = OkHttp.string(api, getMember()); - Data play = Resp.objectFrom(json).getData(); - List playList = new ArrayList<>(); - List playFrom = new ArrayList<>(); - for (int i = 0; i < play.getAcceptQuality().size(); i++) { - int quality = play.getAcceptQuality().get(i); - List vodItems = new ArrayList<>(); - if (!login && quality > 32) continue; - if (!vip && quality > 80) continue; - for (Page page : detail.getPages()) vodItems.add(page.getPart() + "$" + aid + "+" + page.getCid() + "+" + quality); - playList.add(TextUtils.join("#", vodItems)); - playFrom.add(play.getAcceptDescription().get(i)); - } + Map vod_play = new LinkedHashMap<>(); + ArrayList playList = new ArrayList<>(); + for (Page page : detail.getPages()) playList.add(page.getPart() + "$" + aid + "+" + page.getCid()); + vod_play.put("B站", TextUtils.join("#", playList)); - vod.setVodPlayFrom(TextUtils.join("$$$", playFrom)); - vod.setVodPlayUrl(TextUtils.join("$$$", playList)); + api = "https://api.bilibili.com/x/web-interface/archive/related?bvid=" + id; + JSONArray related = new JSONObject(OkHttp.string(api, getMember())).optJSONArray("data"); + playList = new ArrayList<>(); + for (int i = 0; i < related.length(); i++) { + JSONObject relatedData = related.getJSONObject(i); + playList.add(relatedData.getString("title") + "$" + relatedData.optLong("aid") + "+" + relatedData.optLong("cid")); + } + vod_play.put("相关推荐", TextUtils.join("#", playList)); + + + vod.setVodPlayFrom(TextUtils.join("$$$", vod_play.keySet())); + vod.setVodPlayUrl(TextUtils.join("$$$", vod_play.values())); return Result.string(vod); } @@ -191,7 +208,7 @@ public class Bili extends Spider { String[] ids = id.split("\\+"); String aid = ids[0]; String cid = ids[1]; - String qn = ids[2]; + String qn = "127"; String api = "https://api.bilibili.com/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=4048&fourk=1"; String json = OkHttp.string(api, getMember()); diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index 329c5b03..11c6a904 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 993a394b..998bfde9 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -c48e1d66048b6807ba74245339fc9143 +1de1a94d0429f343a35986ef5e9145d6 diff --git a/json/adult.json b/json/adult.json index 1792112f..99c8f1c1 100644 --- a/json/adult.json +++ b/json/adult.json @@ -1,5 +1,5 @@ { - "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;c48e1d66048b6807ba74245339fc9143", + "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;1de1a94d0429f343a35986ef5e9145d6", "wallpaper": "https://gao.chuqiuyu.tk", "sites": [ { diff --git a/json/bili.json b/json/bili.json new file mode 100644 index 00000000..403cc937 --- /dev/null +++ b/json/bili.json @@ -0,0 +1,42 @@ +{ + "classes": [ + { + "type_name": "帕梅拉", + "type_id": "帕梅拉" + }, + { + "type_name": "太极拳", + "type_id": "太极拳" + }, + { + "type_name": "广场舞", + "type_id": "广场舞" + }, + { + "type_name": "健身", + "type_id": "健身" + }, + { + "type_name": "舞蹈", + "type_id": "舞蹈" + }, + { + "type_name": "电影", + "type_id": "电影" + }, + { + "type_name": "电视剧", + "type_id": "电视剧" + }, + { + "type_name": "演唱会", + "type_id": "演唱会" + }, + { + "type_name": "动物世界", + "type_id": "动物世界" + } + ], + "filter": { + } +} \ No newline at end of file diff --git a/json/config.json b/json/config.json index a773055e..aebd6a8f 100644 --- a/json/config.json +++ b/json/config.json @@ -1,5 +1,5 @@ { - "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;c48e1d66048b6807ba74245339fc9143", + "spider": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/jar/custom_spider.jar;md5;1de1a94d0429f343a35986ef5e9145d6", "wallpaper": "http://饭太硬.top/深色壁纸/api.php", "sites": [ { @@ -40,6 +40,7 @@ "ratio": 1.597 }, "ext": { + "json": "https://fongmi.cachefly.net/FongMi/CatVodSpider/main/json/bili.json", "type": "帕梅拉#太极拳#广场舞#演唱会", "cookie": "" }