# 自定义解析器快速开始 > **提示**:除了Java自定义解析器,本项目还支持使用JavaScript编写解析器,无需编译即可使用。 > 查看 [JavaScript解析器开发指南](JAVASCRIPT_PARSER_GUIDE.md) 了解更多。 ## 5分钟快速集成指南 ### 步骤1: 添加依赖(pom.xml) ```xml cn.qaiu parser 10.1.17 ``` ### 步骤2: 实现解析器(3个文件) #### 2.1 创建解析工具类 `MyPanTool.java` ```java package com.example.myapp.parser; import cn.qaiu.entity.ShareLinkInfo; import cn.qaiu.parser.IPanTool; import io.vertx.core.Future; import io.vertx.core.Promise; public class MyPanTool implements IPanTool { private final ShareLinkInfo shareLinkInfo; // 必须有这个构造器! public MyPanTool(ShareLinkInfo shareLinkInfo) { this.shareLinkInfo = shareLinkInfo; } @Override public Future parse() { Promise promise = Promise.promise(); String shareKey = shareLinkInfo.getShareKey(); String password = shareLinkInfo.getSharePassword(); // TODO: 调用你的网盘API String downloadUrl = "https://mypan.com/download/" + shareKey; promise.complete(downloadUrl); return promise.future(); } } ``` #### 2.2 创建注册器 `ParserRegistry.java` ```java package com.example.myapp.config; import cn.qaiu.parser.custom.CustomParserConfig; import cn.qaiu.parser.custom.CustomParserRegistry; import com.example.myapp.parser.MyPanTool; public class ParserRegistry { public static void init() { CustomParserConfig config = CustomParserConfig.builder() .type("mypan") // 唯一标识 .displayName("我的网盘") // 显示名称 .toolClass(MyPanTool.class) // 解析器类 .build(); CustomParserRegistry.register(config); } } ``` #### 2.3 在应用启动时注册 ```java package com.example.myapp; import com.example.myapp.config.ParserRegistry; import io.vertx.core.Vertx; import cn.qaiu.WebClientVertxInit; public class Application { public static void main(String[] args) { // 1. 初始化 Vertx(必需) Vertx vertx = Vertx.vertx(); WebClientVertxInit.init(vertx); // 2. 注册自定义解析器 ParserRegistry.init(); // 3. 启动应用... System.out.println("应用启动成功!"); } } ``` ### 步骤3: 使用解析器 ```java package com.example.myapp.service; import cn.qaiu.parser.ParserCreate; import cn.qaiu.parser.IPanTool; public class DownloadService { public String getDownloadUrl(String shareKey, String password) { // 创建解析器 IPanTool tool = ParserCreate.fromType("mypan") .shareKey(shareKey) .setShareLinkInfoPwd(password) .createTool(); // 同步解析 return tool.parseSync(); // 或异步解析: // tool.parse().onSuccess(url -> { // System.out.println("下载链接: " + url); // }); } } ``` ## 完整示例(可直接运行) ```java package com.example; import cn.qaiu.entity.ShareLinkInfo; import cn.qaiu.parser.custom.CustomParserConfig; import cn.qaiu.parser.custom.CustomParserRegistry; import cn.qaiu.parser.IPanTool; import cn.qaiu.parser.ParserCreate; import cn.qaiu.WebClientVertxInit; import io.vertx.core.Future; import io.vertx.core.Promise; import io.vertx.core.Vertx; public class QuickStartExample { public static void main(String[] args) { // 1. 初始化环境 Vertx vertx = Vertx.vertx(); WebClientVertxInit.init(vertx); // 2. 注册自定义解析器 CustomParserConfig config = CustomParserConfig.builder() .type("demo") .displayName("演示网盘") .toolClass(DemoPanTool.class) .build(); CustomParserRegistry.register(config); System.out.println("✓ 解析器注册成功"); // 3. 使用解析器 IPanTool tool = ParserCreate.fromType("demo") .shareKey("test123") .setShareLinkInfoPwd("pass123") .createTool(); String url = tool.parseSync(); System.out.println("✓ 下载链接: " + url); // 清理 vertx.close(); } // 演示解析器实现 static class DemoPanTool implements IPanTool { private final ShareLinkInfo info; public DemoPanTool(ShareLinkInfo info) { this.info = info; } @Override public Future parse() { Promise promise = Promise.promise(); String url = "https://demo.com/download/" + info.getShareKey() + "?pwd=" + info.getSharePassword(); promise.complete(url); return promise.future(); } } } ``` 运行输出: ``` ✓ 解析器注册成功 ✓ 下载链接: https://demo.com/download/test123?pwd=pass123 ``` ## 常见问题速查 ### Q: 忘记注册解析器会怎样? A: 抛出异常:`未找到类型为 'xxx' 的解析器` **解决方法:** 确保在使用前调用 `CustomParserRegistry.register(config)` ### Q: 构造器写错了会怎样? A: 抛出异常:`toolClass必须有ShareLinkInfo单参构造器` **解决方法:** 确保有这个构造器: ```java public MyTool(ShareLinkInfo info) { ... } ``` ### Q: 可以从分享链接自动识别吗? A: 不可以。自定义解析器只能通过 `fromType` 创建。 **正确用法:** ```java ParserCreate.fromType("mypan") // ✓ 正确 .shareKey("abc") .createTool(); ParserCreate.fromShareUrl("https://...") // ✗ 不支持 ``` ### Q: 如何调试解析器? A: 在 `parse()` 方法中添加日志: ```java @Override public Future parse() { System.out.println("开始解析: " + shareLinkInfo); // ... 解析逻辑 } ``` ## Spring Boot 集成示例 ```java @Configuration public class ParserConfig { @Bean public Vertx vertx() { Vertx vertx = Vertx.vertx(); WebClientVertxInit.init(vertx); return vertx; } @PostConstruct public void registerCustomParsers() { CustomParserConfig config = CustomParserConfig.builder() .type("mypan") .displayName("我的网盘") .toolClass(MyPanTool.class) .build(); CustomParserRegistry.register(config); log.info("自定义解析器注册完成"); } } ``` ## 下一步 - 📖 阅读[完整文档](CUSTOM_PARSER_GUIDE.md)了解高级用法 - 🔍 查看[测试代码](../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) - 解析器开发约定和规范 ## 技术支持 遇到问题? 1. 查看[完整文档](CUSTOM_PARSER_GUIDE.md) 2. 查看[测试用例](../src/test/java/cn/qaiu/parser/CustomParserTest.java) 3. 提交 [Issue](https://github.com/qaiu/netdisk-fast-download/issues)