mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-16 12:23:03 +00:00
Compare commits
20 Commits
0.1.8.fixe
...
v0.1.8.tes
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ade0d34d91 | ||
|
|
56d082eb0b | ||
|
|
795c4529ba | ||
|
|
0f5cfe22ea | ||
|
|
925ad2c3a5 | ||
|
|
f3e96907fe | ||
|
|
75a1e58a7d | ||
|
|
379e889f71 | ||
|
|
40c06f397b | ||
|
|
9e9302436e | ||
|
|
6d816d4193 | ||
|
|
438eda9c08 | ||
|
|
ace39e4633 | ||
|
|
7712391f29 | ||
|
|
65f08dcb02 | ||
|
|
1d332aa6f4 | ||
|
|
ba81641517 | ||
|
|
fb30bdb879 | ||
|
|
fc451d3b41 | ||
|
|
ffee1f3462 |
13
.github/workflows/maven.yml
vendored
13
.github/workflows/maven.yml
vendored
@@ -15,6 +15,8 @@ permissions:
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
branches: [ "main" ]
|
||||
paths-ignore:
|
||||
- 'bin/**'
|
||||
@@ -76,6 +78,13 @@ jobs:
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
- name: Extract git tag
|
||||
id: tag
|
||||
run: |
|
||||
GIT_TAG=$(git tag --points-at HEAD | head -n 1)
|
||||
echo "tag=$GIT_TAG" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build and push Docker image
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/build-push-action@v5
|
||||
@@ -83,5 +92,5 @@ jobs:
|
||||
context: .
|
||||
push: true
|
||||
tags: |
|
||||
ghcr.io/${{ github.repository }}:${{ github.sha }}
|
||||
ghcr.io/${{ github.repository }}:main
|
||||
ghcr.io/qaiu/netdisk-fast-download:${{ steps.tag.outputs.tag }}
|
||||
ghcr.io/qaiu/netdisk-fast-download:latest
|
||||
|
||||
52
README.md
52
README.md
@@ -1,5 +1,6 @@
|
||||
|
||||
<div align=center><img src="https://bd2.qaiu.cn/blog/lanzou111.403f7881.png" height="160" width="160"></div>
|
||||
<p align="center">
|
||||
<img src="https://github.com/user-attachments/assets/87401aae-b0b6-4ffb-bbeb-44756404d26f" alt="项目预览图" />
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml"><img src="https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml/badge.svg?style=flat"></a>
|
||||
@@ -10,12 +11,15 @@
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
|
||||
# netdisk-fast-download 网盘分享链接云解析服务
|
||||
|
||||
netdisk-fast-download网盘直链云解析(nfd云解析)能把网盘分享下载链接转化为直链,支持多款云盘,已支持蓝奏云/蓝奏云优享/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘/Cloudreve等,支持加密分享。
|
||||
netdisk-fast-download网盘直链云解析(nfd云解析)能把网盘分享下载链接转化为直链,支持多款云盘,已支持蓝奏云/蓝奏云优享/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘/Cloudreve等,支持加密分享,以及部分网盘文件夹分享。
|
||||
|
||||
[预览地址1](https://lz.qaiu.top)
|
||||
[预览地址2](http://www.722shop.top:6401)
|
||||
|
||||
预览地址 https://lz.qaiu.top
|
||||
预览地址2(可以解析onedrive) http://8.209.249.88:6402
|
||||
main分支依赖JDK17, 提供了JDK11分支[main-jdk11](https://github.com/qaiu/netdisk-fast-download/tree/main-jdk11)
|
||||
**0.1.8及以上版本json接口格式有调整 参考json返回数据格式示例**
|
||||
**小飞机解析有IP限制,多数云服务商的大陆IP会被拦截(可以自行配置代理),和本程序无关**
|
||||
@@ -81,6 +85,8 @@ API规则:
|
||||
2. 获取解析后的直链--JSON格式
|
||||
http://your_host/json/parser?url=分享链接&pwd=xxx
|
||||
http://your_host/json/网盘标识/分享key@分享密码
|
||||
3. 文件夹解析v0.1.8fixed3新增
|
||||
http://your_host/json/getFileList?url=分享链接&pwd=xxx
|
||||
```
|
||||
json返回数据格式示例:
|
||||
`shareKey`: 全局分享key
|
||||
@@ -132,7 +138,34 @@ json返回数据格式示例:
|
||||
"timestamp": 1736489219402
|
||||
}
|
||||
```
|
||||
3. 解析次数统计接口 /v2/statisticsInfo
|
||||
3. 文件夹解析(仅支持蓝奏云/蓝奏优享/小飞机网盘)
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "success",
|
||||
"success": true,
|
||||
"data": [
|
||||
{
|
||||
"fileName": "xxx",
|
||||
"fileId": "xxx",
|
||||
"fileIcon": null,
|
||||
"size": 999,
|
||||
"sizeStr": "999 M",
|
||||
"fileType": "apk",
|
||||
"filePath": null,
|
||||
"createTime": "17 小时前",
|
||||
"updateTime": null,
|
||||
"createBy": null,
|
||||
"description": null,
|
||||
"downloadCount": null,
|
||||
"panType": "lz",
|
||||
"parserUrl": "下载链接",
|
||||
"extParameters": null
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
4. 解析次数统计接口 /v2/statisticsInfo
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
@@ -351,10 +384,15 @@ Core模块集成Vert.x实现类似spring的注解式路由API
|
||||
### 关于专属版
|
||||
99元, 提供对小飞机,蓝奏优享大文件解析的支持, 提供天翼云盘,移动云盘,联调云盘的解析支持
|
||||
199元, 包含部署服务和首页定制, 需提供宝塔环境
|
||||
可以提供功能定制开发, 加v价格详谈: qaiu-cn
|
||||
可以提供功能定制开发, 加v价格详谈:
|
||||
<p>wechat1: qaiu-cn</p>
|
||||
<p>wechat2: imcoding_</p>
|
||||
|
||||
<!--
|
||||

|
||||
|
||||
[手机端支付宝打赏跳转链接](https://qr.alipay.com/fkx01882dnoxxtjenhlxt53)
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<artifactId>parser</artifactId>
|
||||
|
||||
<packaging>jar</packaging>
|
||||
<name>${project.groupId}:${project.artifactId}</name>
|
||||
<name>cn.qaiu:parser</name>
|
||||
<description>NFD parser</description>
|
||||
<url>https://qaiu.top</url>
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public enum PanDomainTemplate {
|
||||
WsTool.class),
|
||||
// https://www.123pan.com/s/
|
||||
YE("123网盘",
|
||||
compile("https://www\\.(123pan|123865|123684)\\.com/s/(?<KEY>.+)(.html)?"),
|
||||
compile("https://www\\.(123pan\\.com|123865\\.com|123684\\.com|123912\\.com|123pan\\.cn)/s/(?<KEY>.+)(.html)?"),
|
||||
"https://www.123pan.com/s/{shareKey}",
|
||||
YeTool.class),
|
||||
// https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data={code}&isShare=1
|
||||
|
||||
@@ -15,15 +15,9 @@ 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.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
/**
|
||||
* 小飞机网盘
|
||||
@@ -108,33 +102,7 @@ public class FjTool extends PanBase {
|
||||
.setTemplateParam("uuid", uuid)
|
||||
.setTemplateParam("ts", tsEncode)
|
||||
.send().onSuccess(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);
|
||||
JsonObject resJson = asJson(res);
|
||||
if (resJson.getInteger("code") != 200) {
|
||||
fail(FIRST_REQUEST_URL + " 返回异常: " + resJson);
|
||||
return;
|
||||
|
||||
@@ -6,7 +6,9 @@ import cn.qaiu.util.CommonUtils;
|
||||
import cn.qaiu.util.JsExecUtils;
|
||||
import io.vertx.core.Future;
|
||||
import io.vertx.core.MultiMap;
|
||||
import io.vertx.core.json.JsonArray;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.core.json.pointer.JsonPointer;
|
||||
import io.vertx.ext.web.client.WebClient;
|
||||
import io.vertx.uritemplate.UriTemplate;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -33,6 +35,7 @@ public class YeTool extends PanBase {
|
||||
"&shareKey={shareKey}&SharePwd={pwd}&ParentFileId=0&Page=1&event=homeListFile&operateType=1";
|
||||
private static final String DOWNLOAD_API_URL = "https://www.123pan.com/a/api/share/download/info?{authK}={authV}";
|
||||
|
||||
private static final String BATCH_DOWNLOAD_API_URL = "https://www.123pan.com/b/api/file/batch_download_share_info?{authK}={authV}";
|
||||
private final MultiMap header = MultiMap.caseInsensitiveMultiMap();
|
||||
|
||||
public YeTool(ShareLinkInfo shareLinkInfo) {
|
||||
@@ -41,8 +44,8 @@ public class YeTool extends PanBase {
|
||||
header.set("App-Version", "3");
|
||||
header.set("Cache-Control", "no-cache");
|
||||
header.set("Connection", "keep-alive");
|
||||
header.set("DNT", "1");
|
||||
header.set("Host", "www.123pan.com");
|
||||
//header.set("DNT", "1");
|
||||
//header.set("Host", "www.123pan.com");
|
||||
header.set("LoginUuid", gen36String());
|
||||
header.set("Pragma", "no-cache");
|
||||
header.set("Referer", shareLinkInfo.getStandardUrl());
|
||||
@@ -103,9 +106,23 @@ public class YeTool extends PanBase {
|
||||
fail("{} 状态码异常 {}", dataKey, infoJson);
|
||||
return;
|
||||
}
|
||||
|
||||
JsonObject getFileInfoJson =
|
||||
infoJson.getJsonObject("data").getJsonArray("InfoList").getJsonObject(0);
|
||||
getFileInfoJson.put("ShareKey", shareKey);
|
||||
|
||||
// 判断是否为文件夹: data->InfoList->0->Type: 1为文件夹, 0为文件
|
||||
try {
|
||||
int type = (Integer)JsonPointer.from("/data/InfoList/0/Type").queryJson(infoJson);
|
||||
if (type == 1) {
|
||||
getZipDownUrl(client, getFileInfoJson);
|
||||
return;
|
||||
}
|
||||
} catch (Exception exception) {
|
||||
fail("该分享[{}]解析异常: {}", dataKey, exception.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
getDownUrl(client, getFileInfoJson);
|
||||
}).onFailure(this.handleFail(GET_FILE_INFO_URL));
|
||||
} else {
|
||||
@@ -116,6 +133,11 @@ public class YeTool extends PanBase {
|
||||
|
||||
JsonObject reqBodyJson = resListJson.getJsonObject("data").getJsonArray("InfoList").getJsonObject(0);
|
||||
reqBodyJson.put("ShareKey", shareKey);
|
||||
if (reqBodyJson.getInteger("Type") == 1) {
|
||||
// 文件夹
|
||||
getZipDownUrl(client, reqBodyJson);
|
||||
return;
|
||||
}
|
||||
getDownUrl(client, reqBodyJson);
|
||||
}).onFailure(this.handleFail(FIRST_REQUEST_URL));
|
||||
|
||||
@@ -134,6 +156,21 @@ public class YeTool extends PanBase {
|
||||
jsonObject.put("Etag", reqBodyJson.getString("Etag"));
|
||||
|
||||
// 调用JS文件获取签名
|
||||
down(client, jsonObject, DOWNLOAD_API_URL);
|
||||
}
|
||||
|
||||
|
||||
private void getZipDownUrl(WebClient client, JsonObject reqBodyJson) {
|
||||
log.info(reqBodyJson.encodePrettily());
|
||||
JsonObject jsonObject = new JsonObject();
|
||||
// {"ShareKey":"LH3rTd-1ENed","fileIdList":[{"fileId":17525952}]}
|
||||
jsonObject.put("ShareKey", reqBodyJson.getString("ShareKey"));
|
||||
jsonObject.put("fileIdList", new JsonArray().add(JsonObject.of("fileId", reqBodyJson.getInteger("FileId"))));
|
||||
// 调用JS文件获取签名
|
||||
down(client, jsonObject, BATCH_DOWNLOAD_API_URL);
|
||||
}
|
||||
|
||||
private void down(WebClient client, JsonObject jsonObject, String api) {
|
||||
ScriptObjectMirror getSign;
|
||||
try {
|
||||
getSign = JsExecUtils.executeJs("getSign", "/a/api/share/download/info");
|
||||
@@ -143,7 +180,7 @@ public class YeTool extends PanBase {
|
||||
}
|
||||
log.info("ye getSign: {}={}", getSign.get("0").toString(), getSign.get("1").toString());
|
||||
|
||||
client.postAbs(UriTemplate.of(DOWNLOAD_API_URL))
|
||||
client.postAbs(UriTemplate.of(api))
|
||||
.setTemplateParam("authK", getSign.get("0").toString())
|
||||
.setTemplateParam("authV", getSign.get("1").toString())
|
||||
.putHeader("Platform", "web")
|
||||
@@ -160,7 +197,8 @@ public class YeTool extends PanBase {
|
||||
fail("Ye: downURLJson格式异常->" + downURLJson);
|
||||
return;
|
||||
}
|
||||
String downURL = downURLJson.getJsonObject("data").getString("DownloadURL");
|
||||
String downURL = downURLJson.getJsonObject("data")
|
||||
.getString(api.contains("batch_download_share_info")? "DownloadUrl" : "DownloadURL");
|
||||
try {
|
||||
Map<String, String> urlParams = CommonUtils.getURLParams(downURL);
|
||||
String params = urlParams.get("params");
|
||||
|
||||
2
pom.xml
2
pom.xml
@@ -27,7 +27,7 @@
|
||||
|
||||
<vertx.version>4.5.6</vertx.version>
|
||||
<org.reflections.version>0.10.2</org.reflections.version>
|
||||
<lombok.version>1.18.30</lombok.version>
|
||||
<lombok.version>1.18.38</lombok.version>
|
||||
<slf4j.version>2.0.5</slf4j.version>
|
||||
<commons-lang3.version>3.12.0</commons-lang3.version>
|
||||
<commons-beanutils2.version>2.0.0</commons-beanutils2.version>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"qrcode": "^1.5.4",
|
||||
"vue": "^3.5.12",
|
||||
"vue-clipboard3": "^2.0.0",
|
||||
"vue3-json-viewer": "^2.2.2"
|
||||
"vue3-json-viewer": "2.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.26.0",
|
||||
|
||||
@@ -20,14 +20,15 @@ import static cn.qaiu.vx.core.util.ConfigConstant.LOCAL;
|
||||
|
||||
|
||||
/**
|
||||
* 程序入口
|
||||
* vertx程序入口
|
||||
*
|
||||
* <br>Create date 2021-05-08 13:00:01
|
||||
*
|
||||
* @author qaiu
|
||||
* @author qaiu yyzy
|
||||
*/
|
||||
public class AppMain {
|
||||
|
||||
public static void main(String[] args) {
|
||||
// start
|
||||
Deploy.instance().start(args, AppMain::exec);
|
||||
}
|
||||
|
||||
|
||||
@@ -119,3 +119,19 @@ Platform:web
|
||||
{"ShareKey":"iaKtVv-6OECd","behavior":1}
|
||||
|
||||
### eaefamemdead
|
||||
https://www.123684.com/b/api/share/get?2393880368=1749017805-9397896-3041863692&limit=100&next=0&orderBy=file_name&orderDirection=asc&shareKey=LH3rTd-pENed&SharePwd=qaiu&ParentFileId=0&Page=1&event=homeListFile&operateType=1
|
||||
Referer: https://www.123684.com/s/LH3rTd-pENed
|
||||
Sec-Fetch-Dest: empty
|
||||
Sec-Fetch-Mode: cors
|
||||
Sec-Fetch-Site: same-origin
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0
|
||||
platform: web
|
||||
sec-ch-ua: "Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"
|
||||
sec-ch-ua-mobile: ?0
|
||||
sec-ch-ua-platform: "Windows"
|
||||
|
||||
###
|
||||
POST https://www.123684.com/b/api/file/batch_download_share_info?3697171543=1749019332-221279-1801740277
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
{"ShareKey":"LH3rTd-pENed","fileIdList":[{"fileId":17525951}]}
|
||||
|
||||
Reference in New Issue
Block a user