Compare commits

..

14 Commits

Author SHA1 Message Date
qaiu
068efd0503 - 升级vertx到4.5.6
- 添加Cloudreve
- 蓝奏云优享和小飞机规则修改
2024-04-09 12:13:26 +08:00
qaiu
d6de9851df Merge pull request #35 from qaiu/dependabot/npm_and_yarn/web-front/webpack-dev-middleware-5.3.4
Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /web-front
2024-03-24 15:23:37 +08:00
qaiu
a9a048a9ce Merge pull request #34 from qaiu/dependabot/npm_and_yarn/web-front/follow-redirects-1.15.6
Bump follow-redirects from 1.15.2 to 1.15.6 in /web-front
2024-03-24 15:23:15 +08:00
dependabot[bot]
481e7b1240 Bump webpack-dev-middleware from 5.3.3 to 5.3.4 in /web-front
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-23 19:01:51 +00:00
dependabot[bot]
e406e03dc2 Bump follow-redirects from 1.15.2 to 1.15.6 in /web-front
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.2 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 14:15:40 +00:00
qaiu
acbf56adbc 更新 README.md 2024-01-29 00:35:23 +08:00
qaiu
1cf82b8df9 更新 README.md 2024-01-29 00:34:43 +08:00
qaiu
a8405830f2 更新 README.md 2024-01-29 00:23:34 +08:00
qaiu
2673f23e64 更新 README.md 2024-01-29 00:22:39 +08:00
qaiu
cbaf6e9ac0 .. 2024-01-28 15:29:41 +08:00
qaiu
edb2d65638 添加蓝奏云优享解析支持 2024-01-28 15:26:22 +08:00
qaiu
f8f64fdcb1 蓝奏云域名修改, shell分隔符调整 2024-01-27 10:53:52 +08:00
qaiu
ae86b85e51 Update README.md 2023-12-27 14:27:31 +08:00
qaiu
c35bc22d02 Merge pull request #28 from qaiu/dev-reference
Dev reference 添加文叔叔解析
2023-12-16 14:35:44 +08:00
24 changed files with 443 additions and 87 deletions

View File

@@ -1,5 +1,3 @@
{
"java.compile.nullAnalysis.mode": "automatic",
"cmake.configureOnOpen": false,
"java.configuration.updateBuildConfiguration": "interactive"
"java.compile.nullAnalysis.mode": "automatic"
}

108
README.md
View File

@@ -1,38 +1,38 @@
云盘解析服务 (nfd云解析)
预览地址 https://lz.qaiu.top
注意: lz.qaiu.top因解析量过大IP已被123和小飞机禁止访问,
请不要过度依赖预览地址服务,建议本地搭建或者云服务器自行搭建
预览地址 https://lz.qaiu.top
**注意: 请不要过度依赖lz.qaiu.top预览地址服务,建议本地搭建或者云服务器自行搭建。
解析次数过多IP会被部分网盘厂商限制不推荐做公共解析。**
[![Java CI with Maven](https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml/badge.svg)](https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml)
[![jdk](https://img.shields.io/badge/jdk-%3E%3D17-blue)](https://www.oracle.com/cn/java/technologies/downloads/)
[![vert.x](https://img.shields.io/badge/vert.x-4.5.0-blue)](https://vertx-china.github.io/)
[![vert.x](https://img.shields.io/badge/vert.x-4.5.6-blue)](https://vertx-china.github.io/)
[![GitHub release (latest by date)](https://img.shields.io/github/v/release/qaiu/netdisk-fast-download)](https://github.com/qaiu/netdisk-fast-download/releases/tag/0.1.6-releases)
## 项目介绍
网盘直链解析工具能把网盘分享下载链接转化为直链,已支持蓝奏云/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘等支持密分享。
网盘直链解析工具能把网盘分享下载链接转化为直链,已支持蓝奏云/蓝奏云优享/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘/Cloudreve等,支持密分享。
*重要声明:本项目仅供学习参考;请不要将此项目用于任何商业用途,否则可能带来严重的后果。*
## 网盘支持情况:
> 20230905 奶牛云直链做了防盗链需加入请求头Referer: https://cowtransfer.com/
> 20230824 123云盘解析大文件(>100MB)失效,需要登录
> 20230722 UC网盘解析失效需要登录
> 20230905 奶牛云直链做了防盗链需加入请求头Referer: https://cowtransfer.com/
> 20230824 123云盘解析大文件(>100MB)失效,需要登录
> 20230722 UC网盘解析失效需要登录
`网盘名称(网盘标识):`
- [蓝奏云 (lz)](https://pc.woozooo.com/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [蓝奏云优享 (iz)](https://www.ilanzou.com/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [奶牛快传 (cow)](https://cowtransfer.com/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [移动云空间 (ec)](https://www.ecpan.cn/web)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [UC网盘 (uc)似乎已经失效,需要登录](https://fast.uc.cn/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [小飞机网盘 (fj)](https://www.feijipan.com/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
@@ -42,42 +42,57 @@
- [123云盘 (ye)](https://www.123pan.com/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [文叔叔 (ws) 开发中](https://www.wenshushu.cn/)
- [文叔叔 (ws)](https://www.wenshushu.cn/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [QQ邮箱 (qq) 开发中](https://wx.mail.qq.com/)
- [Cloudreve自建网盘 (ce)](https://github.com/cloudreve/Cloudreve)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- [QQ邮箱 (qq) 暂不可用-存在cookie问题](https://wx.mail.qq.com/)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析(用户无法直接使用直链)
- [夸克网盘 (qk) 开发中](https://pan.quark.cn/)
- [夸克网盘 (qk) 寄了](https://pan.quark.cn/)
- [UC网盘 (uc) 寄了](https://fast.uc.cn/)
**TODO:**
- 登录接口, 文件上传/下载/分享后端接口
- 短地址服务
- 前端界面(建设中...)
**技术栈:**
Jdk17+Vert.x4.4.1
Core模块集成Vert.x实现类似spring的注解式路由API
API接口
### API接口说明
your_host指的是您的域名或者IP实际使用时替换为实际域名或者IP。
解析方式分为两种类型直接跳转下载链接和获取下载链接(JSON),每一种都提供了两种接口形式parser和网盘标志/分享key拼接的短地址标志短链所有规则参考示例。
- 通用接口: `/parser?url=分享链接`加密分享需要加上参数pwd=密码;
- 标志短链: `/网盘标识/分享key` 在分享Key后面加上@密码;
- 直链JSON: `通用接口``标志短链`前加上`/json` 加密分享的密码规则同上;
- 网盘标识参考上面网盘支持情况
- 括号内是可选内容: 表示当带有分享密码时需要加上密码参数
- 移动云空间,小飞机网盘的加密分享的密码可以忽略
规则示例:
```
网盘标识参考上面网盘支持情况, 括号内是可选内容: 表示当带有分享密码时需要加上密码参数
parser接口可以直接解析分享链接: 加密分享需要加上参数pwd=密码;
其他接口在分享Key后面加上@密码;
1. 解析并自动302跳转 :
http(s)://your_host/parser?url=分享链接(&pwd=xxx)
http(s)://your_host/网盘标识/分享key(@分享密码)
http://your_host/parser?url=分享链接(&pwd=xxx)
http://your_host/网盘标识/分享key(@分享密码)
2. 获取解析后的直链--JSON格式
http(s)://your_host/json/parser?url=分享链接(&pwd=xxx)
http(s)://your_host/json/网盘标识/分享key(@分享密码)
3. 特别注意的地方:
- 有些网盘的加密分享的密码可以忽略: 如移动云空间,小飞机网盘
- 移动云空间(ec)使用parser?url= 解析时因为分享链接比较特殊(链接带有参数且含有#符号)所以要么对#进行转义%23要么直接去掉# 或者URL直接是主机名+'/'跟一个data参数
http://your_host/json/parser?url=分享链接(&pwd=xxx)
http://your_host/json/网盘标识/分享key(@分享密码)
3. 需要特殊处理的网盘分享:
1. 移动云空间(ec)使用parser?url= 解析时因为分享链接比较特殊(链接带有参数且含有#符号)所以要么对#进行转义%23要么直接去掉# 或者URL直接是主机名+'/'跟一个data参数
比如 http://your_host/parser?url=https://www.ecpan.cn/web//yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1
http://your_host/parser?url=https://www.ecpan.cn/web/%23/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1
http://your_host/parser?url=https://www.ecpan.cn/&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1
2. Cloudreve自建网盘解析规则:
1. 标志短链: 根据网盘使用https和http选择 http://your_host/ce/https_网盘域名_s_wDz5TK 或 http://your_host/ce/http_网盘域名_s_wDz5TK
网盘域名指的是Cloudreve搭建网盘的主域名比如pan.huang1111.cn如果存在子路径需要将/替换为_是否存在子路径看分享链接格式是否是//网盘域名/子路径/s/xxx一般不存在子路径网盘域名/s/xxx
比如: http://127.0.0.1:6400/ce/https_pan.huang1111.cn_s_wDz5TK
2. parser接口 -> http://your_host/parser?url=分享链接(&pwd=xxx)
比如: http://127.0.0.1:6400/parser?url=https://pan.huang1111.cn/s/wDz5TK
```
json返回数据格式示例:
```json
@@ -168,25 +183,25 @@ unzip netdisk-fast-download-bin.zip
cd netdisk-fast-download
bash service-install.sh
```
服务相关命令:
1、查看服务状态
systemctl status netdisk-fast-download.service
服务相关命令:
2、控制服务
启动服务
systemctl start netdisk-fast-download.service
查看服务状态
`systemctl status netdisk-fast-download.service`
启动服务
`systemctl start netdisk-fast-download.service`
重启服务
systemctl restart netdisk-fast-download.service
重启服务
`systemctl restart netdisk-fast-download.service`
停止服务
systemctl stop netdisk-fast-download.service
停止服务
`systemctl stop netdisk-fast-download.service`
开机启动服务
systemctl enable netdisk-fast-download.servic
开机启动服务
`systemctl enable netdisk-fast-download.servic`
停止开机启动
systemctl disable netdisk-fast-download.servic
停止开机启动
`systemctl disable netdisk-fast-download.servic`
## Windows服务部署
1. 下载并解压releases版本netdisk-fast-download-bin.zip
@@ -202,6 +217,12 @@ systemctl disable netdisk-fast-download.servic
- 直链缓存
- 日志优化
**技术栈:**
Jdk17+Vert.x4.4.1
Core模块集成Vert.x实现类似spring的注解式路由API
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=qaiu/netdisk-fast-download&type=Date)](https://star-history.com/#qaiu/netdisk-fast-download&Date)
@@ -209,7 +230,6 @@ systemctl disable netdisk-fast-download.servic
## 支持该项目
本项目长期维护如果觉得有帮助, 可以请作者喝杯咖啡, 感谢支持
支付宝发大额红包了...就这几天, 不要错过哦
![image](https://github.com/qaiu/netdisk-fast-download/assets/29825328/54276aee-cc3f-4ebd-8973-2e15f6295819)
[手机端支付宝打赏跳转链接](https://qr.alipay.com/fkx01882dnoxxtjenhlxt53)

View File

@@ -5,6 +5,7 @@ for /f "delims=X" %%i in ('dir /b %LIB_DIR%\netdisk-fast-download.jar') do (
set LAUNCH_JAR=%LIB_DIR%%%i
)
set "JAVA_HOME=D:\App\dragonwell-17.0.3.0.3+7-GA"
"%JAVA_HOME%\bin\java.exe" -Xmx512M -Dfile.encoding=utf8 -jar %LAUNCH_JAR% %*
pause

View File

@@ -16,7 +16,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j.version>2.0.5</slf4j.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<vertx.version>4.5.0</vertx.version>
<vertx.version>4.5.6</vertx.version>
</properties>
<dependencies>

View File

@@ -15,7 +15,6 @@ import org.slf4j.LoggerFactory;
import java.lang.management.ManagementFactory;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.locks.LockSupport;
import static cn.qaiu.vx.core.util.ConfigConstant.*;
@@ -58,9 +57,6 @@ public final class Deploy {
path.append("-").append(args[0]);
}
// 设置时区
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
// 读取yml配置
ConfigUtil.readYamlConfig(path.toString(), tempVertx)
.onSuccess(this::readConf)

View File

@@ -19,6 +19,8 @@ public interface IPanTool {
case "le" -> new LeTool(key, pwd);
case "ws" -> new WsTool(key, pwd);
case "qq" -> new QQTool(key, pwd);
case "iz" -> new IzTool(key, pwd);
case "ce" -> new CeTool(key, pwd);
default -> {
throw new UnsupportedOperationException("未知分享类型");
}
@@ -39,6 +41,8 @@ public interface IPanTool {
return new YeTool(url, pwd);
} else if (url.startsWith(FjTool.SHARE_URL_PREFIX) || url.startsWith(FjTool.SHARE_URL_PREFIX2)) {
return new FjTool(url, pwd);
} else if (url.startsWith(IzTool.SHARE_URL_PREFIX)) {
return new IzTool(url, pwd);
} else if (url.contains(LzTool.LINK_KEY)) {
return new LzTool(url, pwd);
} else if (url.startsWith(LeTool.SHARE_URL_PREFIX)) {
@@ -47,6 +51,9 @@ public interface IPanTool {
return new WsTool(url, pwd);
} else if (url.contains(QQTool.SHARE_URL_PREFIX)) {
return new QQTool(url, pwd);
} else if (url.contains("/s/")) {
// Cloudreve 网盘通用解析
return new CeTool(url, pwd);
}
throw new UnsupportedOperationException("未知分享类型");

View File

@@ -6,6 +6,7 @@ import io.vertx.core.Handler;
import io.vertx.core.Promise;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import io.vertx.ext.web.client.WebClientSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,6 +24,11 @@ public abstract class PanBase {
*/
protected WebClient client = WebClient.create(WebClientVertxInit.get());
/**
* Http client session (会话管理, 带cookie请求)
*/
protected WebClientSession clientSession = WebClientSession.create(client);
/**
* Http client 不自动跳转
*/

View File

@@ -0,0 +1,73 @@
package cn.qaiu.parser.impl;
import cn.qaiu.parser.IPanTool;
import cn.qaiu.parser.PanBase;
import io.vertx.core.Future;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.HttpRequest;
import java.net.MalformedURLException;
import java.net.URL;
/**
* <a href="https://github.com/cloudreve/Cloudreve">Cloudreve网盘解析</a> <br>
* <a href="https://pan.xiaomuxi.cn">暮希云盘</a> <br>
* <a href="https://pan.huang1111.cn">huang1111</a> <br>
*/
public class CeTool extends PanBase implements IPanTool {
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 = "/api/v3/share/info/";
public CeTool(String key, String pwd) {
super(key, pwd);
}
public Future<String> parse() {
// 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
// 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;
// 设置cookie
HttpRequest<Buffer> httpRequest = clientSession.getAbs(shareApiUrl);
if (pwd != null) {
httpRequest.addQueryParam("password", pwd);
}
// 获取下载链接
httpRequest.send().onSuccess(res -> getDownURL(downloadApiUrl)).onFailure(handleFail(shareApiUrl));
} catch (MalformedURLException e) {
fail(e, "URL解析错误");
}
return promise.future();
}
private void getDownURL(String apiUrl) {
clientSession.putAbs(apiUrl).send().onSuccess(res -> {
JsonObject jsonObject = res.bodyAsJsonObject();
System.out.println(jsonObject.encodePrettily());
if (jsonObject.containsKey("code") && jsonObject.getInteger("code") == 0) {
promise.complete(jsonObject.getString("data"));
} else {
fail("JSON解析失败: {}", jsonObject.encodePrettily());
}
}).onFailure(handleFail(apiUrl));
}
}

View File

@@ -20,7 +20,8 @@ import java.util.UUID;
public class FjTool extends PanBase implements IPanTool {
public static final String SHARE_URL_PREFIX = "https://www.feijix.com/s/";
public static final String SHARE_URL_PREFIX2 = "https://share.feijipan.com/s/";
public static final String REFERER_URL = "https://share.feijipan.com/";
public static final String SHARE_URL_PREFIX2 = REFERER_URL + "s/";
private static final String API_URL_PREFIX = "https://api.feijipan.com/ws/";
private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "recommend/list?devType=6&devModel=Chrome&extra" +
@@ -57,15 +58,21 @@ public class FjTool extends PanBase implements IPanTool {
return;
}
// 文件Id
String fileId = resJson.getJsonArray("list").getJsonObject(0).getString("fileIds");
JsonObject fileInfo = resJson.getJsonArray("list").getJsonObject(0);
String fileId = fileInfo.getString("fileIds");
String userId = fileInfo.getString("userId");
// 其他参数
long nowTs = System.currentTimeMillis();
String tsEncode = AESUtils.encrypt2Hex(Long.toString(nowTs));
String uuid = UUID.randomUUID().toString();
String fidEncode = AESUtils.encrypt2Hex(fileId + "|");
String auth = AESUtils.encrypt2Hex(fileId + "|" + nowTs);
MultiMap headers0 = MultiMap.caseInsensitiveMultiMap();
headers0.set("referer", REFERER_URL);
// 第二次请求
client.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
.putHeaders(headers0)
.setTemplateParam("fidEncode", fidEncode)
.setTemplateParam("uuid", uuid)
.setTemplateParam("ts", tsEncode)

View File

@@ -0,0 +1,80 @@
package cn.qaiu.parser.impl;
import cn.qaiu.parser.IPanTool;
import cn.qaiu.parser.PanBase;
import cn.qaiu.util.AESUtils;
import cn.qaiu.util.CommonUtils;
import io.vertx.core.Future;
import io.vertx.core.MultiMap;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.uritemplate.UriTemplate;
import java.util.UUID;
/**
* 蓝奏云优享
*
*/
public class IzTool extends PanBase implements IPanTool {
public static final String SHARE_URL_PREFIX = "https://www.ilanzou.com/s/";
private static final String API_URL_PREFIX = "https://api.ilanzou.com/unproved/";
private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "recommend/list?devType=6&devModel=Chrome&extra" +
"=2&shareId={shareId}&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}&timestamp={ts}&auth={auth}";
public IzTool(String key, String pwd) {
super(key, pwd);
}
public Future<String> parse() {
String dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, key);
WebClient client = clientNoRedirects;
String shareId = String.valueOf(AESUtils.idEncryptIz(dataKey));
// 第一次请求 获取文件信息
// 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", shareId).send().onSuccess(res -> {
JsonObject resJson = res.bodyAsJsonObject();
if (resJson.getInteger("code") != 200) {
fail(FIRST_REQUEST_URL + " 返回异常: " + resJson);
return;
}
if (resJson.getJsonArray("list").size() == 0) {
fail(FIRST_REQUEST_URL + " 解析文件列表为空: " + resJson);
return;
}
// 文件Id
JsonObject fileInfo = resJson.getJsonArray("list").getJsonObject(0);
String fileId = fileInfo.getString("fileIds");
String userId = fileInfo.getString("userId");
// 其他参数
long nowTs = System.currentTimeMillis();
String tsEncode = AESUtils.encrypt2HexIz(Long.toString(nowTs));
String uuid = UUID.randomUUID().toString();
// String fidEncode = AESUtils.encrypt2HexIz(fileId + "|");
String fidEncode = AESUtils.encrypt2HexIz(fileId + "|" + userId);
String auth = AESUtils.encrypt2HexIz(fileId + "|" + nowTs);
// 第二次请求
client.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
.setTemplateParam("fidEncode", fidEncode)
.setTemplateParam("uuid", uuid)
.setTemplateParam("ts", tsEncode)
.setTemplateParam("auth", auth).send().onSuccess(res2 -> {
MultiMap headers = res2.headers();
if (!headers.contains("Location")) {
fail(SECOND_REQUEST_URL + " 未找到重定向URL: \n" + res.headers());
return;
}
promise.complete(headers.get("Location"));
}).onFailure(handleFail(SECOND_REQUEST_URL));
}).onFailure(handleFail(FIRST_REQUEST_URL));
return promise.future();
}
}

View File

@@ -18,11 +18,10 @@ import java.util.regex.Pattern;
* 蓝奏云解析工具
*
* @author QAIU
* @version 1.0 update 2021/5/16 10:39
*/
public class LzTool extends PanBase implements IPanTool {
public static final String SHARE_URL_PREFIX = "https://wwwa.lanzoui.com";
public static final String SHARE_URL_PREFIX = "https://wwwa.lanzoux.com";
public static final String LINK_KEY = "lanzou";

View File

@@ -34,7 +34,10 @@ public class AESUtils {
public static final String CIPHER_AES2 = "YbQHZqK/PdQql2+7ATcPQHREAxt0Hn0Ob9v317QirZM=";
public static final String CIPHER_AES2_IZ = "1uQFS3sNeHd/bCrmrQpflXREAxt0Hn0Ob9v317QirZM=";
public static final String CIPHER_AES0;
public static final String CIPHER_AES0_IZ;
/**
* 秘钥长度
@@ -59,6 +62,7 @@ public class AESUtils {
static {
try {
CIPHER_AES0 = decryptByBase64AES(CIPHER_AES2, CIPHER_AES);
CIPHER_AES0_IZ = decryptByBase64AES(CIPHER_AES2_IZ, CIPHER_AES);
} catch (IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException | NoSuchAlgorithmException |
InvalidKeyException e) {
throw new RuntimeException(e);
@@ -154,6 +158,15 @@ public class AESUtils {
}
}
public static String encrypt2HexIz(String source) {
try {
return encryptHexByAES(source, CIPHER_AES0_IZ);
} catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException |
BadPaddingException e) {
throw new RuntimeException("加密失败: "+ e.getMessage());
}
}
/**
* AES解密
*
@@ -214,10 +227,14 @@ public class AESUtils {
'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'L', 'R', 'S', 'I',
'J', 'K'};
private static int decodeChar(char c) {
for (int i = 0; i < array.length; i++) {
if (c == array[i]) {
private static final char[] arrayIz =
{'Y', 'y', '0', 'Z', 'z', 'N', 'n', 'M', 'I', '6', 'm', 'W', 'w', '1', 'X', 'x', 'L', 'l', 'K', '7', 'k',
'i', 'U', 'u', '2', 'V', 'v', 'J', 'j', '8', 'G', 'g', 'F', 'S', 's', '3', 'T', 't', 'H', 'h',
'f', 'E', 'e', 'D', 'Q', 'q', '4', 'R', 'r', '9', 'd', 'a', 'C', 'c', 'B', 'O', 'o', '5', 'P',
'p', 'b', 'A'};
private static int decodeChar(char c, char[] keys) {
for (int i = 0; i < keys.length; i++) {
if (c == keys[i]) {
return i;
}
}
@@ -226,21 +243,46 @@ public class AESUtils {
// id解密
public static int idEncrypt(String str) {
return idEncrypt0(str, array, 2, 2);
}
// ================================蓝奏优享版Id解密========================================== //
public static int idEncryptIz(String str) {
// idEncrypt(e) {
// let t = 1
// , n = 0;
// if ("" != e && e.length > 4) {
// let r;
// e = e.substring(3, e.length - 1);
// for (let v = 0; v < e.length; v++)
// r = e.charAt(e.length - v - 1),
// n += this.decodeChar(r) * t,
// t *= 62
// }
// return n
// },
return idEncrypt0(str, arrayIz, 3, 1);
}
public static int idEncrypt0(String str, char[] keys, int x1, int x2) {
// 倍数
int multiple = 1;
int result = 0;
if (StringUtils.isNotEmpty(str) && str.length() > 4) {
str = str.substring(2, str.length() - 2);
str = str.substring(x1, str.length() - x2);
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(str.length() - i - 1);
result += decodeChar(c) * multiple;
result += decodeChar(c, keys) * multiple;
multiple = multiple * 62;
}
}
return result;
}
// ========================== musetransfer加密相关 ===========================
//length用户要求产生字符串的长度

View File

@@ -7,6 +7,12 @@ import java.util.Map;
public class CommonUtils {
/**
* 获取分享key 比如: https://www.ilanzou.com/s/xxx -> xxx
* @param urlPrefix 不包含key的URL前缀
* @param url 完整URL
* @return 分享key
*/
public static String adaptShortPaths(String urlPrefix, String url) {
if (url.endsWith(".html")) {
url = url.substring(0, url.length() - 5);

View File

@@ -50,6 +50,12 @@ public class TestAESUtil {
Assert.assertEquals(146731, AESUtils.idEncrypt("7jy0zlv"));
}
// 蓝奏优享
@Test
public void testIzIdDecode() {
Assert.assertEquals(26216, AESUtils.idEncryptIz("lGFndCM"));
}
@Test
public void test00() throws IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException,
NoSuchAlgorithmException, InvalidKeyException {

View File

@@ -25,7 +25,7 @@
<packageDirectory>${project.basedir}/web-service/target/package</packageDirectory>
<slf4j.version>2.0.5</slf4j.version>
<vertx.version>4.5.0</vertx.version>
<vertx.version>4.5.6</vertx.version>
<org.reflections.version>0.10.2</org.reflections.version>
<lombok.version>1.18.12</lombok.version>
<slf4j.version>2.0.5</slf4j.version>

View File

@@ -7240,9 +7240,15 @@
"dev": true
},
"node_modules/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
@@ -13346,9 +13352,9 @@
}
},
"node_modules/webpack-dev-middleware": {
"version": "5.3.3",
"resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
"integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
"version": "5.3.4",
"resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
"integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
"dev": true,
"dependencies": {
"colorette": "^2.0.10",
@@ -13360,6 +13366,10 @@
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}

View File

@@ -37,9 +37,9 @@ public class ServerApi {
"&code=" + request.getParam("code") + "&k=" + request.getParam("k") +
"&fweb=" + request.getParam("fweb") + "&cl=" + request.getParam("cl");
}
IPanTool.shareURLPrefixMatching(url, pwd).parse().onSuccess(resUrl -> {
ResponseUtil.redirect(response, resUrl, promise);
}).onFailure(t -> promise.fail(t.fillInStackTrace()));
IPanTool.shareURLPrefixMatching(url, pwd).parse()
.onSuccess(resUrl -> ResponseUtil.redirect(response, resUrl, promise))
.onFailure(t -> promise.fail(t.fillInStackTrace()));
return promise.future();
}
@@ -52,6 +52,16 @@ public class ServerApi {
return IPanTool.shareURLPrefixMatching(url, pwd).parse();
}
@RouteMapping(value = "/json/:type/:key", method = RouteMethod.GET, order = 2)
public Future<String> parseKeyJson(String type, String key) {
String code = "";
if (key.contains("@")) {
String[] keys = key.split("@");
key = keys[0];
code = keys[1];
}
return IPanTool.typeMatching(type, key, code).parse();
}
@RouteMapping(value = "/:type/:key", method = RouteMethod.GET, order = 1)
public Future<Void> parseKey(HttpServerResponse response, String type, String key) {
@@ -69,14 +79,4 @@ public class ServerApi {
return promise.future();
}
@RouteMapping(value = "/json/:type/:key", method = RouteMethod.GET, order = 2)
public Future<String> parseKeyJson(String type, String key) {
String code = "";
if (key.contains("@")) {
String[] keys = key.split("@");
key = keys[0];
code = keys[1];
}
return IPanTool.typeMatching(type, key, code).parse();
}
}

View File

@@ -0,0 +1,19 @@
###
https://5jmpj3-my.sharepoint.com/personal/pan2_xiaomuxi_cn/_layouts/15/download.aspx?UniqueId=cf123281-44cd-4745-b3c3-49a18934044d&Translate=false&tempauth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIwMDAwMDAwMy0wMDAwLTBmZjEtY2UwMC0wMDAwMDAwMDAwMDAvNWptcGozLW15LnNoYXJlcG9pbnQuY29tQGY4MTk4OWJiLWViNDAtNGZhYi05NzA5LTQ0ODFhMDM0ZjNiNCIsImlzcyI6IjAwMDAwMDAzLTAwMDAtMGZmMS1jZTAwLTAwMDAwMDAwMDAwMCIsIm5iZiI6IjE3MDY0MzIyNDciLCJleHAiOiIxNzA2NDM1ODQ3IiwiZW5kcG9pbnR1cmwiOiJNMWVwZ3VjamFKU081MXB4WW5IKzZ6bzZBQlVyc0N1T3MwOVRGbnZJVlRvPSIsImVuZHBvaW50dXJsTGVuZ3RoIjoiMTQ2IiwiaXNsb29wYmFjayI6IlRydWUiLCJjaWQiOiJKM0JzNzloTy8wYW1GZGh1WUFjTjR3PT0iLCJ2ZXIiOiJoYXNoZWRwcm9vZnRva2VuIiwic2l0ZWlkIjoiWkRkaVptRTBNRFl0TXpWall5MDBZamMxTFRsbU16TXRNRGc0TlRCbVkyRmlPVE0yIiwiYXBwX2Rpc3BsYXluYW1lIjoiMuWPt-WtmOWCqOehrOebmCIsImdpdmVuX25hbWUiOiIy5Y-3IiwiZmFtaWx5X25hbWUiOiLnvZHnm5giLCJhcHBpZCI6ImJkZDRjOTA5LTA0ZjItNDU4NS04MjZlLTY0MDQzNDljN2JiZiIsInRpZCI6ImY4MTk4OWJiLWViNDAtNGZhYi05NzA5LTQ0ODFhMDM0ZjNiNCIsInVwbiI6InBhbjJAeGlhb211eGkuY24iLCJwdWlkIjoiMTAwMzIwMDJBRTUyNDMwRCIsImNhY2hla2V5IjoiMGguZnxtZW1iZXJzaGlwfDEwMDMyMDAyYWU1MjQzMGRAbGl2ZS5jb20iLCJzY3AiOiJhbGxmaWxlcy53cml0ZSIsInR0IjoiMiIsImlwYWRkciI6IjIwLjE5MC4xNDQuMTcxIn0.WY--gv_Ac1pwhj3XTOdIddaj643CHoOqBeFFpdSa4-w&ApiVersion=2.0
###
#@no-redirect
PUT https://pan.xiaomuxi.cn/api/v3/share/download/Ag4Uy
###
PUT https://pan.huang1111.cn/api/v3/share/download/m1Mlt1
###
https://pan.huang1111.cn/api/v3/share/info/g31PcQ?password=qaiu
###
https://pan.huang1111.cn/api/v3/share/info/m1Mlt1?password=
###
PUT https://pan.huang1111.cn/api/v3/share/download/g31PcQ?path=undefined%2Fundefined

View File

@@ -11,7 +11,7 @@
# offset: 1
# limit: 60
# @no-cookie-jar
POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=193186&type=0&offset=1&limit=60
POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=146731&type=0&offset=1&limit=60
# 654488C79332E7279F9A38367BD72D3B
# 4703B103BD6871F83441233393695EF3
@@ -37,4 +37,25 @@ https://web.feejii.com/ee433d6e5102ad79af58a2aa0e6cf758/1686279412/files/2023/05
### 7jy0zlv
https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=146731
###
# @no-redirect
https://api.feijipan.com/ws/file/redirect?downloadId=4703B103BD6871F83441233393695EF3&enable=1&devType=6&uuid=ZIdOV27C5dHvd3aUUXoiP&timestamp=4FDB14DD6441E581458CD2750EAF188A&auth=42965E158C74872285C5A3F545118CAAF417B148DBEEBF90B0969E08950830E5
Referer: https://share.feijipan.com/
###
# @no-redirect
https://api.feijipan.com/ws/file/redirect?uuid=6591af86-5464-4c8d-a100-44f6cb859e9b&devType=6&devCode=6591af86-5464-4c8d-a100-44f6cb859e9b&devModel=chrome&devVersion=122&appVersion=&timestamp=77d605733113552383e2626fe134cfc3&appToken=9a253a6202bc1095030a8e8d76fe7f38-1&enable=1&downloadId=79d91c3dc8b578d4c69b04b8251f04e029de3c08240dc9ceab77f7f656cbba23&auth=ccfd80a4787abfb1b86970902e3156ff155ae85ef80ebd661d3bc33de20659a1
Referer: https://share.feijipan.com/
###
POST https://api.feijipan.com/ws/login?uuid=6591af86-5464-4c8d-a100-44f6cb859e9b&devType=6&devCode=6591af86-5464-4c8d-a100-44f6cb859e9b&devModel=chrome&devVersion=122&appVersion=&timestamp=2e6932b46c0bc20d9cbcdb6c5f0e9bee&appToken=&extra=2
Accept:application/json, text/plain, */*
Content-Type:application/json
Origin:https://www.feijipan.com
Referer:https://www.feijipan.com/
{"loginName":"15687886400","loginPwd":"4458225ff"}

View File

@@ -0,0 +1,27 @@
###
POST https://api.ilanzou.com/unproved/recommend/list?shareId=26216
###
#@no-redirect
https://api.ilanzou.com/unproved/file/redirect?downloadId=DC3D647979EE315935D1687834F05914&enable=1&devType=6&uuid=46vk1ImPHKt1Mr2cRu5wA&timestamp=B11E6A597CB93B55D87A338AEDDFBE45&auth=8BF7415F1AA0BB02278336F3C11EBD0B25654EAAB68588D5E8C4974ACAD88935
###
#@no-redirect
https://api.ilanzou.com/unproved/file/redirect?downloadId=DC3D647979EE315935D1687834F05914&enable=1&devType=6&uuid=46vk1ImPHKt1Mr2cRu5wA&timestamp=90A417B68D70B35311FACC72EEE63291&auth=849E8A34873CA37147A5FE110912FCBF836D8BD5D37626FBCBD8A3F6F42A7A8B
###
#@no-redirect
https://dl.lanosso.com/disk/2024/01/28/9/14733029/1706414002788330.gz?attname=testgles.c&sign=9ef76e9a270dbe5e9401c8f4c2ae0d68&t=65b5f826
###
#@no-redirect
https://api.ilanzou.com/unproved/file/redirect?uuid=0&devType=6&timestamp=4532409118d790651b6b50823bf6a555&downloadId=d16fcb8f3e00da0eb956db9a0541f97277437b80f7fe61438b7fba55856e050f&auth=a4c567681b3ba556b5d70cff93e909774a6695647300260c5f0abfe3c188f1a0
###
https://www.ilanzou.com/s/zHkna1S
### fileId: 145042258

View File

@@ -0,0 +1,17 @@
### 坚果云直链
GET https://www.jianguoyun.com/c/dl-file/bin.zip?dt=s80etr&sd=ekfj3&kv=NzM2MjI2NDAwQHFxLmNvbQ&vr=1&ud=Ai4TqB3nzfSF6iR0zapyvKGPYKP_cUqKIhtziVb1dRA
###
https://www.jianguoyun.com/d/ajax/dlink?sndId=175599f&sndMagic=2d8381e894e47b39&path=%2Fbin.zip&forwin=true&_=1706507895357
Cookie:umn=736226400%40qq.com; ta=G0RPJtiW0%2FEqRmv4amZpcXTLHhuOxhQCSTJX3IU5HVo%3D;
###
https://www.jianguoyun.com/d/ajax/fileops/pubFileLink?k=DSBBfXkQn7PVCxjz24cFIAA
Cookie:umn=736226400%40qq.com; ta=G0RPJtiW0%2FEqRmv4amZpcXTLHhuOxhQCSTJX3IU5HVo%3D;
###
https://www.jianguoyun.com/d/signup?next=%2Fp%2FDSBBfXkQn7PVCxjz24cFIAA&msg=%E7%99%BB%E5%BD%95%E5%90%8E%E7%AB%8B%E5%8D%B3%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6

View File

@@ -4,11 +4,14 @@ 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://lanzoux.com/iNvid035jgcb
GET http://127.0.0.1:6400/json/parser?url=https://wwsd.lanzoue.com/iLany1e9bbbi
### 蓝奏云
# @no-redirect
GET http://127.0.0.1:6400/lz/i6SqHmp1yfc
### 蓝奏云https://acgtools.lanzoui.com/iUr7Qnu3sxc https://wwn.lanzouy.com/tp/ihLkw1gezutg https://wwn.lanzouy.com/ihLkw1gezutg
# @no-redirect
GET http://127.0.0.1:6400/lz/ihLkw1gezutg
### 蓝奏云
# @no-redirect
@@ -17,6 +20,16 @@ GET http://127.0.0.1:6400/lz/icBp6qqj82b@QAIU
### 蓝奏云
GET http://127.0.0.1:6400/json/lz/ia2cntg
### 蓝奏云优享
GET http://127.0.0.1:6400/json/iz/lGFndCM
###
GET http://127.0.0.1:6400/json/parser?url=https://www.ilanzou.com/s/lGFndCM
###
GET http://127.0.0.1:6400/json/parser?url=https://www.ilanzou.com/s/6XwnC4X
###
GET http://127.0.0.1:6400/json/parser?url=https://www.ilanzou.com/s/zHkna1S
### 奶牛
GET http://127.0.0.1:6400/json/cow/9a644fe3e3a748
Referer: https://cowtransfer.com/
@@ -62,8 +75,13 @@ GET http://127.0.0.1:6400/parser?url=https://fast.uc.cn/s/33197dd53ace4
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://share.feijipan.com/s/nMtCOXL
### 小飞机盘 https://share.feijipan.com/s/laUshYGk
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://share.feijipan.com/s/laUshYGk
### 小飞机盘
GET http://127.0.0.1:6400/json/fj/tIfhRqH
### 小飞机盘 https://share.feijipan.com/s/7jy0zlv
GET http://127.0.0.1:6400/json/fj/7jy0zlv
### 小飞机盘
# @no-redirect
@@ -124,6 +142,11 @@ GET http://127.0.0.1:6400/le/2RkKbLP9BrppS9b43@ex2b
### 联想乐云
GET http://127.0.0.1:6400/json/le/2RkKbLP9BrppS9b43@ex2b
### Cloudreve
GET http://127.0.0.1:6400/json/ce/https_pan.huang1111.cn_s_wDz5TK
### Cloudreve
GET http://127.0.0.1:6400/json/parser?url=https://pan.huang1111.cn/s/g31PcQ&pwd=qaiu
###
GET http://127.0.0.1:6400/v2/statisticsInfo

View File

@@ -46,7 +46,7 @@
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>true</withJansi>
<withJansi>false</withJansi>
<encoder>
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>${CUSTOMER_PATTERN2}</pattern>

View File

@@ -1,2 +0,0 @@
call mvn clean
call mvn package