From 3f4f9fa76b47865c87edb6872aa2794a99ed593e Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Sat, 10 Jun 2023 13:29:22 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=8A=A0=E5=85=A5360=E4=BA=BF=E6=96=B9?= =?UTF-8?q?=E4=BA=91=E7=9B=B4=E9=93=BE=E8=A7=A3=E6=9E=90=20-=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 67 +++++++---- .../java/cn/qaiu/lz/common/util/FcTool.java | 105 ++++++++++++++++++ .../java/cn/qaiu/lz/common/util/LzTool.java | 2 + .../java/cn/qaiu/lz/web/http/ServerApi.java | 100 ++++++++++------- .../src/main/resources/http-tools/pan-fc.http | 26 ++++- .../src/main/resources/http-tools/test.http | 15 ++- .../test/java/cn/qaiu/web/test/TestRegex.java | 24 ++++ 7 files changed, 274 insertions(+), 65 deletions(-) create mode 100644 web-service/src/main/java/cn/qaiu/lz/common/util/FcTool.java create mode 100644 web-service/src/test/java/cn/qaiu/web/test/TestRegex.java diff --git a/README.md b/README.md index 7a9c04d..ca146b0 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/FcTool.java b/web-service/src/main/java/cn/qaiu/lz/common/util/FcTool.java new file mode 100644 index 0000000..452a824 --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/common/util/FcTool.java @@ -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 parse(String data, String code) { + String dataKey = CommonUtils.parseURL(SHARE_URL_PREFIX, data); + + Promise 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 promise, HttpResponse 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")); + }); + } +} diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/LzTool.java b/web-service/src/main/java/cn/qaiu/lz/common/util/LzTool.java index 497a971..edb7b32 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/LzTool.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/util/LzTool.java @@ -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; } } diff --git a/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java b/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java index 9d39128..c926779 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java @@ -42,8 +42,30 @@ public class ServerApi { @RouteMapping(value = "/parser", method = RouteMethod.GET) public Future parse(HttpServerResponse response, HttpServerRequest request, String url, String pwd) { Promise 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 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 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 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); + } } diff --git a/web-service/src/main/resources/http-tools/pan-fc.http b/web-service/src/main/resources/http-tools/pan-fc.http index 3029de5..99c10b7 100644 --- a/web-service/src/main/resources/http-tools/pan-fc.http +++ b/web-service/src/main/resources/http-tools/pan-fc.http @@ -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; diff --git a/web-service/src/main/resources/http-tools/test.http b/web-service/src/main/resources/http-tools/test.http index c2dc270..83bd18d 100644 --- a/web-service/src/main/resources/http-tools/test.http +++ b/web-service/src/main/resources/http-tools/test.http @@ -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 diff --git a/web-service/src/test/java/cn/qaiu/web/test/TestRegex.java b/web-service/src/test/java/cn/qaiu/web/test/TestRegex.java new file mode 100644 index 0000000..28beaae --- /dev/null +++ b/web-service/src/test/java/cn/qaiu/web/test/TestRegex.java @@ -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 = """ + + + """; + + 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)); + } + } +}