mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-16 12:23:03 +00:00
fixed. 123跨区下载错误
This commit is contained in:
@@ -95,7 +95,9 @@ String url = tool.parseSync();
|
||||
|
||||
## 文档
|
||||
- parser/doc/README.md:解析约定、示例、IDEA `.http` 调试
|
||||
- **parser/doc/CUSTOM_PARSER_GUIDE.md:自定义解析器扩展完整指南**
|
||||
- **parser/doc/JAVASCRIPT_PARSER_GUIDE.md:JavaScript解析器开发完整指南** - 使用JavaScript编写自定义解析器
|
||||
- **parser/doc/CUSTOM_PARSER_GUIDE.md:自定义解析器扩展完整指南** - Java自定义解析器扩展
|
||||
- **parser/doc/CUSTOM_PARSER_QUICKSTART.md:自定义解析器快速开始** - 快速上手指南
|
||||
|
||||
## 目录
|
||||
- src/main/java/cn/qaiu/entity:通用实体(如 FileInfo)
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
本模块支持用户自定义解析器扩展。用户在依赖本项目的 Maven 坐标后,可以实现自己的网盘解析器并注册到系统中使用。
|
||||
|
||||
> **提示**:除了Java自定义解析器,本项目还支持使用JavaScript编写解析器,无需编译即可使用。
|
||||
> 查看 [JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md) 了解更多。
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 1. CustomParserConfig
|
||||
@@ -491,6 +494,12 @@ A: 不可以。自定义解析器只能通过 `fromType` 方法创建。如果
|
||||
### Q5: 解析器需要依赖外部服务怎么办?
|
||||
A: 可以在解析器类中注入依赖,或使用单例模式管理外部服务连接。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md) - 使用JavaScript编写解析器,无需编译
|
||||
- [自定义解析器快速开始](CUSTOM_PARSER_QUICKSTART.md) - 快速上手指南
|
||||
- [解析器开发文档](README.md) - 解析器开发约定和规范
|
||||
|
||||
## 贡献
|
||||
|
||||
如果你实现了通用的网盘解析器,欢迎提交 PR 将其加入到内置解析器中!
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# 自定义解析器快速开始
|
||||
|
||||
> **提示**:除了Java自定义解析器,本项目还支持使用JavaScript编写解析器,无需编译即可使用。
|
||||
> 查看 [JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md) 了解更多。
|
||||
|
||||
## 5分钟快速集成指南
|
||||
|
||||
### 步骤1: 添加依赖(pom.xml)
|
||||
@@ -266,6 +269,12 @@ public class ParserConfig {
|
||||
- 🔍 查看[测试代码](../src/test/java/cn/qaiu/parser/CustomParserTest.java)了解更多示例
|
||||
- 💡 参考[内置解析器](../src/main/java/cn/qaiu/parser/impl/)了解最佳实践
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [自定义解析器扩展完整指南](CUSTOM_PARSER_GUIDE.md) - Java自定义解析器详细文档
|
||||
- [JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md) - 使用JavaScript编写解析器
|
||||
- [解析器开发文档](README.md) - 解析器开发约定和规范
|
||||
|
||||
## 技术支持
|
||||
|
||||
遇到问题?
|
||||
|
||||
@@ -62,9 +62,56 @@ function parse(shareLinkInfo, http, logger) {
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 重启应用
|
||||
### 2. 解析器加载路径
|
||||
|
||||
重启应用后,JavaScript解析器会自动加载并注册。
|
||||
JavaScript解析器支持两种加载方式:
|
||||
|
||||
#### 内置解析器(jar包内)
|
||||
- **位置**:jar包内的 `custom-parsers/` 资源目录
|
||||
- **特点**:随jar包一起发布,无需额外配置
|
||||
- **路径**:`parser/src/main/resources/custom-parsers/`
|
||||
|
||||
#### 外部解析器(用户自定义)
|
||||
- **默认位置**:应用运行目录下的 `./custom-parsers/` 文件夹
|
||||
- **配置方式**(优先级从高到低):
|
||||
1. **系统属性**:`-Dparser.custom-parsers.path=/path/to/your/parsers`
|
||||
2. **环境变量**:`PARSER_CUSTOM_PARSERS_PATH=/path/to/your/parsers`
|
||||
3. **默认路径**:`./custom-parsers/`(相对于应用运行目录)
|
||||
|
||||
#### 配置示例
|
||||
|
||||
**Maven项目中使用:**
|
||||
```bash
|
||||
# 方式1:系统属性
|
||||
mvn exec:java -Dexec.mainClass="your.MainClass" -Dparser.custom-parsers.path=./src/main/resources/custom-parsers
|
||||
|
||||
# 方式2:环境变量
|
||||
export PARSER_CUSTOM_PARSERS_PATH=./src/main/resources/custom-parsers
|
||||
mvn exec:java -Dexec.mainClass="your.MainClass"
|
||||
```
|
||||
|
||||
**jar包运行时:**
|
||||
```bash
|
||||
# 方式1:系统属性
|
||||
java -Dparser.custom-parsers.path=/path/to/your/parsers -jar your-app.jar
|
||||
|
||||
# 方式2:环境变量
|
||||
export PARSER_CUSTOM_PARSERS_PATH=/path/to/your/parsers
|
||||
java -jar your-app.jar
|
||||
```
|
||||
|
||||
**Docker部署:**
|
||||
```bash
|
||||
# 挂载外部解析器目录
|
||||
docker run -d -v /path/to/your/parsers:/app/custom-parsers your-image
|
||||
|
||||
# 或使用环境变量
|
||||
docker run -d -e PARSER_CUSTOM_PARSERS_PATH=/app/custom-parsers your-image
|
||||
```
|
||||
|
||||
### 3. 重启应用
|
||||
|
||||
重启应用后,JavaScript解析器会自动加载并注册。查看应用日志确认解析器是否成功加载。
|
||||
|
||||
## 元数据格式
|
||||
|
||||
@@ -653,7 +700,20 @@ A: 使用 `logger.debug()` 输出调试信息,查看应用日志。
|
||||
|
||||
## 示例脚本
|
||||
|
||||
参考 `parser/src/main/resources/custom-parsers/example-demo.js` 文件,包含完整的示例实现。
|
||||
参考以下示例文件,包含完整的解析器实现:
|
||||
|
||||
- **`parser/src/main/resources/custom-parsers/example-demo.js`** - 完整的演示解析器,展示所有功能
|
||||
- **`parser/src/main/resources/custom-parsers/baidu-photo.js`** - 百度相册解析器示例
|
||||
- **`parser/src/main/resources/custom-parsers/migu-music.js`** - 咪咕音乐解析器示例
|
||||
- **`parser/src/main/resources/custom-parsers/qishui-music.js`** - 汽水音乐解析器示例
|
||||
|
||||
这些示例展示了:
|
||||
- 元数据配置
|
||||
- 三个核心方法的实现(parse、parseFileList、parseById)
|
||||
- 错误处理和日志记录
|
||||
- 文件信息构建
|
||||
- 重定向处理
|
||||
- 代理支持
|
||||
|
||||
## 限制说明
|
||||
|
||||
@@ -662,6 +722,16 @@ A: 使用 `logger.debug()` 输出调试信息,查看应用日志。
|
||||
3. **内存限制**: 长时间运行可能存在内存泄漏风险
|
||||
4. **安全限制**: 无法访问文件系统或执行系统命令
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [自定义解析器扩展指南](CUSTOM_PARSER_GUIDE.md) - Java自定义解析器扩展
|
||||
- [自定义解析器快速开始](CUSTOM_PARSER_QUICKSTART.md) - 快速上手指南
|
||||
- [解析器开发文档](README.md) - 解析器开发约定和规范
|
||||
|
||||
## 更新日志
|
||||
|
||||
- v1.0.0: 初始版本,支持基本的JavaScript解析器功能
|
||||
- 支持外部解析器路径配置(系统属性、环境变量)
|
||||
- 支持文件上传功能(sendMultipartForm)
|
||||
- 支持重定向处理(getNoRedirect、getWithRedirect)
|
||||
- 支持代理配置(HTTP/SOCKS4/SOCKS5)
|
||||
|
||||
@@ -118,8 +118,9 @@ function parse(shareLinkInfo, http, logger) {
|
||||
|
||||
### 3. 详细文档
|
||||
|
||||
- [JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md)
|
||||
- [自定义解析器开发指南](CUSTOM_PARSER_GUIDE.md)
|
||||
- **[JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md)** - 完整的JavaScript解析器开发文档,包含API参考、示例代码和最佳实践
|
||||
- **[自定义解析器扩展指南](CUSTOM_PARSER_GUIDE.md)** - Java自定义解析器扩展完整指南
|
||||
- **[自定义解析器快速开始](CUSTOM_PARSER_QUICKSTART.md)** - 快速上手自定义解析器开发
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -7,6 +7,51 @@
|
||||
// 全局类型定义,使用JSDoc注释
|
||||
// 这些类型定义将在VSCode中提供代码补全和类型检查
|
||||
|
||||
// ============================================================================
|
||||
// Nashorn Java 互操作全局对象
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Java 全局对象类型定义 (Nashorn引擎提供)
|
||||
* 用于访问Java类型和进行Java互操作
|
||||
* @typedef {Object} JavaGlobal
|
||||
* @property {function(string): any} type - 获取Java类,参数为完整类名(如"java.util.zip.CRC32")
|
||||
* @property {function(any): any} from - 将Java对象转换为JavaScript对象
|
||||
* @property {function(any): any} to - 将JavaScript对象转换为Java对象
|
||||
* @property {function(any): boolean} isType - 检查对象是否为指定Java类型
|
||||
* @property {function(any): boolean} isJavaObject - 检查对象是否为Java对象
|
||||
* @property {function(any): boolean} isJavaMethod - 检查对象是否为Java方法
|
||||
* @property {function(any): boolean} isJavaFunction - 检查对象是否为Java函数
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java 全局对象 (Nashorn引擎提供)
|
||||
* @global
|
||||
* @type {JavaGlobal}
|
||||
*/
|
||||
var Java;
|
||||
|
||||
/**
|
||||
* java 命名空间对象类型定义 (Nashorn引擎提供)
|
||||
* 用于直接访问Java包和类
|
||||
* @typedef {Object} JavaNamespace
|
||||
* @property {Object} lang - java.lang 包
|
||||
* @property {Object} util - java.util 包
|
||||
* @property {Object} io - java.io 包
|
||||
* @property {Object} net - java.net 包
|
||||
* @property {Object} math - java.math 包
|
||||
* @property {Object} security - java.security 包
|
||||
* @property {Object} text - java.text 包
|
||||
* @property {Object} time - java.time 包
|
||||
*/
|
||||
|
||||
/**
|
||||
* java 命名空间对象 (Nashorn引擎提供)
|
||||
* @global
|
||||
* @type {JavaNamespace}
|
||||
*/
|
||||
var java;
|
||||
|
||||
/**
|
||||
* @typedef {Object} ShareLinkInfo
|
||||
* @property {function(): string} getShareUrl - 获取分享URL
|
||||
@@ -69,3 +114,157 @@
|
||||
* @property {function(ShareLinkInfo, JsHttpClient, JsLogger): FileInfo[]} parseFileList - 解析文件列表
|
||||
* @property {function(ShareLinkInfo, JsHttpClient, JsLogger): string} parseById - 根据文件ID获取下载链接
|
||||
*/
|
||||
|
||||
// ============================================================================
|
||||
// Java 基础类型定义
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Java byte 类型 (8位有符号整数)
|
||||
* 范围: -128 到 127
|
||||
* @typedef {number} JavaByte
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java short 类型 (16位有符号整数)
|
||||
* 范围: -32,768 到 32,767
|
||||
* @typedef {number} JavaShort
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java int 类型 (32位有符号整数)
|
||||
* 范围: -2,147,483,648 到 2,147,483,647
|
||||
* @typedef {number} JavaInt
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java long 类型 (64位有符号整数)
|
||||
* 范围: -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
|
||||
* @typedef {number} JavaLong
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java float 类型 (32位单精度浮点数)
|
||||
* @typedef {number} JavaFloat
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java double 类型 (64位双精度浮点数)
|
||||
* @typedef {number} JavaDouble
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java char 类型 (16位Unicode字符)
|
||||
* @typedef {string|number} JavaChar
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java boolean 类型 (布尔值)
|
||||
* @typedef {boolean} JavaBoolean
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java String 类型 (字符串)
|
||||
* @typedef {string} JavaString
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Byte 包装类型
|
||||
* @typedef {Object} JavaByteWrapper
|
||||
* @property {function(): number} byteValue - 返回byte值
|
||||
* @property {function(): number} intValue - 返回int值
|
||||
* @property {function(): number} longValue - 返回long值
|
||||
* @property {function(): number} floatValue - 返回float值
|
||||
* @property {function(): number} doubleValue - 返回double值
|
||||
* @property {function(JavaByteWrapper): number} compareTo - 比较两个Byte对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Short 包装类型
|
||||
* @typedef {Object} JavaShortWrapper
|
||||
* @property {function(): number} shortValue - 返回short值
|
||||
* @property {function(): number} intValue - 返回int值
|
||||
* @property {function(): number} longValue - 返回long值
|
||||
* @property {function(): number} floatValue - 返回float值
|
||||
* @property {function(): number} doubleValue - 返回double值
|
||||
* @property {function(JavaShortWrapper): number} compareTo - 比较两个Short对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Integer 包装类型
|
||||
* @typedef {Object} JavaIntegerWrapper
|
||||
* @property {function(): number} intValue - 返回int值
|
||||
* @property {function(): number} longValue - 返回long值
|
||||
* @property {function(): number} floatValue - 返回float值
|
||||
* @property {function(): number} doubleValue - 返回double值
|
||||
* @property {function(JavaIntegerWrapper): number} compareTo - 比较两个Integer对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
* @property {function(number): JavaIntegerWrapper} valueOf - 静态方法:创建Integer对象
|
||||
* @property {function(string): number} parseInt - 静态方法:解析字符串为int
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Long 包装类型
|
||||
* @typedef {Object} JavaLongWrapper
|
||||
* @property {function(): number} longValue - 返回long值
|
||||
* @property {function(): number} intValue - 返回int值
|
||||
* @property {function(): number} floatValue - 返回float值
|
||||
* @property {function(): number} doubleValue - 返回double值
|
||||
* @property {function(JavaLongWrapper): number} compareTo - 比较两个Long对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
* @property {function(number): JavaLongWrapper} valueOf - 静态方法:创建Long对象
|
||||
* @property {function(string): number} parseLong - 静态方法:解析字符串为long
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Float 包装类型
|
||||
* @typedef {Object} JavaFloatWrapper
|
||||
* @property {function(): number} floatValue - 返回float值
|
||||
* @property {function(): number} doubleValue - 返回double值
|
||||
* @property {function(): number} intValue - 返回int值
|
||||
* @property {function(): number} longValue - 返回long值
|
||||
* @property {function(JavaFloatWrapper): number} compareTo - 比较两个Float对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
* @property {function(number): JavaFloatWrapper} valueOf - 静态方法:创建Float对象
|
||||
* @property {function(string): number} parseFloat - 静态方法:解析字符串为float
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Double 包装类型
|
||||
* @typedef {Object} JavaDoubleWrapper
|
||||
* @property {function(): number} doubleValue - 返回double值
|
||||
* @property {function(): number} floatValue - 返回float值
|
||||
* @property {function(): number} intValue - 返回int值
|
||||
* @property {function(): number} longValue - 返回long值
|
||||
* @property {function(JavaDoubleWrapper): number} compareTo - 比较两个Double对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
* @property {function(number): JavaDoubleWrapper} valueOf - 静态方法:创建Double对象
|
||||
* @property {function(string): number} parseDouble - 静态方法:解析字符串为double
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Character 包装类型
|
||||
* @typedef {Object} JavaCharacterWrapper
|
||||
* @property {function(): string|number} charValue - 返回char值
|
||||
* @property {function(JavaCharacterWrapper): number} compareTo - 比较两个Character对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
* @property {function(string|number): boolean} isDigit - 静态方法:判断是否为数字
|
||||
* @property {function(string|number): boolean} isLetter - 静态方法:判断是否为字母
|
||||
* @property {function(string|number): boolean} isLetterOrDigit - 静态方法:判断是否为字母或数字
|
||||
* @property {function(string|number): boolean} isUpperCase - 静态方法:判断是否为大写
|
||||
* @property {function(string|number): boolean} isLowerCase - 静态方法:判断是否为小写
|
||||
* @property {function(string|number): string|number} toUpperCase - 静态方法:转换为大写
|
||||
* @property {function(string|number): string|number} toLowerCase - 静态方法:转换为小写
|
||||
*/
|
||||
|
||||
/**
|
||||
* Java Boolean 包装类型
|
||||
* @typedef {Object} JavaBooleanWrapper
|
||||
* @property {function(): boolean} booleanValue - 返回boolean值
|
||||
* @property {function(JavaBooleanWrapper): number} compareTo - 比较两个Boolean对象
|
||||
* @property {function(): string} toString - 转换为字符串
|
||||
* @property {function(boolean): JavaBooleanWrapper} valueOf - 静态方法:创建Boolean对象
|
||||
* @property {function(string): boolean} parseBoolean - 静态方法:解析字符串为boolean
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user