- 加入360亿方云直链解析

- 优化代码
This commit is contained in:
QAIU
2023-06-10 13:29:22 +08:00
parent 635c639bf5
commit 3f4f9fa76b
7 changed files with 274 additions and 65 deletions

View File

@@ -18,6 +18,9 @@
- 小飞机网盘 (fj)
- [ ] 登录, 上传, 下载, 分享
- [x] 直链解析
- 亿方云 (fc)
- [ ] 登录, 上传, 下载, 分享
- [x] 直链解析
- 文叔叔 (ws)
- 夸克网盘 (qk)
- TODO
@@ -27,37 +30,51 @@ Jdk17+Vert.x4.4.1+Jsoup
Core模块集成Vert.x实现类spring的注解式路由API
API接口
```shell
(括号内表示可选内容)
```
括号内可选内容: 表示当带有分享密码时需要加上密码参数
parse接口加上参数pwd=密码;其他接口在分享Key后面加上$密码
1. 解析并自动302跳转 :
http(s)://you_host/parser?url=分享链接
http(s)://you_host/网盘标识/分享id(#分享密码)
http(s)://you_host/parser?url=分享链接(&pwd=xxx)
http(s)://you_host/网盘标识/分享id($分享密码)
2. 获取解析后的直链--JSON格式
http(s)://you_host/json/网盘标识/分享id(#分享密码)
http(s)://you_host/json/网盘标识/分享id($分享密码)
3. 有些网盘的加密分享的密码可以忽略: 如移动云空间,小飞机网盘
```
示例:
IDEA HttpClient示例:
```
// 解析并重定向到直链
###
# 解析并重定向到直链
### 蓝奏云普通分享
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://lanzoux.com/ia2cntg
###
### 奶牛快传普通分享
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://cowtransfer.com/s/9a644fe3e3a748
### 360亿方云加密分享
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://v2.fangcloud.com/sharing/e5079007dc31226096628870c7&pwd=QAIU
// Rest请求(只提供共享文件Id):
###
# Rest请求自动302跳转(只提供共享文件Id):
### 蓝奏云普通分享
# @no-redirect
GET http://127.0.0.1:6400/lz/ia2cntg
### 奶牛快传普通分享
# @no-redirect
GET http://127.0.0.1:6400/cow/9a644fe3e3a748
### 360亿方云加密分享
GET http://127.0.0.1:6400/json/fc/e5079007dc31226096628870c7$QAIU
// 解析返回json直链
###
GET http://127.0.0.1:6400/json/cow/9a644fe3e3a748
###
# 解析返回json直链
### 蓝奏云普通分享
GET http://127.0.0.1:6400/json/lz/ia2cntg
### 奶牛快传普通分享
GET http://127.0.0.1:6400/json/cow/9a644fe3e3a748
### 360亿方云加密分享
GET http://127.0.0.1:6400/json/fc/e5079007dc31226096628870c7$QAIU
```
@@ -67,12 +84,16 @@ TODO:
# 网盘对比
| 网盘名称 | 可直接下载分享 | 加密分享 | 初始网盘空间 | 单文件大小限制 | 登录接口 |
|------------|---------|----------|----------|---------|------|
| 蓝奏云 | √ | √ | 不限空间 | 100M | TODO |
| 奶牛快传 | √ | X | 10G | 不限大小 | TODO |
| 移动云空间 | √ | √(密码可忽略) | 5G(个人) | 不限大小 | TODO |
| UC网盘 | √ | √ | 10G | 不限大小 | TODO |
| 小飞机网盘 | √ | √(密码可忽略) | 10G | 不限大小 | TODO |
| 夸克网盘(TODO) | 需要登录 | √ | 10G(20G) | 不限大小 | TODO |
| 网盘名称 | 可直接下载分享 | 加密分享 | 初始网盘空间 | 单文件大小限制 | 登录接口 |
|------------|------------|----------|-----------|---------|------|
| 蓝奏云 | √ | √ | 不限空间 | 100M | TODO |
| 奶牛快传 | √ | X | 10G | 不限大小 | TODO |
| 移动云空间 | √ | √(密码可忽略) | 5G(个人) | 不限大小 | TODO |
| UC网盘 | √ | √ | 10G | 不限大小 | TODO |
| 小飞机网盘 | √ | √(密码可忽略) | 10G | 不限大小 | TODO |
| 360亿方云 | √(注意有流量限制) | √(密码可忽略) | 100G(须实名) | 不限大小 | TODO |
| 文叔叔(TODO) | √(注意有时间限制) | √ | 10G | 不限大小 | TODO |
| 夸克网盘(TODO) | 需要登录 | √ | 10G(20G) | 不限大小 | TODO |
# 打包部署
TODO

View File

@@ -0,0 +1,105 @@
package cn.qaiu.lz.common.util;
import cn.qaiu.vx.core.util.VertxHolder;
import io.vertx.core.Future;
import io.vertx.core.MultiMap;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import io.vertx.ext.web.client.WebClientSession;
import io.vertx.uritemplate.UriTemplate;
import org.apache.commons.lang3.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 亿方云
*/
public class FcTool {
public static final String SHARE_URL_PREFIX = "https://v2.fangcloud.com/sharing/";
public static final String SHARE_URL_PREFIX2 = "https://v2.fangcloud.cn/sharing/";
private static final String DOWN_REQUEST_URL = "https://v2.fangcloud.cn/apps/files/download?file_id={fid}" +
"&scenario=share&unique_name={uname}";
public static Future<String> parse(String data, String code) {
String dataKey = CommonUtils.parseURL(SHARE_URL_PREFIX, data);
Promise<String> promise = Promise.promise();
Vertx vertx = VertxHolder.getVertxInstance();
WebClient client = WebClient.create(vertx);
WebClientSession sClient = WebClientSession.create(client);
// 第一次请求 自动重定向
sClient.getAbs(SHARE_URL_PREFIX + dataKey).send().onSuccess(res -> {
// 判断是否是加密分享
if (StringUtils.isNotEmpty(code)) {
// 获取requesttoken
String html = res.bodyAsString();
Pattern compile = Pattern.compile("name=\"requesttoken\"\\s+value=\"([a-zA-Z0-9_+=]+)\"");
Matcher matcher = compile.matcher(html);
if (!matcher.find()) {
promise.fail(SHARE_URL_PREFIX + " 未匹配到加密分享的密码输入页面的requesttoken: \n" + html);
return;
}
String token = matcher.group(1);
sClient.postAbs(SHARE_URL_PREFIX2 + dataKey).sendForm(MultiMap.caseInsensitiveMultiMap()
.set("requesttoken", token)
.set("password", code)).onSuccess(res2 -> {
if (res2.statusCode() == 302) {
sClient.getAbs(res2.getHeader("Location")).send().onSuccess(res3 -> {
getDownURL(dataKey, promise, res3, sClient);
});
} else {
promise.fail(SHARE_URL_PREFIX + " 密码跳转后获取重定向失败 \n" + html);
}
});
return;
}
getDownURL(dataKey, promise, res, sClient);
});
return promise.future();
}
private static void getDownURL(String dataKey, Promise<String> promise, HttpResponse<Buffer> res,
WebClientSession sClient) {
// 从HTML中找到文件id
String html = res.bodyAsString();
Pattern compile = Pattern.compile("id=\"typed_id\"\\s+value=\"file_(\\d+)\"");
Matcher matcher = compile.matcher(html);
if (!matcher.find()) {
promise.fail(SHARE_URL_PREFIX + " 未匹配到文件id(typed_id): \n" + html);
return;
}
String fid = matcher.group(1);
// 创建一个不自动重定向的WebClientSession
WebClient clientNoRedirects = WebClient.create(VertxHolder.getVertxInstance(),
new WebClientOptions().setFollowRedirects(false));
WebClientSession sClientNoRedirects = WebClientSession.create(clientNoRedirects, sClient.cookieStore());
// 第二次请求
sClientNoRedirects.getAbs(UriTemplate.of(DOWN_REQUEST_URL))
.setTemplateParam("fid", fid)
.setTemplateParam("unique_name", dataKey).send().onSuccess(res2 -> {
JsonObject resJson;
try {
resJson = res2.bodyAsJsonObject();
} catch (Exception e) {
promise.fail(DOWN_REQUEST_URL + " 第二次请求没有返回JSON, 可能下载受限: " + res2.bodyAsString());
return;
}
if (!resJson.getBoolean("success")) {
promise.fail(DOWN_REQUEST_URL + " 第二次请求未得到正确相应: " + resJson);
return;
}
promise.complete(resJson.getString("download_url"));
});
}
}

View File

@@ -3,6 +3,7 @@ package cn.qaiu.lz.common.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
import java.util.HashMap;
@@ -90,6 +91,7 @@ public class LzTool {
.headers();
//得到重定向的地址进行重定向
url = headers.get("Location");
return url;
}
}

View File

@@ -42,8 +42,30 @@ public class ServerApi {
@RouteMapping(value = "/parser", method = RouteMethod.GET)
public Future<Void> parse(HttpServerResponse response, HttpServerRequest request, String url, String pwd) {
Promise<Void> promise = Promise.promise();
if (url.contains("lanzou")) {
String urlDownload = null;
if (url.contains(EcTool.EC_HOST)) {
// 默认读取Url参数会被截断手动获取一下其他参数
String data = request.getParam("data");
EcTool.parse(data).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> promise.fail(t.fillInStackTrace()));
} else if (url.contains(UcTool.SHARE_URL_PREFIX)) {
UcTool.parse(url, pwd).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> promise.fail(t.fillInStackTrace()));
} else if (url.contains(FjTool.SHARE_URL_PREFIX)) {
FjTool.parse(url).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> promise.fail(t.fillInStackTrace()));
} else if (url.contains(FcTool.SHARE_URL_PREFIX)) {
FcTool.parse(url, pwd).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> promise.fail(t.fillInStackTrace()));
} else if (url.contains("lanzou")) {
String urlDownload;
try {
urlDownload = LzTool.parse(url);
log.info("url = {}", urlDownload);
@@ -53,7 +75,7 @@ public class ServerApi {
promise.fail(e);
}
} else if (url.contains("cowtransfer.com")) {
String urlDownload = null;
String urlDownload;
try {
urlDownload = CowTool.parse(url);
response.putHeader("location", urlDownload).setStatusCode(302).end();
@@ -62,29 +84,6 @@ public class ServerApi {
promise.fail(e);
}
} else if (url.contains(EcTool.EC_HOST)) {
// 默认读取Url参数会被截断手动获取一下其他参数
String data = request.getParam("data");
EcTool.parse(data).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> {
promise.fail(t.fillInStackTrace());
});
} else if (url.contains(UcTool.SHARE_URL_PREFIX)) {
UcTool.parse(url, pwd).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> {
promise.fail(t.fillInStackTrace());
});
} else if (url.contains(FjTool.SHARE_URL_PREFIX)) {
FjTool.parse(url).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> {
promise.fail(t.fillInStackTrace());
});
}
return promise.future();
}
@@ -120,9 +119,8 @@ public class ServerApi {
@RouteMapping(value = "/ec/:id", method = RouteMethod.GET)
public void ecParse(HttpServerResponse response, String id) {
EcTool.parse(id).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
}).onFailure(t -> {
EcTool.parse(id).onSuccess(resUrl -> response.putHeader("location", resUrl)
.setStatusCode(302).end()).onFailure(t -> {
response.putHeader(CONTENT_TYPE, "text/html;charset=utf-8");
response.end(t.getMessage());
});
@@ -136,14 +134,13 @@ public class ServerApi {
@RouteMapping(value = "/uc/:id", method = RouteMethod.GET)
public void ucParse(HttpServerResponse response, String id) {
String code = "";
if (id.contains("#")) {
String[] ids = id.split("#");
if (id.contains("$")) {
String[] ids = id.split("\\$");
id = ids[0];
code = ids[1];
}
UcTool.parse(id, code).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
}).onFailure(t -> {
UcTool.parse(id, code).onSuccess(resUrl -> response.putHeader("location", resUrl)
.setStatusCode(302).end()).onFailure(t -> {
response.putHeader(CONTENT_TYPE, "text/html;charset=utf-8");
response.end(t.getMessage());
});
@@ -152,8 +149,8 @@ public class ServerApi {
@RouteMapping(value = "/json/uc/:id", method = RouteMethod.GET)
public Future<String> ucParseJson(String id) {
String code = "";
if (id.contains("#")) {
String[] ids = id.split("#");
if (id.contains("$")) {
String[] ids = id.split("\\$");
id = ids[0];
code = ids[1];
}
@@ -162,9 +159,8 @@ public class ServerApi {
@RouteMapping(value = "/fj/:id", method = RouteMethod.GET)
public void fjParse(HttpServerResponse response, String id) {
FjTool.parse(id).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
}).onFailure(t -> {
FjTool.parse(id).onSuccess(resUrl -> response.putHeader("location", resUrl)
.setStatusCode(302).end()).onFailure(t -> {
response.putHeader(CONTENT_TYPE, "text/html;charset=utf-8");
response.end(t.getMessage());
});
@@ -174,4 +170,30 @@ public class ServerApi {
public Future<String> fjParseJson(HttpServerResponse response, String id) {
return FjTool.parse(id);
}
@RouteMapping(value = "/fc/:id", method = RouteMethod.GET)
public void fcParse(HttpServerResponse response, String id) {
String code = "";
if (id.contains("$")) {
String[] ids = id.split("\\$");
id = ids[0];
code = ids[1];
}
FcTool.parse(id, code).onSuccess(resUrl -> response.putHeader("location", resUrl)
.setStatusCode(302).end()).onFailure(t -> {
response.putHeader(CONTENT_TYPE, "text/html;charset=utf-8");
response.end(t.getMessage());
});
}
@RouteMapping(value = "/json/fc/:id", method = RouteMethod.GET)
public Future<String> fcParseJson(HttpServerResponse response, String id) {
String code = "";
if (id.contains("$")) {
String[] ids = id.split("\\$");
id = ids[0];
code = ids[1];
}
return FcTool.parse(id, code);
}
}

View File

@@ -8,7 +8,7 @@ https://share-d94258c2ebfde2a83a7d5931e8da5221.fangcloud.cn/share/9cbe4b73521ba4
### cookie: fc_session=xxx 获取file_id
# @no-cookie-jar
https://share-d94258c2ebfde2a83a7d5931e8da5221.fangcloud.cn/apps/files/get_info?scenario=share&item_typed_id=file_559003251828
Cookie:fc_session=eyJpdiI6Im9hQ0Njc1pKczNsaDl4Z2pubHRDVnc9PSIsInZhbHVlIjoieDAwRUc4NkNMSHZkMzZsVzVwWGJKd0M2dFNKcEM5elpsWFZONURRYkFqTm9maDN6aXpsMWNwR0ZydXliSDBENE1Cclh2SzNyNXNmS2ttOHBKakxzSVE9PSIsIm1hYyI6IjRkNzg5ZDQwOTIzOGRiZDYyNjg2ZDE3ZDgzZDg2OWViNWRmNGIwZDFjNjQ0ODdkYTc0MjljZjI1YzU5NDY4ZGQifQ%3D%3D
Cookie:fc_session=eyJpdiI6IndQYzJoVkdQWjhJSmNOYVIwZnpiTVE9PSIsInZhbHVlIjoiUThocXBGcHA3MXN0SHZYV3R1a282djlpWEl0YmlxMzE2SUpFUjZQbFwvMytoU0NjNXRVbm10ejg0b1wvaVpSZXJaUVRIeTV2NmlvUDZlMlJsRnEyRTY1Zz09IiwibWFjIjoiNGM2NTFkN2Q2NTI3ZWUwOTc2ZmY1ODUzODEzYWRkZjIyNjg0ZGM1NDhhZDg1NjU1NzRkNjZiZWFjOGYyOWYxZiJ9
#{
# "success": true
@@ -20,6 +20,28 @@ Cookie:fc_session=eyJpdiI6Im9hQ0Njc1pKczNsaDl4Z2pubHRDVnc9PSIsInZhbHVlIjoieDAwRU
# @no-redirect
# @no-cookie-jar
https://share-d94258c2ebfde2a83a7d5931e8da5221.fangcloud.cn/apps/files/download?file_id=559003251828&scenario=share&unique_name=9cbe4b73521ba4d65a8cd38a8c
Cookie:fc_session=eyJpdiI6Im9hQ0Njc1pKczNsaDl4Z2pubHRDVnc9PSIsInZhbHVlIjoieDAwRUc4NkNMSHZkMzZsVzVwWGJKd0M2dFNKcEM5elpsWFZONURRYkFqTm9maDN6aXpsMWNwR0ZydXliSDBENE1Cclh2SzNyNXNmS2ttOHBKakxzSVE9PSIsIm1hYyI6IjRkNzg5ZDQwOTIzOGRiZDYyNjg2ZDE3ZDgzZDg2OWViNWRmNGIwZDFjNjQ0ODdkYTc0MjljZjI1YzU5NDY4ZGQifQ%3D%3D
Cookie:fc_session=eyJpdiI6IndQYzJoVkdQWjhJSmNOYVIwZnpiTVE9PSIsInZhbHVlIjoiUThocXBGcHA3MXN0SHZYV3R1a282djlpWEl0YmlxMzE2SUpFUjZQbFwvMytoU0NjNXRVbm10ejg0b1wvaVpSZXJaUVRIeTV2NmlvUDZlMlJsRnEyRTY1Zz09IiwibWFjIjoiNGM2NTFkN2Q2NTI3ZWUwOTc2ZmY1ODUzODEzYWRkZjIyNjg0ZGM1NDhhZDg1NjU1NzRkNjZiZWFjOGYyOWYxZiJ9
### 加密分享
# @no-redirect
https://v2.fangcloud.cn/share/e5079007dc31226096628870c7
### 加密分享
# @no-redirect
# @no-cookie-jar
POST https://v2.fangcloud.cn/share/e5079007dc31226096628870c7
Content-Type: application/x-www-form-urlencoded
Cookie:XSRF-TOKEN=eyJpdiI6IkQ2TlNTOEtBRHZkUWZsVFErcVNPTkE9PSIsInZhbHVlIjoiZXJYUlZVcU94WjlMaThQcU5lU1dHRGJ4TkljVFJYOVpaS0xRS3JldHlBdlwvc3RSakphR1dZK015VkxzbWlBZU5yZFdmaW1yVnk0bWJ6dGhsWEk2b0F3PT0iLCJtYWMiOiIxODI1OGY5NDkwYmY3ZmJhZjMzNDliNTNiNjgxZTM2MTQ2ODhiMGIyNjU3MjQxYzdkNjZkYWMyM2EyMGRjZDg5In0%3D; fc_session=eyJpdiI6IlppZW1UQVwvSHRWSDhVZWZwampkNHZRPT0iLCJ2YWx1ZSI6IjliWlBUZ0VPMlhoTXlUN3hXU25qYjlIdnRQRmtqbFdBR2cyaW1RVDdBN0s5OFRwcGFURjZ3TTZxZnQ4VVRGS2hNbWdPUFhrU0tlUTg1ZTJLZVZFS0FnPT0iLCJtYWMiOiJjMTM0YjI5ZTEwYjQwMGU0MGNlN2UyZmM4MWM2NzAyZmZhYjg5NWNlMjc3ODRhMmIzMzhmODg5ZTZlNzcyMGM2In0%3D; __DC_monitor_count=1; __DC_sid=265210824.1779672371747793700.1686368845992.5159; __guid=265210824.1677826520974775000.1686368845996.6543; device_token=5c99442e32e7b8e5edecd4221f992b41; Hm_lvt_762d2bc251bef4b42a758268dc7edda3=1686367033; Hm_lpvt_762d2bc251bef4b42a758268dc7edda3=1686368846; __DC_gid=265210824.275572345.1686368845996.1686368883043.2
Host:v2.fangcloud.cn
Referer:https://v2.fangcloud.cn/share/e5079007dc31226096628870c7
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37
requesttoken=se2GpxdjP9zU4rajy1ro3vZ8x0nYE64KdTzgOUtG&password=QAIU
###
# @no-redirect
# @no-cookie-jar
https://v2.fangcloud.cn/share/e5079007dc31226096628870c7
Cookie:XSRF-TOKEN=eyJpdiI6ImVpdW9XOFwvazVka0xRQ2JUQ1p4c1dRPT0iLCJ2YWx1ZSI6Im1NcTJuQW8xdlF4MEg1XC9NZERZUnE4TUgxNm9UYWhoV3pKMlhKcngwakMxR2VHeTFZZ0EzSlBcL244YXlRTWtKZ3NOd1JxYTl4ZktsdXdcL0t5dVlTMXhnPT0iLCJtYWMiOiJhMjZlODE3NDFlMTRkMjg1MzVhMjRjOGVmYTgzYjk1NGM1NmY1N2NmZjljZmIzMmRjZGFmOTVkNDhhMWYwMDRhIn0%3D; fc_session=eyJpdiI6IlppZW1UQVwvSHRWSDhVZWZwampkNHZRPT0iLCJ2YWx1ZSI6IjliWlBUZ0VPMlhoTXlUN3hXU25qYjlIdnRQRmtqbFdBR2cyaW1RVDdBN0s5OFRwcGFURjZ3TTZxZnQ4VVRGS2hNbWdPUFhrU0tlUTg1ZTJLZVZFS0FnPT0iLCJtYWMiOiJjMTM0YjI5ZTEwYjQwMGU0MGNlN2UyZmM4MWM2NzAyZmZhYjg5NWNlMjc3ODRhMmIzMzhmODg5ZTZlNzcyMGM2In0%3D;

View File

@@ -129,7 +129,7 @@ https://developer.lanzoug.com/file/?VDJbZVxtADFSWwY+U2YHa1FuU2tTYgBnBnUGZFNmWylS
https://developer.lanzoug.com/file/?VTNVa1tqAjMFDAM7BDEAbAE+U2tfbgZhBnVbOQUwVCYEb1IoAToCNwQhVnRXLlcyVWAEdl9uVzkEbFYxVm5VeVVlVSxbNwJ4BWADeAQyAGgBNVN4X3oGbQZxW3sFP1Q8BGhSYAEDAj8ENlY9VzJXZ1U3BDFfMldlBDFWaVY9VXJVM1VxWzsCZwVlA2QEYAAwAWtTYF8wBiIGcVstBWRUZwQ0UjcBbwJ5BGJWNVcsV2RVOgQuX2NXZgQ2VjJWMlVhVWdVNlswAm8FagMxBGAANgE6UzdfYwZgBjFbbAU6VGwEZVIyAWQCZQRkVjZXMFdmVTcENV8uVy8EalYgVixVIVUmVWdbdAI/BTcDaARhADEBblNvXzQGPQY5W3sFLVQ8BGlSYAE6AmsEY1Y2VztXY1U/BDFfM1dnBDRWZFYkVXpVc1VkW2oCIQVuA2QEZgA5AW5TZl8wBjYGMFtkBWFUcwRxUnUBKwJrBGNWNlc7V2NVPwQxXzJXZQQzVmdWLFUhVTxVcls7AmcFYgNnBH4AMwFoU2RfLgY1BjVbawV3VGIEPA==
###
### 小飞机盘
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://www.feijix.com/s/tIfhRqH
@@ -139,3 +139,16 @@ GET http://127.0.0.1:6400/json/fj/tIfhRqH
###
# @no-redirect
GET http://127.0.0.1:6400/fj/tIfhRqH
### 360亿方云
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://v2.fangcloud.com/sharing/e5079007dc31226096628870c7&pwd=QAIU
###
GET http://127.0.0.1:6400/json/fc/30646fefc8bf936a4766ab8a5e
###
# @no-redirect
GET http://127.0.0.1:6400/fc/e5079007dc31226096628870c7$QAIU
#https://v2.fangcloud.com/sharing/e5079007dc31226096628870c7

View File

@@ -0,0 +1,24 @@
package cn.qaiu.web.test;
import org.junit.Test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
@Test
public void regexYFC() {
String html = """
<input type="hidden" id="typed_id" value="file_559003251828">
<input type="hidden" id="share_link_token" value="9cbe4b73521ba4d65a8cd38a8c">
""";
Pattern compile = Pattern.compile("id=\"typed_id\"\\s+value=\"file_(\\d+)\"");
Matcher matcher = compile.matcher(html);
if (matcher.find()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
}
}
}