diff --git a/README.md b/README.md index cc551c0..be5af5f 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ https://nfd-parser.github.io/nfd-preview/preview.html?src=https%3A%2F%2Flz.qaiu. **解析器模块文档:** [parser/README.md](parser/README.md) +**JavaScript解析器文档:** [JavaScript解析器开发指南](parser/doc/JAVASCRIPT_PARSER_GUIDE.md) | [自定义解析器扩展指南](parser/doc/CUSTOM_PARSER_GUIDE.md) | [快速开始](parser/doc/CUSTOM_PARSER_QUICKSTART.md) + ## 预览地址 [预览地址1](https://lz.qaiu.top) [预览地址2](https://lzzz.qaiu.top) @@ -406,6 +408,23 @@ proxy: nfd-proxy搭建http代理服务器 参考https://github.com/nfd-parser/nfd-proxy +### 认证信息配置说明 +部分网盘(如123)解析大文件时需要登录认证,可以在配置文件中添加认证信息。 + +修改配置文件: +app-dev.yml + +```yaml +### 解析认证相关 +auths: + # 123:配置用户名密码 + ye: + username: 你的用户名 + password: 你的密码 +``` + +**注意:** 目前仅支持 123(ye)的认证配置。 + ## 开发计划 ### v0.1.8~v0.1.9 ✓ - API添加文件信息(专属版/开源版) diff --git a/parser/README.md b/parser/README.md index ddb8584..9b3c606 100644 --- a/parser/README.md +++ b/parser/README.md @@ -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) diff --git a/parser/doc/CUSTOM_PARSER_GUIDE.md b/parser/doc/CUSTOM_PARSER_GUIDE.md index 3992cd3..9628cb2 100644 --- a/parser/doc/CUSTOM_PARSER_GUIDE.md +++ b/parser/doc/CUSTOM_PARSER_GUIDE.md @@ -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 将其加入到内置解析器中! diff --git a/parser/doc/CUSTOM_PARSER_QUICKSTART.md b/parser/doc/CUSTOM_PARSER_QUICKSTART.md index 75f1ca8..8067805 100644 --- a/parser/doc/CUSTOM_PARSER_QUICKSTART.md +++ b/parser/doc/CUSTOM_PARSER_QUICKSTART.md @@ -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) - 解析器开发约定和规范 + ## 技术支持 遇到问题? diff --git a/parser/doc/JAVASCRIPT_PARSER_GUIDE.md b/parser/doc/JAVASCRIPT_PARSER_GUIDE.md index da790aa..f2e434c 100644 --- a/parser/doc/JAVASCRIPT_PARSER_GUIDE.md +++ b/parser/doc/JAVASCRIPT_PARSER_GUIDE.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) diff --git a/parser/doc/README.md b/parser/doc/README.md index 1bd379a..15d8c69 100644 --- a/parser/doc/README.md +++ b/parser/doc/README.md @@ -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)** - 快速上手自定义解析器开发 --- diff --git a/parser/src/main/resources/custom-parsers/types.js b/parser/src/main/resources/custom-parsers/types.js index bfd23b7..bed5e07 100644 --- a/parser/src/main/resources/custom-parsers/types.js +++ b/parser/src/main/resources/custom-parsers/types.js @@ -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 + */ diff --git a/web-service/src/main/java/cn/qaiu/lz/AppMain.java b/web-service/src/main/java/cn/qaiu/lz/AppMain.java index f169ec6..b116e59 100644 --- a/web-service/src/main/java/cn/qaiu/lz/AppMain.java +++ b/web-service/src/main/java/cn/qaiu/lz/AppMain.java @@ -82,5 +82,11 @@ public class AppMain { localMap.put("proxy", jsonObject1); } } + + // 认证 + if (jsonObject.containsKey(ConfigConstant.AUTHS)) { + JsonObject auths = jsonObject.getJsonObject(ConfigConstant.AUTHS); + localMap.put(ConfigConstant.AUTHS, auths); + } } } diff --git a/web-service/src/main/resources/app-dev.yml b/web-service/src/main/resources/app-dev.yml index 781b5ad..37f2a75 100644 --- a/web-service/src/main/resources/app-dev.yml +++ b/web-service/src/main/resources/app-dev.yml @@ -96,3 +96,9 @@ proxy: # username: # password: +### 解析认证相关 +auths: + # 123网盘:配置用户名密码 + ye: + username: + password: \ No newline at end of file