diff --git a/parser/src/main/java/cn/qaiu/parser/PanBase.java b/parser/src/main/java/cn/qaiu/parser/PanBase.java index a06686c..ed32746 100644 --- a/parser/src/main/java/cn/qaiu/parser/PanBase.java +++ b/parser/src/main/java/cn/qaiu/parser/PanBase.java @@ -4,6 +4,9 @@ import cn.qaiu.WebClientVertxInit; import cn.qaiu.entity.ShareLinkInfo; 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.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; @@ -98,4 +101,19 @@ public abstract class PanBase { return t -> fail(this.getClass().getSimpleName() + " - 请求异常 {}: -> {}", errorMsg, t.fillInStackTrace()); } + + /** + * bodyAsJsonObject的封装, 会自动处理异常 + * @param res HttpResponse + * @return JsonObject + */ + protected JsonObject asJson(HttpResponse res) { + try { + return res.bodyAsJsonObject(); + } catch (DecodeException e) { + fail("解析失败: json格式异常: {}", res.bodyAsString()); + throw new RuntimeException("解析失败: json格式异常"); + } + } + } diff --git a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java index 6ef6f22..0fd89b2 100644 --- a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java +++ b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java @@ -71,10 +71,11 @@ public enum PanDomainTemplate { "https://(.*)cowtransfer\\.com/s/(.+)", "https://cowtransfer.com/s/{shareKey}", CowTool.class), - // https://pan.huang1111.cn/s/ - CE("huang1111", - "https://pan\\.huang1111\\.cn/s/(.+)", - "https://pan.huang1111.cn/s/{shareKey}", + // https://pan.huang1111.cn/s/xxx + // 通用域名([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}", CeTool.class); diff --git a/parser/src/main/java/cn/qaiu/parser/ParserCreate.java b/parser/src/main/java/cn/qaiu/parser/ParserCreate.java index 6095dcc..7ba8384 100644 --- a/parser/src/main/java/cn/qaiu/parser/ParserCreate.java +++ b/parser/src/main/java/cn/qaiu/parser/ParserCreate.java @@ -66,8 +66,17 @@ public class ParserCreate { // set share key public ParserCreate shareKey(String shareKey) { - shareLinkInfo.setShareKey(shareKey); - shareLinkInfo.setStandardUrl(panDomainTemplate.getStandardUrlTemplate().replace("{shareKey}", shareKey)); + if (panDomainTemplate == PanDomainTemplate.CE) { + // 处理Cloudreve(ce)类: pan.huang1111.cn_s_wDz5TK _ -> / + String[] s = shareKey.split("_"); + String standardUrl = "https://" + String.join("/", s); + shareLinkInfo.setShareKey(s[s.length - 1]); + shareLinkInfo.setStandardUrl(standardUrl); + shareLinkInfo.setShareUrl(standardUrl); + } else { + shareLinkInfo.setShareKey(shareKey); + shareLinkInfo.setStandardUrl(panDomainTemplate.getStandardUrlTemplate().replace("{shareKey}", shareKey)); + } return this; } diff --git a/parser/src/main/java/cn/qaiu/parser/impl/CeTool.java b/parser/src/main/java/cn/qaiu/parser/impl/CeTool.java index 91aac9f..6dd5b34 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/CeTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/CeTool.java @@ -8,17 +8,21 @@ import io.vertx.core.buffer.Buffer; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.HttpRequest; +import java.net.URL; + /** - * Cloudreve网盘解析
+ * Cloudreve自建网盘解析
* 暮希云盘
* huang1111
+ * 看见存储
+ * 亿安云盘
*/ public class CeTool extends PanBase implements IPanTool { - private static final String DOWNLOAD_API_PATH = "https://pan.huang1111.cn/api/v3/share/download/"; + private static final String DOWNLOAD_API_PATH = "/api/v3/share/download/"; // api/v3/share/info/g31PcQ?password=qaiu - private static final String SHARE_API_PATH = "https://pan.huang1111.cn/api/v3/share/info/"; + private static final String SHARE_API_PATH = "/api/v3/share/info/"; public CeTool(ShareLinkInfo shareLinkInfo) { super(shareLinkInfo); @@ -31,24 +35,14 @@ public class CeTool extends PanBase implements IPanTool { // https://pan.huang1111.cn/s/wDz5TK // https://pan.huang1111.cn/s/y12bI6 -> https://pan.huang1111 // .cn/api/v3/share/download/y12bI6?path=undefined%2Fundefined; - // 类型解析 -> /ce/https_pan.huang1111.cn_s_wDz5TK + // 类型解析 -> /ce/pan.huang1111.cn_s_wDz5TK // parser接口 -> /parser?url=https://pan.huang1111.cn/s/wDz5TK try { -// if (key.startsWith("https_") || key.startsWith("http_")) { -// key = key.replace("https_", "https://") -// .replace("http_", "http://") -// .replace("_", "/"); -// } // // 处理URL -// URL url = new URL(key); -// String path = url.getPath(); -// String shareKey = path.substring(3); -// String downloadApiUrl = url.getProtocol() + "://" + url.getHost() + DOWNLOAD_API_PATH + shareKey + "?path" + -// "=undefined/undefined;"; -// String shareApiUrl = url.getProtocol() + "://" + url.getHost() + SHARE_API_PATH + shareKey; - - var shareApiUrl = SHARE_API_PATH; - var downloadApiUrl = DOWNLOAD_API_PATH; + URL url = new URL(shareLinkInfo.getShareUrl()); + String downloadApiUrl = url.getProtocol() + "://" + url.getHost() + DOWNLOAD_API_PATH + key + "?path" + + "=undefined/undefined;"; + String shareApiUrl = url.getProtocol() + "://" + url.getHost() + SHARE_API_PATH + key; // 设置cookie HttpRequest httpRequest = clientSession.getAbs(shareApiUrl); @@ -65,7 +59,7 @@ public class CeTool extends PanBase implements IPanTool { private void getDownURL(String apiUrl) { clientSession.putAbs(apiUrl).send().onSuccess(res -> { - JsonObject jsonObject = res.bodyAsJsonObject(); + JsonObject jsonObject = asJson(res); System.out.println(jsonObject.encodePrettily()); if (jsonObject.containsKey("code") && jsonObject.getInteger("code") == 0) { promise.complete(jsonObject.getString("data")); diff --git a/parser/src/main/java/cn/qaiu/parser/impl/CowTool.java b/parser/src/main/java/cn/qaiu/parser/impl/CowTool.java index e9a93ef..33ace82 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/CowTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/CowTool.java @@ -26,7 +26,7 @@ public class CowTool extends PanBase implements IPanTool { final String key = shareLinkInfo.getShareKey(); String url = API_REQUEST_URL + "?uniqueUrl=" + key; client.getAbs(url).send().onSuccess(res -> { - JsonObject resJson = res.bodyAsJsonObject(); + JsonObject resJson = asJson(res); if ("success".equals(resJson.getString("message")) && resJson.containsKey("data")) { JsonObject dataJson = resJson.getJsonObject("data"); String guid = dataJson.getString("guid"); @@ -41,7 +41,7 @@ public class CowTool extends PanBase implements IPanTool { } String url2 = url2Build.toString(); client.getAbs(url2).send().onSuccess(res2 -> { - JsonObject res2Json = res2.bodyAsJsonObject(); + JsonObject res2Json = asJson(res2); if ("success".equals(res2Json.getString("message")) && res2Json.containsKey("data")) { JsonObject data2 = res2Json.getJsonObject("data"); String downloadUrl = data2.getString("downloadUrl"); diff --git a/parser/src/main/java/cn/qaiu/parser/impl/EcTool.java b/parser/src/main/java/cn/qaiu/parser/impl/EcTool.java index 101d5a8..31b0ea4 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/EcTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/EcTool.java @@ -34,7 +34,7 @@ public class EcTool extends PanBase implements IPanTool { .setTemplateParam("extractionCode", pwd == null ? "" : pwd) .send() .onSuccess(res -> { - JsonObject jsonObject = res.bodyAsJsonObject(); + JsonObject jsonObject = asJson(res); log.debug("ecPan get file info -> {}", jsonObject); JsonObject fileInfo = jsonObject .getJsonObject("var") @@ -59,7 +59,7 @@ public class EcTool extends PanBase implements IPanTool { // 第二次请求 获取下载链接 client.postAbs(DOWNLOAD_REQUEST_URL).sendJsonObject(requestBodyJson).onSuccess(res2 -> { - JsonObject jsonRes = res2.bodyAsJsonObject(); + JsonObject jsonRes = asJson(res2); log.debug("ecPan get download url -> {}", res2.body().toString()); promise.complete(jsonRes.getJsonObject("var").getString("downloadUrl")); }).onFailure(handleFail("")); diff --git a/parser/src/main/java/cn/qaiu/parser/impl/FcTool.java b/parser/src/main/java/cn/qaiu/parser/impl/FcTool.java index 4e60c06..ce3b542 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/FcTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/FcTool.java @@ -88,7 +88,7 @@ public class FcTool extends PanBase implements IPanTool { .setTemplateParam("unique_name", dataKey).send().onSuccess(res2 -> { JsonObject resJson; try { - resJson = res2.bodyAsJsonObject(); + resJson = asJson(res2); } catch (Exception e) { fail(e, DOWN_REQUEST_URL + " 第二次请求没有返回JSON, 可能下载受限"); return; diff --git a/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java b/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java index f5d317c..be3dd64 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java @@ -63,7 +63,7 @@ public class FjTool extends PanBase implements IPanTool { .setTemplateParam("uuid", uuid) .setTemplateParam("ts", tsEncode0) .send().onSuccess(res -> { - JsonObject resJson = res.bodyAsJsonObject(); + JsonObject resJson = asJson(res); if (resJson.getInteger("code") != 200) { fail(FIRST_REQUEST_URL + " 返回异常: " + resJson); return; diff --git a/parser/src/main/java/cn/qaiu/parser/impl/IzTool.java b/parser/src/main/java/cn/qaiu/parser/impl/IzTool.java index c47bbab..60750ca 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/IzTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/IzTool.java @@ -39,7 +39,7 @@ public class IzTool extends PanBase implements IPanTool { // 第一次请求 获取文件信息 // POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=146731&type=0&offset=1&limit=60 client.postAbs(UriTemplate.of(FIRST_REQUEST_URL)).setTemplateParam("shareId", dataKey).send().onSuccess(res -> { - JsonObject resJson = res.bodyAsJsonObject(); + JsonObject resJson = asJson(res); if (resJson.getInteger("code") != 200) { fail(FIRST_REQUEST_URL + " 返回异常: " + resJson); return; 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 86dba49..8417e9b 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/LeTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/LeTool.java @@ -27,7 +27,7 @@ public class LeTool extends PanBase implements IPanTool { client.postAbs(apiUrl1) .sendJsonObject(JsonObject.of("shareId", dataKey, "password", pwd, "directoryId", -1)) .onSuccess(res -> { - JsonObject resJson = res.bodyAsJsonObject(); + JsonObject resJson = asJson(res); if (resJson.containsKey("result")) { if (resJson.getBoolean("result")) { JsonObject dataJson = resJson.getJsonObject("data"); @@ -68,7 +68,7 @@ public class LeTool extends PanBase implements IPanTool { client.postAbs(apiUrl2) .sendJsonObject(JsonObject.of("fileIds", fileIds, "shareId", key, "browserId", uuid)) .onSuccess(res -> { - JsonObject resJson = res.bodyAsJsonObject(); + JsonObject resJson = asJson(res); if (resJson.containsKey("result")) { if (resJson.getBoolean("result")) { JsonObject dataJson = resJson.getJsonObject("data"); diff --git a/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java b/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java index c019365..f5f625c 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java @@ -115,7 +115,7 @@ public class LzTool extends PanBase implements IPanTool { String url = SHARE_URL_PREFIX + "/ajaxm.php"; client.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> { - JsonObject urlJson = res2.bodyAsJsonObject(); + JsonObject urlJson = asJson(res2); if (urlJson.getInteger("zt") != 1) { fail(urlJson.getString("inf")); return; diff --git a/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java b/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java index 9dd2c06..cb6c1f7 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java @@ -50,7 +50,7 @@ public class WsTool extends PanBase implements IPanTool { if (res.statusCode() == 200) { try { // 设置匿名登录token - String token = res.bodyAsJsonObject().getJsonObject("data").getString("token"); + String token = asJson(res).getJsonObject("data").getString("token"); headers.set("X-Token", token); // 获取文件夹信息 @@ -63,10 +63,10 @@ public class WsTool extends PanBase implements IPanTool { if (res2.statusCode() == 200) { try { // 获取文件夹信息 - String filetime = res2.bodyAsJsonObject().getJsonObject("data").getString("expire"); // 文件夹剩余时间 - String filesize = res2.bodyAsJsonObject().getJsonObject("data").getString("file_size"); // 文件夹大小 - String filepid = res2.bodyAsJsonObject().getJsonObject("data").getString("ufileid"); // 文件夹pid - String filebid = res2.bodyAsJsonObject().getJsonObject("data").getString("boxid"); // 文件夹bid + String filetime = asJson(res2).getJsonObject("data").getString("expire"); // 文件夹剩余时间 + String filesize = asJson(res2).getJsonObject("data").getString("file_size"); // 文件夹大小 + String filepid = asJson(res2).getJsonObject("data").getString("ufileid"); // 文件夹pid + String filebid = asJson(res2).getJsonObject("data").getString("boxid"); // 文件夹bid // 调试输出文件夹信息 System.out.println("文件夹期限: " + filetime); @@ -93,9 +93,9 @@ public class WsTool extends PanBase implements IPanTool { if (res3.statusCode() == 200) { try { // 获取文件信息 - String filename = res3.bodyAsJsonObject().getJsonObject("data") + String filename = asJson(res3).getJsonObject("data") .getJsonArray("fileList").getJsonObject(0).getString("fname"); // 文件名称 - String filefid = res3.bodyAsJsonObject().getJsonObject("data") + String filefid = asJson(res3).getJsonObject("data") .getJsonArray("fileList").getJsonObject(0).getString("fid"); // 文件fid // 调试输出文件信息 @@ -113,7 +113,7 @@ public class WsTool extends PanBase implements IPanTool { if (res4.statusCode() == 200) { try { // 获取直链 - String fileurl = res4.bodyAsJsonObject().getJsonObject("data").getString("url"); + String fileurl = asJson(res4).getJsonObject("data").getString("url"); // 调试输出文件直链 System.out.println("文件直链: " + fileurl); diff --git a/parser/src/main/java/cn/qaiu/parser/impl/YeTool.java b/parser/src/main/java/cn/qaiu/parser/impl/YeTool.java index 63bc1e7..5ca6cfb 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/YeTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/YeTool.java @@ -70,7 +70,7 @@ public class YeTool extends PanBase implements IPanTool { .putHeader("Platform", "web") .putHeader("App-Version", "3") .send().onSuccess(res2 -> { - JsonObject infoJson = res2.bodyAsJsonObject(); + JsonObject infoJson = asJson(res2); if (infoJson.getInteger("code") != 0) { fail("{} 状态码异常 {}", dataKey, infoJson); return; @@ -121,7 +121,7 @@ public class YeTool extends PanBase implements IPanTool { .putHeader("Platform", "web") .putHeader("App-Version", "3") .sendJsonObject(jsonObject).onSuccess(res2 -> { - JsonObject downURLJson = res2.bodyAsJsonObject(); + JsonObject downURLJson = asJson(res2); try { if (downURLJson.getInteger("code") != 0) { @@ -141,7 +141,7 @@ public class YeTool extends PanBase implements IPanTool { // 获取直链 client.getAbs(downUrl2).send().onSuccess(res3 -> { - JsonObject res3Json = res3.bodyAsJsonObject(); + JsonObject res3Json = asJson(res3); try { if (res3Json.getInteger("code") != 0) { fail("Ye: downUrl2返回值异常->" + res3Json); diff --git a/pom.xml b/pom.xml index 58fb7a7..bc8a38c 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,6 @@ ${project.basedir}/web-service/target/package - 2.0.5 4.5.6 0.10.2 1.18.30 diff --git a/web-front/public/index.html b/web-front/public/index.html index 17ee9e9..e5d2978 100644 --- a/web-front/public/index.html +++ b/web-front/public/index.html @@ -9,7 +9,10 @@ content="Netdisk fast download,网盘直链解析工具"> - + + +