From 2465a4d6d3550b32093be6d5af168d21f79160fc Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Mon, 16 Dec 2024 12:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=8F=E9=A3=9E=E6=9C=BA?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/qaiu/parser/impl/FjTool.java | 73 +++++++++++++++++-- 1 file changed, 65 insertions(+), 8 deletions(-) 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 b6de8fd..b67a862 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java @@ -1,6 +1,6 @@ package cn.qaiu.parser.impl; -import cn.qaiu.entity.ShareLinkInfo; +import cn.qaiu.entity.ShareLinkInfo; import cn.qaiu.parser.PanBase; import cn.qaiu.util.AESUtils; import cn.qaiu.util.UUIDUtil; @@ -11,6 +11,13 @@ import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.HttpRequest; import io.vertx.uritemplate.UriTemplate; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPInputStream; + /** * 小飞机网盘 * @@ -22,8 +29,9 @@ public class FjTool extends PanBase { private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "recommend/list?devType=6&devModel=Chrome" + "&uuid={uuid}&extra=2×tamp={ts}&shareId={shareId}&type=0&offset=1&limit=60"; - /// recommend/list?devType=6&devModel=Chrome&uuid={uuid}&extra=2×tamp={ts}&shareId={shareId}&type=0&offset=1 - // &limit=60 + /// recommend/list?devType=6&devModel=Chrome&uuid={uuid}&extra=2×tamp={ts}&shareId={shareId}&type=0&offset=1&limit=60 + // recommend/list?devType=6&devModel=Chrome&uuid={uuid}&extra=2×tamp={ts}&shareId=JoUTkZYj&type=0&offset=1&limit=60 + private static final String SECOND_REQUEST_URL = API_URL_PREFIX + "file/redirect?downloadId={fidEncode}&enable=1" + "&devType=6&uuid={uuid}×tamp={ts}&auth={auth}&shareId={dataKey}"; @@ -34,6 +42,30 @@ public class FjTool extends PanBase { "={uuid}&extra=2×tamp={ts}"; // https://api.feijipan.com/ws/buy/vip/list?devType=6&devModel=Chrome&uuid=WQAl5yBy1naGudJEILBvE&extra=2×tamp=E2C53155F6D09417A27981561134CB73 + private static final MultiMap header; + + static { + header = MultiMap.caseInsensitiveMultiMap(); + header.set("Accept", "application/json, text/plain, */*"); + header.set("Accept-Encoding", "gzip, deflate, br, zstd"); + header.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); + header.set("Cache-Control", "no-cache"); + header.set("Connection", "keep-alive"); + header.set("Content-Length", "0"); + header.set("DNT", "1"); + header.set("Host", "api.feijipan.com"); + header.set("Origin", "https://www.feijix.com"); + header.set("Pragma", "no-cache"); + header.set("Referer", "https://www.feijix.com/"); + header.set("Sec-Fetch-Dest", "empty"); + header.set("Sec-Fetch-Mode", "cors"); + header.set("Sec-Fetch-Site", "cross-site"); + header.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"); + header.set("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\""); + header.set("sec-ch-ua-mobile", "?0"); + header.set("sec-ch-ua-platform", "\"Windows\""); + } + public FjTool(ShareLinkInfo shareLinkInfo) { super(shareLinkInfo); } @@ -58,11 +90,38 @@ public class FjTool extends PanBase { // 第一次请求 获取文件信息 // 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)) + .putHeaders(header) .setTemplateParam("shareId", shareId) .setTemplateParam("uuid", uuid) - .setTemplateParam("ts", tsEncode0) + .setTemplateParam("ts", tsEncode) .send().onSuccess(res -> { - JsonObject resJson = asJson(res); + // 处理GZ压缩 + // 使用GZIPInputStream来解压数据 + String decompressedString; + try (ByteArrayInputStream bais = new ByteArrayInputStream(res.body().getBytes()); + GZIPInputStream gzis = new GZIPInputStream(bais); + BufferedReader reader = new BufferedReader(new InputStreamReader(gzis, StandardCharsets.UTF_8))) { + + // 用于存储解压后的字符串 + StringBuilder decompressedData = new StringBuilder(); + + // 逐行读取解压后的数据 + String line; + while ((line = reader.readLine()) != null) { + decompressedData.append(line); + } + + // 此时decompressedData.toString()包含了解压后的字符串 + decompressedString = decompressedData.toString(); + + } catch (IOException e) { + // 处理可能的IO异常 + fail(FIRST_REQUEST_URL + " 响应异常"); + return; + } + // 处理GZ压缩结束 + + JsonObject resJson = new JsonObject(decompressedString); if (resJson.getInteger("code") != 200) { fail(FIRST_REQUEST_URL + " 返回异常: " + resJson); return; @@ -81,12 +140,10 @@ public class FjTool extends PanBase { String fidEncode = AESUtils.encrypt2Hex(fileId + "|" + userId); String auth = AESUtils.encrypt2Hex(fileId + "|" + nowTs2); - MultiMap headers0 = MultiMap.caseInsensitiveMultiMap(); - headers0.set("referer", REFERER_URL); // 第二次请求 HttpRequest httpRequest = clientNoRedirects.getAbs(UriTemplate.of(SECOND_REQUEST_URL)) - .putHeaders(headers0) + .putHeaders(header) .setTemplateParam("fidEncode", fidEncode) .setTemplateParam("uuid", uuid) .setTemplateParam("ts", tsEncode2)