夸克盘 ,proxy debug

This commit is contained in:
lushunming 2024-08-29 16:27:01 +08:00
parent df43a58ad6
commit 12a5463d21
13 changed files with 258 additions and 11 deletions

View File

@ -57,7 +57,7 @@ android {
dependencies {
implementation 'com.github.thegrizzlylabs:sardine-android:0.9'
implementation 'wang.harlon.quickjs:wrapper-android:2.0.0'
implementation 'wang.harlon.quickjs:wrapper-android:2.0.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
implementation 'com.google.code.gson:gson:2.11.0'
implementation 'cn.wanghaomiao:JsoupXpath:2.5.1'
@ -66,6 +66,7 @@ dependencies {
implementation 'org.jsoup:jsoup:1.15.3'
implementation 'androidx.core:core-ktx:1.10.1'
testImplementation "io.github.dokar3:quickjs-kt-jvm:1.0.0-alpha13"
testImplementation 'org.nanohttpd:nanohttpd:2.3.1'
// Required -- JUnit 4 framework
testImplementation 'junit:junit:4.12'
@ -74,8 +75,8 @@ dependencies {
testImplementation "org.robolectric:robolectric:4.13"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1"
//implementation 'wang.harlon.quickjs:wrapper-java:1.0.0'
// implementation(ext: 'aar', name: 'quickjs', group: 'fongmi', version: 'release')
// api 'wang.harlon.quickjs:wrapper-android:2.0.0'
// implementation(ext: 'aar', name: 'quickjs', group: 'fongmi', version: 'release')
// api 'wang.harlon.quickjs:wrapper-android:2.0.0'
}

View File

@ -6,6 +6,7 @@ import com.github.catvod.crawler.Spider;
import com.github.catvod.crawler.SpiderDebug;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.ProxyVideo;
import com.github.catvod.utils.Util;
import com.google.gson.Gson;
import java.io.ByteArrayInputStream;
@ -40,12 +41,12 @@ public class Proxy extends Spider {
private static final List<String> keys = Arrays.asList("url", "header", "do", "Content-Type", "User-Agent", "Host");
private static Object[] commonProxy(Map<String, String> params) throws Exception {
String url = new String(Base64.decode(params.get("url"),Base64.DEFAULT), Charset.defaultCharset());
Map<String, String> header = new Gson().fromJson(new String(Base64.decode(params.get("header"),Base64.DEFAULT), Charset.defaultCharset()), Map.class);
String url = Util.base64Decode(params.get("url"));
Map<String, String> header = new Gson().fromJson(Util.base64Decode(params.get("header")), Map.class);
if (header == null) header = new HashMap<>();
for (Map.Entry<String, String> entry : params.entrySet()) {
/* for (Map.Entry<String, String> entry : params.entrySet()) {
if (!keys.contains(entry.getKey())) header.put(entry.getKey(), entry.getValue());
}
}*/
return ProxyVideo.proxy(url, header);
}

View File

@ -0,0 +1,37 @@
import android.app.Application;
import com.github.catvod.net.OkHttp;
import com.github.catvod.net.OkResult;
import com.github.catvod.server.Server;
import com.github.catvod.utils.Json;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import java.util.ArrayList;
import java.util.Arrays;
@RunWith(RobolectricTestRunner.class)
public class ProxyTest {
// @Mock
private Application mockContext;
@org.junit.Before
public void setUp() throws Exception {
Server.get().start();
}
@org.junit.Test
public void homeContent() throws Exception {
OkResult result = OkHttp.get("http://127.0.0.1:9978/proxy?do=proxy&url=aHR0cHM6Ly92aWRlby1wbGF5LWMtemIuZHJpdmUucXVhcmsuY24vb3Y3c2RmbnMvNjc4OTQ0MDk3MC9hYWE3NGQyNTBhOWU0OGJiOTE0M2JhYjI3NzkyN2YzMTY2NTczMmI4LzY2NTczMmI4YTI4NzQ1NzZlM2ZlNDljYzliNTY3MGExMmMyYTBmYmQ/YXV0aF9rZXk9MTcyNDkzMDM2OC0yMTIxMTE0LTEwODAwLWJiNWVmYTU3OWI3OTc5NWI1ZDU1OTY2ZGY3YTJlNzVjJnNwPTE2MTcmdG9rZW49My00MTA5MDUzYmMyMzMzYTc2Yzc2MzRiODNmYTdjNGUxYy04LTItMjQyNS02OGQ5XzE4NDRkMGM3NTJiMTg4ZGUxYzVhZWY4MjMxNzc4N2JiLTAtMC0wLTAtMjMxM2U1MmFkMzNkODA5ZjgwOTg3NzBhODg1YjVhNWQmdWQ9MTYtNC0xLTItMS01LTctTi0xLTE2LTItTg==&header=eyJDb29raWUiOiJiLXVzZXItaWRcdTAwM2Q4OWVkZTM0ZS0wZWZjLWUxZGQtYzk5Ny1mMTZhYWE3OTJkMGM7IF9VUF9BNEFfMTFfXHUwMDNkd2I5NjYxYzZkZmI2NDJmODhmNzNkOGUwYzdlZGQzOTg7IGItdXNlci1pZFx1MDAzZDg5ZWRlMzRlLTBlZmMtZTFkZC1jOTk3LWYxNmFhYTc5MmQwYzsgY3Rva2VuXHUwMDNkd2xhNnAzRVVPTHluMUZTQjhJS3AxU0VXOyBncmV5LWlkXHUwMDNkNTU4M2UzMmItMzlkZi00YmYwLWYzOWYtMWFkZjgzZjYwNGEyOyBncmV5LWlkLnNpZ1x1MDAzZHA4UmVCSU1HMkJlWnUxc1l2c3VPQVp4WWJ4LU1WcnNmS0VpQ3Y4N01zVE07IGlzUXVhcmtcdTAwM2R0cnVlOyBpc1F1YXJrLnNpZ1x1MDAzZGhVZ3FPYnlrcUZvbTVZMDlibGw5NFQxc1M5YWJUMVgtNERmX2x6Z2w4bk07IF9VUF9GN0VfOERfXHUwMDNkWmt5dlZIbnJCTHAxQTFORkpJaldpMFB3S0xPVmJ4SlBjZzBSelFQSTZLbUJ0VjZaTWdQaDM4bDkzcGd1YmdIRFFxaGFaMlNmYzBxdiUyQlJhbnRiZmcxbVdHQVVwUk1QNFJxWFA3OFd2dSUyRkNmdmtXV0djNU5oQ1RWNzF0R09JR2dEQlIzJTJCdTYlMkZqajQ0S2xFNWJpU05ET1dXN0JpZ2N6Mjdsdk9UaWR6Tnc4cyUyRld0S0FJeFdibkN6Wm40JTJGSk1CVXViMVNJTWNXODlnNTdrNG1mUG1EbENncFpLenh3bDZiZVNmZHRaNFJVV1htWk9uNXY1Tmt4VktoVTR3UjBQcTdOa2xjekVHZFJxMm5JQWN1N3YyMlV3Mm8lMkZ4TVkweEJkZUM5S29ybTUlMkZOSG54bDZLJTJCZDZGWFNvVDlhM1hJTVFPMzU5YXVaUGlaV3pyTmxaZSUyQnFuT2FoWGN4N0tBaFFJUnFTT2FwU21MNHlnSm9yNHI1aXNKaFJ1RG9YeTd2SkFWdUglMkZSRHRFSko4clpUcTBCZEMyM0J6JTJCME1yc2RnYkslMkJpVzsgX1VQX0RfXHUwMDNkcGM7IF9fd3BrcmVwb3J0ZXJ3aWRfXHUwMDNkM2QzZjc0YTctOTliNy00OTE2LTNmNzgtOTExZmMyZWI5ZDg3OyB0ZnN0a1x1MDAzZGZJb1pOeGpuYmhLd1BPdTBUV1o0THNhUnFpclRjdWRTU21OYm54RDBDNVZnQ2xNbTh4TXlCLUdzblN1NHRqcE9mbEFPbVNELTlQTmlHbDEyMFhyZ2tWTmIxU3JxSGJKQk4zdFNCQUVZb1FPV1ZVVWc5cVo4bjFiR0drRDNDcUdZSU5LU0JBQmhqblhncDNfVnl3ejZnU2MwU3lqM0JXZjBtcjJETFcyNGVaZmlpb3ZFS1dlZmoxcTBzd3EzRTgyaU5FTWluTXk3U0xyY3BBNEZoM3pfWkFWaUNmaWgzUGJ0ZFc1Tl9EdVU3N0FhVGlqbVlSa0wyV3E1NEVOb3k1YTdaWHhDYm9rMzNYelM3UVNaZ3hELW95b1ZzZEdvdHFsMHAyZFZ1N3VtQzRuTFN0YmlMbVBhcmM0RkVMSHJJLWMwdTJkUFZScnM4em9aV0tDbkliTlpybEhmVUNNVXoyejhLeVhWU2xnU0ZtVW9qaDU4T3plcVR6Z3dhR2xsNFlDWUt3Y3REVjVjb1AyTEw3OWVLSHhwTlRYSG1yZTFrWlUzMkpQV0NSX0FrUDJMTDc5ZUxaUVktV2VVTmR3MS47IF9fcHVzXHUwMDNkMjA1MWM4MjI4NTE5OWQ4YmU1NTNiZTQxZGQ1YTIxMDBBQVErbW12MzVHNEZERFo1eCszTWhlMk9NYk5nd2VRMU9EYlc4ekR0OVl1UDFMUVZxSFV1QUF6OUtXTHNQanBOdGltMEFWR0h1c040TUNvc1RtYnEva2hNOyBfX2twXHUwMDNkZTY2MDQxMjAtNjA1MS0xMWVmLWJmZTQtYzMxYjZjZGQwNzY2OyBfX2twc1x1MDAzZEFBVGNaQXJWZ1M3NkVQbjBGTWFWNEhFajsgX19rdGRcdTAwM2RzaWkvaXo0ZVB6RWFvVmlyWHVsN1FRXHUwMDNkXHUwMDNkOyBfX3VpZFx1MDAzZEFBVGNaQXJWZ1M3NkVQbjBGTWFWNEhFajsgX19pdHJhY2Vfd2lkXHUwMDNkNTgyOWI5NWQtZGFjMS00OGQzLWJmZDUtZjYwY2Q5NDYyNzg2OyBfX3B1dXNcdTAwM2RhYzczZWQ0NWQ4YTJjNzIyZjdiZTM2NjM3ZTIxNGI3NEFBVHAvcTgvUXVwVDdJaUJSMUdXcVpoeHR1am9sUWVxK2VqcWVqT3NvRUdtT1E2ZHFlVXVzS0R1SU1IM3Zva2NHQU94UzlrUFlGZjBmSXdQa3F2TGRSaWdIYTBSZWQzZVFCblV5R2RrY0pMRGxaRWdtdTF2cmlLOEIyeXE4dklYeTdpb3ltM3ZXWGd1N0N1Q0JjQ0VYUkVpcWdhUVR1b1U4azY0QTVMNzNESzdPKzBrejdzRGcxTDFiSEJCWmxlWGUrR2hCdnczNkdJc0wyQkRRYmtCVkJNcCIsIlVzZXItQWdlbnQiOiJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBxdWFyay1jbG91ZC1kcml2ZS8yLjUuMjAgQ2hyb21lLzEwMC4wLjQ4OTYuMTYwIEVsZWN0cm9uLzE4LjMuNS40LWI0Nzg0OTExMDAgU2FmYXJpLzUzNy4zNiBDaGFubmVsL3Bja2tfb3RoZXJfY2giLCJSZWZlcmVyIjoiaHR0cHM6Ly9wYW4ucXVhcmsuY24vIn0=", null, null);
System.out.println(result);
}
}

View File

@ -1,5 +1,6 @@
import android.app.Application;
import com.github.catvod.server.Server;
import com.github.catvod.spider.Init;
import com.github.catvod.spider.Jianpian;
import com.github.catvod.spider.Wogg;
@ -30,6 +31,7 @@ public class WoggTest {
mockContext = RuntimeEnvironment.application;
Init.init(mockContext);
spider = new Wogg();
Server.get().start();
spider.init(mockContext, "{\"cookie\":\"b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; _UP_A4A_11_=wb9661c6dfb642f88f73d8e0c7edd398; b-user-id=89ede34e-0efc-e1dd-c997-f16aaa792d0c; ctoken=wla6p3EUOLyn1FSB8IKp1SEW; grey-id=5583e32b-39df-4bf0-f39f-1adf83f604a2; grey-id.sig=p8ReBIMG2BeZu1sYvsuOAZxYbx-MVrsfKEiCv87MsTM; isQuark=true; isQuark.sig=hUgqObykqFom5Y09bll94T1sS9abT1X-4Df_lzgl8nM; _UP_F7E_8D_=ZkyvVHnrBLp1A1NFJIjWi0PwKLOVbxJPcg0RzQPI6KmBtV6ZMgPh38l93pgubgHDQqhaZ2Sfc0qv%2BRantbfg1mWGAUpRMP4RqXP78Wvu%2FCfvkWWGc5NhCTV71tGOIGgDBR3%2Bu6%2Fjj44KlE5biSNDOWW7Bigcz27lvOTidzNw8s%2FWtKAIxWbnCzZn4%2FJMBUub1SIMcW89g57k4mfPmDlCgpZKzxwl6beSfdtZ4RUWXmZOn5v5NkxVKhU4wR0Pq7NklczEGdRq2nIAcu7v22Uw2o%2FxMY0xBdeC9Korm5%2FNHnxl6K%2Bd6FXSoT9a3XIMQO359auZPiZWzrNlZe%2BqnOahXcx7KAhQIRqSOapSmL4ygJor4r5isJhRuDoXy7vJAVuH%2FRDtEJJ8rZTq0BdC23Bz%2B0MrsdgbK%2BiW; _UP_D_=pc; __wpkreporterwid_=3d3f74a7-99b7-4916-3f78-911fc2eb9d87; tfstk=fIoZNxjnbhKwPOu0TWZ4LsaRqirTcudSSmNbnxD0C5VgClMm8xMyB-GsnSu4tjpOflAOmSD-9PNiGl120XrgkVNb1SrqHbJBN3tSBAEYoQOWVUUg9qZ8n1bGGkD3CqGYINKSBABhjnXgp3_Vywz6gSc0Syj3BWf0mr2DLW24eZfiiovEKWefj1q0swq3E82iNEMinMy7SLrcpA4Fh3z_ZAViCfih3PbtdW5N_DuU77AaTijmYRkL2Wq54ENoy5a7ZXxCbok33XzS7QSZgxD-oyoVsdGotql0p2dVu7umC4nLStbiLmParc4FELHrI-c0u2dPVRrs8zoZWKCnIbNZrlHfUCMUz2z8KyXVSlgSFmUojh58OzeqTzgwaGll4YCYKwctDV5coP2LL79eKHxpNTXHmre1kZU32JPWCR_AkP2LL79eLZQY-WeUNdw1.; __pus=2051c82285199d8be553be41dd5a2100AAQ+mmv35G4FDDZ5x+3Mhe2OMbNgweQ1ODbW8zDt9YuP1LQVqHUuAAz9KWLsPjpNtim0AVGHusN4MCosTmbq/khM; __kp=e6604120-6051-11ef-bfe4-c31b6cdd0766; __kps=AATcZArVgS76EPn0FMaV4HEj; __ktd=sii/iz4ePzEaoVirXul7QQ==; __uid=AATcZArVgS76EPn0FMaV4HEj; __itrace_wid=5829b95d-dac1-48d3-bfd5-f60cd9462786; __puus=7da0b96cb710fa1b376934485f977e05AATp/q8/QupT7IiBR1GWqZhxlIRT677smMvoHlLxQA0Lk6CkP0YJBOTl+p9DZgzlMz6w4hPXPgWsokukk8PW7ZfhFfPmv8tKMgLpCGLW+tk57luhNghmSdTeVPkAF59STtyCPBEtiNzNAd/zZJ6qILJDi5ywEBAAAg+gOyWHoLHNUR+QxeHRuQa8g5WWA95J8jebIlrr8rCvI1vjTbtiYktT\",\"token\":\"26fc6787afff43e78b78992e782502f1\"}");
}
@ -94,4 +96,6 @@ public class WoggTest {
System.out.println("searchContent--" + gson.toJson(map));
Assert.assertFalse(map.getAsJsonArray("list").isEmpty());
}
}

View File

@ -0,0 +1,92 @@
package com.github.catvod.server;
import com.google.common.net.HttpHeaders;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import fi.iki.elonen.NanoHTTPD;
public class Nano extends NanoHTTPD {
private List<Process> process;
public Nano(int port) {
super(port);
addProcess();
}
private void addProcess() {
process = new ArrayList<>();
process.add(new Proxy());
}
public static Response success() {
return success("OK");
}
public static Response success(String text) {
return newFixedLengthResponse(Response.Status.OK, MIME_PLAINTEXT, text);
}
public static Response error(String text) {
return error(Response.Status.INTERNAL_ERROR, text);
}
public static Response error(Response.IStatus status, String text) {
return newFixedLengthResponse(status, MIME_PLAINTEXT, text);
}
public static Response redirect(String url, Map<String, String> headers) {
Response response = newFixedLengthResponse(Response.Status.REDIRECT, MIME_HTML, "");
for (Map.Entry<String, String> entry : headers.entrySet()) response.addHeader(entry.getKey(), entry.getValue());
response.addHeader(HttpHeaders.LOCATION, url);
return response;
}
@Override
public Response serve(IHTTPSession session) {
String url = session.getUri().trim();
Map<String, String> files = new HashMap<>();
if (session.getMethod() == Method.POST) parse(session, files);
if (url.contains("?")) url = url.substring(0, url.indexOf('?'));
for (Process process : process)
if (process.isRequest(session, url)) return process.doResponse(session, url, files);
return null;
}
private void parse(IHTTPSession session, Map<String, String> files) {
String ct = session.getHeaders().get("content-type");
if (ct != null && ct.toLowerCase().contains("multipart/form-data") && !ct.toLowerCase().contains("charset=")) {
Matcher matcher = Pattern.compile("[ |\t]*(boundary[ |\t]*=[ |\t]*['|\"]?[^\"^'^;^,]*['|\"]?)", Pattern.CASE_INSENSITIVE).matcher(ct);
String boundary = matcher.find() ? matcher.group(1) : null;
if (boundary != null)
session.getHeaders().put("content-type", "multipart/form-data; charset=utf-8; " + boundary);
}
try {
session.parseBody(files);
} catch (Exception ignored) {
}
}
@Override
public void start() throws IOException {
super.start();
}
@Override
public void stop() {
super.stop();
}
}

View File

@ -0,0 +1,12 @@
package com.github.catvod.server;
import java.util.Map;
import fi.iki.elonen.NanoHTTPD;
public interface Process {
boolean isRequest(NanoHTTPD.IHTTPSession session, String path);
NanoHTTPD.Response doResponse(NanoHTTPD.IHTTPSession session, String path, Map<String, String> files);
}

View File

@ -0,0 +1,34 @@
package com.github.catvod.server;
import java.io.InputStream;
import java.util.Map;
import fi.iki.elonen.NanoHTTPD;
public class Proxy implements Process {
@Override
public boolean isRequest(NanoHTTPD.IHTTPSession session, String path) {
return "/proxy".equals(path);
}
@Override
public NanoHTTPD.Response doResponse(NanoHTTPD.IHTTPSession session, String path, Map<String, String> files) {
try {
Map<String, String> params = session.getParms();
params.putAll(session.getHeaders());
Object[] rs = com.github.catvod.spider.Proxy.proxy(params);
if (rs[0] instanceof NanoHTTPD.Response) return (NanoHTTPD.Response) rs[0];
NanoHTTPD.Response response = NanoHTTPD.newChunkedResponse(NanoHTTPD.Response.Status.lookup((Integer) rs[0]), (String) rs[1], (InputStream) rs[2]);
if (rs.length > 3 && rs[3] != null)
for (Map.Entry<String, String> entry : ((Map<String, String>) rs[3]).entrySet())
response.addHeader(entry.getKey(), entry.getValue());
return response;
} catch (Exception e) {
return Nano.error(e.getMessage());
}
}
}

View File

@ -0,0 +1,66 @@
package com.github.catvod.server;
import com.github.catvod.crawler.SpiderDebug;
public class Server {
private Nano nano;
private int port;
private static class Loader {
static volatile Server INSTANCE = new Server();
}
public static Server get() {
return Loader.INSTANCE;
}
public Server() {
this.port = 9978;
}
public int getPort() {
return port;
}
public String getAddress() {
return getAddress(false);
}
public String getAddress(int tab) {
return getAddress(false) + "?tab=" + tab;
}
public String getAddress(String path) {
return getAddress(true) + path;
}
public String getAddress(boolean local) {
return "http://" + (local ? "127.0.0.1" : "127.0.0.1") + ":" + getPort();
}
public void start() {
if (nano != null) return;
do {
try {
nano = new Nano(port);
// Proxy.set(port);
nano.start();
System.out.println("server start at:" + port);
break;
} catch (Exception e) {
++port;
nano.stop();
nano = null;
}
} while (port < 9999);
}
public void stop() {
if (nano != null) nano.stop();
nano = null;
}
}

Binary file not shown.

View File

@ -1 +1 @@
a160908c93959ce7d1f91533e9083096
d97df3dc4d21b9de101d27c824b39176

View File

@ -1,5 +1,5 @@
{
"spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;a160908c93959ce7d1f91533e9083096",
"spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;d97df3dc4d21b9de101d27c824b39176",
"lives": [
{
"name": "直播ipv6",

View File

@ -1,5 +1,5 @@
{
"spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;a160908c93959ce7d1f91533e9083096",
"spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;d97df3dc4d21b9de101d27c824b39176",
"lives": [
{
"name": "直播ipv6",

View File

@ -1,5 +1,5 @@
{
"spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;a160908c93959ce7d1f91533e9083096",
"spider": "https://androidcatvodspider.pages.dev/jar/custom_spider.jar;md5;d97df3dc4d21b9de101d27c824b39176",
"lives": [
{
"name": "直播ipv6",