mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-17 12:53:02 +00:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df2bfb6ac7 | ||
|
|
517b6f8910 | ||
|
|
94a46d2833 | ||
|
|
1631a0faa1 | ||
|
|
06d5943cb6 | ||
|
|
3095e13676 | ||
|
|
482cbce7e8 | ||
|
|
ef2fc3ab98 | ||
|
|
5b57b05eae | ||
|
|
093579c6f5 | ||
|
|
40e8380738 | ||
|
|
b716e1e861 | ||
|
|
8432d4952c | ||
|
|
dd8f085f63 | ||
|
|
161ff8d8a3 | ||
|
|
1390cd0104 | ||
|
|
7a02b1e97f | ||
|
|
036f107c90 | ||
|
|
5652383450 | ||
|
|
9a047a5da0 | ||
|
|
8975743a37 |
10
.github/workflows/maven.yml
vendored
10
.github/workflows/maven.yml
vendored
@@ -16,8 +16,9 @@ permissions:
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- '*'
|
- '*' # 只有推送tag时才会触发构建
|
||||||
branches: [ "main" ]
|
branches-ignore:
|
||||||
|
- '*' # 排除所有分支的提交
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- 'bin/**'
|
- 'bin/**'
|
||||||
- '.github/**'
|
- '.github/**'
|
||||||
@@ -27,7 +28,8 @@ on:
|
|||||||
- '*.txt'
|
- '*.txt'
|
||||||
- '*.md'
|
- '*.md'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches:
|
||||||
|
- "main"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -49,7 +51,7 @@ jobs:
|
|||||||
cache: maven
|
cache: maven
|
||||||
|
|
||||||
- name: Build Frontend
|
- name: Build Frontend
|
||||||
run: cd web-front && yarn install && yarn run build
|
run: cd web-front && npm install && npm run build
|
||||||
|
|
||||||
- name: Build with Maven
|
- name: Build with Maven
|
||||||
run: mvn -B package --file pom.xml
|
run: mvn -B package --file pom.xml
|
||||||
|
|||||||
34
.github/workflows/update-release-badge.yml
vendored
34
.github/workflows/update-release-badge.yml
vendored
@@ -1,34 +0,0 @@
|
|||||||
name: Update Release Badge
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*' # 可按需调整
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
update-badge:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get latest tag
|
|
||||||
id: get_tag
|
|
||||||
run: echo "tag_name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Update README badge
|
|
||||||
run: |
|
|
||||||
TAG=${{ steps.get_tag.outputs.tag_name }}
|
|
||||||
BADGE="https://img.shields.io/github/actions/workflow/status/qaiu/netdisk-fast-download/maven.yml?branch=$TAG"
|
|
||||||
echo "Using badge: $BADGE"
|
|
||||||
|
|
||||||
# 替换 README 中 badge 行(标记行需特殊注释)
|
|
||||||
sed -i -E "s#(!\[release-badge\]\(.*\))##" README.md
|
|
||||||
|
|
||||||
- name: Commit and push
|
|
||||||
run: |
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
||||||
git commit -am "🔄 update release badge for ${{ steps.get_tag.outputs.tag_name }}" || echo "No changes"
|
|
||||||
git push
|
|
||||||
31
README.md
31
README.md
@@ -3,7 +3,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml"><img src="https://img.shields.io/github/actions/workflow/status/{user}/{repo}/{workflow_file}?branch={tag}"></a>
|
<a href="https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml"><img src="https://img.shields.io/github/actions/workflow/status/qaiu/netdisk-fast-download/maven.yml?branch=v0.1.9b2&style=flat"></a>
|
||||||
<a href="https://www.oracle.com/cn/java/technologies/downloads"><img src="https://img.shields.io/badge/jdk-%3E%3D17-blue"></a>
|
<a href="https://www.oracle.com/cn/java/technologies/downloads"><img src="https://img.shields.io/badge/jdk-%3E%3D17-blue"></a>
|
||||||
<a href="https://vertx-china.github.io"><img src="https://img.shields.io/badge/vert.x-4.5.6-blue?style=flat"></a>
|
<a href="https://vertx-china.github.io"><img src="https://img.shields.io/badge/vert.x-4.5.6-blue?style=flat"></a>
|
||||||
<a href="https://raw.githubusercontent.com/qaiu/netdisk-fast-download/master/LICENSE"><img src="https://img.shields.io/github/license/qaiu/netdisk-fast-download?style=flat"></a>
|
<a href="https://raw.githubusercontent.com/qaiu/netdisk-fast-download/master/LICENSE"><img src="https://img.shields.io/github/license/qaiu/netdisk-fast-download?style=flat"></a>
|
||||||
@@ -76,23 +76,28 @@ main分支依赖JDK17, 提供了JDK11分支[main-jdk11](https://github.com/qaiu/
|
|||||||
|
|
||||||
API规则:
|
API规则:
|
||||||
> 建议使用UrlEncode编码分享链接
|
> 建议使用UrlEncode编码分享链接
|
||||||
```
|
|
||||||
|
|
||||||
1. 解析并自动302跳转
|
1. 解析并自动302跳转
|
||||||
http://your_host/parser?url=分享链接&pwd=xxx
|
http://your_host/parser?url=分享链接&pwd=xxx
|
||||||
或者 http://your_host/parser?url=UrlEncode(分享链接)&pwd=xxx
|
http://your_host/parser?url=UrlEncode(分享链接)&pwd=xxx
|
||||||
http://your_host/d/网盘标识/分享key@分享密码
|
http://your_host/d/网盘标识/分享key@分享密码
|
||||||
2. 获取解析后的直链--JSON格式
|
2. 获取解析后的直链--JSON格式
|
||||||
http://your_host/json/parser?url=分享链接&pwd=xxx
|
http://your_host/json/parser?url=分享链接&pwd=xxx
|
||||||
http://your_host/json/网盘标识/分享key@分享密码
|
http://your_host/json/网盘标识/分享key@分享密码
|
||||||
3. 文件夹解析v0.1.8fixed3新增
|
3. 文件夹解析v0.1.8fixed3新增
|
||||||
http://your_host/json/getFileList?url=分享链接&pwd=xxx
|
http://your_host/json/getFileList?url=分享链接&pwd=xxx
|
||||||
```
|
|
||||||
|
|
||||||
|
### json接口说明
|
||||||
|
|
||||||
|
1. 文件解析:/json/parser?url=分享链接&pwd=xxx
|
||||||
|
|
||||||
json返回数据格式示例:
|
json返回数据格式示例:
|
||||||
`shareKey`: 全局分享key
|
`shareKey`: 全局分享key
|
||||||
`directLink`: 下载链接
|
`directLink`: 下载链接
|
||||||
`cacheHit`: 是否为缓存链接
|
`cacheHit`: 是否为缓存链接
|
||||||
`expires`: 缓存到期时间
|
`expires`: 缓存到期时间
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"code": 200,
|
"code": 200,
|
||||||
@@ -153,15 +158,15 @@ json返回数据格式示例:
|
|||||||
"fileIcon": null,
|
"fileIcon": null,
|
||||||
"size": 999,
|
"size": 999,
|
||||||
"sizeStr": "999 M",
|
"sizeStr": "999 M",
|
||||||
"fileType": "apk",
|
"fileType": "file/folder",
|
||||||
"filePath": null,
|
"filePath": null,
|
||||||
"createTime": "17 小时前",
|
"createTime": "17 小时前",
|
||||||
"updateTime": null,
|
"updateTime": null,
|
||||||
"createBy": null,
|
"createBy": null,
|
||||||
"description": null,
|
"description": null,
|
||||||
"downloadCount": null,
|
"downloadCount": 下载次数,
|
||||||
"panType": "lz",
|
"panType": "lz",
|
||||||
"parserUrl": "下载链接",
|
"parserUrl": "下载链接/文件夹链接",
|
||||||
"extParameters": null
|
"extParameters": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -262,15 +267,15 @@ mkdir -p netdisk-fast-download
|
|||||||
cd netdisk-fast-download
|
cd netdisk-fast-download
|
||||||
|
|
||||||
# 拉取镜像
|
# 拉取镜像
|
||||||
docker pull ghcr.io/qaiu/netdisk-fast-download:main
|
docker pull ghcr.io/qaiu/netdisk-fast-download:lastest
|
||||||
|
|
||||||
# 复制配置文件(或下载仓库web-service\src\main\resources)
|
# 复制配置文件(或下载仓库web-service\src\main\resources)
|
||||||
docker create --name netdisk-fast-download ghcr.io/qaiu/netdisk-fast-download:main
|
docker create --name netdisk-fast-download ghcr.io/qaiu/netdisk-fast-download:lastest
|
||||||
docker cp netdisk-fast-download:/app/resources ./resources
|
docker cp netdisk-fast-download:/app/resources ./resources
|
||||||
docker rm netdisk-fast-download
|
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
|
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:lastest
|
||||||
|
|
||||||
# 反代6401端口
|
# 反代6401端口
|
||||||
|
|
||||||
@@ -285,15 +290,15 @@ mkdir -p netdisk-fast-download
|
|||||||
cd netdisk-fast-download
|
cd netdisk-fast-download
|
||||||
|
|
||||||
# 拉取镜像
|
# 拉取镜像
|
||||||
docker pull ghcr.nju.edu.cn/qaiu/netdisk-fast-download:main
|
docker pull ghcr.nju.edu.cn/qaiu/netdisk-fast-download:lastest
|
||||||
|
|
||||||
# 复制配置文件(或下载仓库web-service\src\main\resources)
|
# 复制配置文件(或下载仓库web-service\src\main\resources)
|
||||||
docker create --name netdisk-fast-download ghcr.nju.edu.cn/qaiu/netdisk-fast-download:main
|
docker create --name netdisk-fast-download ghcr.nju.edu.cn/qaiu/netdisk-fast-download:lastest
|
||||||
docker cp netdisk-fast-download:/app/resources ./resources
|
docker cp netdisk-fast-download:/app/resources ./resources
|
||||||
docker rm netdisk-fast-download
|
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.nju.edu.cn/qaiu/netdisk-fast-download:main
|
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.nju.edu.cn/qaiu/netdisk-fast-download:lastest
|
||||||
|
|
||||||
# 反代6401端口
|
# 反代6401端口
|
||||||
|
|
||||||
|
|||||||
86
bin/nfd-install.sh
Normal file
86
bin/nfd-install.sh
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# ----------- 配置区域 ------------
|
||||||
|
# JRE 下载目录
|
||||||
|
JRE_DIR="/opt/custom-jre17"
|
||||||
|
# 使用阿里云镜像下载 JRE(OpenJDK 17)
|
||||||
|
JRE_TARBALL_URL="https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jre/x64/linux/OpenJDK17U-jre_x64_linux_hotspot_17.0.15_6.tar.gz"
|
||||||
|
|
||||||
|
# ZIP 文件下载相关
|
||||||
|
ZIP_URL="http://www.722shop.top:6401/parser?url="
|
||||||
|
ZIP_DEST_DIR="/opt/target-zip"
|
||||||
|
ZIP_FILE_NAME="nfd.zip"
|
||||||
|
# --------------------------------
|
||||||
|
|
||||||
|
# 创建目录
|
||||||
|
mkdir -p "$JRE_DIR"
|
||||||
|
mkdir -p "$ZIP_DEST_DIR"
|
||||||
|
|
||||||
|
# -------- 检查 unzip 是否存在 --------
|
||||||
|
if ! command -v unzip >/dev/null 2>&1; then
|
||||||
|
echo "unzip 未安装,正在安装..."
|
||||||
|
|
||||||
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
|
apt-get update && apt-get install -y unzip
|
||||||
|
elif command -v yum >/dev/null 2>&1; then
|
||||||
|
yum install -y unzip
|
||||||
|
elif command -v dnf >/dev/null 2>&1; then
|
||||||
|
dnf install -y unzip
|
||||||
|
else
|
||||||
|
echo "不支持的包管理器,无法自动安装 unzip,请手动安装后重试。"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "unzip 已安装"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -------- 下载并解压 JRE --------
|
||||||
|
echo "下载 JRE 17 到 $JRE_DIR..."
|
||||||
|
curl -L "$JRE_TARBALL_URL" -o "$JRE_DIR/jre17.tar.gz"
|
||||||
|
|
||||||
|
echo "解压 JRE..."
|
||||||
|
tar -xzf "$JRE_DIR/jre17.tar.gz" -C "$JRE_DIR" --strip-components=1
|
||||||
|
rm "$JRE_DIR/jre17.tar.gz"
|
||||||
|
echo "JRE 解压完成"
|
||||||
|
|
||||||
|
# -------- 下载 ZIP 文件 --------
|
||||||
|
ZIP_PATH="$ZIP_DEST_DIR/$ZIP_FILE_NAME"
|
||||||
|
echo "下载 ZIP 文件到 $ZIP_PATH..."
|
||||||
|
curl -L "$ZIP_URL" -o "$ZIP_PATH"
|
||||||
|
|
||||||
|
# -------- 解压 ZIP 文件 --------
|
||||||
|
echo "解压 ZIP 文件到 $ZIP_DEST_DIR..."
|
||||||
|
unzip -o "$ZIP_PATH" -d "$ZIP_DEST_DIR"
|
||||||
|
echo "解压完成"
|
||||||
|
|
||||||
|
# -------- 启动 JAR 程序 --------
|
||||||
|
echo "进入 JAR 目录并后台运行程序..."
|
||||||
|
|
||||||
|
JAR_DIR="/opt/target-zip/netdisk-fast-download"
|
||||||
|
JAR_FILE="netdisk-fast-download.jar"
|
||||||
|
JAVA_BIN="$JRE_DIR/bin/java"
|
||||||
|
LOG_FILE="$JAR_DIR/app.log"
|
||||||
|
|
||||||
|
if [ ! -d "$JAR_DIR" ]; then
|
||||||
|
echo "[错误] 找不到 JAR 目录: $JAR_DIR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$JAR_DIR"
|
||||||
|
|
||||||
|
if [ ! -f "$JAR_FILE" ]; then
|
||||||
|
echo "[错误] 找不到 JAR 文件: $JAR_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$JAVA_BIN" ]; then
|
||||||
|
echo "[错误] 找不到可执行的 java: $JAVA_BIN"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 后台运行,日志记录
|
||||||
|
nohup "$JAVA_BIN" -jar "$JAR_FILE" > "$LOG_FILE" 2>&1 &
|
||||||
|
|
||||||
|
echo "程序已在后台启动 ✅"
|
||||||
|
echo "日志路径: $LOG_FILE"
|
||||||
@@ -19,7 +19,7 @@ public interface IPanTool {
|
|||||||
*/
|
*/
|
||||||
default Future<List<FileInfo>> parseFileList() {
|
default Future<List<FileInfo>> parseFileList() {
|
||||||
Promise<List<FileInfo>> promise = Promise.promise();
|
Promise<List<FileInfo>> promise = Promise.promise();
|
||||||
promise.complete();
|
promise.fail("Not implemented yet");
|
||||||
return promise.future();
|
return promise.future();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ public interface IPanTool {
|
|||||||
*/
|
*/
|
||||||
default Future<String> parseById() {
|
default Future<String> parseById() {
|
||||||
Promise<String> promise = Promise.promise();
|
Promise<String> promise = Promise.promise();
|
||||||
promise.complete();
|
promise.complete("Not implemented yet");
|
||||||
return promise.future();
|
return promise.future();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,7 +222,10 @@ public class LzTool extends PanBase {
|
|||||||
.setSizeStr(fileJson.getString("size"))
|
.setSizeStr(fileJson.getString("size"))
|
||||||
.setSize(sizeNum)
|
.setSize(sizeNum)
|
||||||
.setPanType(panType)
|
.setPanType(panType)
|
||||||
.setParserUrl(getDomainName() + "/d/" + panType + "/" + id);
|
.setParserUrl(getDomainName() + "/d/" + panType + "/" + id)
|
||||||
|
.setPreviewUrl(String.format("%s/v2/view/%s/%s", getDomainName(),
|
||||||
|
shareLinkInfo.getType(), id));
|
||||||
|
;
|
||||||
log.debug("文件信息: {}", fileInfo);
|
log.debug("文件信息: {}", fileInfo);
|
||||||
list.add(fileInfo);
|
list.add(fileInfo);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package cn.qaiu.parser.impl;
|
package cn.qaiu.parser.impl;
|
||||||
|
|
||||||
|
import cn.qaiu.entity.FileInfo;
|
||||||
import cn.qaiu.entity.ShareLinkInfo;
|
import cn.qaiu.entity.ShareLinkInfo;
|
||||||
import cn.qaiu.parser.PanBase;
|
import cn.qaiu.parser.PanBase;
|
||||||
import cn.qaiu.util.CommonUtils;
|
import cn.qaiu.util.CommonUtils;
|
||||||
|
import cn.qaiu.util.FileSizeConverter;
|
||||||
import cn.qaiu.util.JsExecUtils;
|
import cn.qaiu.util.JsExecUtils;
|
||||||
import io.vertx.core.Future;
|
import io.vertx.core.Future;
|
||||||
import io.vertx.core.MultiMap;
|
import io.vertx.core.MultiMap;
|
||||||
|
import io.vertx.core.Promise;
|
||||||
import io.vertx.core.json.JsonArray;
|
import io.vertx.core.json.JsonArray;
|
||||||
import io.vertx.core.json.JsonObject;
|
import io.vertx.core.json.JsonObject;
|
||||||
import io.vertx.core.json.pointer.JsonPointer;
|
import io.vertx.core.json.pointer.JsonPointer;
|
||||||
@@ -15,7 +18,9 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.openjdk.nashorn.api.scripting.ScriptObjectMirror;
|
import org.openjdk.nashorn.api.scripting.ScriptObjectMirror;
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -32,7 +37,7 @@ public class YeTool extends PanBase {
|
|||||||
|
|
||||||
private static final String GET_FILE_INFO_URL = "https://www.123pan.com/a/api/share/get?limit=100&next=1&orderBy" +
|
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" +
|
"=file_name&orderDirection=asc" +
|
||||||
"&shareKey={shareKey}&SharePwd={pwd}&ParentFileId=0&Page=1&event=homeListFile&operateType=1";
|
"&shareKey={shareKey}&SharePwd={pwd}&ParentFileId={ParentFileId}&Page=1&event=homeListFile&operateType=1";
|
||||||
private static final String DOWNLOAD_API_URL = "https://www.123pan.com/a/api/share/download/info?{authK}={authV}";
|
private static final String DOWNLOAD_API_URL = "https://www.123pan.com/a/api/share/download/info?{authK}={authV}";
|
||||||
|
|
||||||
private static final String BATCH_DOWNLOAD_API_URL = "https://www.123pan.com/b/api/file/batch_download_share_info?{authK}={authV}";
|
private static final String BATCH_DOWNLOAD_API_URL = "https://www.123pan.com/b/api/file/batch_download_share_info?{authK}={authV}";
|
||||||
@@ -97,6 +102,7 @@ public class YeTool extends PanBase {
|
|||||||
client.getAbs(UriTemplate.of(GET_FILE_INFO_URL))
|
client.getAbs(UriTemplate.of(GET_FILE_INFO_URL))
|
||||||
.setTemplateParam("shareKey", shareKey)
|
.setTemplateParam("shareKey", shareKey)
|
||||||
.setTemplateParam("pwd", pwd)
|
.setTemplateParam("pwd", pwd)
|
||||||
|
.setTemplateParam("ParentFileId", "0")
|
||||||
// .setTemplateParam("authKey", AESUtils.getAuthKey("/a/api/share/get"))
|
// .setTemplateParam("authKey", AESUtils.getAuthKey("/a/api/share/get"))
|
||||||
.putHeader("Platform", "web")
|
.putHeader("Platform", "web")
|
||||||
.putHeader("App-Version", "3")
|
.putHeader("App-Version", "3")
|
||||||
@@ -227,4 +233,121 @@ public class YeTool extends PanBase {
|
|||||||
}
|
}
|
||||||
}).onFailure(this.handleFail(DOWNLOAD_API_URL));
|
}).onFailure(this.handleFail(DOWNLOAD_API_URL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// dir parser
|
||||||
|
@Override
|
||||||
|
public Future<List<FileInfo>> parseFileList() {
|
||||||
|
Promise<List<FileInfo>> promise = Promise.promise();
|
||||||
|
|
||||||
|
String shareKey = shareLinkInfo.getShareKey(); // 分享链接的唯一标识
|
||||||
|
String pwd = shareLinkInfo.getSharePassword(); // 分享密码
|
||||||
|
String parentFileId = "0"; // 根目录的文件ID
|
||||||
|
String shareId = shareLinkInfo.getShareKey(); // String.valueOf(AESUtils.idEncrypt(dataKey));
|
||||||
|
|
||||||
|
// 如果参数里的目录ID不为空,则直接解析目录
|
||||||
|
String dirId = (String) shareLinkInfo.getOtherParam().get("dirId");
|
||||||
|
if (StringUtils.isNotBlank(dirId)) {
|
||||||
|
parentFileId = dirId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 构造文件列表接口的URL
|
||||||
|
client.getAbs(UriTemplate.of(GET_FILE_INFO_URL))
|
||||||
|
.setTemplateParam("shareKey", shareKey)
|
||||||
|
.setTemplateParam("pwd", pwd)
|
||||||
|
.setTemplateParam("ParentFileId", parentFileId)
|
||||||
|
.putHeaders(header)
|
||||||
|
.send().onSuccess(res -> {
|
||||||
|
JsonObject response = asJson(res);
|
||||||
|
if (response.getInteger("code") != 0) {
|
||||||
|
promise.fail("API错误: " + response.getString("message"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonArray infoList = response.getJsonObject("data").getJsonArray("InfoList");
|
||||||
|
List<FileInfo> result = new ArrayList<>();
|
||||||
|
|
||||||
|
// 遍历返回的文件和目录信息
|
||||||
|
for (int i = 0; i < infoList.size(); i++) {
|
||||||
|
JsonObject item = infoList.getJsonObject(i);
|
||||||
|
FileInfo fileInfo = new FileInfo();
|
||||||
|
// "FileId": 16603582,
|
||||||
|
// "FileName": "pdf",
|
||||||
|
// "Type": 1,
|
||||||
|
// "Size": 0,
|
||||||
|
// "ContentType": "0",
|
||||||
|
// "S3KeyFlag": "",
|
||||||
|
// "CreateAt": "2025-07-09T06:56:20+08:00",
|
||||||
|
// "UpdateAt": "2025-07-09T06:56:20+08:00",
|
||||||
|
// "Etag": "",
|
||||||
|
// "DownloadUrl": "",
|
||||||
|
// "Status": 0,
|
||||||
|
// "ParentFileId": 16603579,
|
||||||
|
// "Category": 0,
|
||||||
|
// "PunishFlag": 0,
|
||||||
|
// "StorageNode": "m0",
|
||||||
|
// "PreviewType": 0
|
||||||
|
|
||||||
|
// =>
|
||||||
|
// {
|
||||||
|
// "ShareKey":"iaKtVv-FTaCd",
|
||||||
|
// "FileID":16604189,
|
||||||
|
// "S3keyFlag":"1815268665-0",
|
||||||
|
// "Size":425929,
|
||||||
|
// "Etag":"70049de67075ab2b269c62d690424601",
|
||||||
|
// "OrderId":""}
|
||||||
|
JsonObject postData = JsonObject.of()
|
||||||
|
.put("ShareKey", shareKey)
|
||||||
|
.put("FileID", item.getInteger("FileId"))
|
||||||
|
.put("S3keyFlag", item.getString("S3KeyFlag"))
|
||||||
|
.put("Size", item.getLong("Size"))
|
||||||
|
.put("Etag", item.getString("Etag"));
|
||||||
|
|
||||||
|
byte[] encode = Base64.getEncoder().encode(postData.encode().getBytes());
|
||||||
|
String param = new String(encode);
|
||||||
|
|
||||||
|
if (item.getInteger("Type") == 0) { // 文件
|
||||||
|
fileInfo.setFileName(item.getString("FileName"))
|
||||||
|
.setFileId(item.getString("FileId"))
|
||||||
|
.setFileType("file")
|
||||||
|
.setSize(item.getLong("Size"))
|
||||||
|
.setCreateTime(item.getString("CreateAt"))
|
||||||
|
.setUpdateTime(item.getString("UpdateAt"))
|
||||||
|
.setSizeStr(FileSizeConverter.convertToReadableSize(item.getLong("Size")))
|
||||||
|
.setParserUrl(String.format("%s/v2/redirectUrl/%s/%s", getDomainName(),
|
||||||
|
shareLinkInfo.getType(), param))
|
||||||
|
.setPreviewUrl(String.format("%s/v2/viewUrl/%s/%s", getDomainName(),
|
||||||
|
shareLinkInfo.getType(), param));
|
||||||
|
result.add(fileInfo);
|
||||||
|
} else if (item.getInteger("Type") == 1) { // 目录
|
||||||
|
fileInfo.setFileName(item.getString("FileName"))
|
||||||
|
.setFileId(item.getString("FileId"))
|
||||||
|
.setCreateTime(item.getString("CreateAt"))
|
||||||
|
.setUpdateTime(item.getString("UpdateAt"))
|
||||||
|
.setSize(0L)
|
||||||
|
.setFileType("folder")
|
||||||
|
.setParserUrl(
|
||||||
|
String.format("%s/v2/getFileList?url=%s&dirId=%s&pwd=%s",
|
||||||
|
getDomainName(),
|
||||||
|
shareLinkInfo.getShareUrl(),
|
||||||
|
item.getString("FileId"),
|
||||||
|
pwd)
|
||||||
|
);
|
||||||
|
result.add(fileInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
promise.complete(result);
|
||||||
|
}).onFailure(promise::fail);
|
||||||
|
|
||||||
|
return promise.future();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Future<String> parseById() {
|
||||||
|
JsonObject paramJson = (JsonObject) shareLinkInfo.getOtherParam().get("paramJson");
|
||||||
|
// 调用下载接口获取直链
|
||||||
|
down(client, paramJson, DOWNLOAD_API_URL);
|
||||||
|
return promise.future();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
presets: [
|
presets: [
|
||||||
'@vue/cli-plugin-babel/preset'
|
'@vue/cli-plugin-babel/preset'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'@vue/babel-plugin-transform-vue-jsx'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve",
|
"serve": "vue-cli-service serve",
|
||||||
|
"dev": "vue-cli-service serve",
|
||||||
"build": "vue-cli-service build",
|
"build": "vue-cli-service build",
|
||||||
"lint": "vue-cli-service lint"
|
"lint": "vue-cli-service lint"
|
||||||
},
|
},
|
||||||
@@ -15,18 +16,22 @@
|
|||||||
"core-js": "^3.8.3",
|
"core-js": "^3.8.3",
|
||||||
"element-plus": "^2.8.7",
|
"element-plus": "^2.8.7",
|
||||||
"qrcode": "^1.5.4",
|
"qrcode": "^1.5.4",
|
||||||
|
"splitpanes": "^4.0.4",
|
||||||
"vue": "^3.5.12",
|
"vue": "^3.5.12",
|
||||||
"vue-clipboard3": "^2.0.0",
|
"vue-clipboard3": "^2.0.0",
|
||||||
|
"vue-router": "^4.5.1",
|
||||||
"vue3-json-viewer": "2.2.2"
|
"vue3-json-viewer": "2.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.26.0",
|
"@babel/core": "^7.26.0",
|
||||||
"@babel/eslint-parser": "^7.25.9",
|
"@babel/eslint-parser": "^7.25.9",
|
||||||
|
"@babel/plugin-transform-class-properties": "^7.26.0",
|
||||||
|
"@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
|
||||||
"@vue/cli-plugin-babel": "~5.0.8",
|
"@vue/cli-plugin-babel": "~5.0.8",
|
||||||
"@vue/cli-plugin-eslint": "~5.0.8",
|
"@vue/cli-plugin-eslint": "~5.0.8",
|
||||||
"@vue/cli-service": "~5.0.8",
|
"@vue/cli-service": "~5.0.8",
|
||||||
"compression-webpack-plugin": "^11.1.0",
|
"compression-webpack-plugin": "^11.1.0",
|
||||||
"eslint": "^9.14.0",
|
"eslint": "^9.0.0",
|
||||||
"eslint-plugin-vue": "^9.30.0",
|
"eslint-plugin-vue": "^9.30.0",
|
||||||
"filemanager-webpack-plugin": "8.0.0"
|
"filemanager-webpack-plugin": "8.0.0"
|
||||||
},
|
},
|
||||||
@@ -48,5 +53,12 @@
|
|||||||
"> 1%",
|
"> 1%",
|
||||||
"last 2 versions",
|
"last 2 versions",
|
||||||
"not dead"
|
"not dead"
|
||||||
]
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16.0.0 <=22.0.0",
|
||||||
|
"npm": ">=8.0.0"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"eslint": "^9.0.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
content="Netdisk fast download,网盘直链解析工具">
|
content="Netdisk fast download,网盘直链解析工具">
|
||||||
<meta name="description"
|
<meta name="description"
|
||||||
content="Netdisk fast download 网盘直链解析工具">
|
content="Netdisk fast download 网盘直链解析工具">
|
||||||
|
<!-- Font Awesome 图标库 -->
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||||
<style>
|
<style>
|
||||||
.page-loading-wrap {
|
.page-loading-wrap {
|
||||||
padding: 120px;
|
padding: 120px;
|
||||||
|
|||||||
@@ -1,378 +1,21 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
|
<router-view></router-view>
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-card class="box-card">
|
|
||||||
|
|
||||||
<div style="text-align: right"><DarkMode/></div>
|
|
||||||
<div class="demo-basic--circle">
|
|
||||||
<div class="block" style="text-align: center;">
|
|
||||||
<img :height="150" src="../public/images/lanzou111.png" alt="lz"></img>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<h3 style="text-align: center;">NFD网盘直链解析0.1.9_bate2</h3>
|
|
||||||
<div class="typo">
|
|
||||||
<p style="text-align: center;">
|
|
||||||
<span>
|
|
||||||
<el-link href="https://github.com/qaiu/netdisk-fast-download" target="_blank" rel="nofollow">
|
|
||||||
<u>GitHub</u></el-link>
|
|
||||||
</span>
|
|
||||||
<span style="margin-left: 30px">
|
|
||||||
<el-link href="https://blog.qaiu.top/archives/netdisk-fast-download-bao-ta-an-zhuang-jiao-cheng" target="_blank"
|
|
||||||
rel="nofollow"><u>宝塔部署安装教程</u>
|
|
||||||
</el-link>
|
|
||||||
</span>
|
|
||||||
<span style="margin-left: 30px">
|
|
||||||
<el-link href="https://blog.qaiu.top" target="_blank"
|
|
||||||
rel="nofollow"><u>QAIU博客</u>
|
|
||||||
</el-link>
|
|
||||||
</span></p>
|
|
||||||
<p><strong>文件解析支持 </strong>蓝奏云/蓝奏云优享/小飞机盘/123云盘/奶牛快传/移动云云空间/亿方云/文叔叔/QQ邮箱文件中转站</p>
|
|
||||||
<p><strong>目录解析支持 </strong>蓝奏云/蓝奏云优享/小飞机盘/123云盘(接入中)</p>
|
|
||||||
<p>已加入缓存机制, 如果遇到解析出的下载链接失效的情况请及时到<a href="https://github.com/qaiu/netdisk-fast-download/issues">
|
|
||||||
<u><strong>项目GitHub反馈</strong></u></a></p>
|
|
||||||
<p>节点1: 回源请求数:{{ node1Info.parserTotal }}, 缓存请求数:{{ node1Info.cacheTotal }}, 总数:{{ node1Info.total }}</p>
|
|
||||||
<!-- <p>节点2: 成功:{{ node2Info.success }},失败:{{ node2Info.fail }},总数:{{ node2Info.total }}</p>-->
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="main" v-loading="isLoading">
|
|
||||||
<div class="grid-content">
|
|
||||||
|
|
||||||
<!-- 开关按钮,控制是否自动读取剪切板 -->
|
|
||||||
<el-switch
|
|
||||||
v-model="autoReadClipboard"
|
|
||||||
active-text="自动识别剪切板"
|
|
||||||
></el-switch>
|
|
||||||
|
|
||||||
<el-input placeholder="请粘贴分享链接(http://或https://)" v-model="link" id="url">
|
|
||||||
<template #prepend>分享链接</template>
|
|
||||||
<template #append v-if="!autoReadClipboard">
|
|
||||||
<el-button @click="() => getPaste(1)">读取剪切板</el-button>
|
|
||||||
</template>
|
|
||||||
</el-input>
|
|
||||||
<el-input placeholder="请输入密码" v-model="password" id="url">
|
|
||||||
<template #prepend>分享密码</template>
|
|
||||||
</el-input>
|
|
||||||
<el-input v-show="getLink2" :value="getLink2" id="url">
|
|
||||||
<template #prepend>智能直链</template>
|
|
||||||
<template #append>
|
|
||||||
<el-button v-clipboard:copy="getLink2"
|
|
||||||
v-clipboard:success="onCopy"
|
|
||||||
v-clipboard:error="onError">
|
|
||||||
<el-icon><CopyDocument/></el-icon>
|
|
||||||
</el-button>
|
|
||||||
</template>
|
|
||||||
</el-input>
|
|
||||||
|
|
||||||
<p style="text-align: center">
|
|
||||||
<el-button style="margin-left: 40px" @click="onSubmit">文件解析</el-button>
|
|
||||||
<!-- 目录解析-->
|
|
||||||
<el-button style="margin-left: 20px" @click="getFileList">目录解析</el-button>
|
|
||||||
<el-button style="margin-left: 20px" @click="genMd">生成Markdown链接</el-button>
|
|
||||||
<el-button style="margin-left: 20px" @click="generateQRCode">扫码下载</el-button>
|
|
||||||
<el-button style="margin-left: 20px" @click="getTj">链接信息统计</el-button>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="respData.code" style="margin-top: 10px">
|
|
||||||
<strong>解析结果: </strong>
|
|
||||||
<json-viewer
|
|
||||||
:value="respData"
|
|
||||||
:expand-depth=5
|
|
||||||
copyable
|
|
||||||
boxed
|
|
||||||
sort
|
|
||||||
/>
|
|
||||||
<a :href="downUrl" v-show="downUrl">点击下载</a>
|
|
||||||
</div>
|
|
||||||
<div v-if="mdText" style="text-align: center">
|
|
||||||
<el-input :value="mdText" readonly>
|
|
||||||
<template #append>
|
|
||||||
<el-button v-clipboard:copy="mdText"
|
|
||||||
v-clipboard:success="onCopy"
|
|
||||||
v-clipboard:error="onError">
|
|
||||||
<el-icon><CopyDocument/></el-icon>
|
|
||||||
</el-button>
|
|
||||||
</template>
|
|
||||||
</el-input>
|
|
||||||
</div>
|
|
||||||
<div style="text-align: center" v-show="showQrc">
|
|
||||||
<canvas ref="qrcodeCanvas"></canvas>
|
|
||||||
<div style="text-align: center"><el-link target="_blank" :href="codeUrl">{{ codeUrl }}</el-link></div>
|
|
||||||
</div>
|
|
||||||
<div v-if="tjData.shareLinkInfo">
|
|
||||||
<el-descriptions class="margin-top" title="分享详情" :column="1" border>
|
|
||||||
<template slot="extra">
|
|
||||||
<el-button type="primary" size="small">操作</el-button>
|
|
||||||
</template>
|
|
||||||
<el-descriptions-item label="网盘名称">{{ tjData.shareLinkInfo.panName }}</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="网盘标识">{{ tjData.shareLinkInfo.type }}</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="分享Key">{{ tjData.shareLinkInfo.shareKey }}</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="分享链接"> <el-link target="_blank" :href="tjData.shareLinkInfo.shareUrl">{{ tjData.shareLinkInfo.shareUrl }}</el-link></el-descriptions-item>
|
|
||||||
<el-descriptions-item label="jsonApi链接"> <el-link target="_blank" :href="tjData.apiLink">{{ tjData.apiLink }}</el-link></el-descriptions-item>
|
|
||||||
<el-descriptions-item label="302下载链接"> <el-link target="_blank" :href="tjData.downLink">{{ tjData.downLink }}</el-link></el-descriptions-item>
|
|
||||||
<el-descriptions-item label="解析次数">{{ tjData.parserTotal }}</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="缓存命中次数">{{ tjData.cacheHitTotal }}</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="总请求次数">{{ tjData.sumTotal }}</el-descriptions-item>
|
|
||||||
</el-descriptions>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</el-card>
|
|
||||||
</el-row>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import axios from 'axios'
|
|
||||||
import QRCode from 'qrcode'
|
|
||||||
import DarkMode from '@/components/DarkMode'
|
|
||||||
|
|
||||||
import parserUrl from './parserUrl1'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App'
|
||||||
components: {DarkMode},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
// baseAPI: `${location.protocol}//${location.hostname}:6400`,
|
|
||||||
baseAPI: `${location.protocol}//${location.host}`,
|
|
||||||
autoReadClipboard: true, // 开关状态,默认为自动读取
|
|
||||||
current: {}, // 当前分享
|
|
||||||
showQrc: false,
|
|
||||||
codeUrl: '',
|
|
||||||
mdText: '',
|
|
||||||
link: "",
|
|
||||||
password: "",
|
|
||||||
isLoading: false,
|
|
||||||
downUrl: null,
|
|
||||||
select: "lz",
|
|
||||||
respData: {},
|
|
||||||
tjData: {},
|
|
||||||
getLink: null,
|
|
||||||
getLink2: '',
|
|
||||||
getLinkInfo: null,
|
|
||||||
node1Info: {},
|
|
||||||
node2Info: {},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// toggleDark() {
|
|
||||||
// toggleDark()
|
|
||||||
// },
|
|
||||||
check() {
|
|
||||||
this.mdText = ''
|
|
||||||
this.showQrc = false
|
|
||||||
this.respData = {}
|
|
||||||
this.tjData = {}
|
|
||||||
if (!this.link.startsWith("https://") && !this.link.startsWith("http://")) {
|
|
||||||
this.$message.error("请输入有效链接!")
|
|
||||||
throw new Error('请输入有效链接')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onSubmit() {
|
|
||||||
this.check()
|
|
||||||
this.isLoading = true
|
|
||||||
this.downUrl = ''
|
|
||||||
this.respData = {}
|
|
||||||
this.getLink2 = `${this.baseAPI}/parser?url=${this.link}`
|
|
||||||
// this.getLink = `${location.protocol}//${location.host}/api/json/parser?url=${this.link}`
|
|
||||||
// this.getLink = `${location.protocol}//${location.host}/json/parser`
|
|
||||||
if (this.password) {
|
|
||||||
this.getLink2 += `&pwd=${this.password}`
|
|
||||||
}
|
|
||||||
axios.get(this.getLink, {params: {url: this.link, pwd: this.password}}).then(
|
|
||||||
response => {
|
|
||||||
this.isLoading = false
|
|
||||||
this.respData = response.data
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.$message({
|
|
||||||
message: response.data.msg,
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
this.downUrl = response.data.data.directLink
|
|
||||||
} else {
|
|
||||||
this.$message.error(response.data.msg)
|
|
||||||
}
|
|
||||||
this.getInfo()
|
|
||||||
},
|
|
||||||
error => {
|
|
||||||
this.isLoading = false
|
|
||||||
this.$message.error(error.message)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
onCopy() {
|
|
||||||
this.$message.success('复制成功')
|
|
||||||
},
|
|
||||||
onError() {
|
|
||||||
this.$message.error('复制失败')
|
|
||||||
},
|
|
||||||
getInfo() {
|
|
||||||
// 初始化统计信息
|
|
||||||
axios.get('/v2/statisticsInfo').then(
|
|
||||||
response => {
|
|
||||||
if (response.data.success) {
|
|
||||||
this.node1Info = response.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
// axios.get('/n2/statisticsInfo').then(
|
|
||||||
// response => {
|
|
||||||
// if (response.data.success) {
|
|
||||||
// this.node2Info = response.data.data
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
},
|
|
||||||
genMd() {
|
|
||||||
this.check()
|
|
||||||
axios.get(this.getLinkInfo, {params: {url: this.link, pwd: this.password}}).then(
|
|
||||||
response => {
|
|
||||||
this.isLoading = false
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.$message({
|
|
||||||
message: response.data.msg,
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
this.mdText = this.buildMd('快速下载地址',response.data.data.downLink)
|
|
||||||
} else {
|
|
||||||
this.$message.error(response.data.msg)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
buildMd(title, url) {
|
|
||||||
return `[${title}](${url})`
|
|
||||||
},
|
|
||||||
generateQRCode() {
|
|
||||||
this.check()
|
|
||||||
const options = { // 设置二维码的参数,例如大小、边距等
|
|
||||||
width: 150,
|
|
||||||
height: 150,
|
|
||||||
margin: 2
|
|
||||||
};
|
|
||||||
axios.get(this.getLinkInfo, {params: {url: this.link, pwd: this.password}}).then(
|
|
||||||
response => {
|
|
||||||
this.isLoading = false
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.$message({
|
|
||||||
message: response.data.msg,
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
this.codeUrl = response.data.data.downLink
|
|
||||||
QRCode.toCanvas(this.$refs.qrcodeCanvas, this.codeUrl, options, error => {
|
|
||||||
if (error) console.error(error);
|
|
||||||
});
|
|
||||||
this.showQrc = true
|
|
||||||
} else {
|
|
||||||
this.$message.error(response.data.msg)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getTj() {
|
|
||||||
this.check()
|
|
||||||
axios.get(this.getLinkInfo, {params: {url: this.link, pwd: this.password}}).then(
|
|
||||||
response => {
|
|
||||||
this.isLoading = false
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.$message({
|
|
||||||
message: response.data.msg,
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
this.tjData = response.data.data
|
|
||||||
} else {
|
|
||||||
this.$message.error(response.data.msg)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getFileList() {
|
|
||||||
this.check()
|
|
||||||
this.isLoading = true
|
|
||||||
axios.get(this.getLinkInfo, {params: {url: this.link, pwd: this.password}}).then(
|
|
||||||
response => {
|
|
||||||
this.isLoading = false
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.$message({
|
|
||||||
message: response.data.msg,
|
|
||||||
type: 'success'
|
|
||||||
})
|
|
||||||
const data = response.data.data
|
|
||||||
const panList = ["iz", "lz", "fj"];
|
|
||||||
|
|
||||||
if (!panList.includes(data.shareLinkInfo.type)) {
|
|
||||||
this.$message.error("当前网盘不支持目录解析")
|
|
||||||
}
|
|
||||||
let listUrl = `${window.location.origin}/list.html?url=${encodeURIComponent(this.link)}`
|
|
||||||
let apiUrl = new URL(data.apiLink).origin + `/v2/getFileList?url=${this.link}`;
|
|
||||||
// 动态添加密码参数
|
|
||||||
if (this.password) {
|
|
||||||
listUrl += `&pwd=${this.password}`;
|
|
||||||
apiUrl += `&pwd=${this.password}`;
|
|
||||||
}
|
|
||||||
this.$alert(
|
|
||||||
`目录解析API: <a href="${apiUrl}" target="_blank">${apiUrl}</a><br>打开文件列表: <a href="${listUrl}" target="_blank">点击这里</a>`,
|
|
||||||
'目录解析信息',
|
|
||||||
{
|
|
||||||
dangerouslyUseHTMLString: true,
|
|
||||||
confirmButtonText: '确定',
|
|
||||||
type: 'info'
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
this.$message.error(response.data.msg)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
async getPaste(v) {
|
|
||||||
const text = await navigator.clipboard.readText();
|
|
||||||
console.log('获取到的文本内容是:', text);
|
|
||||||
let linkInfo = parserUrl.parseLink(text);
|
|
||||||
let pwd = parserUrl.parsePwd(text) || '';
|
|
||||||
if (linkInfo.link) {
|
|
||||||
if(linkInfo.link !== this.link || pwd !== this.password ) {
|
|
||||||
this.password = pwd;
|
|
||||||
this.link = linkInfo.link;
|
|
||||||
this.getLink2 = `${this.baseAPI}/parser?url=${this.link}`
|
|
||||||
if (this.link) this.$message.success(`自动识别分享成功, 网盘类型: ${linkInfo.name}; 分享URL ${this.link}; 分享密码: ${this.password || '空'}`);
|
|
||||||
} else {
|
|
||||||
v || this.$message.warning(`[${linkInfo.name}]分享信息无变化`)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.$message.warning("未能提取到分享链接, 该分享可能尚未支持, 你可以复制任意网盘/音乐App的分享到该页面, 系统智能识别")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.getLinkInfo = `${this.baseAPI}/v2/linkInfo`
|
|
||||||
this.getLink = `${this.baseAPI}/json/parser`
|
|
||||||
let item = window.localStorage.getItem("autoReadClipboard");
|
|
||||||
if (item) {
|
|
||||||
this.autoReadClipboard = (item === 'true');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.getInfo()
|
|
||||||
|
|
||||||
// 页面首次加载时,根据开关状态判断是否读取剪切板
|
|
||||||
if (this.autoReadClipboard) {
|
|
||||||
this.getPaste()
|
|
||||||
}
|
|
||||||
// 当文档获得焦点时触发
|
|
||||||
window.addEventListener('focus', () => {
|
|
||||||
if (this.autoReadClipboard) {
|
|
||||||
this.getPaste()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
autoReadClipboard(val) {
|
|
||||||
window.localStorage.setItem("autoReadClipboard", val)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
}
|
||||||
#app {
|
#app {
|
||||||
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
@@ -382,62 +25,12 @@ export default {
|
|||||||
padding: 1em;
|
padding: 1em;
|
||||||
max-width: 900px;
|
max-width: 900px;
|
||||||
}
|
}
|
||||||
|
nav ul {
|
||||||
|
list-style: none;
|
||||||
body:before {
|
padding: 0;
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
opacity: .3;
|
|
||||||
z-index: -1;
|
|
||||||
position: fixed;
|
|
||||||
}
|
}
|
||||||
|
nav li {
|
||||||
.grid-content {
|
display: inline;
|
||||||
margin-top: 1em;
|
margin-right: 15px;
|
||||||
border-radius: 4px;
|
|
||||||
min-height: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-select .el-input {
|
|
||||||
width: 130px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.box-card {
|
|
||||||
margin-top: 4em !important;
|
|
||||||
margin-bottom: 4em !important;
|
|
||||||
opacity: .8;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 700px) {
|
|
||||||
.box-card {
|
|
||||||
margin-top: 1em !important;
|
|
||||||
margin-bottom: 1em !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.download h3 {
|
|
||||||
margin-top: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.download button {
|
|
||||||
margin-right: 0.5em;
|
|
||||||
margin-left: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.typo {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.typo a {
|
|
||||||
color: #0077ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
height: 10px;
|
|
||||||
margin-bottom: .8em;
|
|
||||||
border: none;
|
|
||||||
border-bottom: 1px solid rgba(0, 0, 0, .12);
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -11,14 +11,18 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref,watch } from 'vue'
|
import { ref, watch, onMounted } from 'vue'
|
||||||
import { useDark, useToggle } from '@vueuse/core'
|
import { useDark, useToggle } from '@vueuse/core'
|
||||||
/** 引入Element-Plus图标 */
|
/** 引入Element-Plus图标 */
|
||||||
import { Sunny, Moon } from '@element-plus/icons-vue'
|
import { Sunny, Moon } from '@element-plus/icons-vue'
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'DarkMode'
|
name: 'DarkMode'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 定义事件
|
||||||
|
const emit = defineEmits(['theme-change'])
|
||||||
|
|
||||||
/** 切换模式 */
|
/** 切换模式 */
|
||||||
const isDark = useDark({})
|
const isDark = useDark({})
|
||||||
|
|
||||||
@@ -30,8 +34,32 @@ if (item) {
|
|||||||
}
|
}
|
||||||
/** 是否切换为暗黑模式 */
|
/** 是否切换为暗黑模式 */
|
||||||
const darkMode = ref(item)
|
const darkMode = ref(item)
|
||||||
|
|
||||||
watch(darkMode, (newValue) => {
|
watch(darkMode, (newValue) => {
|
||||||
console.log(`darkMode: ${newValue}`)
|
console.log(`darkMode: ${newValue}`)
|
||||||
window.localStorage.setItem("darkMode", newValue);
|
window.localStorage.setItem("darkMode", newValue);
|
||||||
|
|
||||||
|
// 发射主题变化事件
|
||||||
|
emit('theme-change', newValue)
|
||||||
|
|
||||||
|
// 应用主题到body
|
||||||
|
if (newValue) {
|
||||||
|
document.body.classList.add('dark-theme')
|
||||||
|
document.documentElement.classList.add('dark-theme')
|
||||||
|
} else {
|
||||||
|
document.body.classList.remove('dark-theme')
|
||||||
|
document.documentElement.classList.remove('dark-theme')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// 初始化时发射当前主题状态
|
||||||
|
emit('theme-change', darkMode.value)
|
||||||
|
|
||||||
|
// 应用初始主题
|
||||||
|
if (darkMode.value) {
|
||||||
|
document.body.classList.add('dark-theme')
|
||||||
|
document.documentElement.classList.add('dark-theme')
|
||||||
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -9,22 +9,24 @@ import 'element-plus/dist/index.css'
|
|||||||
import 'element-plus/theme-chalk/dark/css-vars.css'
|
import 'element-plus/theme-chalk/dark/css-vars.css'
|
||||||
import "vue3-json-viewer/dist/index.css";
|
import "vue3-json-viewer/dist/index.css";
|
||||||
import './styles/dark/css-vars.css'
|
import './styles/dark/css-vars.css'
|
||||||
|
import router from './router/index.js'
|
||||||
|
|
||||||
window.$vueApp = Vue.createApp(App)
|
const app = Vue.createApp(App)
|
||||||
|
app.use(router)
|
||||||
|
|
||||||
|
|
||||||
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
||||||
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
|
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
|
||||||
window.$vueApp.component(key, component)
|
app.component(key, component)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Import JsonViewer as a Vue.js plugin
|
// Import JsonViewer as a Vue.js plugin
|
||||||
window.$vueApp.use(JsonViewer)
|
app.use(JsonViewer)
|
||||||
window.$vueApp.use(DirectiveExtensions)
|
app.use(DirectiveExtensions)
|
||||||
|
|
||||||
// or
|
// or
|
||||||
// components: {JsonViewer}
|
// components: {JsonViewer}
|
||||||
|
|
||||||
window.$vueApp.use(VueClipboard)
|
app.use(VueClipboard)
|
||||||
window.$vueApp.use(ElementPlus)
|
app.use(ElementPlus)
|
||||||
window.$vueApp.mount('#app')
|
app.mount('#app')
|
||||||
|
|||||||
@@ -0,0 +1,164 @@
|
|||||||
|
/* 全局样式 */
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 亮色主题 */
|
||||||
|
body {
|
||||||
|
background-color: #f5f7fa;
|
||||||
|
color: #2c3e50;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 暗色主题 */
|
||||||
|
body.dark-theme {
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Element Plus 暗色主题适配 */
|
||||||
|
.dark-theme .el-card {
|
||||||
|
background-color: #2d2d2d !important;
|
||||||
|
border-color: #404040 !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-input__inner {
|
||||||
|
background-color: #404040 !important;
|
||||||
|
border-color: #555555 !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-input__inner::placeholder {
|
||||||
|
color: #bdc3c7 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-button {
|
||||||
|
background-color: #404040 !important;
|
||||||
|
border-color: #555555 !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-button:hover {
|
||||||
|
background-color: #555555 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-button--primary {
|
||||||
|
background-color: #409eff !important;
|
||||||
|
border-color: #409eff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-button--primary:hover {
|
||||||
|
background-color: #66b1ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-button--success {
|
||||||
|
background-color: #67c23a !important;
|
||||||
|
border-color: #67c23a !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-button--success:hover {
|
||||||
|
background-color: #85ce61 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-switch__core {
|
||||||
|
background-color: #555555 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-descriptions {
|
||||||
|
background-color: #2d2d2d !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-descriptions__label {
|
||||||
|
color: #bdc3c7 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-descriptions__content {
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-dialog {
|
||||||
|
background-color: #2d2d2d !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-dialog__title {
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-dialog__body {
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-message {
|
||||||
|
background-color: #2d2d2d !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-message--success {
|
||||||
|
background-color: #67c23a !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-message--error {
|
||||||
|
background-color: #f56c6c !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-message--warning {
|
||||||
|
background-color: #e6a23c !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme .el-message--info {
|
||||||
|
background-color: #909399 !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 链接颜色 */
|
||||||
|
.dark-theme a {
|
||||||
|
color: #4a9eff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme a:hover {
|
||||||
|
color: #66b1ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 滚动条样式 */
|
||||||
|
.dark-theme ::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme ::-webkit-scrollbar-track {
|
||||||
|
background: #2d2d2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme ::-webkit-scrollbar-thumb {
|
||||||
|
background: #555555;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme ::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 选择文本样式 */
|
||||||
|
.dark-theme ::selection {
|
||||||
|
background-color: #409eff;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark-theme ::-moz-selection {
|
||||||
|
background-color: #409eff;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,15 +16,27 @@ module.exports = {
|
|||||||
host: '127.0.0.1',
|
host: '127.0.0.1',
|
||||||
port: 6444,
|
port: 6444,
|
||||||
proxy: {
|
proxy: {
|
||||||
'/': {
|
'/parser': {
|
||||||
target: 'http://127.0.0.1:6400', // 请求本地
|
target: 'http://127.0.0.1:6400/', // 请求本地
|
||||||
|
ws: false
|
||||||
|
},
|
||||||
|
'/v2': {
|
||||||
|
target: 'http://127.0.0.1:6400/', // 请求本地
|
||||||
|
ws: false
|
||||||
|
},
|
||||||
|
'/json': {
|
||||||
|
target: 'http://127.0.0.1:6400/', // 请求本地
|
||||||
|
ws: false
|
||||||
|
},
|
||||||
|
'/d': {
|
||||||
|
target: 'http://127.0.0.1:6400/', // 请求本地
|
||||||
ws: false
|
ws: false
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
configureWebpack: {
|
configureWebpack: {
|
||||||
// provide the app's title in webpack's name field, so that
|
// provide the app's title in webpack's name field, so that
|
||||||
// it can be accessed in index.html to inject the correct title.
|
// it can be accessed in list.html to inject the correct title.
|
||||||
name: 'Netdisk fast download',
|
name: 'Netdisk fast download',
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import cn.qaiu.entity.FileInfo;
|
|||||||
import cn.qaiu.entity.ShareLinkInfo;
|
import cn.qaiu.entity.ShareLinkInfo;
|
||||||
import cn.qaiu.lz.common.cache.CacheManager;
|
import cn.qaiu.lz.common.cache.CacheManager;
|
||||||
import cn.qaiu.lz.common.util.URLParamUtil;
|
import cn.qaiu.lz.common.util.URLParamUtil;
|
||||||
|
import cn.qaiu.lz.web.model.CacheLinkInfo;
|
||||||
import cn.qaiu.lz.web.model.LinkInfoResp;
|
import cn.qaiu.lz.web.model.LinkInfoResp;
|
||||||
import cn.qaiu.lz.web.model.StatisticsInfo;
|
import cn.qaiu.lz.web.model.StatisticsInfo;
|
||||||
import cn.qaiu.lz.web.model.SysUser;
|
import cn.qaiu.lz.web.model.SysUser;
|
||||||
@@ -15,6 +16,7 @@ import cn.qaiu.parser.ParserCreate;
|
|||||||
import cn.qaiu.vx.core.annotaions.RouteHandler;
|
import cn.qaiu.vx.core.annotaions.RouteHandler;
|
||||||
import cn.qaiu.vx.core.annotaions.RouteMapping;
|
import cn.qaiu.vx.core.annotaions.RouteMapping;
|
||||||
import cn.qaiu.vx.core.enums.RouteMethod;
|
import cn.qaiu.vx.core.enums.RouteMethod;
|
||||||
|
import cn.qaiu.vx.core.model.JsonResult;
|
||||||
import cn.qaiu.vx.core.util.AsyncServiceUtil;
|
import cn.qaiu.vx.core.util.AsyncServiceUtil;
|
||||||
import cn.qaiu.vx.core.util.ResponseUtil;
|
import cn.qaiu.vx.core.util.ResponseUtil;
|
||||||
import cn.qaiu.vx.core.util.SharedDataUtil;
|
import cn.qaiu.vx.core.util.SharedDataUtil;
|
||||||
@@ -142,6 +144,39 @@ public class ParserApi {
|
|||||||
return promise.future();
|
return promise.future();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预览媒体文件
|
||||||
|
*/
|
||||||
|
@RouteMapping(value = "/view/:type/:key", method = RouteMethod.GET, order = 2)
|
||||||
|
public void view(HttpServerRequest request, HttpServerResponse response, String type, String key) {
|
||||||
|
String previewURL = SharedDataUtil.getJsonStringForServerConfig("previewURL");
|
||||||
|
new ServerApi().parseKeyJson(request, type, key).onSuccess(res -> {
|
||||||
|
redirect(response, previewURL, res);
|
||||||
|
}).onFailure(e -> {
|
||||||
|
ResponseUtil.fireJsonResultResponse(response, JsonResult.error(e.toString()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void redirect(HttpServerResponse response, String previewURL, CacheLinkInfo res) {
|
||||||
|
String directLink = res.getDirectLink();
|
||||||
|
ResponseUtil.redirect(response, previewURL + URLEncoder.encode(directLink, StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预览媒体文件
|
||||||
|
*/
|
||||||
|
@RouteMapping(value = "/preview", method = RouteMethod.GET, order = 9)
|
||||||
|
public void viewURL(HttpServerRequest request, HttpServerResponse response, String pwd) {
|
||||||
|
String previewURL = SharedDataUtil.getJsonStringForServerConfig("previewURL");
|
||||||
|
new ServerApi().parseJson(request, pwd).onSuccess(res -> {
|
||||||
|
redirect(response, previewURL, res);
|
||||||
|
}).onFailure(e -> {
|
||||||
|
ResponseUtil.fireJsonResultResponse(response, JsonResult.error(e.toString()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@RouteMapping("/viewUrl/:type/:param")
|
@RouteMapping("/viewUrl/:type/:param")
|
||||||
public Future<Void> viewUrl(HttpServerResponse response, String type, String param) {
|
public Future<Void> viewUrl(HttpServerResponse response, String type, String param) {
|
||||||
Promise<Void> promise = Promise.promise();
|
Promise<Void> promise = Promise.promise();
|
||||||
|
|||||||
@@ -135,3 +135,23 @@ POST https://www.123684.com/b/api/file/batch_download_share_info?3697171543=1749
|
|||||||
Content-Type: application/json;charset=UTF-8
|
Content-Type: application/json;charset=UTF-8
|
||||||
|
|
||||||
{"ShareKey":"LH3rTd-pENed","fileIdList":[{"fileId":17525951}]}
|
{"ShareKey":"LH3rTd-pENed","fileIdList":[{"fileId":17525951}]}
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
https://www.123865.com/b/api/share/get?limit=100&next=-1&orderBy=file_name&orderDirection=asc&shareKey=iaKtVv-FTaCd&SharePwd=qaiu&ParentFileId=0&Page=1&event=homeListFile&operateType=1&OrderId=
|
||||||
|
Accept: */*
|
||||||
|
Accept-Encoding: gzip, deflate, br, zstd
|
||||||
|
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
|
||||||
|
App-Version: 3
|
||||||
|
Connection: keep-alive
|
||||||
|
DNT: 1
|
||||||
|
Host: www.123865.com
|
||||||
|
Referer: https://www.123865.com/s/iaKtVv-FTaCd?%E6%8F%90%E5%8F%96%E7%A0%81%3Aqaiu
|
||||||
|
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/138.0.0.0 Safari/537.36 Edg/138.0.0.0
|
||||||
|
platform: web
|
||||||
|
sec-ch-ua: "Not)A;Brand";v="8", "Chromium";v="138", "Microsoft Edge";v="138"
|
||||||
|
sec-ch-ua-mobile: ?0
|
||||||
|
sec-ch-ua-platform: "Windows"
|
||||||
Reference in New Issue
Block a user