diff --git a/app/build.gradle b/app/build.gradle index ee6d598f..f25524c8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -34,14 +34,14 @@ android { configurations.configureEach { resolutionStrategy { - force 'com.squareup.okhttp3:okhttp:3.12.13' + force 'com.squareup.okhttp3:okhttp:' + okhttpVersion } } } dependencies { + implementation 'com.squareup.okhttp3:okhttp:' + okhttpVersion implementation 'com.github.thegrizzlylabs:sardine-android:0.9' - implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14' implementation 'wang.harlon.quickjs:wrapper-android:2.4.0' implementation 'com.google.code.gson:gson:2.11.0' implementation 'cn.wanghaomiao:JsoupXpath:2.5.1' 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 2e278438..2dc492a0 100644 --- a/app/src/main/java/com/github/catvod/net/OkHttp.java +++ b/app/src/main/java/com/github/catvod/net/OkHttp.java @@ -1,13 +1,21 @@ package com.github.catvod.net; +import android.annotation.SuppressLint; + import com.github.catvod.crawler.Spider; import java.io.IOException; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + import okhttp3.Dns; import okhttp3.Headers; import okhttp3.OkHttpClient; @@ -86,7 +94,7 @@ public class OkHttp { } private static OkHttpClient.Builder getBuilder() { - return new OkHttpClient.Builder().dns(safeDns()).connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).hostnameVerifier((hostname, session) -> true).sslSocketFactory(new SSLCompat(), SSLCompat.TM); + return new OkHttpClient.Builder().dns(safeDns()).connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).hostnameVerifier((hostname, session) -> true).sslSocketFactory(getSSLContext().getSocketFactory(), trustAllCertificates()); } private static OkHttpClient client() { @@ -104,4 +112,32 @@ public class OkHttp { return Dns.SYSTEM; } } + + private static SSLContext getSSLContext() { + try { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new TrustManager[]{trustAllCertificates()}, new SecureRandom()); + return context; + } catch (Throwable e) { + return null; + } + } + + @SuppressLint({"TrustAllX509TrustManager", "CustomX509TrustManager"}) + private static X509TrustManager trustAllCertificates() { + return 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[0]; + } + }; + } } diff --git a/app/src/main/java/com/github/catvod/net/SSLCompat.java b/app/src/main/java/com/github/catvod/net/SSLCompat.java deleted file mode 100644 index 3af4a81f..00000000 --- a/app/src/main/java/com/github/catvod/net/SSLCompat.java +++ /dev/null @@ -1,112 +0,0 @@ -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.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 { - - private SSLSocketFactory factory; - private String[] cipherSuites; - private String[] protocols; - - public SSLCompat() { - try { - List list = new LinkedList<>(); - SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(); - for (String protocol : socket.getSupportedProtocols()) if (!protocol.toUpperCase().contains("SSL")) list.add(protocol); - protocols = list.toArray(new String[0]); - 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()))); - cipherSuites = preferredCiphers.toArray(new String[0]); - 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/spider/Miss.java b/app/src/main/java/com/github/catvod/spider/Miss.java deleted file mode 100644 index 734ac16e..00000000 --- a/app/src/main/java/com/github/catvod/spider/Miss.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.github.catvod.spider; - -import android.text.TextUtils; - -import com.github.catvod.bean.Class; -import com.github.catvod.bean.Filter; -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 org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; - -public class Miss extends Spider { - - private final String url = "https://missav.com/"; - - @Override - public String homeContent(boolean filter) throws Exception { - List list = new ArrayList<>(); - List classes = new ArrayList<>(); - LinkedHashMap> filters = new LinkedHashMap<>(); - Document doc = Jsoup.parse(OkHttp.string(url)); - for (Element a : doc.select("a.block.px-4.py-2.text-sm.leading-5.text-nord5.bg-nord3")) { - String typeId = a.attr("href").replace(url, ""); - if (typeId.startsWith("dm") || typeId.contains("VR")) { - classes.add(new Class(typeId, a.text())); - filters.put(typeId, Arrays.asList(new Filter("filters", "過濾", Arrays.asList(new Filter.Value("全部", ""), new Filter.Value("單人作品", "individual"), new Filter.Value("中文字幕", "chinese-subtitle"))))); - } - } - for (Element div : doc.select("div.thumbnail")) { - String id = div.select("a.text-secondary").attr("href").replace(url, ""); - String name = div.select("a.text-secondary").text(); - String pic = div.select("img").attr("data-src"); - if (pic.isEmpty()) pic = div.select("img").attr("src"); - String remark = div.select("span").text(); - if (TextUtils.isEmpty(name)) continue; - list.add(new Vod(id, name, pic, remark)); - } - return Result.string(classes, list, filters); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) throws Exception { - List list = new ArrayList<>(); - String target = url + tid; - String filters = extend.get("filters"); - if (TextUtils.isEmpty(filters)) target += "?page=" + pg; - else target += "?filters=" + extend.get("filters") + "&page=" + pg; - Document doc = Jsoup.parse(OkHttp.string(target)); - for (Element div : doc.select("div.thumbnail")) { - String id = div.select("a.text-secondary").attr("href").replace(url, ""); - String name = div.select("a.text-secondary").text(); - String pic = div.select("img").attr("data-src"); - if (pic.isEmpty()) pic = div.select("img").attr("src"); - String remark = div.select("span").text(); - if (TextUtils.isEmpty(name)) continue; - list.add(new Vod(id, name, pic, remark)); - } - return Result.string(list); - } - - @Override - public String detailContent(List ids) throws Exception { - Document doc = Jsoup.parse(OkHttp.string(url + ids.get(0))); - String name = doc.select("meta[property=og:title]").attr("content"); - String pic = doc.select("meta[property=og:image]").attr("content"); - Vod vod = new Vod(); - vod.setVodId(ids.get(0)); - vod.setVodPic(pic); - vod.setVodName(name); - vod.setVodPlayFrom("MissAV"); - vod.setVodPlayUrl("播放$" + ids.get(0)); - return Result.string(vod); - } - - @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); - } - - @Override - public String playerContent(String flag, String id, List vipFlags) throws Exception { - return Result.get().parse().url(url + id).string(); - } - - private String searchContent(String key, String pg) { - List list = new ArrayList<>(); - Document doc = Jsoup.parse(OkHttp.string(url + "search/" + key + "?page=" + pg)); - for (Element div : doc.select("div.thumbnail")) { - String id = div.select("a.text-secondary").attr("href").replace(url, ""); - String name = div.select("a.text-secondary").text(); - String pic = div.select("img").attr("data-src"); - if (pic.isEmpty()) pic = div.select("img").attr("src"); - String remark = div.select("span").text(); - if (TextUtils.isEmpty(name)) continue; - list.add(new Vod(id, name, pic, remark)); - } - return Result.string(list); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/catvod/utils/Util.java b/app/src/main/java/com/github/catvod/utils/Util.java index 8a510da5..889314a4 100644 --- a/app/src/main/java/com/github/catvod/utils/Util.java +++ b/app/src/main/java/com/github/catvod/utils/Util.java @@ -27,7 +27,7 @@ public class Util { public static final Pattern RULE = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)|http((?!http).)*?video/tos*"); public static final Pattern THUNDER = Pattern.compile("(magnet|thunder|ed2k):.*"); - public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"; + public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"; public static final String ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; public static final List MEDIA = Arrays.asList("mp4", "mkv", "wmv", "flv", "avi", "iso", "mpg", "ts", "mp3", "aac", "flac", "m4a", "ape", "ogg"); public static final List SUB = Arrays.asList("srt", "ass", "ssa", "vtt"); diff --git a/build.gradle b/build.gradle index 27bc1c28..46b41d7c 100644 --- a/build.gradle +++ b/build.gradle @@ -7,4 +7,8 @@ plugins { tasks.register('clean', Delete) { delete rootProject.layout.buildDirectory +} + +project.ext { + okhttpVersion = '5.0.0-alpha.14' } \ No newline at end of file diff --git a/jar/custom_spider.jar b/jar/custom_spider.jar index c608d0a9..0908ab7e 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 e20b1411..b5740901 100644 --- a/jar/custom_spider.jar.md5 +++ b/jar/custom_spider.jar.md5 @@ -1 +1 @@ -d6377af2846bf4ae821a802907d89236 +6eb465b53a8daeecf7e375ab6ca03d1d