This commit is contained in:
GH Action - Upstream Sync 2023-11-24 01:10:54 +00:00
commit 8889ba996a
7 changed files with 594 additions and 43 deletions

View File

@ -3,19 +3,10 @@ package com.github.catvod.net;
import com.github.catvod.crawler.Spider;
import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.ConnectionSpec;
import okhttp3.Dns;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
@ -110,35 +101,6 @@ public class OkHttp {
}
public static OkHttpClient.Builder getBuilder() {
OkHttpClient.Builder builder = new OkHttpClient.Builder().connectionSpecs(Arrays.asList(ConnectionSpec.RESTRICTED_TLS, ConnectionSpec.COMPATIBLE_TLS, ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT)).addInterceptor(new OkhttpInterceptor()).dns(dns()).connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS);
ignoreSSLErrors(builder);
return builder;
return new OkHttpClient.Builder().addInterceptor(new OkhttpInterceptor()).dns(dns()).connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).writeTimeout(30, TimeUnit.SECONDS).hostnameVerifier((hostname, session) -> true).sslSocketFactory(new SSLCompat(), SSLCompat.TM);
}
private static void ignoreSSLErrors(OkHttpClient.Builder builder) {
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, TM, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
builder.sslSocketFactory(context.getSocketFactory(), (X509TrustManager) TM[0]);
builder.hostnameVerifier((hostname, session) -> true);
} catch (Exception e) {
e.printStackTrace();
}
}
private static final TrustManager[] TM = new TrustManager[]{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[]{};
}
}};
}

View File

@ -0,0 +1,112 @@
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<String> 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<String> 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<String> availableCiphers = Arrays.asList(socket.getSupportedCipherSuites());
HashSet<String> 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[]{};
}
};
}

Binary file not shown.

View File

@ -1 +1 @@
17d7e3dcde6c9d3ab25b87dcaf77a3cd
1117603a248d03a2fba94c991612970f

View File

