mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-16 20:33:03 +00:00
Compare commits
12 Commits
0.1.8.fixe
...
0.1.8.fixe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a3e734408 | ||
|
|
54cc212753 | ||
|
|
f4ae1eaa51 | ||
|
|
d2537282c9 | ||
|
|
87527688c3 | ||
|
|
2be0b6505a | ||
|
|
672f100c7c | ||
|
|
5af402c0c5 | ||
|
|
693a4f0f63 | ||
|
|
f8d2426ff6 | ||
|
|
973a9bedcd | ||
|
|
a583733400 |
36
.github/workflows/maven.yml
vendored
36
.github/workflows/maven.yml
vendored
@@ -11,6 +11,7 @@ name: Java CI with Maven
|
||||
# The API requires write permission on the repository to submit dependencies
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -25,21 +26,56 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'yarn'
|
||||
cache-dependency-path: 'web-front/yarn.lock'
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
cache: maven
|
||||
|
||||
- name: Build Frontend
|
||||
run: cd web-front && yarn install && yarn run build
|
||||
|
||||
- name: Build with Maven
|
||||
run: mvn -B package --file pom.xml
|
||||
|
||||
# Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
|
||||
- name: Update dependency graph
|
||||
uses: advanced-security/maven-dependency-submission-action@v3
|
||||
if: github.event_name != 'pull_request'
|
||||
with:
|
||||
ignore-maven-wrapper: true
|
||||
|
||||
# - uses: release-drafter/release-drafter@v5
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: web-service/target/netdisk-fast-download-bin.zip
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push Docker image
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: |
|
||||
ghcr.io/${{ github.repository }}:${{ github.sha }}
|
||||
ghcr.io/${{ github.repository }}:main
|
||||
|
||||
14
Dockerfile
Normal file
14
Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
||||
FROM eclipse-temurin:17-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY ./web-service/target/netdisk-fast-download-bin.zip .
|
||||
|
||||
RUN unzip netdisk-fast-download-bin.zip && \
|
||||
mv netdisk-fast-download/* ./ && \
|
||||
rm netdisk-fast-download-bin.zip && \
|
||||
chmod +x run.sh
|
||||
|
||||
EXPOSE 6400 6401
|
||||
|
||||
ENTRYPOINT ["sh", "run.sh"]
|
||||
25
README.md
25
README.md
@@ -153,6 +153,31 @@ mvn package
|
||||
```
|
||||
打包好的文件位于 web-service/target/netdisk-fast-download-bin.zip
|
||||
## Linux服务部署
|
||||
|
||||
### Docker 部署(Main分支)
|
||||
|
||||
```shell
|
||||
# 创建目录
|
||||
mkdir -p netdisk-fast-download
|
||||
cd netdisk-fast-download
|
||||
|
||||
# 拉取镜像
|
||||
docker pull ghcr.io/qaiu/netdisk-fast-download:main
|
||||
|
||||
# 复制配置文件(或下载仓库web-service\src\main\resources)
|
||||
docker create --name netdisk-fast-download ghcr.io/qaiu/netdisk-fast-download:main
|
||||
docker cp netdisk-fast-download:/app/resources ./resources
|
||||
docker rm netdisk-fast-download
|
||||
|
||||
# 启动容器
|
||||
docker run -d -it --name netdisk-fast-download -p 6401:6401 --restart unless-stopped -e TZ=Asia/Shanghai -v ./resources:/app/resources -v ./db:/app/db -v ./logs:/app/logs ghcr.io/qaiu/netdisk-fast-download:main
|
||||
|
||||
# 反代6401端口
|
||||
|
||||
# 升级容器
|
||||
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once netdisk-fast-download
|
||||
```
|
||||
|
||||
### [宝塔安装参考](https://blog.qaiu.top/archives/netdisk-fast-download-bao-ta-an-zhuang-jiao-cheng)
|
||||
> 注意: netdisk-fast-download.service中的ExecStart的路径改为实际路径
|
||||
```shell
|
||||
|
||||
6
note.txt
6
note.txt
@@ -20,11 +20,11 @@ Cloudreve自建网盘 (ce) {origin}/s/{shareKey}
|
||||
缓存key -> 下载URL
|
||||
分享链接 -> add 网盘类型 pwd origin(私有化) -> 直链
|
||||
|
||||
|
||||
https://f.ws59.cn/f/e3peohu6192
|
||||
|
||||
开源版 TODO
|
||||
1. 缓存优化, 配置自动重载
|
||||
2. 缓存删除接口(后台功能)
|
||||
3. JS脚本引擎 自定义解析
|
||||
|
||||
|
||||
|
||||
专属版 功能设计
|
||||
|
||||
@@ -77,7 +77,11 @@ public class ShareLinkInfo {
|
||||
|
||||
public String getCacheKey() {
|
||||
// 将type和shareKey组合成一个字符串作为缓存key
|
||||
return type + ":" + shareKey;
|
||||
String key = type + ":" + shareKey;
|
||||
if (type.equals("p115")) {
|
||||
key += ("_" + otherParam.get("UA").toString().hashCode());
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
public ShareLinkInfo setOtherParam(Map<String, Object> otherParam) {
|
||||
|
||||
@@ -6,11 +6,9 @@ import io.vertx.core.Future;
|
||||
import io.vertx.core.Handler;
|
||||
import io.vertx.core.Promise;
|
||||
import io.vertx.core.json.DecodeException;
|
||||
import io.vertx.core.json.Json;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.core.net.ProxyOptions;
|
||||
import io.vertx.core.net.ProxyType;
|
||||
import io.vertx.core.net.impl.VertxHandler;
|
||||
import io.vertx.ext.web.client.HttpResponse;
|
||||
import io.vertx.ext.web.client.WebClient;
|
||||
import io.vertx.ext.web.client.WebClientOptions;
|
||||
@@ -21,7 +19,6 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 解析器抽象类包含promise, HTTP Client, 默认失败方法等;
|
||||
@@ -39,7 +36,7 @@ public abstract class PanBase implements IPanTool {
|
||||
* Http client
|
||||
*/
|
||||
protected WebClient client = WebClient.create(WebClientVertxInit.get(),
|
||||
new WebClientOptions().setUserAgentEnabled(false));
|
||||
new WebClientOptions());
|
||||
|
||||
/**
|
||||
* Http client session (会话管理, 带cookie请求)
|
||||
@@ -77,7 +74,7 @@ public abstract class PanBase implements IPanTool {
|
||||
proxyOptions.setUsername(proxy.getString("username"));
|
||||
}
|
||||
if (StringUtils.isNotEmpty(proxy.getString("password"))) {
|
||||
proxyOptions.setUsername(proxy.getString("password"));
|
||||
proxyOptions.setPassword(proxy.getString("password"));
|
||||
}
|
||||
this.client = WebClient.create(WebClientVertxInit.get(),
|
||||
new WebClientOptions()
|
||||
|
||||
@@ -90,13 +90,15 @@ public enum PanDomainTemplate {
|
||||
"https://qaiu.118pan.com/b{shareKey}",
|
||||
P118Tool.class),
|
||||
// https://www.vyuyun.com/s/QMa6ie?password=I4KG7H
|
||||
// https://www.vyuyun.com/s/QMa6ie/file?password=I4KG7H
|
||||
PVYY("微雨云存储",
|
||||
compile("https://www\\.vyuyun\\.com/s/(?<KEY>[a-zA-Z\\d-]+)(\\?password=.*)?"),
|
||||
"https://www.vyuyun.com/s/{shareKey}",
|
||||
compile("https://www\\.vyuyun\\.com/s/(?<KEY>[a-zA-Z\\d-]+)(/file)?(\\?password=(?<PWD>\\w+))?"),
|
||||
"https://www.vyuyun.com/s/{shareKey}?password={pwd}",
|
||||
PvyyTool.class),
|
||||
// https://1drv.ms/w/s!Alg0feQmCv2rnRFd60DQOmMa-Oh_?e=buaRtp
|
||||
POD("OneDrive",
|
||||
compile("https://1drv\\.ms/[uw]/s!(?<KEY>.+)"),
|
||||
compile("https://1drv\\.ms/(?<KEY>.+)"),
|
||||
"https://1drv\\.ms/{shareKey}",
|
||||
"https://onedrive.live.com/",
|
||||
PodTool.class),
|
||||
// 404网盘 https://drive.google.com/file/d/xxx/view?usp=sharing
|
||||
@@ -114,7 +116,10 @@ public enum PanDomainTemplate {
|
||||
compile("https://www.dropbox.com/scl/fi/(?<KEY>\\w+)/.+?rlkey=(?<PWD>\\w+).*"),
|
||||
"https://www.dropbox.com/scl/fi/{shareKey}/?rlkey={pwd}&dl=0",
|
||||
PdbTool.class),
|
||||
|
||||
P115("115网盘",
|
||||
compile("https://(115|anxia).com/s/(?<KEY>\\w+)(\\?password=(?<PWD>\\w+))?"),
|
||||
"https://115.com/s/{shareKey}?password={pwd}",
|
||||
P115Tool.class),
|
||||
// =====================音乐类解析 分享链接标志->MxxS (单歌曲/普通音质)==========================
|
||||
// http://163cn.tv/xxx
|
||||
MNES("网易云音乐分享",
|
||||
|
||||
@@ -43,9 +43,11 @@ public class ParserCreate {
|
||||
// 返回规范化的标准链接
|
||||
String standardUrl = getStandardUrlTemplate()
|
||||
.replace("{shareKey}", shareKey);
|
||||
|
||||
try {
|
||||
String pwd = matcher.group(PWD);
|
||||
if (StringUtils.isNotEmpty(pwd)) {
|
||||
shareLinkInfo.setSharePassword(pwd);
|
||||
}
|
||||
standardUrl = standardUrl .replace("{pwd}", pwd);
|
||||
} catch (Exception ignored) {}
|
||||
|
||||
@@ -107,7 +109,9 @@ public class ParserCreate {
|
||||
}
|
||||
|
||||
public ParserCreate setShareLinkInfoPwd(String pwd) {
|
||||
shareLinkInfo.setSharePassword(pwd);
|
||||
if (pwd != null) {
|
||||
shareLinkInfo.setSharePassword(pwd);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.qaiu.parser.impl;
|
||||
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.parser.PanBase;
|
||||
import io.vertx.core.Future;
|
||||
import io.vertx.core.json.JsonArray;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.qaiu.parser.impl;
|
||||
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.parser.PanBase;
|
||||
import cn.qaiu.util.AESUtils;
|
||||
import cn.qaiu.util.UUIDUtil;
|
||||
@@ -11,6 +11,13 @@ import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.ext.web.client.HttpRequest;
|
||||
import io.vertx.uritemplate.UriTemplate;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
/**
|
||||
* 小飞机网盘
|
||||
*
|
||||
@@ -22,8 +29,9 @@ public class FjTool extends PanBase {
|
||||
|
||||
private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "recommend/list?devType=6&devModel=Chrome" +
|
||||
"&uuid={uuid}&extra=2×tamp={ts}&shareId={shareId}&type=0&offset=1&limit=60";
|
||||
/// recommend/list?devType=6&devModel=Chrome&uuid={uuid}&extra=2×tamp={ts}&shareId={shareId}&type=0&offset=1
|
||||
// &limit=60
|
||||
/// recommend/list?devType=6&devModel=Chrome&uuid={uuid}&extra=2×tamp={ts}&shareId={shareId}&type=0&offset=1&limit=60
|
||||
// recommend/list?devType=6&devModel=Chrome&uuid={uuid}&extra=2×tamp={ts}&shareId=JoUTkZYj&type=0&offset=1&limit=60
|
||||
|
||||
|
||||
private static final String SECOND_REQUEST_URL = API_URL_PREFIX + "file/redirect?downloadId={fidEncode}&enable=1" +
|
||||
"&devType=6&uuid={uuid}×tamp={ts}&auth={auth}&shareId={dataKey}";
|
||||
@@ -34,6 +42,30 @@ public class FjTool extends PanBase {
|
||||
"={uuid}&extra=2×tamp={ts}";
|
||||
// https://api.feijipan.com/ws/buy/vip/list?devType=6&devModel=Chrome&uuid=WQAl5yBy1naGudJEILBvE&extra=2×tamp=E2C53155F6D09417A27981561134CB73
|
||||
|
||||
private static final MultiMap header;
|
||||
|
||||
static {
|
||||
header = MultiMap.caseInsensitiveMultiMap();
|
||||
header.set("Accept", "application/json, text/plain, */*");
|
||||
header.set("Accept-Encoding", "gzip, deflate, br, zstd");
|
||||
header.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
|
||||
header.set("Cache-Control", "no-cache");
|
||||
header.set("Connection", "keep-alive");
|
||||
header.set("Content-Length", "0");
|
||||
header.set("DNT", "1");
|
||||
header.set("Host", "api.feijipan.com");
|
||||
header.set("Origin", "https://www.feijix.com");
|
||||
header.set("Pragma", "no-cache");
|
||||
header.set("Referer", "https://www.feijix.com/");
|
||||
header.set("Sec-Fetch-Dest", "empty");
|
||||
header.set("Sec-Fetch-Mode", "cors");
|
||||
header.set("Sec-Fetch-Site", "cross-site");
|
||||
header.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36");
|
||||
header.set("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"");
|
||||
header.set("sec-ch-ua-mobile", "?0");
|
||||
header.set("sec-ch-ua-platform", "\"Windows\"");
|
||||
}
|
||||
|
||||
public FjTool(ShareLinkInfo shareLinkInfo) {
|
||||
super(shareLinkInfo);
|
||||
}
|
||||
@@ -58,11 +90,38 @@ public class FjTool extends PanBase {
|
||||
// 第一次请求 获取文件信息
|
||||
// POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=146731&type=0&offset=1&limit=60
|
||||
client.postAbs(UriTemplate.of(FIRST_REQUEST_URL))
|
||||
.putHeaders(header)
|
||||
.setTemplateParam("shareId", shareId)
|
||||
.setTemplateParam("uuid", uuid)
|
||||
.setTemplateParam("ts", tsEncode0)
|
||||
.setTemplateParam("ts", tsEncode)
|
||||
.send().onSuccess(res -> {
|
||||
JsonObject resJson = asJson(res);
|
||||
// 处理GZ压缩
|
||||
// 使用GZIPInputStream来解压数据
|
||||
String decompressedString;
|
||||
try (ByteArrayInputStream bais = new ByteArrayInputStream(res.body().getBytes());
|
||||
GZIPInputStream gzis = new GZIPInputStream(bais);
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(gzis, StandardCharsets.UTF_8))) {
|
||||
|
||||
// 用于存储解压后的字符串
|
||||
StringBuilder decompressedData = new StringBuilder();
|
||||
|
||||
// 逐行读取解压后的数据
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
decompressedData.append(line);
|
||||
}
|
||||
|
||||
// 此时decompressedData.toString()包含了解压后的字符串
|
||||
decompressedString = decompressedData.toString();
|
||||
|
||||
} catch (IOException e) {
|
||||
// 处理可能的IO异常
|
||||
fail(FIRST_REQUEST_URL + " 响应异常");
|
||||
return;
|
||||
}
|
||||
// 处理GZ压缩结束
|
||||
|
||||
JsonObject resJson = new JsonObject(decompressedString);
|
||||
if (resJson.getInteger("code") != 200) {
|
||||
fail(FIRST_REQUEST_URL + " 返回异常: " + resJson);
|
||||
return;
|
||||
@@ -81,12 +140,10 @@ public class FjTool extends PanBase {
|
||||
String fidEncode = AESUtils.encrypt2Hex(fileId + "|" + userId);
|
||||
String auth = AESUtils.encrypt2Hex(fileId + "|" + nowTs2);
|
||||
|
||||
MultiMap headers0 = MultiMap.caseInsensitiveMultiMap();
|
||||
headers0.set("referer", REFERER_URL);
|
||||
// 第二次请求
|
||||
HttpRequest<Buffer> httpRequest =
|
||||
clientNoRedirects.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
|
||||
.putHeaders(headers0)
|
||||
.putHeaders(header)
|
||||
.setTemplateParam("fidEncode", fidEncode)
|
||||
.setTemplateParam("uuid", uuid)
|
||||
.setTemplateParam("ts", tsEncode2)
|
||||
|
||||
90
parser/src/main/java/cn/qaiu/parser/impl/P115Tool.java
Normal file
90
parser/src/main/java/cn/qaiu/parser/impl/P115Tool.java
Normal file
@@ -0,0 +1,90 @@
|
||||
package cn.qaiu.parser.impl;
|
||||
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.parser.PanBase;
|
||||
import io.vertx.core.Future;
|
||||
import io.vertx.core.MultiMap;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.uritemplate.UriTemplate;
|
||||
|
||||
/**
|
||||
* 115网盘
|
||||
*
|
||||
* 需要请求API的UA和请求下载链接的UA保持一致,安卓Chrome需要访问电脑版才能下载
|
||||
*/
|
||||
public class P115Tool extends PanBase {
|
||||
private static final String API_URL_PREFIX = "https://anxia.com/webapi/";
|
||||
|
||||
private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "share/snap?share_code={dataKey}&offset=0" +
|
||||
"&limit=20&receive_code={dataPwd}&cid=";
|
||||
|
||||
private static final String SECOND_REQUEST_URL = API_URL_PREFIX + "share/skip_login_downurl";
|
||||
|
||||
|
||||
private static final MultiMap header;
|
||||
|
||||
static {
|
||||
header = MultiMap.caseInsensitiveMultiMap();
|
||||
header.set("Accept", "application/json, text/plain, */*");
|
||||
header.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
|
||||
header.set("Cache-Control", "no-cache");
|
||||
header.set("Connection", "keep-alive");
|
||||
header.set("Content-Length", "0");
|
||||
header.set("DNT", "1");
|
||||
header.set("Host", "anxia.com");
|
||||
header.set("Origin", "https://anxia.com");
|
||||
header.set("Pragma", "no-cache");
|
||||
header.set("Referer", "https://anxia.com");
|
||||
header.set("Sec-Fetch-Dest", "empty");
|
||||
header.set("Sec-Fetch-Mode", "cors");
|
||||
header.set("Sec-Fetch-Site", "cross-site");
|
||||
header.set("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"");
|
||||
header.set("sec-ch-ua-mobile", "?0");
|
||||
header.set("sec-ch-ua-platform", "\"Windows\"");
|
||||
}
|
||||
|
||||
public P115Tool(ShareLinkInfo shareLinkInfo) {
|
||||
super(shareLinkInfo);
|
||||
}
|
||||
|
||||
public Future<String> parse() {
|
||||
// 第一次请求 获取文件信息
|
||||
client.getAbs(UriTemplate.of(FIRST_REQUEST_URL))
|
||||
.putHeaders(header)
|
||||
.putHeader("User-Agent", shareLinkInfo.getOtherParam().get("UA").toString())
|
||||
.setTemplateParam("dataKey", shareLinkInfo.getShareKey())
|
||||
.setTemplateParam("dataPwd", shareLinkInfo.getSharePassword())
|
||||
.send().onSuccess(res -> {
|
||||
JsonObject resJson = asJson(res);
|
||||
if (!resJson.getBoolean("state")) {
|
||||
fail(FIRST_REQUEST_URL + " 解析错误: " + resJson);
|
||||
return;
|
||||
}
|
||||
// 文件Id: data.list[0].fid
|
||||
JsonObject fileInfo = resJson.getJsonObject("data").getJsonArray("list").getJsonObject(0);
|
||||
String fileId = fileInfo.getString("fid");
|
||||
|
||||
// 第二次请求
|
||||
// share_code={dataKey}&receive_code={dataPwd}&file_id={file_id}
|
||||
client.postAbs(SECOND_REQUEST_URL)
|
||||
.putHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
|
||||
.putHeader("User-Agent", shareLinkInfo.getOtherParam().get("UA").toString())
|
||||
.sendForm(MultiMap.caseInsensitiveMultiMap()
|
||||
.set("share_code", shareLinkInfo.getShareKey())
|
||||
.set("receive_code", shareLinkInfo.getSharePassword())
|
||||
.set("file_id", fileId))
|
||||
.onSuccess(res2 -> {
|
||||
JsonObject resJson2 = asJson(res2);
|
||||
if (!resJson.getBoolean("state")) {
|
||||
fail(FIRST_REQUEST_URL + " 解析错误: " + resJson);
|
||||
return;
|
||||
}
|
||||
// data.url.url
|
||||
promise.complete(resJson2.getJsonObject("data").getJsonObject("url").getString("url"));
|
||||
}).onFailure(handleFail(SECOND_REQUEST_URL));
|
||||
}).onFailure(handleFail(FIRST_REQUEST_URL));
|
||||
|
||||
|
||||
return promise.future();
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,20 @@
|
||||
package cn.qaiu.parser.impl;
|
||||
|
||||
import cn.qaiu.WebClientVertxInit;
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.parser.PanBase;
|
||||
import io.vertx.core.Future;
|
||||
import io.vertx.core.Promise;
|
||||
import io.vertx.core.WorkerExecutor;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.uritemplate.UriTemplate;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -21,47 +31,201 @@ public class PodTool extends PanBase {
|
||||
* -> @content.downloadUrl
|
||||
*/
|
||||
|
||||
private static final String api = "https://api.onedrive.com/v1.0/drives/{cid}/items/{cid20}?authkey={authkey}";
|
||||
|
||||
// https://onedrive.live.com/redir?resid=ABFD0A26E47D3458!4699&e=OggA4s&migratedtospo=true&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3UvcyFBbGcwZmVRbUN2MnJwRnZ1NDQ0aGc1eVZxRGNLP2U9T2dnQTRz
|
||||
private static final String API_TEMPLATE = "https://onedrive.live.com/embed" +
|
||||
"?id={resid}&resid={resid1}" +
|
||||
"&cid={cid}" +
|
||||
"&redeem={redeem}" +
|
||||
"&migratedtospo=true&embed=1";
|
||||
|
||||
private static final String TOKEN_API = "https://api-badgerp.svc.ms/v1.0/token";
|
||||
|
||||
|
||||
private static final Pattern redirectUrlRegex =
|
||||
Pattern.compile("=(?<cid>.+)!(?<cid2>.+)&authkey=(?<authkey>.+)&e=(?<e>.+)");
|
||||
Pattern.compile("resid=(?<cid1>[^!]+)!(?<cid2>[^&]+).+&redeem=(?<redeem>.+).*");
|
||||
|
||||
public PodTool(ShareLinkInfo shareLinkInfo) {
|
||||
super(shareLinkInfo);
|
||||
}
|
||||
|
||||
public Future<String> parse() {
|
||||
clientNoRedirects.getAbs(shareLinkInfo.getShareUrl()).send().onSuccess(r0 -> {
|
||||
|
||||
|
||||
/*
|
||||
* POST https://api-badgerp.svc.ms/v1.0/token
|
||||
* Content-Type: application/json
|
||||
*
|
||||
* {
|
||||
* "appid": "00000000-0000-0000-0000-0000481710a4"
|
||||
* }
|
||||
*/
|
||||
// https://my.microsoftpersonalcontent.com/_api/v2.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL3UvcyFBbGcwZmVRbUN2MnJwRnZ1NDQ0aGc1eVZxRGNLP2U9T2dnQTRz/driveitem?%24select=*%2Cocr%2CwebDavUrl
|
||||
// https://onedrive.live.com/embed?id=ABFD0A26E47D3458!4698&resid=ABFD0A26E47D3458!4698&cid=abfd0a26e47d3458&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3UvYy9hYmZkMGEyNmU0N2QzNDU4L0lRUllOSDNrSmdyOUlJQ3JXaElBQUFBQUFTWGlubWZ2WmNxYUQyMXJUQjIxVmg4&migratedtospo=true&embed=1
|
||||
|
||||
|
||||
clientNoRedirects.getAbs(shareLinkInfo.getShareUrl() == null ? shareLinkInfo.getStandardUrl() :
|
||||
shareLinkInfo.getShareUrl()).send().onSuccess(r0 -> {
|
||||
String location = r0.getHeader("Location");
|
||||
Matcher matcher = redirectUrlRegex.matcher(location);
|
||||
if (matcher.find()) {
|
||||
var cid= matcher.group("cid");
|
||||
var cid2= matcher.group("cid2");
|
||||
var authkey= matcher.group("authkey");
|
||||
client.getAbs(UriTemplate.of(api))
|
||||
.setTemplateParam("cid", cid)
|
||||
.setTemplateParam("cid20", cid + "!" + cid2)
|
||||
.setTemplateParam("authkey", authkey).send()
|
||||
.onSuccess(res -> {
|
||||
JsonObject jsonObject = asJson(res);
|
||||
// System.out.println(jsonObject);
|
||||
complete(jsonObject.getString("@content.downloadUrl"));
|
||||
})
|
||||
.onFailure(handleFail());
|
||||
if (!matcher.find()) {
|
||||
fail("Location格式错误");
|
||||
return;
|
||||
}
|
||||
String redeem = matcher.group("redeem");
|
||||
String cid1 = matcher.group("cid1");
|
||||
String cid2 = cid1 + "!" + matcher.group("cid2");
|
||||
|
||||
clientNoRedirects.getAbs(UriTemplate.of(API_TEMPLATE))
|
||||
.setTemplateParam("resid", cid2)
|
||||
.setTemplateParam("resid1", cid2)
|
||||
.setTemplateParam("cid", cid1.toLowerCase())
|
||||
.setTemplateParam("redeem", redeem)
|
||||
.send()
|
||||
.onSuccess(r1 -> {
|
||||
String auth =
|
||||
r1.cookies().stream().filter(c -> c.startsWith("BadgerAuth=")).findFirst().orElse("");
|
||||
if (auth.isEmpty()) {
|
||||
fail("Error BadgerAuth not fount");
|
||||
return;
|
||||
}
|
||||
String token = auth.split(";")[0].split("=")[1];
|
||||
|
||||
try {
|
||||
|
||||
String url = matcherUrl(r1.bodyAsString());
|
||||
|
||||
sendHttpRequest(url, token).onSuccess(body -> {
|
||||
Matcher matcher1 =
|
||||
Pattern.compile("\"downloadUrl\":\"(?<url>https?://[^\s\"]+)").matcher(body);
|
||||
if (matcher1.find()) {
|
||||
complete(matcher1.group("url"));
|
||||
} else {
|
||||
fail();
|
||||
}
|
||||
}).onFailure(handleFail());
|
||||
} catch (Exception ignored) {
|
||||
sendHttpRequest2(token, redeem).onSuccess(res -> {
|
||||
try {
|
||||
complete(new JsonObject(res).getString("@content.downloadUrl"));
|
||||
} catch (Exception ignored1) {
|
||||
fail();
|
||||
}
|
||||
}).onFailure(handleFail());
|
||||
}
|
||||
|
||||
}).onFailure(handleFail());
|
||||
}).onFailure(handleFail());
|
||||
return promise.future();
|
||||
}
|
||||
|
||||
private String matcherUrl(String html) {
|
||||
|
||||
// 正则表达式来匹配 URL
|
||||
String urlRegex = "'action'.+(?<url>https://.+)'\\)";
|
||||
Pattern urlPattern = Pattern.compile(urlRegex);
|
||||
Matcher urlMatcher = urlPattern.matcher(html);
|
||||
|
||||
if (urlMatcher.find()) {
|
||||
String url = urlMatcher.group("url");
|
||||
System.out.println("URL: " + url);
|
||||
return url;
|
||||
}
|
||||
throw new RuntimeException("URL匹配失败");
|
||||
}
|
||||
|
||||
|
||||
private String matcherToken(String html) {
|
||||
// 正则表达式来匹配 inputElem.value 中的 Token
|
||||
String tokenRegex = "inputElem\\.value\\s*=\\s*'([^']+)'";
|
||||
Pattern tokenPattern = Pattern.compile(tokenRegex);
|
||||
Matcher tokenMatcher = tokenPattern.matcher(html);
|
||||
|
||||
if (tokenMatcher.find()) {
|
||||
String token = tokenMatcher.group(1);
|
||||
System.out.println("Token: " + token);
|
||||
return token;
|
||||
}
|
||||
throw new RuntimeException("token匹配失败");
|
||||
}
|
||||
|
||||
public Future<String> sendHttpRequest2(String token, String redeem) {
|
||||
Promise<String> promise = Promise.promise();
|
||||
// 构造 HttpClient
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
|
||||
// 构造请求的 URI 和头部信息
|
||||
// https://onedrive.live.com/redir?cid=abfd0a26e47d3458&resid=ABFD0A26E47D3458!4465&ithint=file%2cxlsx&e=Ao2uSU&migratedtospo=true&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3gvYy9hYmZkMGEyNmU0N2QzNDU4L0VWZzBmZVFtQ3YwZ2dLdHhFUUFBQUFBQlRQRWVDMTZfZk1EYk5FTjhEdTRta1E_ZT1BbzJ1U1U
|
||||
String url = ("https://my.microsoftpersonalcontent.com/_api/v2.0/shares/u!%s/driveItem?$select=content" +
|
||||
".downloadUrl").formatted(redeem);
|
||||
String authorizationHeader = "Badger " + token;
|
||||
|
||||
// 构建请求
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.header("Authorization", authorizationHeader)
|
||||
.build();
|
||||
|
||||
// 发送请求并处理响应
|
||||
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
|
||||
.thenApply(response -> {
|
||||
System.out.println("Response Status Code: " + response.statusCode());
|
||||
System.out.println("Response Body: " + response.body());
|
||||
promise.complete(response.body());
|
||||
return null;
|
||||
});
|
||||
|
||||
return promise.future();
|
||||
}
|
||||
|
||||
//https://onedrive.live.com/redir?resid=ABFD0A26E47D3458!4699&e=OggA4s&migratedtospo=true&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3UvcyFBbGcwZmVRbUN2MnJwRnZ1NDQ0aGc1eVZxRGNLP2U9T2dnQTRz
|
||||
// public static void main(String[] args) {
|
||||
// Matcher matcher = redirectUrlRegex.matcher("https://onedrive.live.com/redir?resid=ABFD0A26E47D3458!4698" +
|
||||
// "&authkey=!ACpvXghP5xhG_cg&e=hV98W1");
|
||||
// if (matcher.find()) {
|
||||
// System.out.println(matcher.group("cid"));
|
||||
// System.out.println(matcher.group("cid2"));
|
||||
// System.out.println(matcher.group("authkey"));
|
||||
// }
|
||||
public Future<String> sendHttpRequest(String url, String token) {
|
||||
// 创建一个 WorkerExecutor 用于异步执行阻塞的 HTTP 请求
|
||||
WorkerExecutor executor = WebClientVertxInit.get().createSharedWorkerExecutor("http-client-worker");
|
||||
|
||||
// }
|
||||
Promise<String> promise = Promise.promise();
|
||||
executor.executeBlocking(() -> {
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpRequest request = null;
|
||||
|
||||
try {
|
||||
// 构造请求
|
||||
request = HttpRequest.newBuilder()
|
||||
.uri(new URI(url))
|
||||
.header("accept", "text/html,application/xhtml+xml,application/xml;q=0.9," +
|
||||
"image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;" +
|
||||
"v=b3;q=0.7")
|
||||
.header("accept-language", "zh-CN,zh;q=0.9")
|
||||
.header("cache-control", "no-cache")
|
||||
.header("content-type", "application/x-www-form-urlencoded")
|
||||
.header("dnt", "1")
|
||||
.header("origin", "https://onedrive.live.com")
|
||||
.header("pragma", "no-cache")
|
||||
.header("priority", "u=0, i")
|
||||
.header("referer", "https://onedrive.live.com/")
|
||||
.header("sec-ch-ua", "\"Chromium\";v=\"130\", \"Google Chrome\";v=\"130\", " +
|
||||
"\"Not?A_Brand\";v=\"99\"")
|
||||
.header("sec-ch-ua-mobile", "?0")
|
||||
.header("sec-ch-ua-platform", "\"Windows\"")
|
||||
.header("sec-fetch-dest", "iframe")
|
||||
.header("sec-fetch-mode", "navigate")
|
||||
.header("sec-fetch-site", "cross-site")
|
||||
.header("upgrade-insecure-requests", "1")
|
||||
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537" +
|
||||
".36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36")
|
||||
.POST(HttpRequest.BodyPublishers.ofString("badger_token=" + token))
|
||||
.build();
|
||||
|
||||
// 发起请求并获取响应
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
|
||||
// 返回响应体
|
||||
promise.complete(response.body());
|
||||
return null;
|
||||
} catch (URISyntaxException | IOException | InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
|
||||
return promise.future();
|
||||
}
|
||||
}
|
||||
|
||||
28
parser/src/test/java/cn/qaiu/parser/ParserUrlOut.java
Normal file
28
parser/src/test/java/cn/qaiu/parser/ParserUrlOut.java
Normal file
@@ -0,0 +1,28 @@
|
||||
package cn.qaiu.parser;
|
||||
|
||||
import cn.qaiu.entity.ShareLinkInfo;
|
||||
import cn.qaiu.parser.impl.PodTool;
|
||||
|
||||
public class ParserUrlOut {
|
||||
|
||||
//https://onedrive.live.com/redir?resid=ABFD0A26E47D3458!4699&e=OggA4s&migratedtospo=true&redeem=aHR0cHM6Ly8xZHJ2Lm1zL3UvcyFBbGcwZmVRbUN2MnJwRnZ1NDQ0aGc1eVZxRGNLP2U9T2dnQTRz
|
||||
public static void main(String[] args) {
|
||||
// Matcher matcher = redirectUrlRegex.matcher("https://onedrive.live.com/redir?resid=ABFD0A26E47D3458!4698" +
|
||||
// "&authkey=!ACpvXghP5xhG_cg&e=hV98W1");
|
||||
// if (matcher.find()) {
|
||||
// System.out.println(matcher.group("cid"));
|
||||
// System.out.println(matcher.group("cid2"));
|
||||
// System.out.println(matcher.group("authkey"));
|
||||
// }
|
||||
// appid 5cbed6ac-a083-4e14-b191-b4ba07653de2 5cbed6ac-a083-4e14-b191-b4ba07653de2
|
||||
// https://my.microsoftpersonalcontent.com/personal/abfd0a26e47d3458/_layouts/15/embed.aspx?UniqueId=e47d3458-0a26-20fd-80ab-5b1200000000&Translate=false&ApiVersion=2.0
|
||||
// https://my.microsoftpersonalcontent.com/personal/abfd0a26e47d3458/_layouts/15/embed.aspx?UniqueId=6b0900d6-abcf-44ce-b7bf-7b626bcbe4b8&Translate=false&ApiVersion=2.0
|
||||
// https://1drv.ms/u/s!Alg0feQmCv2rpFvu444hg5yVqDcK?e=OggA4s
|
||||
// https://1drv.ms/u/c/abfd0a26e47d3458/EVg0feQmCv0ggKtbEgAAAAABqGv8K6HmOwLRsvokyV5fUg?e=iqoRc0
|
||||
// https://1drv.ms/u/c/abfd0a26e47d3458/EVg0feQmCv0ggKtaEgAAAAAB-lF1qjkfv5OqdrT9VSMDMw
|
||||
new PodTool(ShareLinkInfo.newBuilder().shareUrl("https://1drv.ms/u/c/abfd0a26e47d3458/EdYACWvPq85Et797YmvL5LgBruUKoNxqIFATXhIv1PI2_Q")
|
||||
.build())
|
||||
.parse().onSuccess(System.out::println);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
<img :height="150" src="../public/images/lanzou111.png" alt="lz"></img>
|
||||
</div>
|
||||
</div>
|
||||
<h3 style="text-align: center;">NFD网盘直链解析0.1.8_bate2(API演示)</h3>
|
||||
<h3 style="text-align: center;">NFD网盘直链解析0.1.8_bate3(API演示)</h3>
|
||||
<div class="typo">
|
||||
<p style="text-align: center;">
|
||||
<span>
|
||||
@@ -66,7 +66,7 @@
|
||||
<p style="text-align: center">
|
||||
<el-button style="margin-left: 40px;margin-bottom: 10px" @click="onSubmit">解析测试</el-button>
|
||||
<el-button style="margin-left: 20px;margin-bottom: 10px" @click="genMd">生成Markdown链接</el-button>
|
||||
<el-button style="margin-left: 20px" @click="generateQRCode">生成二维码</el-button>
|
||||
<el-button style="margin-left: 20px" @click="generateQRCode">扫码下载</el-button>
|
||||
<el-button style="margin-left: 20px" @click="getTj">链接信息统计</el-button>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -298,8 +298,14 @@
|
||||
host: /118pan\.com/,
|
||||
name: '118网盘'
|
||||
},
|
||||
pan115: {
|
||||
// https://115.com/s/swhyiia3wzi?password=h374
|
||||
reg: /https:\/\/(115|anxia)\.com\/s\/.+/,
|
||||
host: /115pan\.com/,
|
||||
name: '115网盘'
|
||||
},
|
||||
onedrive: {
|
||||
reg: /https:\/\/1drv\.ms\/[uw]\/s!.+/,
|
||||
reg: /https:\/\/1drv\.ms\/.+/,
|
||||
host: /1drv\.ms/,
|
||||
name: 'OneDrive'
|
||||
},
|
||||
|
||||
@@ -48,18 +48,19 @@ public class AppMain {
|
||||
if (jsonObject.containsKey(ConfigConstant.PROXY)) {
|
||||
LocalMap<Object, Object> localMap = VertxHolder.getVertxInstance().sharedData().getLocalMap(LOCAL);
|
||||
JsonArray proxyJsonArray = jsonObject.getJsonArray(ConfigConstant.PROXY);
|
||||
if (proxyJsonArray != null) {
|
||||
proxyJsonArray.forEach(proxyJson -> {
|
||||
String panTypes = ((JsonObject)proxyJson).getString("panTypes");
|
||||
|
||||
proxyJsonArray.forEach(proxyJson -> {
|
||||
String panTypes = ((JsonObject)proxyJson).getString("panTypes");
|
||||
|
||||
if (!panTypes.isEmpty()) {
|
||||
JsonObject jsonObject1 = new JsonObject();
|
||||
for (String s : panTypes.split(",")) {
|
||||
jsonObject1.put(s, proxyJson);
|
||||
if (!panTypes.isEmpty()) {
|
||||
JsonObject jsonObject1 = new JsonObject();
|
||||
for (String s : panTypes.split(",")) {
|
||||
jsonObject1.put(s, proxyJson);
|
||||
}
|
||||
localMap.put("proxy", jsonObject1);
|
||||
}
|
||||
localMap.put("proxy", jsonObject1);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@ public class ParserApi {
|
||||
.apiLink(getDownLink(parserCreate, true))
|
||||
.shareLinkInfo(shareLinkInfo).build();
|
||||
// 解析次数统计
|
||||
shareLinkInfo.getOtherParam().put("UA",request.headers().get("user-agent"));
|
||||
cacheManager.getShareKeyTotal(shareLinkInfo.getCacheKey()).onSuccess(res -> {
|
||||
if (res != null) {
|
||||
build.setCacheHitTotal(res.get("hit_total") == null ? 0: res.get("hit_total"));
|
||||
|
||||
@@ -12,6 +12,8 @@ import io.vertx.core.Future;
|
||||
import io.vertx.core.Promise;
|
||||
import io.vertx.core.http.HttpServerRequest;
|
||||
import io.vertx.core.http.HttpServerResponse;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
import io.vertx.ext.web.RoutingContext;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
@@ -27,11 +29,11 @@ public class ServerApi {
|
||||
private final CacheService cacheService = AsyncServiceUtil.getAsyncServiceInstance(CacheService.class);
|
||||
|
||||
@RouteMapping(value = "/parser", method = RouteMethod.GET, order = 1)
|
||||
public Future<Void> parse(HttpServerResponse response, HttpServerRequest request, String pwd) {
|
||||
public Future<Void> parse(HttpServerResponse response, HttpServerRequest request, RoutingContext rcx, String pwd) {
|
||||
Promise<Void> promise = Promise.promise();
|
||||
String url = URLParamUtil.parserParams(request);
|
||||
|
||||
cacheService.getCachedByShareUrlAndPwd(url, pwd)
|
||||
cacheService.getCachedByShareUrlAndPwd(url, pwd, JsonObject.of("UA",request.headers().get("user-agent")))
|
||||
.onSuccess(res -> ResponseUtil.redirect(
|
||||
response.putHeader("nfd-cache-hit", res.getCacheHit().toString())
|
||||
.putHeader("nfd-cache-expires", res.getExpires()),
|
||||
@@ -43,22 +45,22 @@ public class ServerApi {
|
||||
@RouteMapping(value = "/json/parser", method = RouteMethod.GET, order = 1)
|
||||
public Future<CacheLinkInfo> parseJson(HttpServerRequest request, String pwd) {
|
||||
String url = URLParamUtil.parserParams(request);
|
||||
return cacheService.getCachedByShareUrlAndPwd(url, pwd);
|
||||
return cacheService.getCachedByShareUrlAndPwd(url, pwd, JsonObject.of("UA",request.headers().get("user-agent")));
|
||||
}
|
||||
|
||||
@RouteMapping(value = "/json/:type/:key", method = RouteMethod.GET)
|
||||
public Future<CacheLinkInfo> parseKeyJson(String type, String key) {
|
||||
public Future<CacheLinkInfo> parseKeyJson(HttpServerRequest request, String type, String key) {
|
||||
String pwd = "";
|
||||
if (key.contains("@")) {
|
||||
String[] keys = key.split("@");
|
||||
key = keys[0];
|
||||
pwd = keys[1];
|
||||
}
|
||||
return cacheService.getCachedByShareKeyAndPwd(type, key, pwd);
|
||||
return cacheService.getCachedByShareKeyAndPwd(type, key, pwd, JsonObject.of("UA",request.headers().get("user-agent")));
|
||||
}
|
||||
|
||||
@RouteMapping(value = "/:type/:key", method = RouteMethod.GET)
|
||||
public Future<Void> parseKey(HttpServerResponse response, String type, String key) {
|
||||
public Future<Void> parseKey(HttpServerResponse response, HttpServerRequest request, String type, String key) {
|
||||
Promise<Void> promise = Promise.promise();
|
||||
String pwd = "";
|
||||
if (key.contains("@")) {
|
||||
@@ -66,7 +68,7 @@ public class ServerApi {
|
||||
key = keys[0];
|
||||
pwd = keys[1];
|
||||
}
|
||||
cacheService.getCachedByShareKeyAndPwd(type, key, pwd)
|
||||
cacheService.getCachedByShareKeyAndPwd(type, key, pwd, JsonObject.of("UA",request.headers().get("user-agent")))
|
||||
.onSuccess(res -> ResponseUtil.redirect(
|
||||
response.putHeader("nfd-cache-hit", res.getCacheHit().toString())
|
||||
.putHeader("nfd-cache-expires", res.getExpires()),
|
||||
|
||||
@@ -4,6 +4,7 @@ import cn.qaiu.lz.web.model.CacheLinkInfo;
|
||||
import cn.qaiu.vx.core.base.BaseAsyncService;
|
||||
import io.vertx.codegen.annotations.ProxyGen;
|
||||
import io.vertx.core.Future;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
|
||||
/**
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
@@ -12,7 +13,7 @@ import io.vertx.core.Future;
|
||||
@ProxyGen
|
||||
public interface CacheService extends BaseAsyncService {
|
||||
|
||||
Future<CacheLinkInfo> getCachedByShareKeyAndPwd(String type, String shareKey, String pwd);
|
||||
Future<CacheLinkInfo> getCachedByShareKeyAndPwd(String type, String shareKey, String pwd, JsonObject otherParam);
|
||||
|
||||
Future<CacheLinkInfo> getCachedByShareUrlAndPwd(String shareUrl, String pwd);
|
||||
Future<CacheLinkInfo> getCachedByShareUrlAndPwd(String shareUrl, String pwd, JsonObject otherParam);
|
||||
}
|
||||
|
||||
@@ -76,14 +76,16 @@ public class CacheServiceImpl implements CacheService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Future<CacheLinkInfo> getCachedByShareKeyAndPwd(String type, String shareKey, String pwd) {
|
||||
public Future<CacheLinkInfo> getCachedByShareKeyAndPwd(String type, String shareKey, String pwd, JsonObject otherParam) {
|
||||
ParserCreate parserCreate = ParserCreate.fromType(type).shareKey(shareKey).setShareLinkInfoPwd(pwd);
|
||||
parserCreate.getShareLinkInfo().getOtherParam().putAll(otherParam.getMap());
|
||||
return getAndSaveCachedShareLink(parserCreate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Future<CacheLinkInfo> getCachedByShareUrlAndPwd(String shareUrl, String pwd) {
|
||||
public Future<CacheLinkInfo> getCachedByShareUrlAndPwd(String shareUrl, String pwd, JsonObject otherParam) {
|
||||
ParserCreate parserCreate = ParserCreate.fromShareUrl(shareUrl).setShareLinkInfoPwd(pwd);
|
||||
parserCreate.getShareLinkInfo().getOtherParam().putAll(otherParam.getMap());
|
||||
return getAndSaveCachedShareLink(parserCreate);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ cache:
|
||||
cow:
|
||||
ec:
|
||||
fc:
|
||||
fj: 30
|
||||
fj:
|
||||
iz: 20
|
||||
le: 2879
|
||||
lz: 20
|
||||
@@ -63,15 +63,16 @@ cache:
|
||||
mne: 30
|
||||
mqq: 30
|
||||
mkg: 30
|
||||
p115: 5
|
||||
|
||||
# httpClient静态代理服务器配置(外网代理)
|
||||
proxy:
|
||||
- panTypes: pgd,pdb
|
||||
type: http # 支持http/socks4/socks5
|
||||
host: 127.0.0.1
|
||||
port: 7890
|
||||
username:
|
||||
password:
|
||||
# - panTypes: pgd,pdb,pod
|
||||
# type: http # 支持http/socks4/socks5
|
||||
# host: 127.0.0.1
|
||||
# port: 7890
|
||||
# username:
|
||||
# password:
|
||||
|
||||
|
||||
# 代理池配置
|
||||
|
||||
@@ -3,8 +3,203 @@
|
||||
### ecpan(移动云空间)
|
||||
https://www.ecpan.cn/drive/fileextoverrid.do?chainUrlTemplate=https:%2F%2Fwww.ecpan.cn%2Fweb%2F%23%2FyunpanProxy%3Fpath%3D%252F%2523%252Fdrive%252Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&parentId=-1
|
||||
|
||||
#
|
||||
{
|
||||
"code": "S_OK",
|
||||
"errorCode": null,
|
||||
"summary": "1",
|
||||
"var": {
|
||||
"resUrl": "/resource_drive",
|
||||
"driveUrl": "/drive",
|
||||
"chainFileInfo": {
|
||||
"chainPower": 1010,
|
||||
"navigations": [],
|
||||
"cloudpFile": {
|
||||
"tableName": "cloudp_file_52",
|
||||
"appFileId": "2d06ad61f91c11ed86b3b026287b20b1",
|
||||
"dfsFileId": "3080817de83747698ff5747e25f97e50",
|
||||
"fileName": "fonts.zip",
|
||||
"filePath": "个人盘",
|
||||
"fileLevel": 0,
|
||||
"fileCount": 0,
|
||||
"fileType": 2,
|
||||
"fileSort": 99,
|
||||
"fileSize": 19115063,
|
||||
"uploadSize": 19115063,
|
||||
"parentId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"usn": 11364252,
|
||||
"userName": "157****1073",
|
||||
"userId": "",
|
||||
"corpId": 13260232,
|
||||
"createDate": 1684813492000,
|
||||
"modifyDate": 1684813492000,
|
||||
"status": 1,
|
||||
"version": 0,
|
||||
"comeFrom": 21,
|
||||
"isShare": 0,
|
||||
"folderType": 0,
|
||||
"groupDesc": null,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"groupName": null,
|
||||
"permission": null,
|
||||
"userInfo": null,
|
||||
"diskType": 1,
|
||||
"historyKey": null,
|
||||
"oldAppFileId": null,
|
||||
"fileRealPath": null,
|
||||
"fileExt": null,
|
||||
"oldFileName": null,
|
||||
"key": null,
|
||||
"isUpperCase": null,
|
||||
"isSubDir": null,
|
||||
"isViewFolder": null,
|
||||
"uploadTimeType": null,
|
||||
"startUploadTime": null,
|
||||
"endUploadTime": null,
|
||||
"sizeOperator": null,
|
||||
"orderField": null,
|
||||
"orderBy": null,
|
||||
"oldFilePath": null,
|
||||
"statusStr": null,
|
||||
"rootUsn": 11364252,
|
||||
"createdByUsn": null,
|
||||
"attentionCount": 0,
|
||||
"fileMd5": "86c1ff32437ca0ccaca24f7ea197e34a",
|
||||
"fileLabel": null,
|
||||
"fileDesc": null,
|
||||
"fileExtends": "<fileExtends><shareRoot></shareRoot><isLock>0</isLock><isEncrypt>0</isEncrypt></fileExtends>",
|
||||
"deviceId": null,
|
||||
"fileNamePinyin": "fonts.zip",
|
||||
"modifyUser": "157****1073",
|
||||
"fileExFileds": {
|
||||
"shareRoot": "",
|
||||
"isLock": 0,
|
||||
"isEncrypt": 0
|
||||
},
|
||||
"security": 0,
|
||||
"createdDate": null,
|
||||
"modifiedDate1": null,
|
||||
"modifiedDate2": null,
|
||||
"createdDate1": null,
|
||||
"createdDate2": null,
|
||||
"deleteUsn": null,
|
||||
"opType": 0,
|
||||
"toShares": null,
|
||||
"firstLevel": null
|
||||
},
|
||||
"shareId": 2404783,
|
||||
"jsonFileList": [
|
||||
{
|
||||
"appFileId": "2d06ad61f91c11ed86b3b026287b20b1",
|
||||
"corpId": 13260232,
|
||||
"createdByUsn": 0,
|
||||
"dfsFileId": "3080817de83747698ff5747e25f97e50",
|
||||
"diskType": 1,
|
||||
"downloadUrl": "",
|
||||
"fileMd5": "86c1ff32437ca0ccaca24f7ea197e34a",
|
||||
"fileName": "fonts.zip",
|
||||
"fileSize": 19115063,
|
||||
"fileSort": 99,
|
||||
"fileType": 2,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"parentId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"rootUsn": 11364252,
|
||||
"status": 1,
|
||||
"usn": 11364252,
|
||||
"version": 0
|
||||
}
|
||||
],
|
||||
"watermarkStatus": 2,
|
||||
"cloudpFileList": [
|
||||
{
|
||||
"tableName": "cloudp_file_52",
|
||||
"appFileId": "2d06ad61f91c11ed86b3b026287b20b1",
|
||||
"dfsFileId": "3080817de83747698ff5747e25f97e50",
|
||||
"fileName": "fonts.zip",
|
||||
"filePath": "个人盘",
|
||||
"fileLevel": 0,
|
||||
"fileCount": 0,
|
||||
"fileType": 2,
|
||||
"fileSort": 99,
|
||||
"fileSize": 19115063,
|
||||
"uploadSize": 19115063,
|
||||
"parentId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"usn": 11364252,
|
||||
"userName": "157****1073",
|
||||
"userId": "",
|
||||
"corpId": 13260232,
|
||||
"createDate": 1684813492000,
|
||||
"modifyDate": 1684813492000,
|
||||
"status": 1,
|
||||
"version": 0,
|
||||
"comeFrom": 21,
|
||||
"isShare": 0,
|
||||
"folderType": 0,
|
||||
"groupDesc": null,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"groupName": null,
|
||||
"permission": null,
|
||||
"userInfo": null,
|
||||
"diskType": 1,
|
||||
"historyKey": null,
|
||||
"oldAppFileId": null,
|
||||
"fileRealPath": null,
|
||||
"fileExt": null,
|
||||
"oldFileName": null,
|
||||
"key": null,
|
||||
"isUpperCase": null,
|
||||
"isSubDir": null,
|
||||
"isViewFolder": null,
|
||||
"uploadTimeType": null,
|
||||
"startUploadTime": null,
|
||||
"endUploadTime": null,
|
||||
"sizeOperator": null,
|
||||
"orderField": null,
|
||||
"orderBy": null,
|
||||
"oldFilePath": null,
|
||||
"statusStr": null,
|
||||
"rootUsn": 11364252,
|
||||
"createdByUsn": null,
|
||||
"attentionCount": 0,
|
||||
"fileMd5": "86c1ff32437ca0ccaca24f7ea197e34a",
|
||||
"fileLabel": null,
|
||||
"fileDesc": null,
|
||||
"fileExtends": "<fileExtends><shareRoot></shareRoot><isLock>0</isLock><isEncrypt>0</isEncrypt></fileExtends>",
|
||||
"deviceId": null,
|
||||
"fileNamePinyin": "fonts.zip",
|
||||
"modifyUser": "157****1073",
|
||||
"fileExFileds": {
|
||||
"shareRoot": "",
|
||||
"isLock": 0,
|
||||
"isEncrypt": 0
|
||||
},
|
||||
"security": 0,
|
||||
"createdDate": null,
|
||||
"modifiedDate1": null,
|
||||
"modifiedDate2": null,
|
||||
"createdDate1": null,
|
||||
"createdDate2": null,
|
||||
"deleteUsn": null,
|
||||
"opType": 0,
|
||||
"toShares": null,
|
||||
"firstLevel": null
|
||||
}
|
||||
],
|
||||
"mobilePhone": "157****1073",
|
||||
"domain": "https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside",
|
||||
"shareTime": 1684813544000,
|
||||
"expireDate": "2122-06-22 23:59:59",
|
||||
"extCodeFlag": 0,
|
||||
"shareUser": "157****1073"
|
||||
},
|
||||
"logo": "logo.png"
|
||||
},
|
||||
"rememberMe": null
|
||||
}
|
||||
|
||||
|
||||
###
|
||||
# @no-cookie-jar
|
||||
POST https://www.ecpan.cn/drive/sharedownload.do
|
||||
Content-Type: application/json
|
||||
|
||||
@@ -86,3 +281,267 @@ Content-Type: application/json
|
||||
"firstLevel": null
|
||||
}]
|
||||
}
|
||||
|
||||
###
|
||||
# curl 'https://www.ecpan.cn/drive/sharedownload.do'
|
||||
# -H 'Accept: application/json, text/plain, */*'
|
||||
# -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8'
|
||||
# -H 'Cache-Control: no-cache'
|
||||
# -H 'Connection: keep-alive'
|
||||
# -H 'Content-Type: application/json'
|
||||
# -H 'Cookie: _rum_trackingId=m4t7vbvr3dspgdptfs823jei; _rum_sessionId=m4t7vbvr2qax1j1ez8g3ei3ry4ngh2dd'
|
||||
# -H 'DNT: 1'
|
||||
# -H 'Origin: https://www.ecpan.cn'
|
||||
# -H 'Pinpoint-TraceID: 193d7666ad316af8d90bff63127016d0'
|
||||
# -H 'Pinpoint-TransactionID: 112_b36bec39c167f5f5^1734485633747^0'
|
||||
# -H 'Pinpoint-pAgentID: 112_b36bec39c167f5f5'
|
||||
# -H 'Pinpoint-pSpanID: 193d7666ad316a43'
|
||||
# -H 'Pragma: no-cache'
|
||||
# -H 'Referer: https://www.ecpan.cn/web/yunpan/'
|
||||
# -H 'Sec-Fetch-Dest: empty'
|
||||
# -H 'Sec-Fetch-Mode: cors'
|
||||
# -H 'Sec-Fetch-Site: same-origin'
|
||||
# -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
|
||||
# -H 'sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
# -H 'sec-ch-ua-mobile: ?0'
|
||||
# -H 'sec-ch-ua-platform: "Windows"'
|
||||
# --data-raw '{"extCodeFlag":0,"isIp":0,"shareId":2854164,"groupId":"c27b53c4f91b11ed86b3b026287b20b1","fileIdList":[{"tableName":"cloudp_file_52","appFileId":"f786f877eeb811ee88d4bc16950460f6","dfsFileId":"231f235d4380434ab9b57bc069d08630","fileName":"Pydroid 3_7.2_arm64_q_cn.apk","filePath":"个人盘\\pydroid7","fileLevel":1,"fileCount":0,"fileType":2,"fileSort":99,"fileSize":324728098,"uploadSize":324728098,"parentId":"964abd0f861e11eeb992bc16950460f6","usn":11364252,"userName":"157****1073","userId":"","corpId":13260232,"createDate":1711818868000,"modifyDate":1711818868000,"status":1,"version":0,"comeFrom":21,"isShare":0,"folderType":0,"groupDesc":null,"groupId":"c27b53c4f91b11ed86b3b026287b20b1","groupName":null,"permission":null,"userInfo":null,"diskType":1,"historyKey":null,"oldAppFileId":null,"fileRealPath":null,"fileExt":null,"oldFileName":null,"key":null,"isUpperCase":null,"isSubDir":null,"isViewFolder":null,"uploadTimeType":null,"startUploadTime":null,"endUploadTime":null,"sizeOperator":null,"orderField":null,"orderBy":null,"oldFilePath":null,"statusStr":null,"rootUsn":11364252,"createdByUsn":null,"attentionCount":0,"fileMd5":"c5ed01a124030ce376c9f4753e015544","fileLabel":null,"fileDesc":null,"fileExtends":"<fileExtends><shareRoot></shareRoot><isLock>0</isLock><isEncrypt>0</isEncrypt></fileExtends>","deviceId":null,"fileNamePinyin":"Pydroid 3_7.2_arm64_q_cn.apk","modifyUser":"157****1073","fileExFileds":{"shareRoot":"","isLock":0,"isEncrypt":0},"security":0,"createdDate":null,"modifiedDate1":null,"modifiedDate2":null,"createdDate1":null,"createdDate2":null,"deleteUsn":null,"opType":0,"toShares":null,"firstLevel":null,"downloadUrl":null}]}'
|
||||
POST https://www.ecpan.cn/drive/sharedownload.do
|
||||
Accept: application/json, text/plain, */*
|
||||
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
|
||||
Cache-Control: no-cache
|
||||
Connection: keep-alive
|
||||
Cookie: _rum_trackingId=m4t7vbvr3dspgdptfs823jei; _rum_sessionId=m4t7vbvr2qax1j1ez8g3ei3ry4ngh2dd
|
||||
DNT: 1
|
||||
Origin: https://www.ecpan.cn
|
||||
Pinpoint-TraceID: 193d7666ad316af8d90bff63127016d0
|
||||
Pinpoint-TransactionID: 112_b36bec39c167f5f5^1734485633747^0
|
||||
Pinpoint-pAgentID: 112_b36bec39c167f5f5
|
||||
Pinpoint-pSpanID: 193d7666ad316a43
|
||||
Pragma: no-cache
|
||||
Referer: https://www.ecpan.cn/web/yunpan/
|
||||
Sec-Fetch-Dest: empty
|
||||
Sec-Fetch-Mode: cors
|
||||
Sec-Fetch-Site: same-origin
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
|
||||
sec-ch-ua-mobile: ?0
|
||||
sec-ch-ua-platform: "Windows"
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"extCodeFlag": 0,
|
||||
"isIp": 0,
|
||||
"shareId": 2854164,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"fileIdList": [
|
||||
{
|
||||
"tableName": "cloudp_file_52",
|
||||
"appFileId": "f786f877eeb811ee88d4bc16950460f6",
|
||||
"dfsFileId": "231f235d4380434ab9b57bc069d08630",
|
||||
"fileName": "Pydroid 3_7.2_arm64_q_cn.apk",
|
||||
"filePath": "个人盘pydroid7",
|
||||
"fileLevel": 1,
|
||||
"fileCount": 0,
|
||||
"fileType": 2,
|
||||
"fileSort": 99,
|
||||
"fileSize": 324728098,
|
||||
"uploadSize": 324728098,
|
||||
"parentId": "964abd0f861e11eeb992bc16950460f6",
|
||||
"usn": 11364252,
|
||||
"userName": "157****1073",
|
||||
"userId": "",
|
||||
"corpId": 13260232,
|
||||
"createDate": 1711818868000,
|
||||
"modifyDate": 1711818868000,
|
||||
"status": 1,
|
||||
"version": 0,
|
||||
"comeFrom": 21,
|
||||
"isShare": 0,
|
||||
"folderType": 0,
|
||||
"groupDesc": null,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"groupName": null,
|
||||
"permission": null,
|
||||
"userInfo": null,
|
||||
"diskType": 1,
|
||||
"historyKey": null,
|
||||
"oldAppFileId": null,
|
||||
"fileRealPath": null,
|
||||
"fileExt": null,
|
||||
"oldFileName": null,
|
||||
"key": null,
|
||||
"isUpperCase": null,
|
||||
"isSubDir": null,
|
||||
"isViewFolder": null,
|
||||
"uploadTimeType": null,
|
||||
"startUploadTime": null,
|
||||
"endUploadTime": null,
|
||||
"sizeOperator": null,
|
||||
"orderField": null,
|
||||
"orderBy": null,
|
||||
"oldFilePath": null,
|
||||
"statusStr": null,
|
||||
"rootUsn": 11364252,
|
||||
"createdByUsn": null,
|
||||
"attentionCount": 0,
|
||||
"fileMd5": "c5ed01a124030ce376c9f4753e015544",
|
||||
"fileLabel": null,
|
||||
"fileDesc": null,
|
||||
"fileExtends": "<fileExtends><shareRoot></shareRoot><isLock>0</isLock><isEncrypt>0</isEncrypt></fileExtends>",
|
||||
"deviceId": null,
|
||||
"fileNamePinyin": "Pydroid 3_7.2_arm64_q_cn.apk",
|
||||
"modifyUser": "157****1073",
|
||||
"fileExFileds": {
|
||||
"shareRoot": "",
|
||||
"isLock": 0,
|
||||
"isEncrypt": 0
|
||||
},
|
||||
"security": 0,
|
||||
"createdDate": null,
|
||||
"modifiedDate1": null,
|
||||
"modifiedDate2": null,
|
||||
"createdDate1": null,
|
||||
"createdDate2": null,
|
||||
"deleteUsn": null,
|
||||
"opType": 0,
|
||||
"toShares": null,
|
||||
"firstLevel": null,
|
||||
"downloadUrl": null
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
###
|
||||
# curl 'https://www.ecpan.cn/drive/sharedownload.do'
|
||||
# -H 'Accept: application/json, text/plain, */*'
|
||||
# -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8'
|
||||
# -H 'Cache-Control: no-cache'
|
||||
# -H 'Connection: keep-alive'
|
||||
# -H 'Content-Type: application/json'
|
||||
# -H 'Cookie: _rum_trackingId=m4t7vbvr3dspgdptfs823jei; _rum_sessionId=m4t7vbvr2qax1j1ez8g3ei3ry4ngh2dd'
|
||||
# -H 'DNT: 1'
|
||||
# -H 'Origin: https://www.ecpan.cn'
|
||||
# -H 'Pinpoint-TraceID: 193d7666ad316af8d90bff63127016d0'
|
||||
# -H 'Pinpoint-TransactionID: 112_b36bec39c167f5f5^1734485633747^0'
|
||||
# -H 'Pinpoint-pAgentID: 112_b36bec39c167f5f5'
|
||||
# -H 'Pinpoint-pSpanID: 193d7666ad316a43'
|
||||
# -H 'Pragma: no-cache'
|
||||
# -H 'Referer: https://www.ecpan.cn/web/yunpan/'
|
||||
# -H 'Sec-Fetch-Dest: empty'
|
||||
# -H 'Sec-Fetch-Mode: cors'
|
||||
# -H 'Sec-Fetch-Site: same-origin'
|
||||
# -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
|
||||
# -H 'sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
# -H 'sec-ch-ua-mobile: ?0'
|
||||
# -H 'sec-ch-ua-platform: "Windows"'
|
||||
# --data-raw '{"extCodeFlag":0,"isIp":0,"shareId":2854164,"groupId":"c27b53c4f91b11ed86b3b026287b20b1","fileIdList":[{"tableName":"cloudp_file_52","appFileId":"f786f877eeb811ee88d4bc16950460f6","dfsFileId":"231f235d4380434ab9b57bc069d08630","fileName":"Pydroid 3_7.2_arm64_q_cn.apk","filePath":"个人盘\\pydroid7","fileLevel":1,"fileCount":0,"fileType":2,"fileSort":99,"fileSize":324728098,"uploadSize":324728098,"parentId":"964abd0f861e11eeb992bc16950460f6","usn":11364252,"userName":"157****1073","userId":"","corpId":13260232,"createDate":1711818868000,"modifyDate":1711818868000,"status":1,"version":0,"comeFrom":21,"isShare":0,"folderType":0,"groupDesc":null,"groupId":"c27b53c4f91b11ed86b3b026287b20b1","groupName":null,"permission":null,"userInfo":null,"diskType":1,"historyKey":null,"oldAppFileId":null,"fileRealPath":null,"fileExt":null,"oldFileName":null,"key":null,"isUpperCase":null,"isSubDir":null,"isViewFolder":null,"uploadTimeType":null,"startUploadTime":null,"endUploadTime":null,"sizeOperator":null,"orderField":null,"orderBy":null,"oldFilePath":null,"statusStr":null,"rootUsn":11364252,"createdByUsn":null,"attentionCount":0,"fileMd5":"c5ed01a124030ce376c9f4753e015544","fileLabel":null,"fileDesc":null,"fileExtends":"<fileExtends><shareRoot></shareRoot><isLock>0</isLock><isEncrypt>0</isEncrypt></fileExtends>","deviceId":null,"fileNamePinyin":"Pydroid 3_7.2_arm64_q_cn.apk","modifyUser":"157****1073","fileExFileds":{"shareRoot":"","isLock":0,"isEncrypt":0},"security":0,"createdDate":null,"modifiedDate1":null,"modifiedDate2":null,"createdDate1":null,"createdDate2":null,"deleteUsn":null,"opType":0,"toShares":null,"firstLevel":null,"downloadUrl":null}]}'
|
||||
POST https://www.ecpan.cn/drive/sharedownload.do
|
||||
Accept: application/json, text/plain, */*
|
||||
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
|
||||
Cache-Control: no-cache
|
||||
Connection: keep-alive
|
||||
Cookie: _rum_trackingId=m4t7vbvr3dspgdptfs823jei; _rum_sessionId=m4t7vbvr2qax1j1ez8g3ei3ry4ngh2dd
|
||||
DNT: 1
|
||||
Origin: https://www.ecpan.cn
|
||||
Pinpoint-TraceID: 193d7666ad316af8d90bff63127016d0
|
||||
Pinpoint-TransactionID: 112_b36bec39c167f5f5^1734485633747^0
|
||||
Pinpoint-pAgentID: 112_b36bec39c167f5f5
|
||||
Pinpoint-pSpanID: 193d7666ad316a43
|
||||
Pragma: no-cache
|
||||
Referer: https://www.ecpan.cn/web/yunpan/
|
||||
Sec-Fetch-Dest: empty
|
||||
Sec-Fetch-Mode: cors
|
||||
Sec-Fetch-Site: same-origin
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
|
||||
sec-ch-ua-mobile: ?0
|
||||
sec-ch-ua-platform: "Windows"
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"extCodeFlag": 0,
|
||||
"isIp": 0,
|
||||
"shareId": 2854164,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"fileIdList": [
|
||||
{
|
||||
"tableName": "cloudp_file_52",
|
||||
"appFileId": "f786f877eeb811ee88d4bc16950460f6",
|
||||
"dfsFileId": "231f235d4380434ab9b57bc069d08630",
|
||||
"fileName": "Pydroid 3_7.2_arm64_q_cn.apk",
|
||||
"filePath": "个人盘pydroid7",
|
||||
"fileLevel": 1,
|
||||
"fileCount": 0,
|
||||
"fileType": 2,
|
||||
"fileSort": 99,
|
||||
"fileSize": 324728098,
|
||||
"uploadSize": 324728098,
|
||||
"parentId": "964abd0f861e11eeb992bc16950460f6",
|
||||
"usn": 11364252,
|
||||
"userName": "157****1073",
|
||||
"userId": "",
|
||||
"corpId": 13260232,
|
||||
"createDate": 1711818868000,
|
||||
"modifyDate": 1711818868000,
|
||||
"status": 1,
|
||||
"version": 0,
|
||||
"comeFrom": 21,
|
||||
"isShare": 0,
|
||||
"folderType": 0,
|
||||
"groupDesc": null,
|
||||
"groupId": "c27b53c4f91b11ed86b3b026287b20b1",
|
||||
"groupName": null,
|
||||
"permission": null,
|
||||
"userInfo": null,
|
||||
"diskType": 1,
|
||||
"historyKey": null,
|
||||
"oldAppFileId": null,
|
||||
"fileRealPath": null,
|
||||
"fileExt": null,
|
||||
"oldFileName": null,
|
||||
"key": null,
|
||||
"isUpperCase": null,
|
||||
"isSubDir": null,
|
||||
"isViewFolder": null,
|
||||
"uploadTimeType": null,
|
||||
"startUploadTime": null,
|
||||
"endUploadTime": null,
|
||||
"sizeOperator": null,
|
||||
"orderField": null,
|
||||
"orderBy": null,
|
||||
"oldFilePath": null,
|
||||
"statusStr": null,
|
||||
"rootUsn": 11364252,
|
||||
"createdByUsn": null,
|
||||
"attentionCount": 0,
|
||||
"fileMd5": "c5ed01a124030ce376c9f4753e015544",
|
||||
"fileLabel": null,
|
||||
"fileDesc": null,
|
||||
"fileExtends": "<fileExtends><shareRoot></shareRoot><isLock>0</isLock><isEncrypt>0</isEncrypt></fileExtends>",
|
||||
"deviceId": null,
|
||||
"fileNamePinyin": "Pydroid 3_7.2_arm64_q_cn.apk",
|
||||
"modifyUser": "157****1073",
|
||||
"fileExFileds": {
|
||||
"shareRoot": "",
|
||||
"isLock": 0,
|
||||
"isEncrypt": 0
|
||||
},
|
||||
"security": 0,
|
||||
"createdDate": null,
|
||||
"modifiedDate1": null,
|
||||
"modifiedDate2": null,
|
||||
"createdDate1": null,
|
||||
"createdDate2": null,
|
||||
"deleteUsn": null,
|
||||
"opType": 0,
|
||||
"toShares": null,
|
||||
"firstLevel": null,
|
||||
"downloadUrl": null
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
###
|
||||
|
||||
|
||||
|
||||
@@ -45,3 +45,101 @@ requesttoken=se2GpxdjP9zU4rajy1ro3vZ8x0nYE64KdTzgOUtG&password=QAIU
|
||||
# @no-cookie-jar
|
||||
https://v2.fangcloud.cn/share/e5079007dc31226096628870c7
|
||||
Cookie:XSRF-TOKEN=eyJpdiI6ImVpdW9XOFwvazVka0xRQ2JUQ1p4c1dRPT0iLCJ2YWx1ZSI6Im1NcTJuQW8xdlF4MEg1XC9NZERZUnE4TUgxNm9UYWhoV3pKMlhKcngwakMxR2VHeTFZZ0EzSlBcL244YXlRTWtKZ3NOd1JxYTl4ZktsdXdcL0t5dVlTMXhnPT0iLCJtYWMiOiJhMjZlODE3NDFlMTRkMjg1MzVhMjRjOGVmYTgzYjk1NGM1NmY1N2NmZjljZmIzMmRjZGFmOTVkNDhhMWYwMDRhIn0%3D; fc_session=eyJpdiI6IlppZW1UQVwvSHRWSDhVZWZwampkNHZRPT0iLCJ2YWx1ZSI6IjliWlBUZ0VPMlhoTXlUN3hXU25qYjlIdnRQRmtqbFdBR2cyaW1RVDdBN0s5OFRwcGFURjZ3TTZxZnQ4VVRGS2hNbWdPUFhrU0tlUTg1ZTJLZVZFS0FnPT0iLCJtYWMiOiJjMTM0YjI5ZTEwYjQwMGU0MGNlN2UyZmM4MWM2NzAyZmZhYjg5NWNlMjc3ODRhMmIzMzhmODg5ZTZlNzcyMGM2In0%3D;
|
||||
|
||||
###
|
||||
# curl 'https://anxia.com/webapi/share/skip_login_downurl'
|
||||
# -H 'Accept: application/json, text/javascript, */*; q=0.01'
|
||||
# -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8'
|
||||
# -H 'Cache-Control: no-cache'
|
||||
# -H 'Connection: keep-alive'
|
||||
# -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
|
||||
# -H 'Cookie: acw_tc=2f6a1fdb17343237335965711ee089dd42f90058dbad48c86a96931b7098b0'
|
||||
# -H 'DNT: 1'
|
||||
# -H 'Origin: https://anxia.com'
|
||||
# -H 'Pragma: no-cache'
|
||||
# -H 'Referer: https://anxia.com/s/swhyiia3wzi?password=h374'
|
||||
# -H 'Sec-Fetch-Dest: empty'
|
||||
# -H 'Sec-Fetch-Mode: cors'
|
||||
# -H 'Sec-Fetch-Site: same-origin'
|
||||
# -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
|
||||
# -H 'X-Requested-With: XMLHttpRequest'
|
||||
# -H 'sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
# -H 'sec-ch-ua-mobile: ?0'
|
||||
# -H 'sec-ch-ua-platform: "Windows"'
|
||||
# --data-raw 'share_code=swhyiia3wzi&receive_code=h374&file_id=2532636713782843636'
|
||||
POST https://anxia.com/webapi/share/skip_login_downurl
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
|
||||
|
||||
share_code=swhyiia3wzi&receive_code=h374&file_id=2532636713782843636
|
||||
|
||||
###
|
||||
# @no-cookie-jar
|
||||
# curl 'https://anxia.com/webapi/share/snap?share_code=swhyiia3wzi&offset=0&limit=20&receive_code=h374&cid='
|
||||
# -H 'Accept: application/json, text/javascript, */*; q=0.01'
|
||||
# -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8'
|
||||
# -H 'Cache-Control: no-cache'
|
||||
# -H 'Connection: keep-alive'
|
||||
# -H 'Cookie: acw_tc=2f6a1fdb17343237335965711ee089dd42f90058dbad48c86a96931b7098b0'
|
||||
# -H 'DNT: 1'
|
||||
# -H 'Pragma: no-cache'
|
||||
# -H 'Referer: https://anxia.com/s/swhyiia3wzi?password=h374'
|
||||
# -H 'Sec-Fetch-Dest: empty'
|
||||
# -H 'Sec-Fetch-Mode: cors'
|
||||
# -H 'Sec-Fetch-Site: same-origin'
|
||||
# -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
|
||||
# -H 'X-Requested-With: XMLHttpRequest'
|
||||
# -H 'sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
# -H 'sec-ch-ua-mobile: ?0'
|
||||
# -H 'sec-ch-ua-platform: "Windows"'
|
||||
GET https://anxia.com/webapi/share/snap?share_code=swhyiia3wzi&offset=0&limit=20&receive_code=h374&cid=
|
||||
Accept: application/json, text/javascript, */*; q=0.01
|
||||
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
|
||||
Cache-Control: no-cache
|
||||
Connection: keep-alive
|
||||
DNT: 1
|
||||
Pragma: no-cache
|
||||
Referer: https://anxia.com/s/swhyiia3wzi?password=h374
|
||||
Sec-Fetch-Dest: empty
|
||||
Sec-Fetch-Mode: cors
|
||||
Sec-Fetch-Site: same-origin
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
X-Requested-With: XMLHttpRequest
|
||||
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
|
||||
sec-ch-ua-mobile: ?0
|
||||
sec-ch-ua-platform: "Windows"
|
||||
|
||||
###
|
||||
# curl 'https://cdnfhnfile.115.com/63a79fdca011d11b46d5fda83f6fdf7fe5141ec7/%E6%95%B0%E5%AD%A612%E6%9C%8819%E6%97%A5-12%E6%9C%8823%E6%97%A5%E7%BA%BF%E4%B8%8A%E8%B5%84%E6%BA%90.zip?t=1734331803&u=ip976768882&s=512000&d=976768882--0&c=1&f=1&k=89f2b6ec6839999b3e7edc2b6ac85066&us=512000&uc=0&v=1'
|
||||
# -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
|
||||
# -H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8'
|
||||
# -H 'Cache-Control: no-cache'
|
||||
# -H 'Connection: keep-alive'
|
||||
# -H 'DNT: 1'
|
||||
# -H 'Pragma: no-cache'
|
||||
# -H 'Referer: https://anxia.com/'
|
||||
# -H 'Sec-Fetch-Dest: document'
|
||||
# -H 'Sec-Fetch-Mode: navigate'
|
||||
# -H 'Sec-Fetch-Site: cross-site'
|
||||
# -H 'Sec-Fetch-User: ?1'
|
||||
# -H 'Upgrade-Insecure-Requests: 1'
|
||||
# -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
|
||||
# -H 'sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||
# -H 'sec-ch-ua-mobile: ?0'
|
||||
# -H 'sec-ch-ua-platform: "Windows"'
|
||||
# @no-cookie-jar
|
||||
# @no-redirect
|
||||
GET https://cdnfhnfile.115.com/63a79fdca011d11b46d5fda83f6fdf7fe5141ec7/%E6%95%B0%E5%AD%A612%E6%9C%8819%E6%97%A5-12%E6%9C%8823%E6%97%A5%E7%BA%BF%E4%B8%8A%E8%B5%84%E6%BA%90.zip?t=1734331803&u=ip976768882&s=512000&d=976768882--0&c=1&f=1&k=89f2b6ec6839999b3e7edc2b6ac85066&us=512000&uc=0&v=1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
|
||||
|
||||
###
|
||||
# @no-cookie-jar
|
||||
# @no-redirect
|
||||
GET https://cdnfhnfile.115.com/63a79fdca011d11b46d5fda83f6fdf7fe5141ec7/%E6%95%B0%E5%AD%A612%E6%9C%8819%E6%97%A5-12%E6%9C%8823%E6%97%A5%E7%BA%BF%E4%B8%8A%E8%B5%84%E6%BA%90.zip?t=1734332086&u=ip976768882&s=512000&d=976768882--0&c=1&f=1&k=28e2b7be1a91ff0715dd92c6a9ec592f&us=512000&uc=0&v=1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
|
||||
|
||||
###
|
||||
https://cdnfhnfile.115.com/63a79fdca011d11b46d5fda83f6fdf7fe5141ec7/%E6%95%B0%E5%AD%A612%E6%9C%8819%E6%97%A5-12%E6%9C%8823%E6%97%A5%E7%BA%BF%E4%B8%8A%E8%B5%84%E6%BA%90.zip?t=1734336235&u=ip976768882&s=512000&d=976768882--0&c=1&f=1&k=89c7796e0906aca3eecccbd545775653&us=512000&uc=0&v=1
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
|
||||
@@ -66,3 +66,27 @@ Referer:https://www.feijipan.com/
|
||||
POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&uuid=WQAl5yBy1naGudJEILBvE&extra=2×tamp=A8ECC3C7C50191ACEB9CB8444FD37624&shareId=nMtCOXL&type=0&offset=1&limit=60
|
||||
|
||||
|
||||
###
|
||||
POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&uuid=23e9pOiMqb2Nc164OwF7X&extra=2×tamp=1E5EE05EE24146C0EA994200A7EC2D82&shareId=JoUTkZYj&type=0&offset=1&limit=60
|
||||
|
||||
###
|
||||
POST https://api.feijipan.com/ws/recommend/list?devType=6&devModel=Chrome&uuid=23e9pOiMqb2Nc164OwF7X&extra=2×tamp=F09BD416CC5AB6FFA52B8CA1FA6C38B7&shareId=JoUTkZYj&type=0&offset=1&limit=60
|
||||
Accept: application/json, text/plain, */*
|
||||
Accept-Encoding: gzip, deflate, br, zstd
|
||||
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
|
||||
Cache-Control: no-cache
|
||||
Connection: keep-alive
|
||||
Content-Length: 0
|
||||
DNT: 1
|
||||
Host: api.feijipan.com
|
||||
Origin: https://www.feijix.com
|
||||
Pragma: no-cache
|
||||
Referer: https://www.feijix.com/
|
||||
Sec-Fetch-Dest: empty
|
||||
Sec-Fetch-Mode: cors
|
||||
Sec-Fetch-Site: cross-site
|
||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
|
||||
appToken: undefined
|
||||
sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
|
||||
sec-ch-ua-mobile: ?0
|
||||
sec-ch-ua-platform: "Windows"
|
||||
|
||||
Reference in New Issue
Block a user