From 209e9c28662b55449895b75635fb03442c2c86a1 Mon Sep 17 00:00:00 2001
From: QAIU <736226400@qq.com>
Date: Mon, 30 Sep 2024 17:38:36 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9B=BD=E5=BA=86=E5=BF=AB=E4=B9=90=20^=20^=20?=
=?UTF-8?q?#59?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
note.txt | 10 +++
.../src/main/java/cn/qaiu/parser/PanBase.java | 7 ++
.../cn/qaiu/parser/PanDomainTemplate.java | 2 +-
.../main/java/cn/qaiu/parser/impl/LeTool.java | 8 +-
.../main/java/cn/qaiu/util/IpExtractor.java | 80 +++++++++++++++++++
.../java/cn/qaiu/util/PanExceptionUtils.java | 12 +++
.../src/main/java/cn/qaiu/util/ReqIpUtil.java | 74 +++++++++++++++++
.../src/main/resources/http-tools/temp.http | 66 +++++++++++++++
.../src/main/resources/http-tools/test.http | 4 +-
9 files changed, 259 insertions(+), 4 deletions(-)
create mode 100644 parser/src/main/java/cn/qaiu/util/IpExtractor.java
create mode 100644 parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java
create mode 100644 parser/src/main/java/cn/qaiu/util/ReqIpUtil.java
create mode 100644 web-service/src/main/resources/http-tools/temp.http
diff --git a/note.txt b/note.txt
index 93c71d6..86f716a 100644
--- a/note.txt
+++ b/note.txt
@@ -22,3 +22,13 @@ Cloudreve自建网盘 (ce) {origin}/s/{shareKey}
https://f.ws59.cn/f/e3peohu6192
+
+开源版 TODO
+1. 缓存优化, 配置自动重载
+
+
+专属版 功能设计
+1. 支持绑定域名, 后台管理-账号管理, token管理, 账号解析次数限制
+2. 流量统计, 文件分享信息, 目录解析, 文件云下载
+3. IP代理池
+
diff --git a/parser/src/main/java/cn/qaiu/parser/PanBase.java b/parser/src/main/java/cn/qaiu/parser/PanBase.java
index ed32746..75e6e2e 100644
--- a/parser/src/main/java/cn/qaiu/parser/PanBase.java
+++ b/parser/src/main/java/cn/qaiu/parser/PanBase.java
@@ -6,6 +6,8 @@ import io.vertx.core.Handler;
import io.vertx.core.Promise;
import io.vertx.core.json.DecodeException;
import io.vertx.core.json.JsonObject;
+import io.vertx.core.net.ProxyOptions;
+import io.vertx.core.net.ProxyType;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
@@ -38,6 +40,11 @@ public abstract class PanBase {
protected WebClient clientNoRedirects = WebClient.create(WebClientVertxInit.get(),
new WebClientOptions().setFollowRedirects(false));
+ // test proxy
+ protected WebClient proxyClient = WebClient.create(WebClientVertxInit.get(), new WebClientOptions()
+ .setUserAgentEnabled(false).setFollowRedirects(false)
+ .setProxyOptions(new ProxyOptions().setHost("101.251.204.174").setPort(8080).setType(ProxyType.HTTP)));
+
protected ShareLinkInfo shareLinkInfo;
/**
diff --git a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java
index 0fd89b2..7667aec 100644
--- a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java
+++ b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java
@@ -75,7 +75,7 @@ public enum PanDomainTemplate {
// 通用域名([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}
CE("Cloudreve",
"https://([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}/s/(.+)",
- "https://{CloudreveName}/s/{shareKey}",
+ "https://{CloudreveDomainName}/s/{shareKey}",
CeTool.class);
diff --git a/parser/src/main/java/cn/qaiu/parser/impl/LeTool.java b/parser/src/main/java/cn/qaiu/parser/impl/LeTool.java
index 8417e9b..8039d1f 100644
--- a/parser/src/main/java/cn/qaiu/parser/impl/LeTool.java
+++ b/parser/src/main/java/cn/qaiu/parser/impl/LeTool.java
@@ -1,11 +1,16 @@
package cn.qaiu.parser.impl;
+import cn.qaiu.WebClientVertxInit;
import cn.qaiu.entity.ShareLinkInfo;
import cn.qaiu.parser.IPanTool;
import cn.qaiu.parser.PanBase;
import io.vertx.core.Future;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
+import io.vertx.core.net.ProxyOptions;
+import io.vertx.core.net.ProxyType;
+import io.vertx.ext.web.client.WebClient;
+import io.vertx.ext.web.client.WebClientOptions;
import java.util.UUID;
@@ -24,6 +29,7 @@ public class LeTool extends PanBase implements IPanTool {
final String pwd = shareLinkInfo.getSharePassword();
// {"shareId":"xxx","password":"xxx","directoryId":"-1"}
String apiUrl1 = API_URL_PREFIX + "shareInfo";
+
client.postAbs(apiUrl1)
.sendJsonObject(JsonObject.of("shareId", dataKey, "password", pwd, "directoryId", -1))
.onSuccess(res -> {
@@ -79,7 +85,7 @@ public class LeTool extends PanBase implements IPanTool {
return;
}
// 获取重定向链接跳转链接
- clientNoRedirects.getAbs(downloadUrl).send()
+ client.getAbs(downloadUrl).send()
.onSuccess(res2 -> promise.complete(res2.headers().get("Location")))
.onFailure(handleFail(downloadUrl));
} else {
diff --git a/parser/src/main/java/cn/qaiu/util/IpExtractor.java b/parser/src/main/java/cn/qaiu/util/IpExtractor.java
new file mode 100644
index 0000000..f8bc7ea
--- /dev/null
+++ b/parser/src/main/java/cn/qaiu/util/IpExtractor.java
@@ -0,0 +1,80 @@
+package cn.qaiu.util;
+
+import io.vertx.core.MultiMap;
+import io.vertx.core.Vertx;
+import io.vertx.core.http.impl.headers.HeadersMultiMap;
+import io.vertx.ext.web.client.WebClient;
+import io.vertx.ext.web.client.WebClientSession;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.ArrayList;
+import java.util.List;
+
+public class IpExtractor {
+ public static void main(String[] args) throws InterruptedException {
+
+
+ // 创建请求头Map
+ MultiMap headers = new HeadersMultiMap();
+ headers.add("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");
+ headers.add("accept-language", "zh-CN,zh;q=0.9,en;q=0.8");
+ headers.add("cache-control", "no-cache");
+ headers.add("dnt", "1");
+ headers.add("origin", "https://ip.ihuan.me");
+ headers.add("pragma", "no-cache");
+ headers.add("priority", "u=0, i");
+ headers.add("referer", "https://ip.ihuan.me/ti.html");
+ headers.add("sec-ch-ua", "\"Google Chrome\";v=\"129\", \"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"129\"");
+ headers.add("sec-ch-ua-mobile", "?0");
+ headers.add("sec-ch-ua-platform", "\"Windows\"");
+ headers.add("sec-fetch-dest", "document");
+ headers.add("sec-fetch-mode", "navigate");
+ headers.add("sec-fetch-site", "same-origin");
+ headers.add("sec-fetch-user", "?1");
+ headers.add("upgrade-insecure-requests", "1");
+ headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36");
+ headers.add("Content-Type", "application/x-www-form-urlencoded");
+
+ WebClient client = WebClient.create(Vertx.vertx());
+ WebClientSession webClientSession = WebClientSession.create(client);
+ webClientSession.getAbs("https://ip.ihuan.me").putHeaders(headers).send().onSuccess(res->{
+ System.out.println(res.toString());
+ webClientSession.getAbs("https://ip.ihuan.me").putHeaders(headers).send().onSuccess(res2->{
+ System.out.println(res2.toString());
+
+ });
+ });
+//
+// String htmlContent = "
提取结果
\n" +
+// "111.1.27.85:80
42.63.65.46:80
118.195.242.20:8080
42.63.65.119:80
117.50.108.90:7890
116.62.50.250:7890
114.231.8.177:8089
190.43.92.90:999
221.178.85.68:8080
61.160.202.86:80
42.63.65.86:80
42.63.65.7:80
42.63.65.41:80
159.226.227.119:80
61.160.202.52:80
42.63.65.15:80
112.17.16.204:80
61.160.202.53:80
42.63.65.9:80
42.63.65.60:80
42.63.65.18:80
203.190.115.177:8071
42.63.65.38:80
42.63.65.31:80
91.185.3.126:8080
139.9.119.20:80
1.15.47.213:443
183.164.243.108:8089
165.225.208.177:80
194.163.132.232:3128
91.235.220.122:80
39.100.120.200:7890
141.147.33.121:80
183.164.243.138:8089
104.129.205.94:54321
117.160.250.138:81
180.120.213.208:8089
61.130.9.37:443
182.34.18.206:9999
117.86.12.150:8089
27.192.173.108:9000
183.164.243.11:8089
114.231.41.205:8089
103.104.233.78:8080
183.164.243.174:8089
36.6.144.230:8089
111.224.213.239:8089
182.92.73.106:80
36.6.145.81:8089
117.69.232.125:8089
36.6.144.64:8089
117.57.92.20:8089
47.100.69.29:8888
117.57.93.246:8089
120.234.203.171:9002
114.231.46.231:8089
183.164.242.199:8089
117.69.237.179:8089
182.44.32.239:7890
47.100.91.57:8080
117.69.236.127:8089
114.231.8.18:8089
117.69.232.183:8089
117.69.237.29:8089
183.164.242.67:8089
183.164.242.35:8089
183.164.243.71:8089
113.223.214.155:8089
36.6.145.132:8089
182.106.220.252:9091
113.223.212.176:8089
62.152.53.186:8909
117.57.92.16:8089
183.164.243.186:8089
36.6.144.210:8089
183.164.242.189:8089
213.178.39.170:8080
121.52.145.163:8080
36.6.144.240:8089
60.188.5.234:80
113.223.213.48:8089
183.164.243.149:8089
200.58.87.195:8080
36.6.144.153:8089
36.6.144.67:8089
36.6.145.182:8089
117.57.93.226:8089
42.112.24.127:8888
43.138.20.156:80
117.57.92.79:8089
65.109.111.238:3128
183.166.137.201:41122
113.223.213.150:8089
36.6.145.154:8089
185.5.209.101:80
36.6.144.17:8089
114.231.8.244:8089
117.69.237.24:8089
117.69.236.232:8089
117.69.236.127:8089
114.231.8.18:8089
117.69.232.183:8089
117.69.237.29:8089
183.164.242.67:8089
183.164.242.35:8089
183.164.243.71:8089
113.223.214.155:8089
36.6.145.132:8089
182.106.220.252:9091
113.223.212.176:8089
62.152.53.186:8909
117.57.92.16:8089
183.164.243.186:8089
36.6.144.210:8089
183.164.242.189:8089
213.178.39.170:8080
121.52.145.163:8080
36.6.144.240:8089
60.188.5.234:80
113.223.213.48:8089
183.164.243.149:8089
200.58.87.195:8080
36.6.144.153:8089
36.6.144.67:8089
36.6.145.182:8089
117.57.93.226:8089
42.112.24.127:8888
43.138.20.156:80
117.57.92.79:8089
65.109.111.238:3128
183.166.137.201:41122
113.223.213.150:8089
36.6.145.154:8089
185.5.209.101:80
36.6.144.17:8089
114.231.8.244:8089
117.69.237.24:8089
117.69.236.232:8089
";
+//
+// // 正则表达式匹配提取结果关键字下面的IP地址
+// Pattern pattern = Pattern.compile("提取结果
\\s*([\\s\\S]*?)(?=
)", Pattern.DOTALL);
+// Matcher matcher = pattern.matcher(htmlContent);
+//
+// if (matcher.find()) {
+// String ipText = matcher.group(1); // 获取匹配的IP地址部分
+// Pattern ipPattern = Pattern.compile("(?:[0-9]{1,3}\\.){3}[0-9]{1,3}(?::\\d+)?");
+// Matcher ipMatcher = ipPattern.matcher(ipText);
+//
+// List ips = new ArrayList<>();
+// while (ipMatcher.find()) {
+// ips.add(ipMatcher.group());
+// }
+//
+// System.out.println("提取到的IP地址:");
+// for (String ip : ips) {
+//// System.out.println(ip);
+// }
+// } else {
+// System.out.println("没有找到匹配的IP地址");
+// }
+//
+// TimeUnit.SECONDS.sleep(1000);
+ }
+}
+
diff --git a/parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java b/parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java
new file mode 100644
index 0000000..a0bc6af
--- /dev/null
+++ b/parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java
@@ -0,0 +1,12 @@
+package cn.qaiu.util;
+
+/**
+ * @author QAIU
+ * @date 2023/7/16 1:53
+ */
+public class PanExceptionUtils {
+
+ public static RuntimeException fillRunTimeException(String name, String dataKey, Throwable t) {
+ return new RuntimeException(name + ": 请求异常: key = " + dataKey, t.fillInStackTrace());
+ }
+}
diff --git a/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java b/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java
new file mode 100644
index 0000000..84384ce
--- /dev/null
+++ b/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java
@@ -0,0 +1,74 @@
+package cn.qaiu.util;
+
+import io.vertx.core.AsyncResult;
+import io.vertx.core.MultiMap;
+import io.vertx.core.Vertx;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.core.http.impl.headers.HeadersMultiMap;
+import io.vertx.ext.web.client.HttpResponse;
+import io.vertx.ext.web.client.WebClient;
+import io.vertx.ext.web.client.WebClientSession;
+
+public class ReqIpUtil {
+ public static String BASE_URL = "https://ip.ihuan.me";
+ public static String BASE_URL_TEMPLATE = BASE_URL + "/{path}";
+
+ // GET https://ip.ihuan.me/mouse.do -> $("input[name='key']").val("30b4975b5547fed806bd2b9caa18485a");
+ public static String PATH1 = "mouse.do";
+
+ public static String PATH2 = "tqdl.html";
+
+ // 创建请求头Map
+ static MultiMap headers = new HeadersMultiMap();
+
+ static {
+
+ headers.set("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");
+ headers.set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8");
+ headers.set("cache-control", "no-cache");
+ headers.set("dnt", "1");
+ headers.set("origin", "https://ip.ihuan.me");
+ headers.set("pragma", "no-cache");
+ headers.set("priority", "u=0, i");
+ headers.set("referer", "https://ip.ihuan.me");
+ headers.set("sec-ch-ua", "\"Google Chrome\";v=\"129\", \"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"129\"");
+ headers.set("sec-ch-ua-mobile", "?0");
+ headers.set("sec-ch-ua-platform", "\"Windows\"");
+ headers.set("sec-fetch-dest", "document");
+ headers.set("sec-fetch-mode", "navigate");
+ headers.set("sec-fetch-site", "same-origin");
+ headers.set("sec-fetch-user", "?1");
+ headers.set("upgrade-insecure-requests", "1");
+// headers.set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36");
+
+ }
+
+
+ Vertx vertx = Vertx.vertx();
+ WebClient webClient = WebClient.create(vertx);
+ // 发送GET请求
+ WebClientSession webClientSession = WebClientSession.create(webClient);
+
+
+ public void exec() {
+ webClientSession.getAbs(BASE_URL)
+ .putHeaders(headers) // 将请求头Map添加到请求中
+ .send(this::next);
+ }
+
+ void next(AsyncResult> response) {
+ if (response.failed()) {
+ response.cause().printStackTrace();
+ } else {
+ HttpResponse res = response.result();
+ System.out.println("Received response with status code " + res.statusCode());
+ System.out.println("Body: " + res.body());
+ webClientSession.getAbs(BASE_URL_TEMPLATE).setTemplateParam("path", PATH1)
+ .putHeaders(headers) // 将请求头Map添加到请求中
+ .send(response2 -> {
+ System.out.println(response2.result().bodyAsString());
+ });
+ }
+
+ }
+}
diff --git a/web-service/src/main/resources/http-tools/temp.http b/web-service/src/main/resources/http-tools/temp.http
new file mode 100644
index 0000000..7cc3e5d
--- /dev/null
+++ b/web-service/src/main/resources/http-tools/temp.http
@@ -0,0 +1,66 @@
+# curl 'https://ip.ihuan.me/tqdl.html'
+# -H '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'
+# -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8'
+# -H 'cache-control: no-cache'
+# -H 'content-type: application/x-www-form-urlencoded'
+# -H 'cookie: 91e73cee101cc3ecefd9ca31a227d508=4380c9f80effb56e85210a54dc286c06; statistics=16453d6e2683b8800ded2a27c7f595d9; Hm_lvt_8ccd0ef22095c2eebfe4cd6187dea829=1727664099; HMACCOUNT=AA7CAD3BA9E39EC8; 28114211b4e11617bd725475433e69aa=29d9778b3f2c1b30c137fef0d6728e29; Hm_lpvt_8ccd0ef22095c2eebfe4cd6187dea829=1727667138'
+# -H 'dnt: 1'
+# -H 'origin: https://ip.ihuan.me'
+# -H 'pragma: no-cache'
+# -H 'priority: u=0, i'
+# -H 'referer: https://ip.ihuan.me/ti.html'
+# -H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"'
+# -H 'sec-ch-ua-mobile: ?0'
+# -H 'sec-ch-ua-platform: "Windows"'
+# -H 'sec-fetch-dest: document'
+# -H 'sec-fetch-mode: navigate'
+# -H 'sec-fetch-site: same-origin'
+# -H 'sec-fetch-user: ?1'
+# -H 'upgrade-insecure-requests: 1'
+# -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
+# --data-raw 'num=100&port=&kill_port=&address=&kill_address=&anonymity=&type=&post=&sort=&key=15146aca2e04e3756a2e79ec33ca5679'
+#@no-cookie-jar
+POST https://ip.ihuan.me/tqdl.html
+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
+accept-language: zh-CN,zh;q=0.9,en;q=0.8
+cache-control: no-cache
+cookie: 91e73cee101cc3ecefd9ca31a227d508=4380c9f80effb56e85210a54dc286c06; statistics=16453d6e2683b8800ded2a27c7f595d9; Hm_lvt_8ccd0ef22095c2eebfe4cd6187dea829=1727664099; HMACCOUNT=AA7CAD3BA9E39EC8; 28114211b4e11617bd725475433e69aa=29d9778b3f2c1b30c137fef0d6728e29; Hm_lpvt_8ccd0ef22095c2eebfe4cd6187dea829=1727667138
+dnt: 1
+origin: https://ip.ihuan.me
+pragma: no-cache
+priority: u=0, i
+referer: https://ip.ihuan.me/ti.html
+sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"
+sec-ch-ua-mobile: ?0
+sec-ch-ua-platform: "Windows"
+sec-fetch-dest: document
+sec-fetch-mode: navigate
+sec-fetch-site: same-origin
+sec-fetch-user: ?1
+upgrade-insecure-requests: 1
+user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
+Content-Type: application/x-www-form-urlencoded
+
+num=100&port=&kill_port=&address=&kill_address=&anonymity=&type=&post=&sort=&key=15146aca2e04e3756a2e79ec33ca5679
+
+###
+https://ip.ihuan.me/
+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
+accept-language: zh-CN,zh;q=0.9,en;q=0.8
+cache-control: no-cache
+#cookie: 91e73cee101cc3ecefd9ca31a227d508=4380c9f80effb56e85210a54dc286c06; statistics=16453d6e2683b8800ded2a27c7f595d9; Hm_lvt_8ccd0ef22095c2eebfe4cd6187dea829=1727664099; HMACCOUNT=AA7CAD3BA9E39EC8; 28114211b4e11617bd725475433e69aa=29d9778b3f2c1b30c137fef0d6728e29; Hm_lpvt_8ccd0ef22095c2eebfe4cd6187dea829=1727667138
+dnt: 1
+origin: https://ip.ihuan.me
+pragma: no-cache
+priority: u=0, i
+referer: https://ip.ihuan.me
+sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"
+sec-ch-ua-mobile: ?0
+sec-ch-ua-platform: "Windows"
+sec-fetch-dest: document
+sec-fetch-mode: navigate
+sec-fetch-site: same-origin
+sec-fetch-user: ?1
+upgrade-insecure-requests: 1
+user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
+Content-Type: application/x-www-form-urlencoded
diff --git a/web-service/src/main/resources/http-tools/test.http b/web-service/src/main/resources/http-tools/test.http
index d809cbb..088d6c9 100644
--- a/web-service/src/main/resources/http-tools/test.http
+++ b/web-service/src/main/resources/http-tools/test.http
@@ -140,7 +140,7 @@ https://f.wss.cc/f/f25625rv6p6
### TODO Cloudreve
GET http://127.0.0.1:6400/json/ce/pan.huang1111.cn_s_wDz5TK
-### TODO Cloudreve2
+### Cloudreve2
GET http://127.0.0.1:6400/json/ce/pan.huang1111.cn_s_g31PcQ@qaiu
### Cloudreve类 PASS
@@ -150,7 +150,7 @@ GET http://127.0.0.1:6400/json/ce/pan.huang1111.cn_s_g31PcQ@qaiu
#GET http://127.0.0.1:6400/parser?url=https://pan.huang1111.cn/s/g31PcQ&pwd=qaiu
# @no-redirect
-GET http://127.0.0.1:6400/v2/linkInfo?url=https://pan.seeoss.com/s/nLNsQ
+GET http://127.0.0.1:6400/parser?url=https://pan.seeoss.com/s/nLNsQ