@ -1,5 +1,5 @@
{
"spider": "https://fm.t4tv.hz.cz/jar/custom_spider.jar;md5;17d7e3dcde6c9d3ab25b87dcaf77a3cd",
"spider": "https://fm.t4tv.hz.cz/jar/custom_spider.jar;md5;1117603a248d03a2fba94c991612970f",
"wallpaper": "https://gao.chuqiuyu.tk",
"sites": [
{

View File

@ -1,5 +1,5 @@
{
"spider": "https://fm.t4tv.hz.cz/jar/custom_spider.jar;md5;17d7e3dcde6c9d3ab25b87dcaf77a3cd",
"spider": "https://fm.t4tv.hz.cz/jar/custom_spider.jar;md5;1117603a248d03a2fba94c991612970f",
"wallpaper": "http://饭太硬.top/深色壁纸/api.php",
"sites": [
{
@ -474,4 +474,4 @@
]
}
]
}
}

477
json/test.json Normal file
View File

@ -0,0 +1,477 @@
{
"spider": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/jar/custom_spider.jar",
"wallpaper": "http://饭太硬.top/深色壁纸/api.php",
"sites": [
{
"key": "商店",
"name": "商店",
"type": 3,
"api": "csp_Market",
"searchable": 0,
"changeable": 0,
"ext": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/market.json"
},
{
"key": "泥巴",
"name": "泥巴",
"type": 3,
"api": "csp_NiNi",
"searchable": 1,
"changeable": 1
},
{
"key": "星星",
"name": "星星",
"type": 3,
"api": "csp_Star",
"searchable": 1,
"changeable": 1
},
{
"key": "玩偶",
"name": "玩偶",
"type": 3,
"api": "csp_Wogg",
"searchable": 1,
"changeable": 0,
"ext": {
"token": "影視天下第一",
"filter": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/wogg.json"
}
},
{
"key": "賤賤",
"name": "賤賤",
"type": 3,
"api": "csp_Jianpian",
"searchable": 1,
"changeable": 1,
"ext": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/jianpian.json"
},
{
"key": "獨播",
"name": "獨播",
"type": 3,
"api": "csp_XPathMacFilter",
"searchable": 1,
"changeable": 1,
"ext": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/duboku.json"
},
{
"key": "haiwaikan",
"name": "海外看",
"type": 1,
"api": "https://haiwaikan.com/api.php/provide/vod",
"searchable": 1,
"changeable": 1,
"categories": [
"日本动漫",
"国产动漫",
"欧美动漫",
"国产剧",
"韩剧",
"日剧",
"台剧",
"泰剧",
"港剧",
"欧美剧",
"动画电影",
"韩国综艺",
"国产综艺",
"日本综艺",
"欧美综艺",
"冒险片",
"剧情片",
"动作片",
"同性片",
"喜剧片",
"奇幻片",
"恐怖片",
"悬疑片",
"惊悚片",
"战争片",
"歌舞片",
"灾难片",
"爱情片",
"犯罪片",
"科幻片",
"纪录片",
"经典片"
]
},
{
"key": "豆瓣",
"name": "豆瓣",
"type": 3,
"api": "csp_Douban",
"searchable": 0,
"changeable": 1,
"ext": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/douban.json"
},
{
"key": "新6V",
"name": "新6V",
"type": 3,
"api": "csp_Xb6v",
"searchable": 1,
"changeable": 0
},
{
"key": "看球",
"name": "看球",
"type": 3,
"api": "csp_Kanqiu",
"searchable": 1,
"changeable": 0,
"style": {
"type": "list"
}
},
{
"key": "暴風",
"name": "暴風",
"type": 1,
"api": "https://bfzyapi.com/api.php/provide/vod",
"searchable": 1,
"changeable": 1
},
{
"key": "索尼",
"name": "索尼 ",
"type": 1,
"api": "https://suoniapi.com/api.php/provide/vod",
"searchable": 1,
"changeable": 1
},
{
"key": "快帆",
"name": "快帆",
"type": 1,
"api": "https://api.kuaifan.tv/api.php/provide/vod",
"searchable": 1,
"changeable": 1
},
{
"key": "量子",
"name": "量子",
"type": 1,
"api": "https://cj.lziapi.com/api.php/provide/vod",
"searchable": 1,
"changeable": 1
},
{
"key": "非凡",
"name": "非凡",
"type": 1,
"api": "http://cj.ffzyapi.com/api.php/provide/vod",
"searchable": 1,
"changeable": 1
},
{
"key": "櫻花",
"name": "櫻花",
"type": 3,
"api": "csp_Ying",
"searchable": 1,
"changeable": 1
},
{
"key": "巴士",
"name": "巴士",
"type": 3,
"api": "csp_Dm84",
"searchable": 1,
"changeable": 1
},
{
"key": "異界",
"name": "異界",
"type": 3,
"api": "csp_Ysj",
"searchable": 1,
"changeable": 1
},
{
"key": "哔哩",
"name": "哔哩",
"type": 3,
"api": "csp_Bili",
"searchable": 1,
"changeable": 0,
"style": {
"type": "rect",
"ratio": 1.433
},
"ext": {
"json": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/bili.json",
"type": "帕梅拉#太极拳#广场舞#演唱会",
"cookie": ""
}
},
{
"key": "bili_open",
"name": "哔哩貓",
"type": 3,
"api": "https://mirror.ghproxy.com/https://raw.githubusercontent.com/FongMi/CatVodOpen/main/open/bili_open.js",
"searchable": 1,
"changeable": 0,
"ext": {
"categories": "沙雕动画#沙雕穿越#沙雕",
"cookie": ""
}
},
{
"key": "酷狗",
"name": "酷狗",
"type": 3,
"api": "csp_Kugou",
"searchable": 0,
"changeable": 0
},
{
"key": "本地",
"name": "本地",
"type": 3,
"api": "csp_Local",
"searchable": 0,
"changeable": 0
},
{
"key": "AList",
"name": "AList",
"type": 3,
"api": "csp_AList",
"searchable": 1,
"changeable": 0,
"ext": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/alist.json"
},
{
"key": "WebDAV",
"name": "WebDAV",
"type": 3,
"api": "csp_WebDAV",
"searchable": 1,
"changeable": 0,
"ext": "https://raw.githubusercontent.com/FongMi/CatVodSpider/main/json/webdav.json"
},
{
"key": "七夜",
"name": "七夜",
"type": 3,
"api": "csp_Dovx",
"searchable": 1,
"changeable": 0
},
{
"key": "易搜",
"name": "易搜",
"type": 3,
"api": "csp_YiSo",
"searchable": 1,
"changeable": 0
},
{
"key": "雲搜",
"name": "雲搜",
"type": 3,
"api": "csp_UpYun",
"searchable": 1,
"changeable": 0
},
{
"key": "盤搜",
"name": "盤搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"changeable": 0
},
{
"key": "紙條搜",
"name": "紙條搜",
"type": 3,
"api": "csp_XiaoZhiTiao",
"searchable": 1,
"changeable": 0
},
{
"key": "盤搜索",
"name": "盤搜索",
"type": 3,
"api": "csp_PanSearch",
"searchable": 1,
"changeable": 0
},
{
"key": "找資源",
"name": "找資源",
"type": 3,
"api": "csp_Zhaozy",
"searchable": 1,
"changeable": 0,
"ext": "影視天下第一$$$test2$$$test2"
},
{
"key": "push_agent",
"name": "推送",
"type": 3,
"api": "csp_Push",
"searchable": 1,
"changeable": 0
}
],
"doh": [
{
"name": "Google",
"url": "https://dns.google/dns-query",
"ips": [
"8.8.4.4",
"8.8.8.8"
]
},
{
"name": "Cloudflare",
"url": "https://cloudflare-dns.com/dns-query",
"ips": [
"1.1.1.1",
"1.0.0.1",
"2606:4700:4700::1111",
"2606:4700:4700::1001"
]
},
{
"name": "AdGuard",
"url": "https://dns.adguard.com/dns-query",
"ips": [
"94.140.14.140",
"94.140.14.141"
]
},
{
"name": "DNSWatch",
"url": "https://resolver2.dns.watch/dns-query",
"ips": [
"84.200.69.80",
"84.200.70.40"
]
},
{
"name": "Quad9",
"url": "https://dns.quad9.net/dns-quer",
"ips": [
"9.9.9.9",
"149.112.112.112"
]
}
],
"rules": [
{
"name": "proxy",
"hosts": [
"raw.githubusercontent.com",
"googlevideo.com",
"cdn.v82u1l.com",
"cdn.iz8qkg.com",
"cdn.kin6c1.com",
"c.biggggg.com",
"c.olddddd.com",
"haiwaikan.com",
"www.histar.tv",
"youtube.com",
"uhibo.com",
".*boku.*",
".*nivod.*",
".*ulivetv.*"
]
},
{
"name": "海外看",
"hosts": [
"haiwaikan"
],
"regex": [
"10.0099",
"10.3333",
"16.0599",
"8.1748",
"10.85"
]
},
{
"name": "索尼",
"hosts": [
"suonizy"
],
"regex": [
"15.1666",
"15.2666"
]
},
{
"name": "暴風",
"hosts": [
"bfzy"
],
"regex": [
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:3,[\\s\\S]*?#EXT-X-DISCONTINUITY"
]
},
{
"name": "星星",
"hosts": [
"aws.ulivetv.net"
],
"regex": [
"#EXT-X-DISCONTINUITY\\r*\\n*#EXTINF:8,[\\s\\S]*?#EXT-X-DISCONTINUITY"
]
},
{
"name": "量子",
"hosts": [
"vip.lz",
"hd.lz",
"v.cdnlz"
],
"regex": [
"18.5333"
]
},
{
"name": "非凡",
"hosts": [
"vip.ffzy",
"hd.ffzy"
],
"regex": [
"25.0666"
]
},
{
"name": "火山嗅探",
"hosts": [
"huoshan.com"
],
"regex": [
"item_id="
]
},
{
"name": "抖音嗅探",
"hosts": [
"douyin.com"
],
"regex": [
"is_play_url="
]
},
{
"name": "農民嗅探",
"hosts": [
"toutiaovod.com"
],
"regex": [
"video/tos/cn"
]
}
]
}