Clean code
This commit is contained in:
parent
6e474781d7
commit
2e139688bb
|
|
@ -34,12 +34,9 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
//Debug For HTTP/3
|
|
||||||
debugImplementation 'org.chromium.net:cronet-embedded:101.4951.41'
|
|
||||||
implementation('com.github.thegrizzlylabs:sardine-android:0.8') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' }
|
implementation('com.github.thegrizzlylabs:sardine-android:0.8') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' }
|
||||||
implementation 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3'
|
implementation 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3'
|
||||||
implementation 'wang.harlon.quickjs:wrapper-android:0.21.1'
|
implementation 'wang.harlon.quickjs:wrapper-android:0.21.1'
|
||||||
implementation 'com.google.net.cronet:cronet-okhttp:0.1.0'
|
|
||||||
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
|
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
|
||||||
implementation 'com.google.code.gson:gson:2.8.6'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
implementation 'cn.wanghaomiao:JsoupXpath:2.5.1'
|
implementation 'cn.wanghaomiao:JsoupXpath:2.5.1'
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,6 @@
|
||||||
-keep class okio.** { *; }
|
-keep class okio.** { *; }
|
||||||
-keep class okhttp3.** { *; }
|
-keep class okhttp3.** { *; }
|
||||||
|
|
||||||
# Cronet
|
|
||||||
-keep class org.chromium.net.** { *; }
|
|
||||||
-keep class com.google.net.cronet.** { *; }
|
|
||||||
|
|
||||||
# Sardine
|
# Sardine
|
||||||
-keep class com.thegrizzlylabs.sardineandroid.** { *; }
|
-keep class com.thegrizzlylabs.sardineandroid.** { *; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.github.catvod.js;
|
package com.github.catvod.js;
|
||||||
|
|
||||||
import com.github.catvod.utils.Utils;
|
import com.github.catvod.utils.Utils;
|
||||||
import com.google.errorprone.annotations.Keep;
|
|
||||||
import com.whl.quickjs.wrapper.JSMethod;
|
import com.whl.quickjs.wrapper.JSMethod;
|
||||||
import com.whl.quickjs.wrapper.QuickJSContext;
|
import com.whl.quickjs.wrapper.QuickJSContext;
|
||||||
|
|
||||||
|
|
@ -13,7 +12,6 @@ public class Method {
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Keep
|
|
||||||
@JSMethod
|
@JSMethod
|
||||||
public void showToast(String msg) {
|
public void showToast(String msg) {
|
||||||
Utils.notify(msg);
|
Utils.notify(msg);
|
||||||
|
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
package com.github.catvod.net;
|
|
||||||
|
|
||||||
import com.github.catvod.spider.Init;
|
|
||||||
import com.google.net.cronet.okhttptransport.CronetInterceptor;
|
|
||||||
|
|
||||||
import org.chromium.net.CronetEngine;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
|
|
||||||
public class Cronet {
|
|
||||||
|
|
||||||
private OkHttpClient client;
|
|
||||||
|
|
||||||
private static class Loader {
|
|
||||||
static volatile Cronet INSTANCE = new Cronet();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Cronet get() {
|
|
||||||
return Loader.INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OkHttpClient client() {
|
|
||||||
if (get().client != null) return get().client;
|
|
||||||
return get().client = getBuilder().build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OkHttpClient noRedirect() {
|
|
||||||
return client().newBuilder().followRedirects(false).followSslRedirects(false).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String string(String url) {
|
|
||||||
return string(url, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String string(String url, Map<String, String> header) {
|
|
||||||
return string(url, null, header);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String string(String url, Map<String, String> params, Map<String, String> header) {
|
|
||||||
return new OkRequest(OkHttp.GET, url, params, header).execute(client()).getBody();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String post(String url, Map<String, String> params) {
|
|
||||||
return post(url, params, null).getBody();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OkResult post(String url, Map<String, String> params, Map<String, String> header) {
|
|
||||||
return new OkRequest(OkHttp.POST, url, params, header).execute(client());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String post(String url, String json) {
|
|
||||||
return post(url, json, null).getBody();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OkResult post(String url, String json, Map<String, String> header) {
|
|
||||||
return new OkRequest(OkHttp.POST, url, json, header).execute(client());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static OkHttpClient.Builder getBuilder() {
|
|
||||||
return OkHttp.getBuilder().addInterceptor(CronetInterceptor.newBuilder(new CronetEngine.Builder(Init.context()).build()).build());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
package com.github.catvod.net;
|
package com.github.catvod.net;
|
||||||
|
|
||||||
import com.github.catvod.utils.Utils;
|
import com.github.catvod.utils.Utils;
|
||||||
import com.google.common.net.HttpHeaders;
|
|
||||||
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.zip.Inflater;
|
import java.util.zip.Inflater;
|
||||||
|
|
@ -22,7 +19,7 @@ public class OkhttpInterceptor implements Interceptor {
|
||||||
@Override
|
@Override
|
||||||
public Response intercept(Chain chain) throws IOException {
|
public Response intercept(Chain chain) throws IOException {
|
||||||
Response response = chain.proceed(getRequest(chain));
|
Response response = chain.proceed(getRequest(chain));
|
||||||
String encoding = response.header(HttpHeaders.CONTENT_ENCODING);
|
String encoding = response.header("Content-Encoding");
|
||||||
if (response.body() == null || encoding == null || !encoding.equals("deflate")) return response;
|
if (response.body() == null || encoding == null || !encoding.equals("deflate")) return response;
|
||||||
InflaterInputStream is = new InflaterInputStream(response.body().byteStream(), new Inflater(true));
|
InflaterInputStream is = new InflaterInputStream(response.body().byteStream(), new Inflater(true));
|
||||||
return response.newBuilder().headers(response.headers()).body(new ResponseBody() {
|
return response.newBuilder().headers(response.headers()).body(new ResponseBody() {
|
||||||
|
|
@ -36,7 +33,6 @@ public class OkhttpInterceptor implements Interceptor {
|
||||||
return response.body().contentLength();
|
return response.body().contentLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
@Override
|
||||||
public BufferedSource source() {
|
public BufferedSource source() {
|
||||||
return Okio.buffer(Okio.source(is));
|
return Okio.buffer(Okio.source(is));
|
||||||
|
|
@ -44,9 +40,9 @@ public class OkhttpInterceptor implements Interceptor {
|
||||||
}).build();
|
}).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Request getRequest(@NonNull Chain chain) {
|
private Request getRequest(Chain chain) {
|
||||||
Request request = chain.request();
|
Request request = chain.request();
|
||||||
if (request.url().host().equals("gitcode.net")) return request.newBuilder().addHeader(HttpHeaders.USER_AGENT, Utils.CHROME).build();
|
if (request.url().host().equals("gitcode.net")) return request.newBuilder().addHeader("User-Agent", Utils.CHROME).build();
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import com.github.catvod.bean.Vod;
|
||||||
import com.github.catvod.bean.upyun.Data;
|
import com.github.catvod.bean.upyun.Data;
|
||||||
import com.github.catvod.bean.upyun.Item;
|
import com.github.catvod.bean.upyun.Item;
|
||||||
import com.github.catvod.net.OkHttp;
|
import com.github.catvod.net.OkHttp;
|
||||||
import com.google.common.io.BaseEncoding;
|
|
||||||
|
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -43,8 +42,14 @@ public class UpYun extends Ali {
|
||||||
IvParameterSpec ivSpec = new IvParameterSpec("qq1920520460qqzz".getBytes());
|
IvParameterSpec ivSpec = new IvParameterSpec("qq1920520460qqzz".getBytes());
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
|
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
|
||||||
byte[] encryptDataBytes = BaseEncoding.base16().decode(data.toUpperCase());
|
byte[] encryptDataBytes = decodeHex(data.toUpperCase());
|
||||||
byte[] decryptData = cipher.doFinal(encryptDataBytes);
|
byte[] decryptData = cipher.doFinal(encryptDataBytes);
|
||||||
return new String(decryptData, "UTF-8");
|
return new String(decryptData, "UTF-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static byte[] decodeHex(String s) {
|
||||||
|
byte[] bytes = new byte[s.length() / 2];
|
||||||
|
for (int i = 0; i < bytes.length; i++) bytes[i] = Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16).byteValue();
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
package com.fongmi.tools;
|
|
||||||
|
|
||||||
import com.google.common.io.BaseEncoding;
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.JsonParser;
|
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import javax.crypto.Cipher;
|
|
||||||
import javax.crypto.spec.IvParameterSpec;
|
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
|
||||||
|
|
||||||
public class Config {
|
|
||||||
|
|
||||||
private final Gson gson;
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
try {
|
|
||||||
Config config = new Config();
|
|
||||||
String json = config.getJson("http://饭太硬.top/tv");
|
|
||||||
System.out.println(config.gson.toJson(JsonParser.parseString(json)));
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Config() {
|
|
||||||
gson = new Gson().newBuilder().disableHtmlEscaping().setPrettyPrinting().create();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getJson(String url) throws Exception {
|
|
||||||
String key = url.contains(";") ? url.split(";")[2] : "";
|
|
||||||
url = url.contains(";") ? url.split(";")[0] : url;
|
|
||||||
String data = getData(url);
|
|
||||||
if (Utils.isJson(data)) return data;
|
|
||||||
if (data.isEmpty()) throw new Exception();
|
|
||||||
if (data.contains("**")) data = base64(data);
|
|
||||||
if (data.startsWith("2423")) data = cbc(data);
|
|
||||||
if (key.length() > 0) data = ecb(data, key);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getData(String url) throws Exception {
|
|
||||||
if (url.startsWith("http")) return Utils.call(url);
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String ecb(String data, String key) throws Exception {
|
|
||||||
SecretKeySpec spec = new SecretKeySpec(padEnd(key), "AES");
|
|
||||||
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
|
|
||||||
cipher.init(Cipher.DECRYPT_MODE, spec);
|
|
||||||
return new String(cipher.doFinal(decodeHex(data)), StandardCharsets.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String cbc(String data) throws Exception {
|
|
||||||
int indexKey = data.indexOf("2324") + 4;
|
|
||||||
String key = new String(decodeHex(data.substring(0, indexKey)), StandardCharsets.UTF_8);
|
|
||||||
key = key.replace("$#", "").replace("#$", "");
|
|
||||||
int indexIv = data.length() - 26;
|
|
||||||
String iv = data.substring(indexIv).trim();
|
|
||||||
iv = new String(decodeHex(iv), StandardCharsets.UTF_8);
|
|
||||||
SecretKeySpec keySpec = new SecretKeySpec(padEnd(key), "AES");
|
|
||||||
IvParameterSpec ivSpec = new IvParameterSpec(padEnd(iv));
|
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
|
||||||
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
|
|
||||||
data = data.substring(indexKey, indexIv).trim();
|
|
||||||
byte[] encryptDataBytes = decodeHex(data);
|
|
||||||
byte[] decryptData = cipher.doFinal(encryptDataBytes);
|
|
||||||
return new String(decryptData, StandardCharsets.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String base64(String data) {
|
|
||||||
String extract = extract(data);
|
|
||||||
if (extract.isEmpty()) return data;
|
|
||||||
return new String(Base64.getDecoder().decode(extract));
|
|
||||||
}
|
|
||||||
|
|
||||||
private String extract(String data) {
|
|
||||||
Matcher matcher = Pattern.compile("[A-Za-z0-9]{8}\\*\\*").matcher(data);
|
|
||||||
return matcher.find() ? data.substring(data.indexOf(matcher.group()) + 10) : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] padEnd(String key) {
|
|
||||||
return (key + "0000000000000000".substring(key.length())).getBytes(StandardCharsets.UTF_8);
|
|
||||||
}
|
|
||||||
|
|
||||||
private byte[] decodeHex(String s) {
|
|
||||||
return BaseEncoding.base16().decode(s.toUpperCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -14,7 +14,6 @@ public class Data {
|
||||||
private String name;
|
private String name;
|
||||||
@SerializedName("epg")
|
@SerializedName("epg")
|
||||||
private String epg;
|
private String epg;
|
||||||
|
|
||||||
@SerializedName("logo")
|
@SerializedName("logo")
|
||||||
private String logo;
|
private String logo;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue