Compare commits

...

73 Commits

Author SHA1 Message Date
QAIU
63b1cad839 update 0.1.5 2023-06-13 13:25:22 +08:00
QAIU
610c6c8d2a update 0.1.5 2023-06-13 13:23:09 +08:00
QAIU
7f50ee5217 移动云空间需要注意的地方 2023-06-13 10:53:02 +08:00
qaiu
5883c7c174 Merge pull request #3 from qaiu/dev
Controller 层不支持方法重载: ServerApi
2023-06-13 10:30:36 +08:00
qaiu
0b73738e39 Controller 层不支持方法重载: ServerApi 2023-06-13 10:29:23 +08:00
qaiu
4e11b61fdb 接口重构 2023-06-13 08:22:11 +08:00
qaiu
853246d363 接口重构 2023-06-13 05:43:37 +08:00
QAIU
e1d880318a 测试相关 2023-06-12 16:41:06 +08:00
QAIU
533f6f8596 Merge remote-tracking branch 'origin/main' 2023-06-12 16:12:12 +08:00
QAIU
68b7c57384 Zzzz 2023-06-12 16:07:28 +08:00
QAIU
089dc5713b Zzzz 2023-06-12 16:07:28 +08:00
QAIU
2596e58943 重构蓝奏云解析代码, 加入蓝奏云加密分享解析 2023-06-12 10:39:33 +08:00
QAIU
7d8b39ad92 重构蓝奏云解析代码, 加入蓝奏云加密分享解析 2023-06-12 10:39:33 +08:00
QAIU
9419c7e0ca 蓝奏云密码解析测试 2023-06-10 17:45:25 +08:00
QAIU
f492e3c031 蓝奏云密码解析测试 2023-06-10 17:45:25 +08:00
QAIU
8973a0e4b2 蓝奏云密码解析测试 2023-06-10 17:32:25 +08:00
QAIU
fff8cfe460 蓝奏云密码解析测试 2023-06-10 17:32:25 +08:00
QAIU
3b3dd0634f change README.md 2023-06-10 16:41:25 +08:00
QAIU
e2945b8f34 change README.md 2023-06-10 16:41:25 +08:00
QAIU
5343c68603 change README.md 2023-06-10 16:35:33 +08:00
QAIU
daadb6e9cc change README.md 2023-06-10 16:35:33 +08:00
QAIU
b8057135a9 添加123云盘直链解析 2023-06-10 16:31:17 +08:00
QAIU
e9ed8715af 添加123云盘直链解析 2023-06-10 16:31:17 +08:00
QAIU
e941d76507 修改密码分隔符$->@ 2023-06-10 13:34:01 +08:00
QAIU
f2280c8e86 修改密码分隔符$->@ 2023-06-10 13:34:01 +08:00
QAIU
b189614d29 - 加入360亿方云直链解析
- 优化代码
2023-06-10 13:29:22 +08:00
QAIU
ea9d1067ed - 加入360亿方云直链解析
- 优化代码
2023-06-10 13:29:22 +08:00
QAIU
70fe0c23ae - 加入小飞机盘直链解析
- 优化代码
2023-06-09 15:43:21 +08:00
QAIU
03c4c8c581 - 加入小飞机盘直链解析
- 优化代码
2023-06-09 15:43:21 +08:00
QAIU
9a3baebec9 Merge remote-tracking branch 'origin/main' 2023-06-08 17:34:02 +08:00
QAIU
3574b58d21 Merge remote-tracking branch 'origin/main' 2023-06-08 17:34:02 +08:00
QAIU
74e95d0f12 其他网盘API 2023-06-08 17:33:42 +08:00
QAIU
a14db13485 其他网盘API 2023-06-08 17:33:42 +08:00
qaiu
37f5f2a30d add lzpan login api test 2023-05-29 01:14:40 +08:00
qaiu
e7ebb7c8c3 change logo show version 2023-05-29 00:29:50 +08:00
qaiu
11decadb4c Update service-install.sh 2023-05-25 18:14:55 +08:00
QAIU
34c6d26581 测试蓝奏云密码访问 2023-05-25 17:44:55 +08:00
QAIU
2155c3e0c0 修改安装脚本 2023-05-25 15:15:56 +08:00
QAIU
0bc23e76bf Merge remote-tracking branch 'origin/main' 2023-05-24 17:41:48 +08:00
qaiu
095040efce Merge pull request #2 from qaiu/qaiu-patch-1
Update README.md
2023-05-24 17:38:05 +08:00
qaiu
d98751b0e3 Update README.md 2023-05-24 17:31:00 +08:00
QAIU
3e31e97c35 1. change actions maven.yml 2023-05-24 17:28:05 +08:00
QAIU
eebce94e88 1. change actions maven.yml 2023-05-24 17:20:45 +08:00
QAIU
2ca7a78920 1. change actions maven.yml 2023-05-24 17:18:30 +08:00
qaiu
2c243650f6 Update maven.yml 2023-05-24 17:01:26 +08:00
qaiu
a257cd2f69 Create maven.yml 2023-05-24 16:57:24 +08:00
qaiu
d0d5c96b9e Update README.md 2023-05-24 16:24:51 +08:00
QAIU
00af483239 1. 项目重命名
2. 添加UC网盘解析
3. 添加移动云空间解析 #1
2023-05-24 16:20:06 +08:00
QAIU
25534452ae UCpan和移动云空间API测试 2023-05-23 17:34:11 +08:00
QAIU
804266d5af do cow login api 2023-05-15 17:42:29 +08:00
QAIU
7fa2ea59a5 do db 2023-05-12 17:30:10 +08:00
QAIU
c9e714418e 夸克Http API测试 2023-05-11 17:51:00 +08:00
qaiu
b3beb61337 清理自动生成的文件 2023-05-07 18:05:43 +08:00
qaiu
2270a05631 zz 2023-05-07 17:21:48 +08:00
qaiu
5fb3d2a2d6 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	lz-cow-api-web/src/main/java/cn/qaiu/lz/common/util/LzTool.java
#	lz-cow-api-web/src/main/resources/logback.xml
2023-05-07 17:19:35 +08:00
qaiu
34f2670700 zz 2023-05-07 17:18:43 +08:00
QAIU
d4586b342e do db 2023-05-06 17:38:56 +08:00
QAIU
1651f1ea93 do var 2023-04-25 17:51:39 +08:00
QAIU
11a054dc2c 日志配置 2023-04-25 09:45:48 +08:00
QAIU
fc233bcea3 日志配置 2023-04-25 09:43:45 +08:00
QAIU
e7e3888b13 蓝奏云API 域名改为wwsd.lanzoue.com 2023-04-25 09:41:10 +08:00
QAIU
91845cc08c 蓝奏云API 正则解析规则修改 2023-04-25 09:32:55 +08:00
qaiu
94cde1e953 细节优化
cow解析失败时返回异常
2023-04-25 08:44:30 +08:00
qaiu
678866f654 Update README.md 2023-04-22 13:19:21 +08:00
qaiu
f7ccc3c3e3 细节优化
cow解析失败时返回异常
2023-04-22 12:46:42 +08:00
qaiu
1799763f7f vert.x升级到4.4.1 2023-04-22 11:34:05 +08:00
qaiu
5ba38f4f1d 0.0.1 fixed done 2023-04-21 23:42:22 +08:00
qaiu
07d8ed19b0 0.0.1 done 2023-04-21 23:30:50 +08:00
QAIU
15b6468333 蓝奏云API BUG修复 2023-04-21 17:39:09 +08:00
qaiu
2457ded158 init 2023-04-21 01:24:31 +08:00
qaiu
54a1a6b7f4 init 2023-04-21 01:21:56 +08:00
qaiu
167149f410 忽略一些文件 2023-04-21 00:41:57 +08:00
qaiu
2c7a17c3b0 Create README.md 2023-04-20 17:43:55 +08:00
43 changed files with 1525 additions and 560 deletions

146
README.md
View File

@@ -1,73 +1,139 @@
# netdisk-fast-download
# 网盘快速下载器--直链解析
[![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)
## 网盘支持情况:
` 网盘名称(网盘标识): `
## 网盘支持情况:
`网盘名称(网盘标识):`
- 蓝奏云 (lz)
- [ ] 登录, 上传, 下载, 分享
- [x] 直链解析
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- 奶牛快传 (cow)
- [ ] 登录, 上传, 下载, 分享
- [x] 直链解析
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- 移动云空间 (ec)
- [ ] 登录, 上传, 下载, 分享
- [x] 直链解析
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- UC网盘 (uc)
- [ ] 登录, 上传, 下载, 分享
- [x] 直链解析
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- 小飞机网盘 (fj)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- 亿方云 (fc)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- 123云盘 (ye)
- [ ] 登录, 上传, 下载, 分享
- [X] 直链解析
- 文叔叔 (ws)
- 夸克网盘 (qk)
- TODO
技术栈:
Jdk17+Vert.x4.4.1+Jsoup
Core模块集成Vert.x实现类spring的注解式路由API
技术栈:
Jdk17+Vert.x4.4.1
Core模块集成Vert.x实现类spring的注解式路由API
API接口
```shell
(括号内表示可选内容)
```
网盘标识参考上面网盘支持情况, 括号内是可选内容: 表示当带有分享密码时需要加上密码参数
parser接口可以直接解析分享链接: 加密分享需要加上参数pwd=密码;
其他接口在分享Key后面加上@密码;
1. 解析并自动302跳转 :
http(s)://you_host/parser?url=分享链接
http(s)://you_host/网盘标识/分享id(#分享密码)
http(s)://your_host/parser?url=分享链接(&pwd=xxx)
http(s)://your_host/网盘标识/分享id(@分享密码)
2. 获取解析后的直链--JSON格式
http(s)://you_host/json/网盘标识/分享id(#分享密码)
http(s)://your_host/json/网盘标识/分享id(@分享密码)
3. 特别注意的地方:
- 有些网盘的加密分享的密码可以忽略: 如移动云空间,小飞机网盘
- 移动云空间(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
```
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
```
TODO:
解析蓝奏云加密链接
# 网盘对比
| 网盘名称 | 可直接下载分享 | 加密分享 | 初始网盘空间 | 单文件大小限制 | 登录接口 |
|-------|-------------|----------|----------|----------------|------|
| 蓝奏云 | √ | √ | 不限空间 | 100M | TODO |
| 奶牛快传 | √ | X | 10G | 不限大小 | TODO |
| 移动云空间 | √ | √(密码可忽略) | 5G(个人) | 不限大小 | TODO |
| UC网盘 | √ | √ | 10G | 不限大小 | TODO |
| 夸克网盘 | √(>10M需要登录) | √ | 10G(20G) | 不限大小(>10M需要登录) | X |
| 网盘名称 | 可直接下载分享 | 加密分享 | 初始网盘空间 | 单文件大小限制 | 登录接口 |
|------------|------------|----------|-----------|---------|------|
| 蓝奏云 | √ | √ | 不限空间 | 100M | TODO |
| 奶牛快传 | √ | X | 10G | 不限大小 | TODO |
| 移动云空间 | √ | √(密码可忽略) | 5G(个人) | 不限大小 | TODO |
| UC网盘 | √ | √ | 10G | 不限大小 | TODO |
| 小飞机网盘 | √ | √(密码可忽略) | 10G | 不限大小 | TODO |
| 360亿方云 | √(注意有流量限制) | √(密码可忽略) | 100G(须实名) | 不限大小 | TODO |
| 123云盘 | √ | √ | 2T | 不限大小 | TODO |
| 文叔叔(TODO) | √(注意有时间限制) | √ | 10G | 不限大小 | TODO |
| 夸克网盘(TODO) | 需要登录 | √ | 10G | 不限大小 | TODO |
# 打包部署
## 开发和打包
```shell
# 环境要求: Jdk17 + maven;
mvn clean
mvn package
```
打包好的文件位于 web-service/target/netdisk-fast-download-x.x.x-bin.zip
## Linux服务部署
> 注意: netdisk-fast-download.service中的ExecStart的路径改为实际路径
```shell
cd ~
wget -O netdisk-fast-download-0.1.5-bin.zip https://github.com/qaiu/netdisk-fast-download/releases/download/0.1.5-releases/netdisk-fast-download-0.1.5-bin.zip
unzip netdisk-fast-download-*-bin.zip
cd netdisk-fast-download-*-bin
bash service-install.sh
```
## Windows服务部署
1. 解压netdisk-fast-download-0.1.5-bin.zip
2. 进入netdisk-fast-download-0.1.5-bin目录
3. 使用管理员权限运行nfd-service-install.bat
如果不想使用服务运行可以直接运行run.bat
## Docker部署
TODO

View File

@@ -7,7 +7,8 @@ Wants=network-online.target
[Service]
Type=simple
# User=USER
ExecStart=/usr/bin/java -server -Xmx128m -jar /root/java/netdisk-fast-download/netdisk-fast-download-0.0.1.jar
# 注意修改为自己的路径
ExecStart=/usr/bin/java -server -Xmx128m -jar /root/java/netdisk-fast-download/netdisk-fast-download*.jar
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=always
StandOutput=syslog

View File

@@ -0,0 +1,27 @@
::
:: generate service xml file
::
@echo off
pushd %~dp0
set MY_DIR=%~dp0
set MY_DIR=%MY_DIR:~0,-1%
for /f "delims=X" %%i in ('dir /b %MY_DIR%\netdisk-fast-download-*.jar') do (
set LAUNCH_JAR=%MY_DIR%\%%i
)
(for /f "delims=" %%a in (nfd-service-template.xml) do (
set "str=%%a"
setlocal enabledelayedexpansion
set "str=!str:${dd}=%MY_DIR%!"
set "str=!str:${jar}=%LAUNCH_JAR%!"
echo,!str!
endlocal
))>"nfd-service.xml"
sc delete netdisk-fast-download
nfd-service install
sc start netdisk-fast-download
pause

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<service>
<id>netdisk-fast-download</id>
<name>netdisk-fast-download</name>
<description>netdisk fast download service</description>
<executable>java</executable>
<arguments>-jar ${jar} -server -Xmx128m </arguments>
<logpath>${dd}\logs</logpath>
<log mode="roll-by-time">
<pattern>yyyyMMdd</pattern>
</log>
</service>

BIN
bin/nfd-service.exe Normal file

Binary file not shown.

View File

@@ -1,5 +1,10 @@
@echo off && @chcp 65001 > nul
pushd %~dp0
set LIB_DIR=%~dp0
for /f "delims=X" %%i in ('dir /b %LIB_DIR%\netdisk-fast-download-*.jar') do set LAUNCH_JAR=%LIB_DIR%\%%i
for /f "delims=X" %%i in ('dir /b %LIB_DIR%\netdisk-fast-download-*.jar') do (
set LAUNCH_JAR=%LIB_DIR%%%i
)
"%JAVA_HOME%\bin\java.exe" -Xmx512M -Dfile.encoding=utf8 -jar %LAUNCH_JAR% %*
pause

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>netdisk-fast-download</artifactId>
<groupId>cn.qaiu</groupId>
<version>0.1.3</version>
<version>0.1.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>netdisk-fast-download</artifactId>
<groupId>cn.qaiu</groupId>
<version>0.1.3</version>
<version>0.1.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>1.0.8</version>

View File

@@ -78,7 +78,8 @@ public class RouterHandlerFactory implements BaseHttpApi {
ctx.request().path(), ctx.request().absoluteURI(), ctx.request().method());
ctx.response().headers().add(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
ctx.response().headers().add(ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, OPTIONS, PUT, DELETE, HEAD");
ctx.response().headers().add(ACCESS_CONTROL_ALLOW_HEADERS, "X-PINGOTHER, Origin,Content-Type, Accept, X-Requested-With, Dev, Authorization, Version, Token");
ctx.response().headers().add(ACCESS_CONTROL_ALLOW_HEADERS, "X-PINGOTHER, Origin,Content-Type, Accept, " +
"X-Requested-With, Dev, Authorization, Version, Token");
ctx.response().headers().add(ACCESS_CONTROL_MAX_AGE, "1728000");
ctx.next();
});
@@ -199,8 +200,8 @@ public class RouterHandlerFactory implements BaseHttpApi {
*/
private String getRouteUrl(String methodName, String mapperValue) {
String routeUrl;
if (mapperValue.startsWith("/:") || "/".equals(mapperValue)) {
routeUrl = (methodName + mapperValue);
if ("/".equals(mapperValue)) {
routeUrl = mapperValue;
} else if (mapperValue.startsWith("/")) {
routeUrl = mapperValue.substring(1);
} else {
@@ -349,7 +350,7 @@ public class RouterHandlerFactory implements BaseHttpApi {
((Future<?>) data).onSuccess(res -> {
if (res instanceof JsonObject) {
fireJsonResponse(ctx, res);
} else if (res != null){
} else if (res != null) {
fireJsonResponse(ctx, JsonResult.data(res));
}
}).onFailure(e -> fireJsonResponse(ctx, JsonResult.error(e.getMessage())));
@@ -363,7 +364,7 @@ public class RouterHandlerFactory implements BaseHttpApi {
String err = e.getMessage();
if (e.getCause() != null) {
if (e.getCause() instanceof InvocationTargetException) {
err = ((InvocationTargetException)e.getCause()).getTargetException().getMessage();
err = ((InvocationTargetException) e.getCause()).getTargetException().getMessage();
} else {
err = e.getCause().getMessage();
}

View File

@@ -7,7 +7,7 @@
<groupId>cn.qaiu</groupId>
<artifactId>netdisk-fast-download</artifactId>
<packaging>pom</packaging>
<version>0.1.3</version>
<version>0.1.5</version>
<modules>
<module>core</module>

View File

@@ -5,10 +5,10 @@
<parent>
<artifactId>netdisk-fast-download</artifactId>
<groupId>cn.qaiu</groupId>
<version>0.1.3</version>
<version>0.1.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>0.1.3</version>
<version>0.1.5</version>
<artifactId>web-service</artifactId>
<properties>
@@ -49,11 +49,6 @@
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.4</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web-client</artifactId>
@@ -63,7 +58,7 @@
<dependency>
<groupId>cn.qaiu</groupId>
<artifactId>core-database</artifactId>
<version>0.1.3</version>
<version>0.1.5</version>
</dependency>

View File

@@ -0,0 +1,45 @@
package cn.qaiu.lz.common.parser;//package cn.qaiu.lz.common.parser;
import cn.qaiu.lz.common.parser.impl.*;
import io.vertx.core.Future;
public interface IPanTool {
Future<String> parse(String data, String code);
static IPanTool typeMatching(String type) {
return switch (type) {
case "lz" -> new LzTool();
case "cow" -> new CowTool();
case "ec" -> new EcTool();
case "fc" -> new FcTool();
case "uc" -> new UcTool();
case "ye" -> new YeTool();
case "fj" -> new FjTool();
default -> {
throw new IllegalArgumentException("未知分享类型");
}
};
}
static IPanTool shareURLPrefixMatching(String url) {
if (url.startsWith(CowTool.SHARE_URL_PREFIX)) {
return new CowTool();
} else if (url.startsWith(EcTool.SHARE_URL_PREFIX)) {
return new EcTool();
} else if (url.startsWith(FcTool.SHARE_URL_PREFIX)) {
return new FcTool();
} else if (url.startsWith(UcTool.SHARE_URL_PREFIX)) {
return new UcTool();
} else if (url.startsWith(YeTool.SHARE_URL_PREFIX)) {
return new YeTool();
} else if (url.startsWith(FjTool.SHARE_URL_PREFIX)) {
return new FjTool();
} else if (url.contains("lanzou")) {
return new LzTool();
}
throw new IllegalArgumentException("未知分享类型");
}
}

View File

@@ -0,0 +1,15 @@
package cn.qaiu.lz.common.parser;
import cn.qaiu.lz.common.parser.impl.LzTool;
/**
* @author <a href="https://qaiu.top">QAIU</a>
* @date 2023/6/13 4:26
*/
public enum PanType {
LZ("lz"),
COW("cow");
PanType(String type) {
}
}

View File

@@ -0,0 +1,56 @@
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.util.CommonUtils;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
/**
* 奶牛快传解析工具
*
* @author <a href="https://qaiu.top">QAIU</a>
* @date 2023/4/21 21:19
*/
@Slf4j
public class CowTool implements IPanTool {
private static final String API_REQUEST_URL = "https://cowtransfer.com/core/api/transfer/share";
public static final String SHARE_URL_PREFIX = "https://cowtransfer.com/s/";
public Future<String> parse(String data, String code) {
Promise<String> promise = Promise.promise();
WebClient client = WebClient.create(Vertx.vertx());
String key = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, data);
client.getAbs(API_REQUEST_URL + "?uniqueUrl=" + key).send().onSuccess(res -> {
JsonObject resJson = res.bodyAsJsonObject();
if ("success".equals(resJson.getString("message")) && resJson.containsKey("data")) {
JsonObject dataJson = resJson.getJsonObject("data");
String guid = dataJson.getString("guid");
String fileId = dataJson.getJsonObject("firstFile").getString("id");
String url2 = API_REQUEST_URL + "/download?transferGuid=" + guid + "&fileId=" + fileId;
client.getAbs(url2).send().onSuccess(res2 -> {
JsonObject res2Json = res2.bodyAsJsonObject();
if ("success".equals(res2Json.getString("message")) && res2Json.containsKey("data")) {
JsonObject data2 = res2Json.getJsonObject("data");
String downloadUrl = data2.getString("downloadUrl");
if (StringUtils.isNotEmpty(downloadUrl)) {
log.info("cow parse success: {}", downloadUrl);
promise.complete(downloadUrl);
}
} else {
log.error("cow parse fail: {}; json: {}", url2, res2Json);
}
});
} else {
log.error("cow parse fail: {}; json: {}", key, resJson);
}
});
return promise.future();
}
}

View File

@@ -1,5 +1,7 @@
package cn.qaiu.lz.common.util;
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.util.CommonUtils;
import cn.qaiu.vx.core.util.VertxHolder;
import io.vertx.core.Future;
import io.vertx.core.Promise;
@@ -13,20 +15,21 @@ import lombok.extern.slf4j.Slf4j;
* 移动云空间解析
*/
@Slf4j
public class EcTool {
private static final String FULL_URL_PREFIX = "https://www.ecpan.cn/drive/fileextoverrid" +
public class EcTool implements IPanTool {
private static final String FIRST_REQUEST_URL = "https://www.ecpan.cn/drive/fileextoverrid" +
".do?chainUrlTemplate=https:%2F%2Fwww.ecpan" +
".cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside&parentId=-1&data={dataKey}";
private static final String DOWNLOAD_REQUEST_URL = "https://www.ecpan.cn/drive/sharedownload.do";
public static final String EC_HOST = "www.ecpan.cn";
public static final String SHARE_URL_PREFIX = "www.ecpan.cn/";
public static Future<String> parse(String dataKey) {
public Future<String> parse(String data, String code) {
String dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, data);
Promise<String> promise = Promise.promise();
WebClient client = WebClient.create(VertxHolder.getVertxInstance());
// 第一次请求 获取文件信息
client.getAbs(UriTemplate.of(FULL_URL_PREFIX)).setTemplateParam("dataKey", dataKey).send().onSuccess(res -> {
client.getAbs(UriTemplate.of(FIRST_REQUEST_URL)).setTemplateParam("dataKey", dataKey).send().onSuccess(res -> {
JsonObject jsonObject = res.bodyAsJsonObject();
log.debug("ecPan get file info -> {}", jsonObject);
JsonObject fileInfo = jsonObject
@@ -48,9 +51,7 @@ public class EcTool {
JsonObject jsonRes = res2.bodyAsJsonObject();
log.debug("ecPan get download url -> {}", res2.body().toString());
promise.complete(jsonRes.getJsonObject("var").getString("downloadUrl"));
}).onFailure(t -> {
promise.fail(new RuntimeException("解析异常: key = " + dataKey, t.fillInStackTrace()));
});
}).onFailure(t -> promise.fail(new RuntimeException("解析异常: key = " + dataKey, t.fillInStackTrace())));
} else {
promise.fail(new RuntimeException(DOWNLOAD_REQUEST_URL + " 解析失败: "

View File

@@ -0,0 +1,107 @@
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.util.CommonUtils;
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 implements IPanTool {
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 Future<String> parse(String data, String code) {
String dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, data);
Promise<String> 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<String> promise, HttpResponse<Buffer> 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"));
});
}
}

View File

@@ -0,0 +1,78 @@
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.util.AESUtils;
import cn.qaiu.lz.common.util.CommonUtils;
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.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import io.vertx.uritemplate.UriTemplate;
import java.util.UUID;
/**
* 小飞机网盘
*
* @version V016_230609
*/
public class FjTool implements IPanTool {
public static final String SHARE_URL_PREFIX = "https://www.feijix.com/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" +
"=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 Future<String> parse(String data, String code) {
String dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, data);
Promise<String> promise = Promise.promise();
WebClient client = WebClient.create(VertxHolder.getVertxInstance(),
new WebClientOptions().setFollowRedirects(false));
String shareId = String.valueOf(AESUtils.idEncrypt(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) {
promise.fail(FIRST_REQUEST_URL + " 返回异常: " + resJson);
return;
}
if (resJson.getJsonArray("list").size() == 0) {
promise.fail(FIRST_REQUEST_URL + " 解析文件列表为空: " + resJson);
return;
}
// 文件Id
String fileId = resJson.getJsonArray("list").getJsonObject(0).getString("fileIds");
// 其他参数
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);
// 第二次请求
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")) {
promise.fail(SECOND_REQUEST_URL + " 未找到重定向URL: \n" + res.headers());
return;
}
promise.complete(headers.get("Location"));
});
});
return promise.future();
}
}

View File

@@ -0,0 +1,91 @@
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
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.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientOptions;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 蓝奏云解析工具
*
* @author QAIU
* @version 1.0 update 2021/5/16 10:39
*/
public class LzTool implements IPanTool {
public static final String SHARE_URL_PREFIX = "https://wwwa.lanzoui.com";
public Future<String> parse(String data, String code) {
Promise<String> promise = Promise.promise();
String key = data.indexOf('/') > 0 ? data : SHARE_URL_PREFIX + "/" + data;
WebClient client = WebClient.create(VertxHolder.getVertxInstance(),
new WebClientOptions().setFollowRedirects(false));
client.getAbs(key).send().onSuccess(res -> {
String html = res.bodyAsString();
// 匹配iframe
Pattern compile = Pattern.compile("src=\"(/fn\\?[a-zA-Z0-9_+/=]{16,})\"");
Matcher matcher = compile.matcher(html);
if (!matcher.find()) {
// 没有Iframe说明是加密分享, 匹配sign通过密码请求下载页面
Pattern compile2 = Pattern.compile("sign=([0-9a-zA-Z_]{16,})");
Matcher matcher2 = compile2.matcher(html);
if (!matcher2.find()) {
promise.fail(key + ": sign正则匹配失败, 可能分享已失效: " + html);
return;
}
String sign = matcher2.group(1);
getDownURL(promise, code, key, client, sign);
return;
}
String iframePath = matcher.group(1);
client.getAbs(SHARE_URL_PREFIX + iframePath).send().onSuccess(res2 -> {
String html2 = res2.bodyAsString();
System.out.println(html);
Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'([0-9a-zA-Z_]+)'").matcher(html2);
if (!matcher2.find()) {
promise.fail(SHARE_URL_PREFIX + iframePath + " -> " + key + ": sign正则匹配失败, 可能分享已失效: " + html2);
return;
}
String sign = matcher2.group(1);
getDownURL(promise, code, key, client, sign);
});
});
return promise.future();
}
private static void getDownURL(Promise<String> promise, String code, String key, WebClient client, String sign) {
MultiMap headers = MultiMap.caseInsensitiveMultiMap();
var userAgent2 = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, " +
"like " +
"Gecko) Chrome/111.0.0.0 Mobile Safari/537.36";
headers.set("User-Agent", userAgent2);
headers.set("referer", key);
headers.set("sec-ch-ua-platform", "Android");
headers.set("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
headers.set("sec-ch-ua-mobile", "sec-ch-ua-mobile");
client.postAbs(SHARE_URL_PREFIX + "/ajaxm.php").putHeaders(headers).sendForm(MultiMap
.caseInsensitiveMultiMap()
.set("action", "downprocess")
.set("sign", sign).set("p", code)).onSuccess(res2 -> {
JsonObject urlJson = res2.bodyAsJsonObject();
if (urlJson.getInteger("zt") != 1) {
promise.fail(urlJson.getString("inf"));
return;
}
String downUrl = urlJson.getString("dom") + "/file/" + urlJson.getString("url");
client.getAbs(downUrl).putHeaders(headers).send().onSuccess(res3 -> {
promise.complete(res3.headers().get("Location"));
});
});
}
}

View File

@@ -0,0 +1,12 @@
package cn.qaiu.lz.common.parser.impl;
import io.vertx.core.Future;
import io.vertx.core.Promise;
public class QkTool {
public static Future<String> parse(String data, String code) {
Promise<String> promise = Promise.promise();
return promise.future();
}
}

View File

@@ -1,5 +1,7 @@
package cn.qaiu.lz.common.util;
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.util.CommonUtils;
import cn.qaiu.vx.core.util.VertxHolder;
import io.vertx.core.Future;
import io.vertx.core.Promise;
@@ -13,10 +15,10 @@ import lombok.extern.slf4j.Slf4j;
* 移动云空间解析
*/
@Slf4j
public class UcTool {
public class UcTool implements IPanTool {
private static final String API_URL_PREFIX = "https://pc-api.uc.cn/1/clouddrive/";
public static final String FULL_URL_PREFIX = "https://fast.uc.cn/s/";
public static final String SHARE_URL_PREFIX = "https://fast.uc.cn/s/";
private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "share/sharepage/token?entry=ft&fr=pc&pr" +
"=UCBrowser";
@@ -26,12 +28,9 @@ public class UcTool {
private static final String THIRD_REQUEST_URL = API_URL_PREFIX + "file/download?entry=ft&fr=pc&pr=UCBrowser";
public static Future<String> parse(String data, String code) {
if (!data.startsWith(FULL_URL_PREFIX)) {
data = FULL_URL_PREFIX + data;
}
public Future<String> parse(String data, String code) {
var dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, data);
var passcode = (code == null) ? "" : code;
var dataKey = data.substring(FULL_URL_PREFIX.length());
Promise<String> promise = Promise.promise();
var client = WebClient.create(VertxHolder.getVertxInstance());
var jsonObject = JsonObject.of("share_for_transfer", true);

View File

@@ -0,0 +1,104 @@
package cn.qaiu.lz.common.parser.impl;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.util.CommonUtils;
import cn.qaiu.vx.core.util.VertxHolder;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.uritemplate.UriTemplate;
import org.apache.commons.lang3.StringUtils;
import java.net.MalformedURLException;
import java.util.Base64;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 123网盘
*/
public class YeTool implements IPanTool {
public static final String SHARE_URL_PREFIX = "https://www.123pan.com/s/";
public static final String FIRST_REQUEST_URL = SHARE_URL_PREFIX + "{key}.html";
private static final String GET_FILE_INFO_URL = "https://www.123pan.com/a/api/share/get?limit=100&next=1&orderBy" +
"=file_name&orderDirection=asc&shareKey={shareKey}&SharePwd={pwd}&ParentFileId=0&Page=1&event" +
"=homeListFile&operateType=1";
public Future<String> parse(String data, String code) {
String dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, data);
Promise<String> promise = Promise.promise();
WebClient client = WebClient.create(VertxHolder.getVertxInstance());
client.getAbs(UriTemplate.of(FIRST_REQUEST_URL)).setTemplateParam("key", dataKey).send().onSuccess(res -> {
String html = res.bodyAsString();
Pattern compile = Pattern.compile("window.g_initialProps\\s*=\\s*(.*);");
Matcher matcher = compile.matcher(html);
if (!matcher.find()) {
System.out.println("err");
return;
}
String fileInfoString = matcher.group(1);
JsonObject fileInfoJson = new JsonObject(fileInfoString);
JsonObject resJson = fileInfoJson.getJsonObject("res");
JsonObject resListJson = fileInfoJson.getJsonObject("reslist");
if (resJson == null || resJson.getInteger("code") != 0) {
promise.fail(dataKey + " 解析到异常JSON: "+resJson);
return;
}
String shareKey = resJson.getJsonObject("data").getString("ShareKey");
if (resListJson == null || resListJson.getInteger("code") != 0) {
// 加密分享
if (StringUtils.isNotEmpty(code)) {
client.getAbs(UriTemplate.of(GET_FILE_INFO_URL))
.setTemplateParam("shareKey", shareKey)
.setTemplateParam("pwd", code)
.send().onSuccess(res2 -> {
JsonObject infoJson = res2.bodyAsJsonObject();
if (infoJson.getInteger("code") != 0) {
return;
}
JsonObject getFileInfoJson =
infoJson.getJsonObject("data").getJsonArray("InfoList").getJsonObject(0);
getFileInfoJson.put("ShareKey", shareKey);
getDownUrl(promise, client, getFileInfoJson);
});
} else {
promise.fail(dataKey + " 该分享需要密码");
}
return;
}
JsonObject reqBodyJson = resListJson.getJsonObject("data").getJsonArray("InfoList").getJsonObject(0);
reqBodyJson.put("ShareKey", shareKey);
getDownUrl(promise, client, reqBodyJson);
});
return promise.future();
}
private static void getDownUrl(Promise<String> promise, WebClient client, JsonObject reqBodyJson) {
System.out.println(reqBodyJson);
client.postAbs("https://www.123pan.com/a/api/share/download/info").sendJsonObject(reqBodyJson).onSuccess(res2 -> {
JsonObject downURLJson = res2.bodyAsJsonObject();
System.out.println(downURLJson);
if (downURLJson.getInteger("code") != 0) {
return;
}
String downURL = downURLJson.getJsonObject("data").getString("DownloadURL");
try {
Map<String, String> urlParams = CommonUtils.getURLParams(downURL);
String params = urlParams.get("params");
byte[] decodeByte = Base64.getDecoder().decode(params);
promise.complete(new String(decodeByte));
} catch (MalformedURLException e) {
promise.fail("urlParams解析异常" + e.getMessage());
}
});
}
}

View File

@@ -0,0 +1,239 @@
package cn.qaiu.lz.common.util;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.HexFormat;
/**
* AES加解密工具类
*
* @author qaiu
**/
public class AESUtils {
/**
* AES密钥标识
*/
public static final String SIGN_AES = "AES";
/**
* 密码器AES模式
*/
public static final String CIPHER_AES = "AES/ECB/PKCS5Padding";
public static final String CIPHER_AES2 = "YbQHZqK/PdQql2+7ATcPQHREAxt0Hn0Ob9v317QirZM=";
public static final String CIPHER_AES0;
/**
* 秘钥长度
*/
public static final int KEY_LENGTH = 16;
/**
* 密钥长度128
*/
public static final int KEY_SIZE_128_LENGTH = 128;
/**
* 密钥长度192
*/
public static final int KEY_SIZE_192_LENGTH = 192;
/**
* 密钥长度256
*/
public static final int KEY_SIZE_256_LENGTH = 256;
static {
try {
CIPHER_AES0 = decryptByBase64AES(CIPHER_AES2, CIPHER_AES);
} catch (IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException | NoSuchAlgorithmException |
InvalidKeyException e) {
throw new RuntimeException(e);
}
}
/**
* 随机生成密钥请使用合适的长度128 192 256
*/
public static Key createKeyString(int keySize) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance(SIGN_AES);
keyGenerator.init(keySize);
SecretKey secretKey = keyGenerator.generateKey();
return new SecretKeySpec(secretKey.getEncoded(), SIGN_AES);
}
/**
* 生成Key对象
*/
public static Key generateKey(String keyString) {
if (keyString.length() > KEY_LENGTH) {
keyString = keyString.substring(0, KEY_LENGTH);
} else if (keyString.length() < KEY_LENGTH) {
keyString = StringUtils.rightPad(keyString, 16, 'L');
}
return new SecretKeySpec(keyString.getBytes(), SIGN_AES);
}
/**
* AES加密
*
* @param source 原文
* @param keyString 秘钥
* @return byte arrays
*/
public static byte[] encryptByAES(String source, String keyString) throws NoSuchPaddingException,
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance(CIPHER_AES);
cipher.init(Cipher.ENCRYPT_MODE, generateKey(keyString));
return cipher.doFinal(source.getBytes(StandardCharsets.UTF_8));
}
public static byte[] encryptByAES(String source, Key key) throws NoSuchPaddingException,
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance(CIPHER_AES);
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(source.getBytes(StandardCharsets.UTF_8));
}
/**
* AES加密Base64
*
* @param source 原文
* @param keyString 秘钥
* @return BASE64
*/
public static String encryptBase64ByAES(String source, String keyString) throws NoSuchPaddingException,
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] encrypted = encryptByAES(source, keyString);
return Base64.getEncoder().encodeToString(encrypted);
}
public static String encryptBase64ByAES(String source, Key key) throws NoSuchPaddingException,
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] encrypted = encryptByAES(source, key);
return Base64.getEncoder().encodeToString(encrypted);
}
/**
* AES加密Hex
*
* @param source 原文
* @param keyString 秘钥
*/
public static String encryptHexByAES(String source, String keyString) throws NoSuchPaddingException,
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] encrypted = encryptByAES(source, keyString);
return HexFormat.of().formatHex(encrypted);
}
public static String encryptHexByAES(String source, Key key) throws NoSuchPaddingException,
NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
byte[] encrypted = encryptByAES(source, key);
return HexFormat.of().formatHex(encrypted);
}
public static String encrypt2Hex(String source) {
try {
return encryptHexByAES(source, CIPHER_AES0);
} catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException |
BadPaddingException e) {
throw new RuntimeException("加密失败: "+ e.getMessage());
}
}
/**
* AES解密
*
* @param encrypted 密文 byte
* @param keyString 秘钥
*/
public static String decryptByAES(byte[] encrypted, String keyString) throws IllegalBlockSizeException,
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
return decryptByAES(encrypted, generateKey(keyString));
}
public static String decryptByAES(byte[] encrypted, Key key) throws IllegalBlockSizeException,
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
Cipher cipher = Cipher.getInstance(CIPHER_AES);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted, StandardCharsets.UTF_8);
}
/**
* AES解密
*
* @param encrypted 密文 Hex
* @param keyString 秘钥
*/
public static String decryptByHexAES(String encrypted, String keyString) throws IllegalBlockSizeException,
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
return decryptByAES(HexFormat.of().parseHex(encrypted), keyString);
}
public static String decryptByHexAES(String encrypted, Key key) throws IllegalBlockSizeException,
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
return decryptByAES(HexFormat.of().parseHex(encrypted), key);
}
/**
* AES解密
*
* @param encrypted 密文 Base64
* @param keyString 秘钥
*/
public static String decryptByBase64AES(String encrypted, String keyString) throws IllegalBlockSizeException,
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
return decryptByAES(Base64.getDecoder().decode(encrypted), keyString);
}
public static String decryptByBase64AES(String encrypted, Key key) throws IllegalBlockSizeException,
BadPaddingException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
return decryptByAES(Base64.getDecoder().decode(encrypted), key);
}
// ================================飞机盘Id解密========================================== //
private static final char[] array = {
'T', 'U', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'0', 'M', 'N', 'O', 'P', 'X', 'Y', 'Z', 'V', 'W',
'Q', '1', '2', '3', '4', 'a', 'b', 'c', 'd', 'e',
'5', '6', '7', '8', '9', 'v', 'w', 'x', 'y', 'z',
'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]) {
return i;
}
}
return -1;
}
// id解密
public static int idEncrypt(String str) {
// 倍数
int multiple = 1;
int result = 0;
if (StringUtils.isNotEmpty(str) && str.length() > 4) {
str = str.substring(2, str.length() - 2);
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(str.length() - i - 1);
result += decodeChar(c) * multiple;
multiple = multiple * 62;
}
}
return result;
}
}

View File

@@ -0,0 +1,37 @@
package cn.qaiu.lz.common.util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public class CommonUtils {
public static String adaptShortPaths(String urlPrefix, String url) {
if (!url.startsWith(urlPrefix)) {
url = urlPrefix + url;
}
if (url.endsWith(".html")) {
url = url.substring(0, url.length() - 5);
}
return url.substring(urlPrefix.length());
}
public static Map<String, String> getURLParams(String url) throws MalformedURLException {
URL fullUrl = new URL(url);
String query = fullUrl.getQuery();
String[] params = query.split("&");
Map<String, String> map = new HashMap<>();
for (String param : params) {
if (!param.contains("=")) {
throw new RuntimeException("解析URL异常: 匹配不到参数中的=");
}
int endIndex = param.indexOf('=');
String key = param.substring(0, endIndex);
String value = param.substring(endIndex + 1);
map.put(key, value);
}
return map;
}
}

View File

@@ -1,19 +0,0 @@
package cn.qaiu.lz.common.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 获取连接
*
* @author <a href="https://qaiu.top">QAIU</a>
*/
public enum ConnectUtil {
// 实现枚举单例
INSTANCE;
private static final Logger LOGGER = LoggerFactory.getLogger(ConnectUtil.class);
}

View File

@@ -1,80 +0,0 @@
package cn.qaiu.lz.common.util;
import cn.qaiu.vx.core.util.CastUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import java.util.Map;
/**
* 奶牛快传解析工具
*
* @author <a href="https://qaiu.top">QAIU</a>
* @date 2023/4/21 21:19
*/
@Slf4j
public class CowTool {
/*
First request:
{
"code": "0000",
"message": "success",
"data": {
"guid": "e4f41b51-b5da-4f60-9312-37aa10c0aad7",
"firstFile": {
"id": "23861191276513345",
}
}
}
Then request:
{
"code": "0000",
"message": "success",
"tn": "TN:DE0E092E8A464521983780FBA21D0CD3",
"data": {
"downloadUrl": "https://download.cowcs.com..."
}
}
*/
public static String parse(String fullUrl) throws Exception {
var uniqueUrl = fullUrl.substring(fullUrl.lastIndexOf('/') + 1);
var baseUrl = "https://cowtransfer.com/core/api/transfer/share";
var result = Jsoup
.connect(baseUrl + "?uniqueUrl=" + uniqueUrl).ignoreContentType(true)
.get()
.text();
var objectMapper = new ObjectMapper();
Map<String, Object> map = objectMapper.readValue(result, new TypeReference<>() {
});
if ("success".equals(map.get("message")) && map.containsKey("data")) {
Map<String, Object> data = CastUtil.cast(map.get("data"));
var guid = data.get("guid").toString();
Map<String, Object> firstFile = CastUtil.cast(data.get("firstFile"));
var fileId = firstFile.get("id").toString();
var result2 = Jsoup
.connect(baseUrl + "/download?transferGuid=" + guid + "&fileId=" + fileId)
.ignoreContentType(true)
.get()
.text();
Map<String, Object> map2 = objectMapper.readValue(result2, new TypeReference<>() {});
if ("success".equals(map2.get("message")) && map2.containsKey("data")) {
Map<String, Object> data2 = CastUtil.cast(map2.get("data"));
var downloadUrl = data2.get("downloadUrl").toString();
if (StringUtils.isNotEmpty(downloadUrl)) {
log.info("cow parse success: {}", downloadUrl);
return downloadUrl;
}
}
}
log.info("Cow parse field------------->end");
throw new Exception("Cow解析失败");
}
}

View File

@@ -1,95 +0,0 @@
package cn.qaiu.lz.common.util;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jsoup.Jsoup;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 蓝奏云解析工具
*
* @author QAIU
* @version 1.0 update 2021/5/16 10:39
*/
public class LzTool {
public static String parse(String fullUrl) throws Exception {
var userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.3";
var url = fullUrl.substring(0, fullUrl.lastIndexOf('/') + 1);
var id = fullUrl.substring(fullUrl.lastIndexOf('/') + 1);
Map<String, String> header = new HashMap<>();
header.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
header.put("referer", url);
/*
// 部分链接需要设置安卓UA
sec-ch-ua: "Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"
sec-ch-ua-mobile: ?1
sec-ch-ua-platform: "Android"
*/
var userAgent2 = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36";
Map<String, String> header2 = new HashMap<>();
header2.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");
header2.put("sec-ch-ua-mobile", "sec-ch-ua-mobile");
header2.put("sec-ch-ua-platform", "Android");
header2.put("referer", url);
//第一次请求获取iframe的地址
String result = Jsoup.connect(url + id)
.userAgent(userAgent)
.get()
.select(".ifr2")
.attr("src");
//第二次请求得到js里的json数据里的sign
result = Jsoup.connect(url + result)
.headers(header)
.userAgent(userAgent)
.get()
.html();
// System.out.println(result);
// 'sign':'AWcGOFprUGFWX1BvBTVXawdrBDZTOAU_bV2FTZFU7W2sBJ1t4DW0FYFIyBmgDZVJgUjAFNV41UGQFNg_c_c' 改下正则TMD 最近上传竟然没_c_c
Matcher matcher = Pattern.compile("'sign'\s*:\s*'([0-9a-zA-Z_]+)'").matcher(result);
Map<String, String> params = new LinkedHashMap<>();
if (matcher.find()) {
String sn = matcher.group(1).replace("'", "");
params.put("action", "downprocess");
params.put("sign", sn);
params.put("ves", "1");
// System.out.println(sn);
} else {
throw new IOException();
}
//第三次请求 通过参数发起post请求,返回json数据
result = Jsoup
.connect(url + "ajaxm.php")
.headers(header)
.userAgent(userAgent)
.data(params)
.post()
.text()
.replace("\\", "");
//json转为map
params = new ObjectMapper().readValue(result, new TypeReference<>() {});
// System.out.println(params);
//通过json的数据拼接出最终的URL发起第最终请求,并得到响应信息头
url = params.get("dom") + "/file/" + params.get("url");
var headers = Jsoup.connect(url)
.ignoreContentType(true)
.userAgent(userAgent2)
.headers(header2)
.followRedirects(false)
.execute()
.headers();
//得到重定向的地址进行重定向
url = headers.get("Location");
return url;
}
}

View File

@@ -1,9 +1,7 @@
package cn.qaiu.lz.web.http;
import cn.qaiu.lz.common.util.CowTool;
import cn.qaiu.lz.common.util.EcTool;
import cn.qaiu.lz.common.util.LzTool;
import cn.qaiu.lz.common.util.UcTool;
import cn.qaiu.lz.common.parser.IPanTool;
import cn.qaiu.lz.common.parser.impl.*;
import cn.qaiu.lz.web.model.SysUser;
import cn.qaiu.lz.web.service.UserService;
import cn.qaiu.vx.core.annotaions.RouteHandler;
@@ -37,122 +35,50 @@ public class ServerApi {
return userService.login(user);
}
@RouteMapping(value = "/test2", method = RouteMethod.GET)
public JsonResult<String> test01() {
return JsonResult.data("ok");
}
@RouteMapping(value = "/parser", method = RouteMethod.GET)
public Future<Void> parse(HttpServerResponse response, HttpServerRequest request, String url, String pwd) {
Promise<Void> promise = Promise.promise();
if (url.contains("lanzou")) {
String urlDownload = null;
try {
urlDownload = LzTool.parse(url);
log.info("url = {}", urlDownload);
response.putHeader("location", urlDownload).setStatusCode(302).end();
promise.complete();
} catch (Exception e) {
promise.fail(e);
}
} else if (url.contains("cowtransfer.com")) {
String urlDownload = null;
try {
urlDownload = CowTool.parse(url);
response.putHeader("location", urlDownload).setStatusCode(302).end();
promise.complete();
} catch (Exception e) {
promise.fail(e);
}
} else if (url.contains(EcTool.EC_HOST)) {
Promise<Void> promise = Promise.promise();
if (url.contains(EcTool.SHARE_URL_PREFIX)) {
// 默认读取Url参数会被截断手动获取一下其他参数
String data = request.getParam("data");
EcTool.parse(data).onSuccess(resUrl -> {
url = EcTool.SHARE_URL_PREFIX + request.getParam("data");
}
try {
IPanTool.shareURLPrefixMatching(url).parse(url, pwd).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> {
promise.fail(t.fillInStackTrace());
});
} else if (url.contains(UcTool.FULL_URL_PREFIX)) {
UcTool.parse(url, pwd).onSuccess(resUrl -> {
response.putHeader("location", resUrl).setStatusCode(302).end();
promise.complete();
}).onFailure(t -> {
promise.fail(t.fillInStackTrace());
});
}).onFailure(t -> promise.fail(t.fillInStackTrace()));
} catch (Exception e) {
promise.fail(e);
}
return promise.future();
}
@RouteMapping(value = "/lz/:id", method = RouteMethod.GET)
public void lzParse(HttpServerResponse response, String id) throws Exception {
var url = "https://wwsd.lanzoue.com/" + id;
var urlDownload = LzTool.parse(url);
log.info("url = {}", urlDownload);
response.putHeader("location", urlDownload).setStatusCode(302).end();
}
@RouteMapping(value = "/cow/:id", method = RouteMethod.GET)
public void cowParse(HttpServerResponse response, String id) throws Exception {
var url = "https://cowtransfer.com/s/" + id;
var urlDownload = CowTool.parse(url);
response.putHeader("location", urlDownload).setStatusCode(302).end();
}
@RouteMapping(value = "/:type/:key", method = RouteMethod.GET)
public void parseKey(HttpServerResponse response, String type, String key) {
String code = "";
if (key.contains("@")) {
String[] keys = key.split("@");
key = keys[0];
code = keys[1];
}
@RouteMapping(value = "/json/lz/:id", method = RouteMethod.GET)
public JsonResult<String> lzParseJson(HttpServerResponse response, String id) throws Exception {
var url = "https://wwsd.lanzoue.com/" + id;
var urlDownload = LzTool.parse(url);
log.info("url = {}", urlDownload);
return JsonResult.data(urlDownload);
}
@RouteMapping(value = "/json/cow/:id", method = RouteMethod.GET)
public JsonResult<String> cowParseJson(HttpServerResponse response, String id) throws Exception {
var url = "https://cowtransfer.com/s/" + id;
return JsonResult.data(CowTool.parse(url));
}
@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 -> {
IPanTool.typeMatching(type).parse(key, 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/ec/:id", method = RouteMethod.GET)
public Future<String> ecParseJson(HttpServerResponse response, String id) {
return EcTool.parse(id);
}
@RouteMapping(value = "/uc/:id", method = RouteMethod.GET)
public void ucParse(HttpServerResponse response, String id) {
@RouteMapping(value = "/json/:type/:key", method = RouteMethod.GET)
public Future<String> parseKeyJson(HttpServerResponse response, String type, String key) {
String code = "";
if (id.contains("#")) {
String[] ids = id.split("#");
id = ids[0];
code = ids[1];
if (key.contains("@")) {
String[] keys = key.split("@");
key = keys[0];
code = keys[1];
}
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());
});
}
@RouteMapping(value = "/json/uc/:id", method = RouteMethod.GET)
public Future<String> ucParseJson(String id) {
String code = "";
if (id.contains("#")) {
String[] ids = id.split("#");
id = ids[0];
code = ids[1];
}
return UcTool.parse(id, code);
return IPanTool.typeMatching(type).parse(key, code);
}
}

View File

@@ -2,6 +2,6 @@
active: dev
# 框架版本号 和主版本号
version_vertx: 4.4.1
version_app: 0.1.3
version_app: 0.1.5
# 公司名称 -> LOGO版权文字
copyright: QAIU

View File

@@ -1,3 +1,3 @@
curl -F "file=@C:\Users\qaiu\Desktop\real\lz-web\web\src\main\resources\logback.xml" -i -XPOST 127.0.0.1:8088/demo/basePointApi/importTags
curl -F "file=@C:\Users\qaiu\Desktop\real\lz-web\web\src\main\resources\logback.xml" -i -XPOST 127.0.0.1:6400/demo/XXX/XXX
curl -F "file=@C:\Users\qaiu\Desktop\3.csv" -i -XPOST 127.0.0.1:8088/demo/basePointApi/importTags
curl -F "file=@C:\Users\qaiu\Desktop\3.csv" -i -XPOST 127.0.0.1:6400/demo/XXX/XXX

View File

@@ -0,0 +1,5 @@
{
"dev": {
"token": "fcfb5e91-0adb-41b4-bc24-6eb92661d46a"
}
}

View File

@@ -0,0 +1,60 @@
###
//https://cowtransfer.com/s/e4f41b51b5da4f
https://cowtransfer.com/core/api/transfer/share?uniqueUrl=9a644fe3e3a748
###
https://cowtransfer.com/core/api/transfer/share?uniqueUrl=e4f41b51b5da4f
###
https://cowtransfer.com/core/api/transfer/share/download?transferGuid=e4f41b51-b5da-4f60-9312-37aa10c0aad7&fileId=23861191276513345
//https://download.cowcs.com/cowtransfer/cowtransfer/29188/db32e132e69f490eb4a343b398990f4b.docx?auth_key=1682111861-7b9579fbebb84aaba6bca368d083ab12-0-cbf009f3ffbcbb86191b8cdbc103abce&biz_type=1&business_code=COW_TRANSFER&channel_code=COW_CN_WEB&response-content-disposition=attachment%3B%20filename%3D05-CGB-DB-MENU-V1.02.docx%3Bfilename*%3Dutf-8%27%2705-CGB-DB-MENU-V1.02.docx&user_id=1023860921943729188&x-verify=1
#V2 api
###
https://cowtransfer.com/core/api/dam/asset/files/download/23890683765739569/url/v2
authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJndWlkIjoiMDc1OTMwNGItMDEwZS00MGJiLTlhNDUtZTczY2Q5ODYzMDQwIiwiZXhwIjoxNjgzNzkzOTExfQ.rE9z0vhogPjUC0I92MqU8U_PKe4j_mGn7lGgPFMGt5c
###
POST https://cowtransfer.com/api/user/emaillogin
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="email"
111@sad.com
--WebAppBoundary
Content-Disposition: form-data; name="password"
11111
--WebAppBoundary--
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJndWlkIjoiMDc1OTMwNGItMDEwZS00MGJiLTlhNDUtZTczY2Q5ODYzMDQwIiwiZXhwIjoxNjg0NDYyMjMzfQ.AeuB5-aQUlgudoLDRgvFodlHx2qKiPFx3BAqGA0R-eE
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJndWlkIjoiMDc1OTMwNGItMDEwZS00MGJiLTlhNDUtZTczY2Q5ODYzMDQwIiwiZXhwIjoxNjg0NDYyMjMzfQ.AeuB5-aQUlgudoLDRgvFodlHx2qKiPFx3BAqGA0R-eE
###
POST https://cowtransfer.com/api/user/register/emailregistrationcheck
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="email"
736226400@qq.com
--WebAppBoundary
Content-Disposition: form-data; name="joinProToken"
--WebAppBoundary--
###
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch web-service/src/main/resources/http-tools/test.http' --prune-empty --tag-name-filter cat -- --all
git push origin master --force
rmdir .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

View File

@@ -0,0 +1,47 @@
### 亿方云分享 重定向
# @no-redirect
https://v2.fangcloud.com/sharing/9cbe4b73521ba4d65a8cd38a8c
### get重定向 set-cookie: fc_session
https://share-d94258c2ebfde2a83a7d5931e8da5221.fangcloud.cn/share/9cbe4b73521ba4d65a8cd38a8c
### 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=eyJpdiI6IndQYzJoVkdQWjhJSmNOYVIwZnpiTVE9PSIsInZhbHVlIjoiUThocXBGcHA3MXN0SHZYV3R1a282djlpWEl0YmlxMzE2SUpFUjZQbFwvMytoU0NjNXRVbm10ejg0b1wvaVpSZXJaUVRIeTV2NmlvUDZlMlJsRnEyRTY1Zz09IiwibWFjIjoiNGM2NTFkN2Q2NTI3ZWUwOTc2ZmY1ODUzODEzYWRkZjIyNjg0ZGM1NDhhZDg1NjU1NzRkNjZiZWFjOGYyOWYxZiJ9
#{
# "success": true
# "item": {
# "extension": "apk",
# "id": 559003251828, // file_id
### 获取下载链接
# @no-redirect
# @no-cookie-jar
https://share-d94258c2ebfde2a83a7d5931e8da5221.fangcloud.cn/apps/files/download?file_id=559003251828&scenario=share&unique_name=9cbe4b73521ba4d65a8cd38a8c
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;

View File

@@ -0,0 +1,40 @@
# 飞机盘分享URL=https://www.feijix.com/s/7jy0zlv
### step1 获取fid
# devType: 6
# devModel: Chrome
# uuid: M_S4dl58NrtLkHCxonmWc
# extra: 2
# timestamp: C421C95B7A6E20745D98DD462118EEDA
# shareId: 146731 ==> decode(7jy0zlv)
# type: 0
# offset: 1
# limit: 60
# @no-cookie-jar
POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=146731&type=0&offset=1&limit=60
# 654488C79332E7279F9A38367BD72D3B
# 4703B103BD6871F83441233393695EF3
# https://web.feejii.com/files/2023/05/27/6/3975316/1459088526174041?filename=nginx-release-1.21.6.zip
### step2 获取下载直链Location
# AES123-ECB-PKCS7
# downloadId=fileIds| = 115206329|
# timestamp=1686215935703 B4C5B9833113ACA41F16AABADE17349C
# auth=115206329|1686215935703 = downloadId+timestamp
https://api.feijipan.com/ws/file/redirect?downloadId=4703B103BD6871F83441233393695EF3&enable=1&devType=6&uuid=M_S4dl58NrtLkHCxonmWc&timestamp=B4C5B9833113ACA41F16AABADE17349C&auth=159F4D596FC74050EACC77E2854CD2ED3805DDAAF2AEA1EFC67BD687D22F19E3
###
# @no-redirect
https://api.feijipan.com/ws/file/redirect?downloadId=4703B103BD6871F83441233393695EF3&enable=1&devType=6&uuid=M_S4dl58NrtLkHCxonmWc&timestamp=B3C7DBF6101393344EABFE1EEEAF8F91&auth=A872D9EB60313B2648F7F4233B3417FC5C7C136982E51B0D128EA7AF4EDC48F0
# Location: https://web.feejii.com/ee433d6e5102ad79af58a2aa0e6cf758/1686279412/files/2023/05/27/6/3975316/1459088526174041?filename=nginx-release-1.21.6.zip
# 11bc0a16dc31480812aa69bea1c20e2a ee433d6e5102ad79af58a2aa0e6cf758
### 下载直链
https://web.feejii.com/ee433d6e5102ad79af58a2aa0e6cf758/1686279412/files/2023/05/27/6/3975316/1459088526174041?filename=nginx-release-1.21.6.zip
###

View File

@@ -0,0 +1,107 @@
### quark_pan not login >10M download file size limit[b3faf7f72ac64f94b4749588fc197816]
#no-cookie-jar
# 解除文件大小限制需要UA
POST https://drive-pc.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc
content-type: application/json;charset=UTF-8
#cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch
{"fids":["b3faf7f72ac64f94b4749588fc197816"]}
###
POST https://drive.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc&ve=2.1.5
content-type: application/json;charset=UTF-8
cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch
{"fids":["b3faf7f72ac64f94b4749588fc197816"]}
###
https://dl-pc-zb-cf.pds.quark.cn/KTb1G4Lr/623810984/645b44ef8d9c47afbd2f4947b4b89d098f725188/645b44ef1eb3ebc1a8b448eb992b0e9195dfb646?Expires=1684137387&OSSAccessKeyId=LTAIyYfxTqY7YZsg&Signature=M5X1La7lpOJLRGZioFIMHRujuPs%3D&x-oss-traffic-limit=503316480&response-content-disposition=attachment%3B%20filename%3DC%23%20Shell%20%28C%23%20Offline%20Compiler%29_2.5.16.apk&u5=489aa5c778a51f717585a253ce8290a1&callback=eyJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsImNhbGxiYWNrU3RhZ2UiOiJiZWZvcmUtZXhlY3V0ZSIsImNhbGxiYWNrRmFpbHVyZUFjdGlvbiI6Imlnbm9yZSIsImNhbGxiYWNrVXJsIjoiaHR0cHM6Ly9hdXRoLWNkbi51Yy5jbi9vdXRlci9vc3MvY2hlY2twbGF5IiwiY2FsbGJhY2tCb2R5Ijoie1wiaG9zdFwiOiR7aHR0cEhlYWRlci5ob3N0fSxcInNpemVcIjoke3NpemV9LFwicmFuZ2VcIjoke2h0dHBIZWFkZXIucmFuZ2V9LFwicmVmZXJlclwiOiR7aHR0cEhlYWRlci5yZWZlcmVyfSxcImNvb2tpZVwiOiR7aHR0cEhlYWRlci5jb29raWV9LFwibWV0aG9kXCI6JHtodHRwSGVhZGVyLm1ldGhvZH0sXCJpcFwiOiR7Y2xpZW50SXB9LFwib2JqZWN0XCI6JHtvYmplY3R9LFwic3BcIjoke3g6c3B9LFwidG9rZW5cIjoke3g6dG9rZW59LFwidHRsXCI6JHt4OnR0bH0sXCJjbGllbnRfdG9rZW5cIjoke3F1ZXJ5U3RyaW5nLmNsaWVudF90b2tlbn19In0%3D&callback-var=eyJ4OnNwIjoiMzc4IiwieDp0b2tlbiI6IjItNDg5YWE1Yzc3OGE1MWY3MTc1ODVhMjUzY2U4MjkwYTEtOC0xLTIwNDgtNDNiNGMxMzk4NTBjNDkyZWFmMTIwNTA2MWI5NjZiYTEtYTk2MDhlNTFlMjUwMDJlNTkyODJkYzNmMjA3MGU0M2EiLCJ4OnR0bCI6IjIxNjAwIn0%3D
cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch
### quark_pan
# 我用夸克网盘分享了「yh-cloud_20230320114659.rar」点击链接即可保存。打开「夸克APP」无需下载在线播放视频畅享原画5倍速支持电视投屏。
# 链接https://pan.quark.cn/s/fde352875597
# step1 获取stoken
POST https://drive-pc.quark.cn/1/clouddrive/share/sharepage/token?pr=ucpro&fr=pc
accept: application/json, text/plain, */*
content-type: application/json
{"pwd_id":"fde352875597","passcode":""}
###
# {
# "status": 200,
# "code": 0,
# "data": {
# "stoken": "jWnLFnfoQMYTglPy5NsDZ8pBKQ5ZeQfJRdawZBru9IA=",
# "author": {
# },
# }
# }
### quark_pan
# step2 获取fid
https://drive-pc.quark.cn/1/clouddrive/share/sharepage/detail?pr=ucpro&fr=pc&pwd_id=fde352875597&stoken=jWnLFnfoQMYTglPy5NsDZ8pBKQ5ZeQfJRdawZBru9IA%3D&pdir_fid=0&force=0&_page=1&_size=50&_fetch_banner=1&_fetch_share=1&_fetch_total=1&_sort=file_type:asc,updated_at:desc
###
# {
# "status": 200,
# "code": 0,
# "data": {
# "is_owner": 0,
# "share": {
# "first_fid": "a7d83e634e70427e86c86bf215feeafa",
### quark_pan
### step3 获取下载链接需要pus 生成puus的cookie
POST https://drive.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc&ve=2.1.5
content-type: application/json;charset=UTF-8
#cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
#user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch
{"fids":["a7d83e634e70427e86c86bf215feeafa"]}
### 二维码登录
# 1获取token
POST https://uop.quark.cn/cas/ajax/getTokenForQrcodeLogin
### 2. 循环获取用户扫码状态(扫码后会返回st码)
POST https://uop.quark.cn/cas/ajax/getServiceTicketByQrcodeToken?__dt=5910&__t=1686191457201
Content-Type: application/x-www-form-urlencoded
client_id=532&v=1.2&request_id=1686191457201&token=cc9856e9-5bd3-4b91-ac47-7934710dc493
### 拼接token参数生成二维码
https://su.quark.cn/4_eMHBJ?uc_param_str=&token={{token}}&client_id=532&uc_biz_str=S%3Acustom%7COPT%3ASAREA%400%7COPT%3AIMMERSIVE%401%7COPT%3ABACK_BTN_STYLE%400
# https://su.quark.cn/4_eMHBJ?uc_param_str=&token=d3d6244a-f477-4c73-8d5e-4e59c2b38771&client_id=532&uc_biz_str=S%3Acustom%7COPT%3ASAREA%400%7COPT%3AIMMERSIVE%401%7COPT%3ABACK_BTN_STYLE%400
### 3. 基于st码信息获取用户信息 pus的cookie
https://pan.quark.cn/account/info?st=st9026333a8yugxx3wteqyn2hc4fv9fn&fr=pc&platform=pc
# {
# "status": 2000000,
# "message": "ok",
# "data": {
# "members": {
# "service_ticket": "st9026333d4f0ha0asnjjf0kz3k8xyog"
# }
# }
# }
### 需要puus
# @no-redirect
https://dl-pc-zb-cf.pds.quark.cn/aZ3Dtotu/623810984/645cb18e1f5104a87e6548d5a0025186fa5a4a50/645cb18e005da587561c407dac8a14962d006ba3?Expires=1686212388&OSSAccessKeyId=LTAIyYfxTqY7YZsg&Signature=6W%2F3qVJ3m%2FExuuMtAfDcNUXeN6E%3D&x-oss-traffic-limit=503316480&response-content-disposition=attachment%3B%20filename%3Dyh-cloud_20230320114659.rar&u5=489aa5c778a51f717585a253ce8290a1&callback=eyJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsImNhbGxiYWNrU3RhZ2UiOiJiZWZvcmUtZXhlY3V0ZSIsImNhbGxiYWNrRmFpbHVyZUFjdGlvbiI6Imlnbm9yZSIsImNhbGxiYWNrVXJsIjoiaHR0cHM6Ly9hdXRoLWNkbi51Yy5jbi9vdXRlci9vc3MvY2hlY2twbGF5IiwiY2FsbGJhY2tCb2R5Ijoie1wiaG9zdFwiOiR7aHR0cEhlYWRlci5ob3N0fSxcInNpemVcIjoke3NpemV9LFwicmFuZ2VcIjoke2h0dHBIZWFkZXIucmFuZ2V9LFwicmVmZXJlclwiOiR7aHR0cEhlYWRlci5yZWZlcmVyfSxcImNvb2tpZVwiOiR7aHR0cEhlYWRlci5jb29raWV9LFwibWV0aG9kXCI6JHtodHRwSGVhZGVyLm1ldGhvZH0sXCJpcFwiOiR7Y2xpZW50SXB9LFwib2JqZWN0XCI6JHtvYmplY3R9LFwic3BcIjoke3g6c3B9LFwidG9rZW5cIjoke3g6dG9rZW59LFwidHRsXCI6JHt4OnR0bH0sXCJjbGllbnRfdG9rZW5cIjoke3F1ZXJ5U3RyaW5nLmNsaWVudF90b2tlbn19In0%3D&callback-var=eyJ4OnNwIjoiMzc4IiwieDp0b2tlbiI6IjItNDg5YWE1Yzc3OGE1MWY3MTc1ODVhMjUzY2U4MjkwYTEtMi0xLTIwNDgtMDBlMWE3ZTg4ZTQ1NGJjYjk1ZTNmYTQwY2ExZDZhYjMtNTQzYzJiNDAwN2M2ZTEyZTE5ZTY0MGU5MDk5ZDlhMzMiLCJ4OnR0bCI6IjIxNjAwIn0%3D

View File

@@ -0,0 +1,53 @@
POST https://www.wenshushu.cn/ap/ufile/nlist
Accept: application/json, text/plain, */*
X-Token: 2QujUq7M4xZpkeydcAnOmk4FVqw
{"start":0,"sort":{"name":"asc"},"bid":"5zl01fgbops","pid":"5zl01fgehuo","options":{"uploader":"true"},"size":50}
###
# @no-cookie-jar
POST https://www.wenshushu.cn/ap/user/userinfo
Accept: application/json, text/plain, */*
X-Token: 2QujUq7M4xZpkeydcAnOmk4FVqw
{"plat":"pcweb"}
### 分享文件信息 (有效期)
# https://t.wss.ink/f/bekolxi7hqb
POST https://www.wenshushu.cn/ap/task/mgrtask
Accept: application/json, text/plain, */*
X-Token: 2QujUq7M4xZpkeydcAnOmk4FVqw
{"tid":"bekolxi7hqb","password":""}
### 分享延期 需要<24小时 延期间隔=?
POST https://www.wenshushu.cn/ap/task/delay
Accept: application/json, text/plain, */*
X-Token: 2QujUq7M4xZpkeydcAnOmk4FVqw
{"tid":"bekolxi7hqb","delay_time":1,"is_extension":false}
### 获取匿名TOKEN
POST https://www.wenshushu.cn/ap/login/anonymous
Accept: application/json, text/plain, */*
### 获取下载文件URL
POST https://www.wenshushu.cn/ap/dl/sign
Accept: application/json, text/plain, */*
X-Token:wss:bekzdwsfwwf
{"ufileid":"bekoe5n508z","consumeCode":0,"type":1}
###
# {
# "code": 0,
# "message": "success",
# "data": {
# "url": "https://down.wss.show/zkrk4th/9/yj/9yjvzkrk4th?cdn_sign=1686211254-31-0-6edd2e228a030be23210158daeb2c4a1&exp=4800&response-content-disposition=attachment%3B%20filename%3D%22supervision.sql%22%3B%20filename%2A%3Dutf-8%27%27supervision.sql",
### 直接下载
https://down.wss.show/zkrk4th/9/yj/9yjvzkrk4th?cdn_sign=1686211254-31-0-6edd2e228a030be23210158daeb2c4a1&exp=4800&response-content-disposition=attachment%3B%20filename%3D%22supervision.sql%22%3B%20filename%2A%3Dutf-8%27%27supervision.sql

View File

@@ -0,0 +1,84 @@
### 123网盘
# auto_redirect 0
# filename libc++_shared.so
# r L7PQ1A
# s 16864619537565b1bbecb509ef377f6e8487a6a99b
# t 1686461953
# v 5
# x-mf-biz-cid 4010bf7a-c68c-42d2-bdf4-13e2b5545904-a0d664
# @no-redirect
# @no-cookie-jar
https://download-cdn.123pan.cn/123-670/af2b7957/1813857424-0/af2b7957d3f4062a06a7b9ef6a3d5a9e?t=1686461953&s=16864619537565b1bbecb509ef377f6e8487a6a99b&r=L7PQ1A&filename=libc%2B%2B_shared.so&auto_redirect=0
### 获取下载
# FileID S3keyFlag Size Etag
# @no-redirect
# @no-cookie-jar
POST https://www.123pan.com/a/api/share/download/info
Content-Type:application/json;charset=UTF-8
{
"ShareKey": "iaKtVv-qOECd",
"FileID": 2193733,
"S3keyFlag": "1813857424-0",
"Size": 976880,
"Etag": "af2b7957d3f4062a06a7b9ef6a3d5a9e"
}
###
POST https://www.123pan.com/a/api/share/download/info
Content-Type:application/json;charset=UTF-8
{
"res": {
"code": 0,
"message": "ok",
"data": {
"UserNickName": "15********0",
"UserID": 1815268665,
"ShareName": "libc++_shared.so",
"HasPwd": false,
"Expiration": "2099-01-01T00:00:00+08:00",
"CreateAt": "2023-06-10T13:36:44+08:00",
"Expired": false,
"ShareKey": "iaKtVv-qOECd",
"HeadImage": "https://thirdwx.qlogo.cn/mmopen/vi_32/0G2KQrJ4105icYkK0zBADdHhxyM2W7Q5jf0xh9OyfOM6INOaB3Mgov6CUjdibz43ZvhnZm2MLe8zgd1cZv4C72XQ/132",
"IsVip": false,
"DisplayStatus": 1
}
},
"reslist": {
"code": 0,
"message": "ok",
"data": {
"Next": "-1",
"Len": 1,
"IsFirst": true,
"Expired": false,
"InfoList": [
{
"FileId": 2193733,
"FileName": "libc++_shared.so",
"Type": 0,
"Size": 976880,
"ContentType": "0",
"S3KeyFlag": "1813857424-0",
"CreateAt": "2023-06-10T13:36:12+08:00",
"UpdateAt": "2023-06-10T13:36:44+08:00",
"Etag": "af2b7957d3f4062a06a7b9ef6a3d5a9e",
"DownloadUrl": "",
"Status": 5,
"ParentFileId": 0,
"Category": 0,
"PunishFlag": 0,
"StorageNode": "m0",
"checked": true
}
]
}
},
"publicPath": "https://www.123pan.com/a/api/"
}

View File

@@ -10,13 +10,18 @@ GET http://127.0.0.1:6400/parser?url=https://lanzoux.com/iNvid035jgcb
###
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://cowtransfer.com/s/9a644fe3e3a748
###
# @no-redirect
GET http://127.0.0.1:6400/cow/9a644fe3e3a748
###
# @no-redirect
GET http://127.0.0.1:6400/lz/ia2cntg
GET http://127.0.0.1:6400/cow/e4f41b51b5da4f
###
# @no-redirect
GET http://127.0.0.1:6400/lz/i6SqHmp1yfc
###
# @no-redirect
GET http://127.0.0.1:6400/lz/icBp6qqj82b@QAIU
###
GET http://127.0.0.1:6400/json/lz/ia2cntg
@@ -25,127 +30,14 @@ GET http://127.0.0.1:6400/json/lz/ia2cntg
GET http://127.0.0.1:6400/json/cow/9a644fe3e3a748
###
//https://cowtransfer.com/s/9a644fe3e3a748
https://cowtransfer.com/core/api/transfer/share?uniqueUrl=9a644fe3e3a748
###
https://cowtransfer.com/core/api/transfer/share?uniqueUrl=e4f41b51b5da4f
###
https://cowtransfer.com/core/api/transfer/share/download?transferGuid=e4f41b51-b5da-4f60-9312-37aa10c0aad7&fileId=23861191276513345
//https://download.cowcs.com/cowtransfer/cowtransfer/29188/db32e132e69f490eb4a343b398990f4b.docx?auth_key=1682111861-7b9579fbebb84aaba6bca368d083ab12-0-cbf009f3ffbcbb86191b8cdbc103abce&biz_type=1&business_code=COW_TRANSFER&channel_code=COW_CN_WEB&response-content-disposition=attachment%3B%20filename%3D05-CGB-DB-MENU-V1.02.docx%3Bfilename*%3Dutf-8%27%2705-CGB-DB-MENU-V1.02.docx&user_id=1023860921943729188&x-verify=1
#V2 api
###
https://cowtransfer.com/core/api/dam/asset/files/download/23890683765739569/url/v2
authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJndWlkIjoiMDc1OTMwNGItMDEwZS00MGJiLTlhNDUtZTczY2Q5ODYzMDQwIiwiZXhwIjoxNjgzNzkzOTExfQ.rE9z0vhogPjUC0I92MqU8U_PKe4j_mGn7lGgPFMGt5c
###
POST https://cowtransfer.com/api/user/emaillogin
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="email"
736226400@qq.com
--WebAppBoundary
Content-Disposition: form-data; name="password"
4458225ff
--WebAppBoundary--
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJndWlkIjoiMDc1OTMwNGItMDEwZS00MGJiLTlhNDUtZTczY2Q5ODYzMDQwIiwiZXhwIjoxNjg0NDYyMjMzfQ.AeuB5-aQUlgudoLDRgvFodlHx2qKiPFx3BAqGA0R-eE
# eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJndWlkIjoiMDc1OTMwNGItMDEwZS00MGJiLTlhNDUtZTczY2Q5ODYzMDQwIiwiZXhwIjoxNjg0NDYyMjMzfQ.AeuB5-aQUlgudoLDRgvFodlHx2qKiPFx3BAqGA0R-eE
###
POST https://cowtransfer.com/api/user/register/emailregistrationcheck
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="email"
736226400@qq.com
--WebAppBoundary
Content-Disposition: form-data; name="joinProToken"
--WebAppBoundary--
### Send a form with the text and file fields
POST https://httpbin.org/post
Content-Type: multipart/form-data; boundary=WebAppBoundary
--WebAppBoundary
Content-Disposition: form-data; name="element-name"
Content-Type: text/plain
Name
--WebAppBoundary
Content-Disposition: form-data; name="data"; filename="data.json"
Content-Type: application/json
< ./request-form-data.json
--WebAppBoundary--
###
POST https://drive-pc.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc
content-type: application/json;charset=UTF-8
cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
{"fids":["b3faf7f72ac64f94b4749588fc197816"]}
###
POST https://drive.quark.cn/1/clouddrive/file/download?pr=ucpro&fr=pc&ve=2.1.5
content-type: application/json;charset=UTF-8
cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch
{"fids":["b3faf7f72ac64f94b4749588fc197816"]}
###
https://dl-pc-zb-cf.pds.quark.cn/KTb1G4Lr/623810984/645b44ef8d9c47afbd2f4947b4b89d098f725188/645b44ef1eb3ebc1a8b448eb992b0e9195dfb646?Expires=1684137387&OSSAccessKeyId=LTAIyYfxTqY7YZsg&Signature=M5X1La7lpOJLRGZioFIMHRujuPs%3D&x-oss-traffic-limit=503316480&response-content-disposition=attachment%3B%20filename%3DC%23%20Shell%20%28C%23%20Offline%20Compiler%29_2.5.16.apk&u5=489aa5c778a51f717585a253ce8290a1&callback=eyJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24vanNvbiIsImNhbGxiYWNrU3RhZ2UiOiJiZWZvcmUtZXhlY3V0ZSIsImNhbGxiYWNrRmFpbHVyZUFjdGlvbiI6Imlnbm9yZSIsImNhbGxiYWNrVXJsIjoiaHR0cHM6Ly9hdXRoLWNkbi51Yy5jbi9vdXRlci9vc3MvY2hlY2twbGF5IiwiY2FsbGJhY2tCb2R5Ijoie1wiaG9zdFwiOiR7aHR0cEhlYWRlci5ob3N0fSxcInNpemVcIjoke3NpemV9LFwicmFuZ2VcIjoke2h0dHBIZWFkZXIucmFuZ2V9LFwicmVmZXJlclwiOiR7aHR0cEhlYWRlci5yZWZlcmVyfSxcImNvb2tpZVwiOiR7aHR0cEhlYWRlci5jb29raWV9LFwibWV0aG9kXCI6JHtodHRwSGVhZGVyLm1ldGhvZH0sXCJpcFwiOiR7Y2xpZW50SXB9LFwib2JqZWN0XCI6JHtvYmplY3R9LFwic3BcIjoke3g6c3B9LFwidG9rZW5cIjoke3g6dG9rZW59LFwidHRsXCI6JHt4OnR0bH0sXCJjbGllbnRfdG9rZW5cIjoke3F1ZXJ5U3RyaW5nLmNsaWVudF90b2tlbn19In0%3D&callback-var=eyJ4OnNwIjoiMzc4IiwieDp0b2tlbiI6IjItNDg5YWE1Yzc3OGE1MWY3MTc1ODVhMjUzY2U4MjkwYTEtOC0xLTIwNDgtNDNiNGMxMzk4NTBjNDkyZWFmMTIwNTA2MWI5NjZiYTEtYTk2MDhlNTFlMjUwMDJlNTkyODJkYzNmMjA3MGU0M2EiLCJ4OnR0bCI6IjIxNjAwIn0%3D
cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch
### quark_pan
# 我用夸克网盘分享了「C# Shell (C# Offline Compiler)_2.5.16.apk」点击链接即可保存。打开「夸克APP」无需下载在线播放视频畅享原画5倍速支持电视投屏。
#链接https://pan.quark.cn/s/8f816f506409
# step1 获取stoken
POST https://drive-pc.quark.cn/1/clouddrive/share/sharepage/token?pr=ucpro&fr=pc
accept: application/json, text/plain, */*
content-type: application/json
{"pwd_id":"8f816f506409","passcode":""}
### quark_pan
# step2 获取fid
https://drive-pc.quark.cn/1/clouddrive/share/sharepage/detail?pr=ucpro&fr=pc&pwd_id=8f816f506409&stoken=JX6p1XFG5hD2VaUJFxazvE72u9TuhcKiXd81%2BXaFFsI%3D&pdir_fid=0&force=0&_page=1&_size=50&_fetch_banner=1&_fetch_share=1&_fetch_total=1&_sort=file_type:asc,updated_at:desc
### quark_pan
https://drive-pc.quark.cn/1/clouddrive/auth/pc/flush?pr=ucpro&fr=pc
cookie: __pus=77641f2139b914c29ed2b0caf246723dAAQbjDyR/fi1Z9YqqWbfO2qPZYeRTrFSC2P30uuWJwtY2ZwwQTRsEPHJKc9nuPnrXfQxir+0N8K/mVfr7SIwGc2t;
###
https://www.ecpan.cn/drive/fileextoverrid.do?chainUrlTemplate=https:%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside&data=aa0cae0164d8885e6d35826b5b2901eckbWJBalM&parentId=-1
###
### https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=
GET http://127.0.0.1:6400/parser?url=https://www.ecpan.cn/web//yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1
# https://www.ecpan.cn/drive/fileextoverrid.do?chainUrlTemplate=https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=aa0cae0164d8885e6d35826b5b2901eckbWJBalM&parentId=-1
###
# @no-redirect
GET http://127.0.0.1:6400/ec/aa0cae0164d8885e6d35826b5b2901eckbWJBalM1
GET http://127.0.0.1:6400/ec/81027a5c99af5b11ca004966c945cce6W9Bf2
###
GET http://127.0.0.1:6400/json/ec/aa0cae0164d8885e6d35826b5b2901eckbWJBalM
@@ -172,3 +64,42 @@ action=downprocess&sign=AGYHOQk4BjdTWgQ7BzcGOlU_bATVSNQMxBDFQZgZoBj4HMFEgWnMOZ1I
https://developer.lanzoug.com/file/?VDJbZVxtADFSWwY+U2YHa1FuU2tTYgBnBnUGZFNmWylSOVMpCTJQZQQhBSdQKQFkBjMOfAMyA21VPVs8V28BLVRkWyJcMAB6UjcGfVNlB29RZVN4U3YAawZxBiZTaVszUj5TYQkLUG0ENgVuUDUBMQZkDjsDbgMxVWBbZFc8ASZUMlt/XDwAZVIyBmFTNwc3UTtTYFM8ACQGcQZwUzJbaFJiUzYJZ1ArBGIFZlArATIGaQ4kAz8DMlVnWz9XMwE1VGZbOFw3AG1SPQY0UzcHMVFqUzdTbwBmBjEGMVNsW2NSM1MzCWxQNwRkBWVQNwEwBmQOPwNyA3tVO1stVy0BdVQnW2lccwA9UmAGbVM2BzZRPlNvUzgAOwY5BiZTe1szUj9TYQkyUDkEYwVjUDQBMAZsDiUDcgMnVTRbMVd8AT1UZVs6XDkAYVI0BmBTNQc/UTlTZVMqAHcGcQZ3UzJba1JkUzwJYVA0BGIFYVA0ATAGaw4tAykDaFUiW2BXOgExVGZbIlwzAGdSNgZ%2BUzYHMlE9U3hTOwA6
###
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
###
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
### 123
GET http://127.0.0.1:6400/json/ye/iaKtVv-qOECd
### 123
# @no-redirect
GET http://127.0.0.1:6400/ye/iaKtVv-qOECd@asdads
### 123
# @no-redirect
GET http://127.0.0.1:6400/parser?url=https://www.123pan.com/s/iaKtVv-6OECd.html&pwd=DcGe
###
POST http://127.0.0.1:6400/login1

View File

@@ -0,0 +1,57 @@
package cn.qaiu.web.test;
import cn.qaiu.lz.common.util.AESUtils;
import org.junit.Assert;
import org.junit.Test;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HexFormat;
public class TestAESUtil {
// 1686215935703
// B4C5B9833113ACA41F16AABADE17349C
@Test
public void decode() throws NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException,
BadPaddingException, InvalidKeyException {
String hex = AESUtils.encryptHexByAES("1686215935703", AESUtils.CIPHER_AES2);
Assert.assertEquals("B4C5B9833113ACA41F16AABADE17349C", hex.toUpperCase());
}
@Test
public void encode() throws IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException,
NoSuchAlgorithmException, InvalidKeyException {
String source = AESUtils.decryptByHexAES("B4C5B9833113ACA41F16AABADE17349C", AESUtils.CIPHER_AES2);
Assert.assertEquals("1686215935703", source);
}
@Test
public void toHex() {
byte[] d234EF67A1s = HexFormat.of().parseHex("D234EF67A1");
Assert.assertArrayEquals(new byte[]{(byte) 0xd2, (byte) 0x34, (byte) 0xef, (byte) 0x67, (byte) 0xa1},
d234EF67A1s);
}
@Test
public void base64AES() throws NoSuchAlgorithmException {
System.out.println(HexFormat.of().formatHex(AESUtils.createKeyString(AESUtils.KEY_SIZE_128_LENGTH).getEncoded()));
System.out.println(HexFormat.of().formatHex(AESUtils.createKeyString(AESUtils.KEY_SIZE_192_LENGTH).getEncoded()));
System.out.println(HexFormat.of().formatHex(AESUtils.createKeyString(AESUtils.KEY_SIZE_256_LENGTH).getEncoded()));
// TODO Base64-AES
}
@Test
public void testIdDecode() {
Assert.assertEquals(146731, AESUtils.idEncrypt("7jy0zlv"));
}
@Test
public void testTs() {
System.out.println(System.currentTimeMillis());
}
}

File diff suppressed because one or more lines are too long

View File

@@ -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 = """
<input type="hidden" id="typed_id" value="file_559003251828">
<input type="hidden" id="share_link_token" value="9cbe4b73521ba4d65a8cd38a8c">
""";
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));
}
}
}