Compare commits

..

367 Commits

Author SHA1 Message Date
q
97ae1a5e92 fix: 修复安全漏洞 - 升级依赖版本
- Vert.x: 4.5.22 → 4.5.14 (包含所有安全修复,Netty版本由其管理)
- Logback: 1.5.19 → 1.5.18 (最新稳定版)
- SLF4J: 2.0.5 → 2.0.16
- Jackson: 2.14.2 → 2.18.2
- 移除不必要的 Netty BOM 依赖
2026-02-04 17:21:13 +08:00
q
a4a521a6f8 fix: 修复多个安全漏洞
修复的安全问题:
1. Vert.x Web static handler 缓存操纵漏洞 - 升级到 4.5.11
2. Netty CRLF注入漏洞 (CVE-2024-47535) - 强制使用 4.1.115.Final
3. Logback 任意代码执行漏洞 (CVE-2024-12798) - 升级到 1.5.15
4. Vert.x-Web XSS漏洞 - 升级到 4.5.11
5. Logback 类实例化漏洞 (CVE-2023-6378) - 升级到 1.5.15

变更:
- 降级 vertx.version: 4.5.22 → 4.5.11 (稳定安全版本)
- 添加 netty.version: 4.1.115.Final (通过 netty-bom 强制版本)
- 降级 logback.version: 1.5.19 → 1.5.15 (稳定安全版本)
- 升级 slf4j.version: 2.0.5 → 2.0.16
- 升级 jackson.version: 2.14.2 → 2.18.2
- 在 dependencyManagement 中添加 Netty BOM 和 Logback 版本管理
2026-02-04 17:14:53 +08:00
q
2056a91071 优化超星解析,清理冗余代码 2026-02-04 17:10:52 +08:00
qaiu
f6209a8959 更新 README.md
添加夸克,uc解析
2026-02-03 16:18:55 +08:00
q
72ed0ea8f8 Fixed 蓝奏云目录解析cookie验证问题 2026-02-03 13:27:09 +08:00
qaiu
d698f82299 Update Playground password protection link in README 2026-02-03 10:41:42 +08:00
q
ba4666c32a Fixed 蓝奏优享解析,v019b21 2026-02-02 16:02:36 +08:00
q
d6d37e8204 fixed: 修复蓝奏优享 #159, #158 2026-02-02 15:59:44 +08:00
q
cb9dbfcc69 蓝奏云规则更新 2026-02-01 10:33:25 +08:00
qaiu
42b366ed0f Clean up launch configurations in launch.json,run AppMain
Removed unused Java launch configurations from launch.json.
2026-01-27 07:53:20 +08:00
qaiu
4021c507b6 更新 README.md, 添加接口文档https://nfdparser.apifox.cn 2026-01-27 00:05:56 +08:00
qaiu
4d8e82080d 189.qaiu.top 大文件解析体验版,支持天翼云盘,移动云盘等
#153 #156 #119 #92
2026-01-26 13:47:37 +08:00
qaiu
fca608b44e 更新 README.md
天翼云盘演示站限时体验
2026-01-26 13:09:49 +08:00
q
34cb89a6ea fix(LeTool): 修复子目录 fileId URL 编码问题
- 在构建 parserUrl 时对 fileId 进行 URL 编码
- 避免 %2B 等特殊字符被前端 axios 自动解码导致请求失败
- 添加异常处理和降级方案
2026-01-23 17:59:19 +08:00
q
69d5f269bd fix(LeTool): 修复联想乐云目录解析失败问题
- 添加统一的 HEADERS 定义,包含完整的浏览器请求头
- 修复 API_URL_PREFIX 路径(share -> mshare)
- 添加 getCleanShareId() 方法处理 URL 中的查询参数
- 所有请求统一使用 putHeaders(HEADERS)
- 增加调试日志输出
2026-01-23 13:24:11 +08:00
q
459c974cb8 联想乐云文件夹解析 2026-01-23 12:45:51 +08:00
qaiu
2f22cb01eb LeTool乐云目录解析 2026-01-23 03:26:35 +08:00
qaiu
e17fb99de4 启用在线脚本解析器 2026-01-06 02:21:19 +08:00
q
0f926a57ef 更新Playground和JsHttpClient相关功能,整理文档结构 2026-01-06 00:00:37 +08:00
q
4380bfe0d6 Merge branch 'main' of github.com:qaiu/netdisk-fast-download 2026-01-04 09:30:54 +08:00
q
8127cd0758 fixed. 演练场静态打包问题 2026-01-04 09:29:20 +08:00
qaiu
71a220f42b 升级前端版本 2026-01-04 01:14:26 +08:00
qaiu
d3b02676ec Update README.md 2026-01-03 21:20:54 +08:00
q
d8f0dc4f8e 更新代码和文档 2026-01-03 21:11:04 +08:00
q
48aa5b6148 Add functional test report
- Document all completed tests and fixes
- Verify BUG1, BUG2, BUG3 fixes
- Confirm TypeScript removal
- Confirm text updates (JS演练场 → 脚本演练场)
- Service startup verification
2026-01-02 19:40:26 +08:00
q
a989841a89 Remove TypeScript-related code and documentation
- Remove TypeScript API endpoints from PlaygroundApi
- Remove TypeScript methods from DbService interface and implementation
- Delete PlaygroundTypeScriptCode model class
- Delete TypeScript documentation files
- Clean up unused imports
2026-01-02 19:27:21 +08:00
q
86783e8e46 Merge branch 'copilot/add-playground-enhancements' 2026-01-02 19:25:05 +08:00
q
66b9bcc53a Fix playground bugs and remove TypeScript compiler
- Fix BUG1: JavaScript timeout with proper thread interruption using ScheduledExecutorService
- Fix BUG2: Add URL regex validation before execution in playground test API
- Fix BUG3: Register published parsers to CustomParserRegistry on save/update/delete
- Remove TypeScript compiler functionality (tsCompiler.js, dependencies, UI)
- Add password authentication for playground access
- Add mobile responsive layout support
- Load playground parsers on application startup
2026-01-02 19:24:47 +08:00
qaiu
ff08615d1e 更新 README.md 2025-12-23 07:55:59 +08:00
qaiu
4a6c3a1f90 更新 README.md 2025-12-08 23:46:58 +08:00
copilot-swe-agent[bot]
c79702eba8 Address code review feedback: protect types.js endpoint and improve code readability
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 05:27:07 +00:00
copilot-swe-agent[bot]
41fc935c09 Fix JsonResult API calls and add documentation
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 05:24:38 +00:00
copilot-swe-agent[bot]
5fbbe5b240 Add playground loading animation, password auth, and mobile layout support
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 05:20:06 +00:00
copilot-swe-agent[bot]
9c121c03f2 Initial plan 2025-12-07 05:11:50 +00:00
copilot-swe-agent[bot]
b74c3f31c4 Add implementation summary in Chinese
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 04:57:03 +00:00
copilot-swe-agent[bot]
f23b97e22c Address code review feedback - improve code quality
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 04:52:22 +00:00
copilot-swe-agent[bot]
0560989e77 Complete TypeScript compiler integration with examples and documentation
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 04:48:38 +00:00
copilot-swe-agent[bot]
f2c9c34324 Add TypeScript compiler integration - core implementation
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-07 04:43:36 +00:00
copilot-swe-agent[bot]
a97268c702 Initial plan 2025-12-07 04:34:47 +00:00
copilot-swe-agent[bot]
2654b550fb Add comprehensive implementation summary
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-06 22:56:10 +00:00
copilot-swe-agent[bot]
12a5a17a30 Address code review feedback: fix Promise.race, improve statusText, use English error messages
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-06 22:52:37 +00:00
copilot-swe-agent[bot]
e346812c0a Complete backend implementation with comprehensive documentation
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-06 22:51:08 +00:00
copilot-swe-agent[bot]
6b2e391af9 Add fetch polyfill tests and documentation
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-06 22:49:32 +00:00
copilot-swe-agent[bot]
199456cb11 Implement fetch polyfill and Promise for ES5 backend
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-12-06 22:44:52 +00:00
copilot-swe-agent[bot]
636994387f Initial plan 2025-12-06 22:38:17 +00:00
qaiu
90c79f7bac Merge pull request #140 from rensumo/main
增加快速部署方式
2025-12-02 17:21:05 +08:00
rensumo
79601b36a5 增加快速部署 2025-12-02 14:43:29 +08:00
rensumo
96cef89f08 增加快速部署 2025-12-02 14:42:07 +08:00
rensumo
e057825b25 增加快速部署
Add quick deployment instructions and Docker deployment section.
2025-12-02 14:40:53 +08:00
qaiu
ebe848dfe8 Merge pull request #139 from Edakerx/main
Update README.md
2025-11-30 12:30:26 +08:00
Edakerx
e259a0989e Update README.md
添加赞助商
2025-11-30 12:20:07 +08:00
q
f750aa68e8 js演练场漏洞修复 2025-11-30 02:07:56 +08:00
q
49b8501e86 js演练场,ye2 2025-11-29 03:44:47 +08:00
q
fc2e2a4697 Merge remote-tracking branch 'origin/main' 2025-11-29 03:42:25 +08:00
q
b4b1d7f923 js演练场 2025-11-29 03:41:51 +08:00
q
df646b8c43 js演练场 2025-11-29 02:56:25 +08:00
qaiu
8e790f6b22 更新 README.md 2025-11-28 20:33:07 +08:00
q
2e76af980e front ver 0.1.9.b12 2025-11-28 19:50:29 +08:00
q
80ccbe5b62 fixed. 123跨区下载错误 2025-11-28 19:48:19 +08:00
q
aa0cd68f7f 客户端链接(实验性),js解析器插件,汽水音乐,一刻相册,咪咕音乐 2025-11-25 16:34:24 +08:00
qaiu
51833148b1 更新 README.md 2025-11-17 23:06:54 +08:00
q
0fa77ebf21 Merge remote-tracking branch 'origin/main' 2025-11-15 21:50:45 +08:00
q
584c075930 - [汽水音乐-qishui_music](https://music.douyin.com/qishui/)
- [咪咕音乐-migu](https://music.migu.cn/)
- [一刻相册-baidu_photo](https://photo.baidu.com/)
2025-11-15 21:49:40 +08:00
qaiu
9e7a3718a4 Update README with new links and information 2025-11-14 06:33:16 +08:00
q
0e2ca2f1ca ce盘优化 2025-11-13 19:32:44 +08:00
q
52e889333b Merge remote-tracking branch 'origin/main' 2025-11-13 18:20:32 +08:00
qaiu
4745440079 Merge pull request #136 from qaiu/copilot/add-ce4tool-parser
Add Cloudreve 4.x API support with Ce4Tool parser
2025-11-13 18:18:30 +08:00
q
b5628eac17 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	parser/src/test/java/cn/qaiu/parser/clientlink/impl/CurlLinkGeneratorTest.java
2025-11-13 17:58:59 +08:00
copilot-swe-agent[bot]
d23b11577e Simplify and optimize Ce4Tool and CeTool version detection logic
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-11-10 09:59:48 +00:00
copilot-swe-agent[bot]
f1dd9fc0ee Add Ce4Tool for Cloudreve 4.x API support and update CeTool with version detection
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-11-10 09:57:41 +00:00
copilot-swe-agent[bot]
0877fadcfb Initial planning for Cloudreve 4.x API support
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-11-10 09:53:58 +00:00
copilot-swe-agent[bot]
733059dc8e Initial plan 2025-11-10 09:50:49 +00:00
qaiu
321380c2b9 更新 README.md 2025-11-08 00:23:22 +08:00
qaiu
deb121a51b 更新 README.md 2025-11-08 00:20:30 +08:00
qaiu
b6aef7c239 更新 README.md 2025-11-08 00:19:16 +08:00
qaiu
b13a7a5ee1 更新 README.md
测试下载链接更新
2025-11-04 15:44:17 +08:00
qaiu
fff6a00690 更新 README.md
接口参考优化
2025-10-30 22:42:28 +08:00
qaiu
b4da3cee20 Merge pull request #135 from qaiu/copilot/remove-test-filelist
[WIP] Remove test filelist from repository
2025-10-30 20:24:45 +08:00
copilot-swe-agent[bot]
0a650996a1 Remove accidentally committed test-filelist.java file
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-10-30 12:21:01 +00:00
copilot-swe-agent[bot]
37b91cd388 Initial plan 2025-10-30 12:18:50 +00:00
q
42b721eabf feat: 新增客户端协议生成系统,支持8种主流下载工具
🚀 核心功能
- 新增完整的客户端下载链接生成器系统
- 支持ARIA2、Motrix、比特彗星、迅雷、wget、cURL、IDM、FDM、PowerShell等8种客户端
- 自动处理防盗链参数(User-Agent、Referer、Cookie等)
- 提供可扩展的生成器架构,支持自定义客户端

🔧 技术实现
- ClientLinkGeneratorFactory: 工厂模式管理生成器
- DownloadLinkMeta: 元数据存储下载信息
- ClientLinkUtils: 便捷工具类
- 线程安全的ConcurrentHashMap设计

🌐 前端集成
- 新增ClientLinks.vue界面,支持客户端链接展示
- Element Plus图标系统,混合图标显示
- 客户端检测逻辑优化,避免自动打开外部应用
- 移动端和PC端环境判断

📚 文档完善
- 完整的CLIENT_LINK_GENERATOR_GUIDE.md使用指南
- API文档和测试用例
- 输出示例和最佳实践

从单纯的网盘解析工具升级为完整的下载解决方案生态
2025-10-24 09:29:05 +08:00
q
231d5c3fb9 修复WPS域名匹配正则表达式
- 修复PWPS正则表达式,支持子域名匹配
- 从 https://www\.kdocs\.cn/l/(?<KEY>.+) 修改为 https://(?:[a-zA-Z\d-]+\.)?kdocs\.cn/l/(?<KEY>.+)
- 现在可以正确匹配带子域名的WPS链接,如 www.kdocs.cn
- 测试通过:WPS云文档解析功能正常工作
2025-10-23 09:20:26 +08:00
q
064efdf3f3 feat: 完善JavaScript解析器功能
- 优化JsScriptLoader,支持JAR包内和文件系统的自动资源文件发现
- 移除预定义文件列表,完全依赖自动检测
- 添加getNoRedirect方法支持重定向处理
- 添加sendMultipartForm方法支持文件上传
- 添加代理配置支持
- 修复JSON解析的压缩处理问题
- 添加默认请求头支持(Accept-Encoding、User-Agent、Accept-Language)
- 更新文档,修正导出方式说明
- 优化README.md结构,删除不符合模块定位的内容
- 升级parser版本到10.2.1
2025-10-22 17:34:19 +08:00
qaiu
7b364a0f90 更新 README.md 2025-10-22 12:27:01 +08:00
q
c8a4ca7f16 feat: 添加getNoRedirect方法支持302重定向处理
- 在JsHttpClient中添加getNoRedirect方法,支持不自动跟随重定向的HTTP请求
- 修改baidu-photo.js解析器,使用getNoRedirect获取真实的下载链接
- 更新测试用例断言,验证重定向处理功能正常工作
- 修复百度一刻相册解析器302重定向问题,现在能正确获取真实下载链接
2025-10-21 17:47:59 +08:00
qaiu
97627b824c 更新 README.md 2025-10-21 12:49:10 +08:00
q
6dbdc9bd90 优化工作流 2025-10-20 13:45:26 +08:00
q
4166ea10af 忽略package-lock.json 2025-10-20 13:42:44 +08:00
q
fa12ab2c51 Merge branch 'main' of github.com:qaiu/netdisk-fast-download 2025-10-20 13:38:07 +08:00
q
4fc4ed8640 feat: 添加 WPS 云文档/WPS 云盘解析支持 (closes #133)
- 新增 PwpsTool 解析器,支持 WPS 云文档直链获取
- 调用 WPS API: https://www.kdocs.cn/api/office/file/{shareKey}/download
- 前端添加 kdocs.cn 链接识别规则
- 前端预览功能优化:WPS 云文档直接使用原分享链接预览
- 后端预览接口特殊处理:判断 shareKey 以 pwps: 开头自动重定向
- 支持提取文件名和有效期信息
- 更新 README 文档,添加 WPS 云文档支持说明

Parser 模块设计:
- 遵循开放封闭原则,易于扩展新网盘
- 只需实现 IPanTool 接口和注册枚举即可
- 支持自定义域名解析和责任链模式

技术特性:
- 免登录获取下载直链
- 支持在线预览(利用 WPS 原生功能)
- 文件大小限制:10M(免费版)/2G(会员版)
- 初始空间:5G(免费版)
2025-10-20 13:33:53 +08:00
qaiu
48172f2769 Merge pull request #134 from qaiu/copilot/update-parser-documentation
更新parser文档:开发者应继承PanBase并添加WebClient请求流程说明
2025-10-18 07:11:52 +08:00
copilot-swe-agent[bot]
c7e6d68fbd Update parser documentation with PanBase inheritance and WebClient flow
Co-authored-by: qaiu <29825328+qaiu@users.noreply.github.com>
2025-10-17 23:03:39 +00:00
copilot-swe-agent[bot]
e6672a51c5 Initial plan 2025-10-17 22:59:33 +00:00
q
abde7841ac web展示内部版本号 2025-10-17 17:19:27 +08:00
q
8e661ed1c5 版本号,123文件信息解析支持 2025-10-17 16:41:02 +08:00
q
217cb3a776 parser v10.1.17发布到maven central 允许开发者依赖
1. 添加自定义解析器扩展和相关示例
2. 优化pom结构
2025-10-17 15:51:52 +08:00
q
b8c1bca900 parser v10.1.17发布到maven central 允许开发者依赖
1. 添加自定义解析器扩展和相关示例
2. 优化pom结构
2025-10-17 15:51:41 +08:00
q
5e09b8e92a parser v10.1.17发布到maven central 允许开发者依赖
1. 添加自定义解析器扩展和相关示例
2. 优化pom结构
2025-10-17 15:50:45 +08:00
q
c16bde6bb8 parser发布到maven central方便开发者依赖, pom文件结构调整 2025-10-16 18:08:03 +08:00
qaiu
eb06eb9f3d 更新 README.md 2025-10-11 00:23:41 +08:00
qaiu
0c49088098 更新 README.md
远期规划
2025-10-11 00:19:07 +08:00
qaiu
b970241a64 Merge pull request #132 from rensumo/main
更新linux部署的下载链接
2025-10-10 09:23:36 +08:00
rensumo
6c5aafc11e 更新linux部署的下载链接 2025-10-09 20:32:22 +08:00
qaiu
ca0846f4a7 Merge pull request #131 from rensumo/main
修复命令行部署自启动命令的错误
2025-10-08 21:42:47 +08:00
rensumo
14f7fcc5ad 修复命令行部署自启动命令的错误 2025-10-08 15:31:04 +08:00
q
23a18aba5c web version 2025-09-28 13:44:07 +08:00
q
2d5a79bb16 Fixed: lz规则更新 #129 #128 2025-09-28 13:38:58 +08:00
q
51e1bbefbb 升级netty依赖 2025-09-15 10:10:30 +08:00
q
6647fc5371 fixed. ye解析,去除正则匹配, 分享key去除后缀, #123, #125 2025-09-15 09:44:32 +08:00
q
b67544f0cd fixed. ye解析,去除正则匹配, #124,#125 2025-09-15 09:25:39 +08:00
qaiu
ef5826a73b Merge pull request #124 from qaiu/dependabot/npm_and_yarn/web-front/axios-1.12.0
Bump axios from 1.11.0 to 1.12.0 in /web-front
2025-09-12 17:41:37 +08:00
dependabot[bot]
a48adbd0df Bump axios from 1.11.0 to 1.12.0 in /web-front
Bumps [axios](https://github.com/axios/axios) from 1.11.0 to 1.12.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.11.0...v1.12.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-12 09:37:49 +00:00
q
5c60493a24 修复123解析 #123 2025-09-12 17:34:07 +08:00
q
55e6227de0 优化docker脚本5 2025-09-10 18:23:58 +08:00
q
24a7395004 优化docker脚本4 2025-09-10 18:16:37 +08:00
q
b2a7187fc5 优化docker脚本3 2025-09-10 18:10:51 +08:00
q
ace7cdc88e 优化docker脚本2 2025-09-10 18:05:14 +08:00
q
2e909b5868 优化docker脚本 2025-09-10 17:53:49 +08:00
q
de78bcbc98 docker多平台支持,add 树莓派 2025-09-10 17:45:27 +08:00
q
c560f0e902 docker多平台支持 2025-09-10 17:27:44 +08:00
q
88860c9302 docker多平台支持 2025-09-10 17:21:33 +08:00
q
ef65d0e095 Merge remote-tracking branch 'origin/main' 2025-09-10 17:10:52 +08:00
q
6438505f4a icloud国际版支持,QQ邮箱文件信息获取 2025-09-10 17:10:39 +08:00
qaiu
1be5030dd1 添加docker多平台支持 2025-09-10 17:06:40 +08:00
q
421b2f4a42 Merge remote-tracking branch 'origin/main' 2025-08-19 18:57:00 +08:00
q
a66bf84381 直链API添加文件信息
修复蓝奏目录文件大小处理报错问题 #120
2025-08-19 18:56:42 +08:00
qaiu
0c4d366d6d 更新 README.md 2025-08-14 19:36:09 +08:00
qaiu
a1d0a921fa 更新 README.md 2025-08-14 19:28:44 +08:00
q
2092230a61 更新文档 2025-08-14 15:27:03 +08:00
q
6e5ae6eff3 Merge remote-tracking branch 'origin/main' 2025-08-12 13:32:09 +08:00
q
4f8259d772 1. iz match fixed
2. redirect res content add "text/html; charset=utf-8"
2025-08-12 13:29:59 +08:00
qaiu
8b987d9824 Update README.md 2025-08-11 13:32:33 +08:00
q
e8ba451d18 build status 2025-08-11 13:26:06 +08:00
q
77758db463 Merge remote-tracking branch 'origin/main' 2025-08-11 13:23:59 +08:00
q
6c58598a8e 用户API 2025-08-11 13:23:30 +08:00
qaiu
3ac35230a3 Update README.md 2025-08-11 13:18:00 +08:00
q
ca91302d28 Merge remote-tracking branch 'origin/main' 2025-08-11 13:14:59 +08:00
q
e07272a5dc 添加支持 QQ闪传,微雨云,优化前端逻辑 2025-08-11 13:14:43 +08:00
qaiu
461305e1df Update README.md 2025-08-08 12:33:46 +08:00
q
8e8ab10a0f Merge remote-tracking branch 'origin/main' 2025-08-05 15:50:50 +08:00
q
e754326925 fixed p118 link 2025-08-05 15:50:32 +08:00
qaiu
4c92994c6f 更新 README.md 2025-08-05 13:14:09 +08:00
qaiu
66c57f47ac Merge pull request #113 from qaiu/dependabot/maven/org.apache.commons-commons-lang3-3.18.0
Bump org.apache.commons:commons-lang3 from 3.12.0 to 3.18.0
2025-07-30 09:17:42 +08:00
dependabot[bot]
ec689eadd8 Bump org.apache.commons:commons-lang3 from 3.12.0 to 3.18.0
Bumps org.apache.commons:commons-lang3 from 3.12.0 to 3.18.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-lang3
  dependency-version: 3.18.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 09:05:14 +00:00
qaiu
c1e15709a7 Merge pull request #110 from qaiu/dependabot/maven/core-database/org.apache.commons-commons-lang3-3.18.0
Bump org.apache.commons:commons-lang3 from 3.12.0 to 3.18.0 in /core-database
2025-07-21 17:02:12 +08:00
q
2848937ce7 Merge remote-tracking branch 'origin/main' 2025-07-18 13:00:33 +08:00
q
42ff0c21b2 1. 默认缓存时间修改
2. 文件夹解析异常处理
3. 首页优化
2025-07-18 13:00:12 +08:00
qaiu
3ed7e547e6 更新 README.md
联系方式更新
2025-07-16 13:30:47 +08:00
q
fad8e688df 首页样式优化 2025-07-15 18:09:11 +08:00
q
b2f2dcac4c Merge remote-tracking branch 'origin/main' 2025-07-14 16:16:13 +08:00
q
fcba78e977 启动参数优化 2025-07-14 16:16:00 +08:00
qaiu
77c9d777a1 更新 README.md 2025-07-12 13:47:03 +08:00
dependabot[bot]
4460659210 Bump org.apache.commons:commons-lang3 in /core-database
Bumps org.apache.commons:commons-lang3 from 3.12.0 to 3.18.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-lang3
  dependency-version: 3.18.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-12 01:16:21 +00:00
q
8631524107 移动端布局优化 2025-07-11 11:51:08 +08:00
q
0579588814 优化构建流v0.1.9b6b 2025-07-10 19:17:22 +08:00
q
df2bfb6ac7 优化构建流 2025-07-10 19:12:15 +08:00
q
517b6f8910 del 2025-07-10 19:07:02 +08:00
q
94a46d2833 目录解析支持优化 v0.1.9b6 2025-07-10 18:59:59 +08:00
q
1631a0faa1 目录解析支持优化 v0.1.9b5 2025-07-10 18:58:12 +08:00
qaiu
06d5943cb6 Merge remote-tracking branch 'origin/main' 2025-07-09 07:58:10 +08:00
qaiu
3095e13676 ye目录解析 2025-07-09 07:57:47 +08:00
qaiu
482cbce7e8 Update maven.yml 2025-07-09 07:09:58 +08:00
qaiu
ef2fc3ab98 lz目录解析预览 2025-07-09 07:06:12 +08:00
q
5b57b05eae 目录解析支持优化 v0.1.9b2 2025-07-08 18:58:38 +08:00
q
093579c6f5 Merge remote-tracking branch 'origin/main' 2025-07-08 18:57:17 +08:00
q
c2d4990d7f 目录解析支持优化 v0.1.9b2 2025-07-08 18:55:19 +08:00
qaiu
40e8380738 更新 README.md 2025-07-08 04:03:42 +08:00
qaiu
b716e1e861 更新 README.md 2025-07-08 04:02:50 +08:00
qaiu
8432d4952c 更新 README.md 2025-07-08 03:51:46 +08:00
qaiu
dd8f085f63 更新 README.md 2025-07-08 03:51:00 +08:00
qaiu
161ff8d8a3 更新 README.md 2025-07-08 03:48:19 +08:00
qaiu
1390cd0104 更新 README.md 2025-07-08 03:47:09 +08:00
qaiu
7a02b1e97f 更新 README.md 2025-07-08 03:46:19 +08:00
qaiu
036f107c90 更新 README.md
docker镜像更新
2025-07-08 03:20:18 +08:00
qaiu
5652383450 Update README.md 2025-07-08 02:23:01 +08:00
qaiu
9a047a5da0 更新 README.md 2025-07-04 19:38:18 +08:00
qaiu
8975743a37 更新 README.md 2025-07-04 19:34:53 +08:00
q
0e30eafe49 目录解析支持 2025-07-04 19:20:06 +08:00
q
7facb62f21 Merge remote-tracking branch 'origin/main' 2025-07-04 19:17:35 +08:00
q
30d43cb961 目录解析支持 2025-07-04 19:16:36 +08:00
q
c505b17e35 目录解析支持 2025-07-04 19:11:39 +08:00
qaiu
080c4c753d Create update-release-badge.yml 2025-07-04 09:34:22 +08:00
q
ade0d34d91 start 2025-07-02 18:40:32 +08:00
qaiu
56d082eb0b Update maven.yml
提交任意tag 触发工作流
2025-07-02 18:36:45 +08:00
qaiu
795c4529ba Update AppMain.java 2025-07-02 18:29:46 +08:00
qaiu
0f5cfe22ea Update maven.yml
构建docker添加tag版本
2025-07-02 18:26:48 +08:00
qaiu
925ad2c3a5 Update AppMain.java 2025-07-02 18:20:30 +08:00
qaiu
f3e96907fe Update maven.yml
docker镜像构建添加版本号
2025-07-02 18:19:01 +08:00
qaiu
75a1e58a7d Update AppMain.java 2025-07-02 18:13:19 +08:00
yyzy-official
379e889f71 Update maven.yml
修改工作流版本号问题
2025-07-02 18:09:48 +08:00
yyzy-official
40c06f397b Update README.md
收款码隐藏
2025-07-02 17:41:23 +08:00
yyzy-official
9e9302436e Update README.md
1. 微信联系方式
2. 预览地址
2025-07-02 17:39:14 +08:00
qaiu
6d816d4193 Update README.md 2025-07-02 15:50:29 +08:00
qaiu
438eda9c08 Update README.md 2025-07-02 15:46:55 +08:00
q
ace39e4633 jdk24适配 2025-06-17 15:48:52 +08:00
qaiu
7712391f29 更新 README.md 2025-06-06 07:17:49 +08:00
qaiu
65f08dcb02 Update README.md 2025-06-04 16:28:50 +08:00
qaiu
1d332aa6f4 Update README.md 2025-06-04 16:26:56 +08:00
QAIU
ba81641517 1. 修改docker构建失败 2025-06-04 15:37:50 +08:00
qaiu
fb30bdb879 Update README.md 2025-06-04 15:27:21 +08:00
qaiu
fc451d3b41 Update README.md 文件夹解析说明 2025-06-04 15:25:26 +08:00
QAIU
ffee1f3462 1. 修复 小飞机解析错误#106
2. 添加 123云盘文件夹分享下解析为压缩包下载直链
3. 添加 123云盘全部域名支持: "www.123pan.com","www.123pan.cn","www.123865.com","www.123684.com","www.123912.com","www.123pan.cn"
2025-06-04 15:13:05 +08:00
QAIU
f30027dd13 1. 蓝奏云域名适配 2025-05-28 17:01:50 +08:00
QAIU
8b6aad17f4 0 2025-05-08 18:18:52 +08:00
QAIU
b77930adfb remove yarn.lock 2025-05-08 18:18:15 +08:00
qaiu
aff8f88076 Update README.md 2025-04-23 14:41:52 +08:00
qaiu
4e6582e24c Update nfd-service-template.xml 2025-04-23 14:31:56 +08:00
qaiu
fa9acaccfd Update README.md 2025-04-07 13:29:43 +08:00
QAIU
0414f85f12 115域名变动,360pan暂不可用,ctfile域名变动 2025-04-03 10:57:28 +08:00
QAIU
527dd0eeb4 城通分享格式适配, 优化日志打印 2025-03-28 17:59:28 +08:00
QAIU
74ed7475c9 json异常时, 快速失败 2025-03-24 13:35:40 +08:00
qaiu
54dc3dba96 蓝奏云随机404 问题修复 2025-03-22 12:53:33 +08:00
qaiu
9980159090 更新 README.md 2025-03-17 19:24:38 +08:00
QAIU
0b193ebb00 Merge remote-tracking branch 'origin/main' 2025-03-14 14:03:47 +08:00
QAIU
f5fc9843b2 微信版QQ邮箱中转站解析优化(已改名为QQ邮箱云盘) 2025-03-14 14:03:29 +08:00
qaiu
df1f67dd26 Update README.md 2025-02-25 10:29:25 +08:00
qaiu
b069a5f576 Update README.md 2025-02-25 10:26:47 +08:00
qaiu
7686763a03 Update README.md 2025-02-25 10:25:35 +08:00
qaiu
635a6eac37 Update README.md 2025-02-25 10:02:23 +08:00
QAIU
877edc535f md 2025-02-24 17:39:23 +08:00
QAIU
01d59e3c1e add 超星盘,360盘 2025-02-22 16:55:00 +08:00
QAIU
fece2799e3 Merge remote-tracking branch 'origin/main' 2025-02-21 18:28:08 +08:00
QAIU
de9756ee86 优化细节 2025-02-21 18:27:52 +08:00
qaiu
51f047a51b 更新 README.md 2025-02-20 18:11:39 +08:00
qaiu
04b66e82b7 Update README.md 2025-02-20 18:06:58 +08:00
qaiu
df89253647 Update README.md 2025-02-20 17:47:00 +08:00
qaiu
45dbca794e 更新 README.md 2025-02-13 12:14:59 +08:00
qaiu
857bf28f99 Update README.md 2025-02-12 16:25:16 +08:00
QAIU
e07ce15228 新增文件列表解析接口/redirectUrl/:type/:param 2025-02-10 14:19:18 +08:00
QAIU
0637bcfd8e 新增文件列表解析接口/v2/getFileList?url= 2025-02-07 19:28:09 +08:00
QAIU
23db0563ac 新增文件列表解析接口/v2/getFileList?url= 2025-02-07 19:27:48 +08:00
QAIU
ccba71aa4e MySQL支持, 其他优化 2025-02-06 16:54:54 +08:00
QAIU
fee4bf2ad6 MySQL支持, 其他优化 2025-02-06 16:52:22 +08:00
QAIU
5052fea9ef MySQL支持, 其他优化 2025-02-06 16:52:06 +08:00
qaiu
e85215fca1 Update README.md 2025-02-06 15:51:46 +08:00
qaiu
e42fe45329 Update README.md 2025-02-06 15:50:26 +08:00
qaiu
4240815bd1 Create FUNDING.yml 2025-02-05 11:11:01 +08:00
qaiu
6f0c5305e2 更新 README.md 2025-01-26 16:26:50 +08:00
qaiu
757005cad8 更新 README.md 2025-01-26 16:09:45 +08:00
qaiu
81651ad97c 更新 README.md 2025-01-26 15:31:43 +08:00
qaiu
f3763b6058 优化内核, QQ邮箱微信账户分享,添加123请求header 2025-01-24 19:21:58 +08:00
qaiu
82478dc485 add: 网易云音乐云盘分享URL支持 2025-01-23 17:23:58 +08:00
qaiu
703fd05d43 Update README.md 2025-01-10 14:33:30 +08:00
qaiu
ff868b6e2a Update README.md 2025-01-10 14:21:00 +08:00
qaiu
051a74b37b Update README.md 2025-01-10 14:19:59 +08:00
qaiu
a0a1085623 Update README.md 2025-01-10 14:14:20 +08:00
qaiu
2612d3919c Update README.md 2025-01-10 14:12:55 +08:00
qaiu
6f123a236f Update README.md 2025-01-10 14:12:04 +08:00
QAIU
71e57e6a08 Merge remote-tracking branch 'origin/main' 2025-01-07 15:04:07 +08:00
QAIU
7cb18d8186 remove yarn.lock 2025-01-07 15:03:53 +08:00
qaiu
cdbf670ece Update maven.yml 2025-01-07 15:00:18 +08:00
QAIU
e0dafee617 remove yarn.lock 2025-01-07 14:48:16 +08:00
QAIU
c37bce1563 优化解析器链接识别 2025-01-07 13:19:40 +08:00
QAIU
0b3c77d644 115pan 2025-01-07 11:13:52 +08:00
QAIU
2cf85caf86 115pan分享识别优化 2025-01-06 18:01:23 +08:00
QAIU
594010ba88 代理服务配置优化 2025-01-04 17:38:33 +08:00
QAIU
d91460d2e2 修复蓝奏优享解析失败, gz压缩的json解析 2025-01-04 15:21:15 +08:00
QAIU
89713e6ac9 修复蓝奏优享解析失败 2025-01-04 14:21:32 +08:00
QAIU
17c9b2538c Merge remote-tracking branch 'origin/main' 2025-01-04 14:18:46 +08:00
QAIU
d337b003cb 常规测试 2024-12-30 18:11:53 +08:00
qaiu
8f1485656b Update README.md
add docker加速地址
2024-12-23 13:05:25 +08:00
qaiu
f0c4ec3031 Update maven.yml 2024-12-23 13:02:51 +08:00
qaiu
458be84aca Update maven.yml 2024-12-23 13:00:28 +08:00
qaiu
c7716aad34 Update README.md 2024-12-18 13:05:16 +08:00
QAIU
4a3e734408 1. onedrive
常规测试
2024-12-18 11:46:06 +08:00
qaiu
54cc212753 Merge pull request #78 from xrgzs/add-ghcr
增加 ghcr.io 容器构建
2024-12-17 16:24:03 +08:00
xrgzs
f4ae1eaa51 PR时不更新依赖图 2024-12-17 16:15:59 +08:00
xrgzs
d2537282c9 增加 ghcr.io 容器构建 2024-12-17 15:47:05 +08:00
QAIU
87527688c3 1. 代理配置 2024-12-17 15:21:59 +08:00
qaiu
2be0b6505a 更新 P115Tool.java
UA问题说明
2024-12-17 09:37:48 +08:00
QAIU
672f100c7c 1. 动态UA 2024-12-16 19:01:55 +08:00
QAIU
5af402c0c5 1. 动态UA 2024-12-16 18:52:02 +08:00
QAIU
693a4f0f63 1. P115网盘解析BUG
2. 完善onedrive支持
2024-12-16 15:54:06 +08:00
QAIU
f8d2426ff6 API 2024-12-16 13:19:15 +08:00
QAIU
973a9bedcd 添加115网盘支持(测试中)#75 2024-12-16 13:15:53 +08:00
QAIU
a583733400 修复小飞机解析失败 2024-12-16 12:31:34 +08:00
QAIU
78eb51b3ca 处理编译失败问题 2024-11-29 11:50:44 +08:00
QAIU
a2606be9d8 修复蓝奏优享#71 2024-11-26 13:02:02 +08:00
qaiu
a4975c72ce Merge pull request #70 from qaiu/dependabot/npm_and_yarn/web-front/eslint/plugin-kit-0.2.3
Bump @eslint/plugin-kit from 0.2.2 to 0.2.3 in /web-front
2024-11-18 12:12:25 +08:00
dependabot[bot]
58f96822a4 Bump @eslint/plugin-kit from 0.2.2 to 0.2.3 in /web-front
Bumps [@eslint/plugin-kit](https://github.com/eslint/rewrite) from 0.2.2 to 0.2.3.
- [Release notes](https://github.com/eslint/rewrite/releases)
- [Changelog](https://github.com/eslint/rewrite/blob/main/release-please-config.json)
- [Commits](https://github.com/eslint/rewrite/compare/plugin-kit-v0.2.2...plugin-kit-v0.2.3)

---
updated-dependencies:
- dependency-name: "@eslint/plugin-kit"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-15 21:50:27 +00:00
qaiu
96b0d94986 Update README.md 2024-11-13 13:59:54 +08:00
QAIU
70b38db8c5 IP互助计划, 添加正向代理服务(TODO) 2024-11-12 19:05:43 +08:00
QAIU
b6a9c2d3a0 . 2024-11-07 18:37:08 +08:00
QAIU
a01df6c7db web file package config 2024-11-07 12:34:24 +08:00
QAIU
4455bee570 pod update 2024-11-05 18:42:32 +08:00
qaiu
cd0adef2ed Merge pull request #67 from qaiu/dependabot/npm_and_yarn/web-front/http-proxy-middleware-2.0.7
Bump http-proxy-middleware from 2.0.6 to 2.0.7 in /web-front
2024-11-04 19:13:24 +08:00
dependabot[bot]
4aa24a65fb Bump http-proxy-middleware from 2.0.6 to 2.0.7 in /web-front
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.6 to 2.0.7.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.7/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.6...v2.0.7)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 10:58:07 +00:00
QAIU
760dca8772 升级vue3 2024-11-04 18:56:49 +08:00
QAIU
8269673619 1. add iCloud解析 2024-11-04 14:18:56 +08:00
qaiu
82ec586554 手残 又不小心提交了 ads代码 2024-11-02 18:59:33 +08:00
qaiu
ca98cc8708 里程碑版本前奏: 1. 添加google云盘解析(需要联网), 2. web页面人工智障自动解析URL, 3. 优化一堆细节问题, 4: git换行配置(待验证), 5. 酷我解析可用 2024-11-02 18:58:15 +08:00
QAIU
f07800985d 1. 优化123pan日志, 2. 微博短链测试, 3. 分享类添加其他参数Map(Cookie支持准备) 2024-11-01 18:18:29 +08:00
qaiu
b042df93b7 更新 urltool.py 2024-10-29 18:59:23 +08:00
QAIU
ecf4441946 .. 2024-10-29 18:36:51 +08:00
QAIU
39b2612840 .. 2024-10-28 18:59:18 +08:00
QAIU
218f486e6b .. 2024-10-28 18:58:37 +08:00
QAIU
cfcc25f175 add onedrive 2024-10-28 18:57:26 +08:00
qaiu
155e88223c 0.0 前端优化,302标识短链添加/d前缀 2024-10-28 14:36:39 +08:00
QAIU
05039ece51 add 118, 微雨云 2024-10-26 16:04:49 +08:00
QAIU
1c673f2b46 idea run Main. 2024-10-25 18:18:42 +08:00
QAIU
2232a70228 Merge remote-tracking branch 'origin/main' 2024-10-25 18:18:34 +08:00
QAIU
e661b1d817 idea run Main. 2024-10-25 18:18:17 +08:00
qaiu
5a6a65f580 Update README.md 2024-10-25 14:54:19 +08:00
qaiu
5cdd3bcd30 Update README.md 2024-10-25 14:52:36 +08:00
qaiu
1233a885b8 Update README.md 2024-10-25 14:49:09 +08:00
QAIU
adf56cd768 add 酷狗音乐, 酷我音乐, 网易云音乐, QQ音乐 2024-10-25 14:38:57 +08:00
QAIU
cd4b208be9 一处SQL语法错误 2024-10-24 10:48:36 +08:00
QAIU
502de1a5d0 0..0 2024-10-23 18:08:10 +08:00
qaiu
4158f869a3 0.0 2024-10-23 18:04:34 +08:00
QAIU
ff569d339c 1. add music parser 2024-10-21 19:14:29 +08:00
QAIU
10eec323dd 1. add 网易云音乐解析 2024-10-20 18:16:51 +08:00
qaiu
0a3db51c7d 更新 app-dev.yml 蓝奏设置合理缓存时间 2024-10-11 08:15:10 +08:00
qaiu
229aee0b30 Update README.md 2024-10-09 15:38:29 +08:00
QAIU
44714aa981 1. add 城通网盘解析(慢速) https://www.ctfile.com
2. 优化解析接口的实现
2024-10-09 15:33:33 +08:00
qaiu
2b6138a889 前端打包说明 2024-10-08 03:01:29 +08:00
qaiu
5e424f7bf4 前端打包说明 2024-10-08 02:13:50 +08:00
qaiu
294e47deed 1. 启用内嵌静态页面, 2. 蓝奏域名规则优化, 3. 反向代理优化, 4. 修复一堆细节问题 2024-10-08 02:06:37 +08:00
qaiu
dc42547b73 更新 README.md 2024-10-07 19:32:22 +08:00
qaiu
7ef7f0706b 更新 PanDomainTemplate.java
蓝奏匹配正则优化
2024-10-06 15:19:51 +08:00
qaiu
a59b98a7c9 更新 PanDomainTemplate.java 2024-10-06 15:04:13 +08:00
qaiu
088fee9a4d 1. add:123云盘的新域名
2. update: 统计API支持ce盘
3. 缓存时长
2024-10-01 17:38:57 +08:00
QAIU
d8666acfe8 国庆快乐 ^ ^ #59 2024-09-30 17:42:38 +08:00
QAIU
209e9c2866 国庆快乐 ^ ^ #59 2024-09-30 17:38:36 +08:00
qaiu
6c3195dea4 更新 README.md 2024-09-29 22:11:04 +08:00
qaiu
7d774a7433 更新 README.md 2024-09-29 22:10:23 +08:00
qaiu
f1ec4433cf 更新 README.md 2024-09-29 22:09:58 +08:00
QAIU
1f825db261 update 支持Cloudreve任意https的80端口的域名, 修复因json异常解析导致的解析时间超时的问题 2024-09-25 20:01:10 +08:00
QAIU
1019f24f1d update web-front README.md 2024-09-24 18:05:30 +08:00
QAIU
f5c5b99579 1. 修改文叔叔链接匹配规则 2024-09-24 17:55:18 +08:00
QAIU
e002d19f1b 1. 前端页面优化, 增强统计功能, 支持生成二维码
2. 添加统计接口
2024-09-24 17:08:29 +08:00
qaiu
0d5c9651f0 Update README.md 2024-09-24 10:07:25 +08:00
qaiu
53fc13b95c Merge pull request #56 from qaiu/dependabot/npm_and_yarn/web-front/micromatch-4.0.8
Bump micromatch from 4.0.5 to 4.0.8 in /web-front
2024-09-24 00:09:00 +08:00
QAIU
694c3b0ddc 修复移动云空间无法解析的前端问题, 更新前端依赖 2024-09-23 18:33:09 +08:00
dependabot[bot]
9b3d4577cc Bump micromatch from 4.0.5 to 4.0.8 in /web-front
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 08:46:39 +00:00
QAIU
77783915dd 修复移动云空间无法解析的前端问题, 更新前端依赖 2024-09-23 16:45:30 +08:00
qaiu
b67ac21a79 Update README.md add 宝塔安装教程 2024-09-22 17:27:54 +08:00
qaiu
603afed2f2 . 2024-09-19 05:34:34 +00:00
qaiu
c2a7c34496 . 2024-09-19 05:31:24 +00:00
qaiu
edd40f48ba 依赖更新 2024-09-19 05:26:31 +00:00
qaiu
cca3d6b8b9 web-front add yarn.lock 2024-09-19 05:22:55 +00:00
qaiu
f004512903 Update devcontainer.json 2024-09-19 09:37:01 +08:00
qaiu
6407bb6730 Merge pull request #47 from qaiu/dependabot/npm_and_yarn/web-front/webpack-5.94.0
Bump webpack from 5.88.2 to 5.94.0 in /web-front
2024-09-19 09:01:53 +08:00
qaiu
b914eeadec Merge pull request #51 from qaiu/dependabot/npm_and_yarn/web-front/multi-d66d039ac5
Bump serve-static and express in /web-front
2024-09-19 09:01:04 +08:00
qaiu
dcadc6783e Merge pull request #52 from qaiu/dependabot/npm_and_yarn/web-front/express-4.21.0
Bump express from 4.19.2 to 4.21.0 in /web-front
2024-09-19 09:00:27 +08:00
dependabot[bot]
bc9f43634f Bump express from 4.19.2 to 4.21.0 in /web-front
Bumps [express](https://github.com/expressjs/express) from 4.19.2 to 4.21.0.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-19 00:59:00 +00:00
dependabot[bot]
4778f0164c Bump serve-static and express in /web-front
Bumps [serve-static](https://github.com/expressjs/serve-static) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-19 00:58:59 +00:00
qaiu
9904754a07 Merge pull request #48 from qaiu/dependabot/npm_and_yarn/web-front/axios-1.7.4
Bump axios from 1.6.0 to 1.7.4 in /web-front
2024-09-19 08:57:43 +08:00
qaiu
1b79077c9e 更新 PanDomainTemplate.java 2024-09-19 06:20:12 +08:00
qaiu
c13afb05b3 示例下载链接修改 2024-09-19 05:43:54 +08:00
qaiu
03e320efb8 Create devcontainer.json 2024-09-18 17:40:52 +08:00
qaiu
7846332476 Update README.md 2024-09-18 16:58:27 +08:00
qaiu
2d5d3b86e0 Update README.md 2024-09-18 16:58:02 +08:00
qaiu
7c9ba890af 1. .. 2024-09-18 15:45:49 +08:00
qaiu
0d609daffa 1. 123后缀处理 2. 修复缓存时间戳格式问题 2024-09-18 15:41:56 +08:00
qaiu
c12e56d402 Update README.md 2024-09-18 13:34:53 +08:00
qaiu
c7b38c07d5 Update README.md 2024-09-18 13:34:26 +08:00
qaiu
dc51066cea 1. 缓存优化 2024-09-18 13:28:20 +08:00
qaiu
59d2fb3010 1. 缓存优化 2024-09-18 13:24:33 +08:00
qaiu
a0fe702c10 1. remove error update 2024-09-15 06:54:55 +08:00
qaiu
f886f7e366 1. 添加缓存
2. 优化解析架构
3. 优化核心模块
2024-09-15 06:53:11 +08:00
dependabot[bot]
1d475d88ed Bump axios from 1.6.0 to 1.7.4 in /web-front
Bumps [axios](https://github.com/axios/axios) from 1.6.0 to 1.7.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.0...v1.7.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-30 18:09:12 +00:00
dependabot[bot]
e64c901912 Bump webpack from 5.88.2 to 5.94.0 in /web-front
Bumps [webpack](https://github.com/webpack/webpack) from 5.88.2 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.88.2...v5.94.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-30 18:07:43 +00:00
qaiu
5fce02e623 Update README.md 2024-07-13 12:50:02 +08:00
qaiu
13997bc543 Update README.md 2024-06-19 10:04:04 +08:00
qaiu
3e05b0d6f9 Update README.md 2024-06-19 10:03:53 +08:00
qaiu
966417f867 Merge pull request #45 from qaiu/dependabot/npm_and_yarn/web-front/multi-d7cccafd4e
Bump braces and filemanager-webpack-plugin in /web-front
2024-06-14 12:14:05 +08:00
dependabot[bot]
601a0d1b91 Bump braces and filemanager-webpack-plugin in /web-front
Bumps [braces](https://github.com/micromatch/braces) to 3.0.3 and updates ancestor dependency [filemanager-webpack-plugin](https://github.com/gregnb/filemanager-webpack-plugin). These dependencies need to be updated together.


Updates `braces` from 3.0.2 to 3.0.3
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

Updates `filemanager-webpack-plugin` from 2.0.5 to 8.0.0
- [Release notes](https://github.com/gregnb/filemanager-webpack-plugin/releases)
- [Changelog](https://github.com/gregnb/filemanager-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gregnb/filemanager-webpack-plugin/compare/v2.0.5...v8.0.0)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
- dependency-name: filemanager-webpack-plugin
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-11 06:54:54 +00:00
12 changed files with 736 additions and 402 deletions

52
.vscode/launch.json vendored
View File

@@ -1,7 +1,4 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
@@ -10,61 +7,12 @@
"request": "launch",
"mainClass": "${file}"
},
{
"type": "java",
"name": "StringCase",
"request": "launch",
"mainClass": "cn.qaiu.vx.core.util.StringCase",
"projectName": "core"
},
{
"type": "java",
"name": "FCURLParser",
"request": "launch",
"mainClass": "cn.qaiu.parser.FCURLParser",
"projectName": "parser"
},
{
"type": "java",
"name": "QkTool",
"request": "launch",
"mainClass": "cn.qaiu.parser.impl.QkTool",
"projectName": "parser"
},
{
"type": "java",
"name": "WebClientExample",
"request": "launch",
"mainClass": "qaiu.web.test.WebClientExample",
"projectName": "parser"
},
{
"type": "java",
"name": "AppMain",
"request": "launch",
"mainClass": "cn.qaiu.lz.AppMain",
"projectName": "web-service"
},
{
"type": "java",
"name": "TestJs",
"request": "launch",
"mainClass": "cn.qaiu.web.test.TestJs",
"projectName": "web-service"
},
{
"type": "java",
"name": "TestOS",
"request": "launch",
"mainClass": "cn.qaiu.web.test.TestOS",
"projectName": "web-service"
},
{
"type": "java",
"name": "WebProxyExamples",
"request": "launch",
"mainClass": "cn.qaiu.web.test.WebProxyExamples",
"projectName": "web-service"
}
]
}

View File

@@ -14,7 +14,7 @@
# netdisk-fast-download 网盘分享链接云解析服务
QQ群1017480890
QQ交流1017480890
netdisk-fast-download网盘直链云解析(nfd云解析)能把网盘分享下载链接转化为直链,支持多款云盘,已支持蓝奏云/蓝奏云优享/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘/Cloudreve等支持加密分享以及部分网盘文件夹分享。
@@ -40,12 +40,12 @@ https://nfd-parser.github.io/nfd-preview/preview.html?src=https%3A%2F%2Flz.qaiu.
**JavaScript解析器文档** [JavaScript解析器开发指南](parser/doc/JAVASCRIPT_PARSER_GUIDE.md) | [自定义解析器扩展指南](parser/doc/CUSTOM_PARSER_GUIDE.md) | [快速开始](parser/doc/CUSTOM_PARSER_QUICKSTART.md)
**Playground功能** [JS解析器演练场密码保护说明](PLAYGROUND_PASSWORD_PROTECTION.md)
**Playground功能** [JS解析器演练场密码保护说明](web-service/doc/PLAYGROUND_PASSWORD_PROTECTION.md)
## 预览地址
[预览地址1](https://lz.qaiu.top)
[预览地址2](https://lz0.qaiu.top)
[移动/联通/天翼云盘大文件试用](https://189.qaiu.top)
[天翼云盘/移动云盘限时体验](https://189.qaiu.top)
main分支依赖JDK17, 提供了JDK11分支[main-jdk11](https://github.com/qaiu/netdisk-fast-download/tree/main-jdk11)
**0.1.8及以上版本json接口格式有调整 参考json返回数据格式示例**
@@ -88,13 +88,17 @@ main分支依赖JDK17, 提供了JDK11分支[main-jdk11](https://github.com/qaiu/
- Onedrive-pod
- Dropbox-pdp
- iCloud-pic
### 专属版提供
### 专属版提供
- [夸克云盘-qk](https://pan.quark.cn/)
- [UC云盘-uc](https://fast.uc.cn/)
- [移动云盘-p139](https://yun.139.com/)
- [联通云盘-pwo](https://pan.wo.cn/)
- [天翼云盘-p189](https://cloud.189.cn/)
## API接口
[api接口文档](https://nfdparser.apifox.cn/)
### 服务端口
- **6400**: API 服务端口(建议使用 Nginx 代理)
- **6401**: 内置 Web 解析工具(个人使用可直接开放此端口)

View File

@@ -1,73 +0,0 @@
package cn.qaiu.vx.core.verticle.conf;
import io.vertx.core.json.JsonObject;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.impl.JsonUtil;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
/**
* Converter and mapper for {@link cn.qaiu.vx.core.verticle.conf.HttpProxyConf}.
* NOTE: This class has been automatically generated from the {@link cn.qaiu.vx.core.verticle.conf.HttpProxyConf} original class using Vert.x codegen.
*/
public class HttpProxyConfConverter {
private static final Base64.Decoder BASE64_DECODER = JsonUtil.BASE64_DECODER;
private static final Base64.Encoder BASE64_ENCODER = JsonUtil.BASE64_ENCODER;
static void fromJson(Iterable<java.util.Map.Entry<String, Object>> json, HttpProxyConf obj) {
for (java.util.Map.Entry<String, Object> member : json) {
switch (member.getKey()) {
case "password":
if (member.getValue() instanceof String) {
obj.setPassword((String)member.getValue());
}
break;
case "port":
if (member.getValue() instanceof Number) {
obj.setPort(((Number)member.getValue()).intValue());
}
break;
case "preProxyOptions":
if (member.getValue() instanceof JsonObject) {
obj.setPreProxyOptions(new io.vertx.core.net.ProxyOptions((io.vertx.core.json.JsonObject)member.getValue()));
}
break;
case "timeout":
if (member.getValue() instanceof Number) {
obj.setTimeout(((Number)member.getValue()).intValue());
}
break;
case "username":
if (member.getValue() instanceof String) {
obj.setUsername((String)member.getValue());
}
break;
}
}
}
static void toJson(HttpProxyConf obj, JsonObject json) {
toJson(obj, json.getMap());
}
static void toJson(HttpProxyConf obj, java.util.Map<String, Object> json) {
if (obj.getPassword() != null) {
json.put("password", obj.getPassword());
}
if (obj.getPort() != null) {
json.put("port", obj.getPort());
}
if (obj.getPreProxyOptions() != null) {
json.put("preProxyOptions", obj.getPreProxyOptions().toJson());
}
if (obj.getTimeout() != null) {
json.put("timeout", obj.getTimeout());
}
if (obj.getUsername() != null) {
json.put("username", obj.getUsername());
}
}
}

View File

@@ -1,89 +0,0 @@
package cn.qaiu.vx.core.verticle.conf;
import io.vertx.codegen.annotations.DataObject;
import io.vertx.codegen.json.annotations.JsonGen;
import io.vertx.core.json.JsonObject;
import io.vertx.core.net.ProxyOptions;
import java.util.UUID;
@DataObject
@JsonGen(publicConverter = false)
public class HttpProxyConf {
public static final String DEFAULT_USERNAME = UUID.randomUUID().toString();
public static final String DEFAULT_PASSWORD = UUID.randomUUID().toString();
public static final Integer DEFAULT_PORT = 6402;
public static final Integer DEFAULT_TIMEOUT = 15000;
Integer timeout;
String username;
String password;
Integer port;
ProxyOptions preProxyOptions;
public HttpProxyConf() {
this.username = DEFAULT_USERNAME;
this.password = DEFAULT_PASSWORD;
this.timeout = DEFAULT_PORT;
this.timeout = DEFAULT_TIMEOUT;
this.preProxyOptions = new ProxyOptions();
}
public HttpProxyConf(JsonObject json) {
this();
}
public Integer getTimeout() {
return timeout;
}
public HttpProxyConf setTimeout(Integer timeout) {
this.timeout = timeout;
return this;
}
public String getUsername() {
return username;
}
public HttpProxyConf setUsername(String username) {
this.username = username;
return this;
}
public String getPassword() {
return password;
}
public HttpProxyConf setPassword(String password) {
this.password = password;
return this;
}
public Integer getPort() {
return port;
}
public HttpProxyConf setPort(Integer port) {
this.port = port;
return this;
}
public ProxyOptions getPreProxyOptions() {
return preProxyOptions;
}
public HttpProxyConf setPreProxyOptions(ProxyOptions preProxyOptions) {
this.preProxyOptions = preProxyOptions;
return this;
}
}

View File

@@ -104,7 +104,7 @@ public enum PanDomainTemplate {
"lanzoug|" +
"lanzoum" +
")\\.com/(.+/)?(?<KEY>.+)"),
"https://lanzoux.com/{shareKey}",
"https://w1.lanzn.com/{shareKey}",
LzTool.class),
// https://www.feijix.com/s/
@@ -263,7 +263,7 @@ public enum PanDomainTemplate {
// https://pan-yz.cldisk.com/external/m/file/953658049102462976
Pcx("超星云盘(需要referer头)",
compile("https://pan-yz\\.cldisk\\.com/external/m/file/(?<KEY>\\w+)"),
compile("https://pan-yz\\.(chaoxing\\.com|cldisk\\.com)/external/m/file/(?<KEY>\\w+)(\\?.*)?"),
"https://pan-yz.cldisk.com/external/m/file/{shareKey}",
PcxTool.class),
// WPS分享格式https://www.kdocs.cn/l/ck0azivLlDi3 API格式https://www.kdocs.cn/api/office/file/{shareKey}/download

View File

@@ -4,13 +4,15 @@ import cn.qaiu.entity.FileInfo;
import cn.qaiu.entity.ShareLinkInfo;
import cn.qaiu.parser.PanBase;
import cn.qaiu.util.AESUtils;
import cn.qaiu.util.AcwScV2Generator;
import cn.qaiu.util.FileSizeConverter;
import cn.qaiu.util.UUIDUtil;
import io.netty.handler.codec.http.cookie.DefaultCookie;
import io.vertx.core.Future;
import io.vertx.core.MultiMap;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClientSession;
import io.vertx.uritemplate.UriTemplate;
import org.apache.commons.lang3.StringUtils;
@@ -18,10 +20,12 @@ import java.util.*;
/**
* 蓝奏云优享
*
* v019b22
*/
public class IzTool extends PanBase {
WebClientSession webClientSession = WebClientSession.create(clientNoRedirects);
private static final String API_URL_PREFIX = "https://api.ilanzou.com/unproved/";
private static final String FIRST_REQUEST_URL = API_URL_PREFIX + "recommend/list?devType=6&devModel=Chrome" +
@@ -70,6 +74,19 @@ public class IzTool extends PanBase {
super(shareLinkInfo);
}
private void setCookie(String html) {
int beginIndex = html.indexOf("arg1='") + 6;
String arg1 = html.substring(beginIndex, html.indexOf("';", beginIndex));
String acw_sc__v2 = AcwScV2Generator.acwScV2Simple(arg1);
// 创建一个 Cookie 并放入 CookieStore
DefaultCookie nettyCookie = new DefaultCookie("acw_sc__v2", acw_sc__v2);
nettyCookie.setDomain(".ilanzou.com"); // 设置域名
nettyCookie.setPath("/"); // 设置路径
nettyCookie.setSecure(false);
nettyCookie.setHttpOnly(false);
webClientSession.cookieStore().put(nettyCookie);
}
public Future<String> parse() {
String shareId = shareLinkInfo.getShareKey();
@@ -80,19 +97,52 @@ public class IzTool extends PanBase {
// POST https://api.ilanzou.com/ws/recommend/list?devType=6&devModel=Chrome&extra=2&shareId=146731&type=0&offset=1&limit=60
String url = StringUtils.isBlank(shareLinkInfo.getSharePassword()) ? FIRST_REQUEST_URL
: (FIRST_REQUEST_URL + "&code=" + shareLinkInfo.getSharePassword());
client.postAbs(UriTemplate.of(VIP_REQUEST_URL))
webClientSession.postAbs(UriTemplate.of(VIP_REQUEST_URL))
.setTemplateParam("uuid", uuid)
.setTemplateParam("ts", tsEncode)
.send().onSuccess(r0 -> { // 忽略res
// 第一次请求 获取文件信息
// 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(url))
webClientSession.postAbs(UriTemplate.of(url))
.putHeaders(header)
.setTemplateParam("shareId", shareId)
.setTemplateParam("uuid", uuid)
.setTemplateParam("ts", tsEncode)
.send().onSuccess(res -> {
JsonObject resJson = asJson(res);
String resBody = asText(res);
// 检查是否包含 cookie 验证
if (resBody.contains("var arg1='")) {
webClientSession = WebClientSession.create(clientNoRedirects);
setCookie(resBody);
// 重新请求
webClientSession.postAbs(UriTemplate.of(url))
.putHeaders(header)
.setTemplateParam("shareId", shareId)
.setTemplateParam("uuid", uuid)
.setTemplateParam("ts", tsEncode)
.send().onSuccess(res2 -> {
handleParseResponse(asText(res2), shareId);
}).onFailure(handleFail(FIRST_REQUEST_URL));
return;
}
handleParseResponse(resBody, shareId);
}).onFailure(handleFail(FIRST_REQUEST_URL));
});
return promise.future();
}
private void handleParseResponse(String resBody, String shareId) {
JsonObject resJson;
try {
resJson = new JsonObject(resBody);
} catch (Exception e) {
fail(FIRST_REQUEST_URL + " 解析JSON失败: " + resBody);
return;
}
if (resJson.isEmpty()) {
fail(FIRST_REQUEST_URL + " 返回内容为空");
return;
}
if (resJson.getInteger("code") != 200) {
fail(FIRST_REQUEST_URL + " 返回异常: " + resJson);
return;
@@ -125,7 +175,7 @@ public class IzTool extends PanBase {
String fidEncode = AESUtils.encrypt2HexIz(fileId + "|" + userId);
String auth = AESUtils.encrypt2HexIz(fileId + "|" + nowTs);
// 第二次请求
clientNoRedirects.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
webClientSession.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
.setTemplateParam("fidEncode", fidEncode)
.setTemplateParam("uuid", uuid)
.setTemplateParam("ts", tsEncode)
@@ -139,9 +189,6 @@ public class IzTool extends PanBase {
}
promise.complete(headers.get("Location"));
}).onFailure(handleFail(SECOND_REQUEST_URL));
}).onFailure(handleFail(FIRST_REQUEST_URL));
});
return promise.future();
}
@Override
@@ -174,7 +221,7 @@ public class IzTool extends PanBase {
log.debug("开始解析目录: {}, shareId: {}, uuid: {}, ts: {}", id, shareId, uuid, tsEncode);
// 开始解析目录: 164312216, shareId: bPMsbg5K, uuid: 0fmVWTx2Ea4zFwkpd7KXf, ts: 20865d7b7f00828279f437cd1f097860
// 拿到目录ID
client.postAbs(UriTemplate.of(FILE_LIST_URL))
webClientSession.postAbs(UriTemplate.of(FILE_LIST_URL))
.putHeaders(header)
.setTemplateParam("shareId", shareId)
.setTemplateParam("uuid", uuid)
@@ -264,7 +311,7 @@ public class IzTool extends PanBase {
public Future<String> parseById() {
// 第二次请求
JsonObject paramJson = (JsonObject)shareLinkInfo.getOtherParam().get("paramJson");
clientNoRedirects.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
webClientSession.getAbs(UriTemplate.of(SECOND_REQUEST_URL))
.setTemplateParam("fidEncode", paramJson.getString("fidEncode"))
.setTemplateParam("uuid", paramJson.getString("uuid"))
.setTemplateParam("ts", paramJson.getString("ts"))

View File

@@ -1,30 +1,72 @@
package cn.qaiu.parser.impl;
import cn.qaiu.entity.FileInfo;
import cn.qaiu.entity.ShareLinkInfo;
import cn.qaiu.parser.PanBase;
import cn.qaiu.util.FileSizeConverter;
import io.vertx.core.Future;
import io.vertx.core.MultiMap;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.UUID;
/**
* <a href="https://lecloud.lenovo.com/">联想乐云</a>
*/
public class LeTool extends PanBase {
private static final String API_URL_PREFIX = "https://lecloud.lenovo.com/share/api/clouddiskapi/share/public/v1/";
private static final String API_URL_PREFIX = "https://lecloud.lenovo.com/mshare/api/clouddiskapi/share/public/v1/";
private static final String DEFAULT_FILE_TYPE = "file";
private static final int FILE_TYPE_DIRECTORY = 0; // 目录类型
private static final MultiMap HEADERS;
static {
HEADERS = MultiMap.caseInsensitiveMultiMap();
HEADERS.set("Accept", "application/json, text/plain, */*");
HEADERS.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
HEADERS.set("Cache-Control", "no-cache");
HEADERS.set("Connection", "keep-alive");
HEADERS.set("Content-Type", "application/json");
HEADERS.set("DNT", "1");
HEADERS.set("Origin", "https://lecloud.lenovo.com");
HEADERS.set("Pragma", "no-cache");
HEADERS.set("Sec-Fetch-Dest", "empty");
HEADERS.set("Sec-Fetch-Mode", "cors");
HEADERS.set("Sec-Fetch-Site", "same-origin");
HEADERS.set("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1 Edg/143.0.0.0");
}
public LeTool(ShareLinkInfo shareLinkInfo) {
super(shareLinkInfo);
}
/**
* 获取干净的 shareId去掉可能的查询参数
* URL 如 https://lecloud.lenovo.com/share/5eoN3RA5PLhQcH4zE?path=... 会导致 shareKey 包含查询参数
*/
private String getCleanShareId() {
String shareKey = shareLinkInfo.getShareKey();
if (shareKey != null && shareKey.contains("?")) {
return shareKey.split("\\?")[0];
}
return shareKey;
}
public Future<String> parse() {
final String dataKey = shareLinkInfo.getShareKey();
final String dataKey = getCleanShareId();
final String pwd = shareLinkInfo.getSharePassword();
// {"shareId":"xxx","password":"xxx","directoryId":"-1"}
String apiUrl1 = API_URL_PREFIX + "shareInfo";
client.postAbs(apiUrl1)
.sendJsonObject(JsonObject.of("shareId", dataKey, "password", pwd, "directoryId", -1))
.putHeaders(HEADERS)
.sendJsonObject(JsonObject.of("shareId", dataKey, "password", pwd, "directoryId", "-1"))
.onSuccess(res -> {
JsonObject resJson = asJson(res);
if (resJson.containsKey("result")) {
@@ -44,7 +86,19 @@ public class LeTool extends PanBase {
}
JsonObject fileInfoJson = files.getJsonObject(0);
if (fileInfoJson != null) {
// TODO 文件大小fileSize和文件名fileName
// Extract and populate FileInfo
FileInfo fileInfo = createFileInfo(fileInfoJson);
shareLinkInfo.getOtherParam().put("fileInfo", fileInfo);
// 判断是否为目录
Integer fileType = fileInfoJson.getInteger("fileType");
if (fileType != null && fileType == FILE_TYPE_DIRECTORY) {
// 如果是目录返回目录ID
String fileId = fileInfoJson.getString("fileId");
promise.complete(fileId);
return;
}
String fileId = fileInfoJson.getString("fileId");
// 根据文件ID获取跳转链接
getDownURL(dataKey, fileId);
@@ -59,12 +113,204 @@ public class LeTool extends PanBase {
return promise.future();
}
@Override
public Future<List<FileInfo>> parseFileList() {
Promise<List<FileInfo>> listPromise = Promise.promise();
String dataKey = getCleanShareId();
// 如果参数里的目录ID不为空则直接解析目录
String dirId = (String) shareLinkInfo.getOtherParam().get("dirId");
if (dirId == null || dirId.isEmpty()) {
// 如果没有指定目录ID使用根目录ID "-1"
dirId = "-1";
}
// 直接请求shareInfo接口解析目录
parseDirectory(dirId, dataKey, listPromise);
return listPromise.future();
}
/**
* 解析目录下的文件列表
*/
private void parseDirectory(String directoryId, String shareId, Promise<List<FileInfo>> promise) {
String pwd = shareLinkInfo.getSharePassword();
if (pwd == null) {
pwd = "";
}
String apiUrl = API_URL_PREFIX + "shareInfo";
JsonObject requestBody = JsonObject.of("shareId", shareId, "password", pwd, "directoryId", directoryId);
log.info("解析目录请求: url={}, body={}", apiUrl, requestBody.encode());
client.postAbs(apiUrl)
.putHeaders(HEADERS)
.sendJsonObject(requestBody)
.onSuccess(res -> {
JsonObject resJson = asJson(res);
if (!resJson.containsKey("result") || !resJson.getBoolean("result")) {
promise.fail("解析目录失败: " + resJson.encode());
return;
}
JsonObject dataJson = resJson.getJsonObject("data");
if (!dataJson.getBoolean("passwordVerified")) {
promise.fail("密码验证失败");
return;
}
JsonArray files = dataJson.getJsonArray("files");
if (files == null || files.isEmpty()) {
promise.complete(new ArrayList<>());
return;
}
List<FileInfo> fileList = new ArrayList<>();
for (int i = 0; i < files.size(); i++) {
JsonObject fileJson = files.getJsonObject(i);
FileInfo fileInfo = createFileInfoForList(fileJson, shareId);
fileList.add(fileInfo);
}
promise.complete(fileList);
})
.onFailure(err -> {
log.error("解析目录请求失败: {}", err.getMessage());
promise.fail(err);
});
}
/**
* 为文件列表创建 FileInfo 对象
*/
private FileInfo createFileInfoForList(JsonObject fileJson, String shareId) {
FileInfo fileInfo = new FileInfo();
try {
String fileId = fileJson.getString("fileId");
String fileName = fileJson.getString("fileName");
Long fileSize = fileJson.getLong("fileSize");
Integer fileType = fileJson.getInteger("fileType");
fileInfo.setFileId(fileId);
fileInfo.setFileName(fileName);
fileInfo.setPanType(shareLinkInfo.getType());
// 判断是否为目录
if (fileType != null && fileType == FILE_TYPE_DIRECTORY) {
// 目录类型
fileInfo.setFileType("folder");
fileInfo.setSize(0L);
fileInfo.setSizeStr("0B");
// 设置目录解析的URL - fileId 需要进行 URL 编码以保持特殊字符的编码状态
try {
String encodedFileId = URLEncoder.encode(fileId, "UTF-8");
fileInfo.setParserUrl(String.format("%s/v2/getFileList?url=%s&dirId=%s",
getDomainName(),
shareLinkInfo.getShareUrl(),
encodedFileId));
} catch (UnsupportedEncodingException e) {
log.error("URL编码失败: {}", e.getMessage());
// 降级方案:直接使用原始 fileId
fileInfo.setParserUrl(String.format("%s/v2/getFileList?url=%s&dirId=%s",
getDomainName(),
shareLinkInfo.getShareUrl(),
fileId));
}
} else {
// 文件类型
fileInfo.setFileType(fileType != null ? String.valueOf(fileType) : DEFAULT_FILE_TYPE);
fileInfo.setSize(fileSize);
fileInfo.setSizeStr(FileSizeConverter.convertToReadableSize(fileSize));
// 创建参数JSON并编码为Base64
JsonObject paramJson = JsonObject.of(
"shareId", shareId,
"fileId", fileId
);
String paramBase64 = Base64.getEncoder().encodeToString(paramJson.encode().getBytes());
// 设置解析URL和预览URL
fileInfo.setParserUrl(String.format("%s/v2/redirectUrl/%s/%s",
getDomainName(),
shareLinkInfo.getType(),
paramBase64))
.setPreviewUrl(String.format("%s/v2/viewUrl/%s/%s",
getDomainName(),
shareLinkInfo.getType(),
paramBase64));
}
} catch (Exception e) {
log.warn("创建文件信息失败: {}", e.getMessage());
}
return fileInfo;
}
@Override
public Future<String> parseById() {
Promise<String> parsePromise = Promise.promise();
try {
// 从参数中获取解析所需的信息
JsonObject paramJson = (JsonObject) shareLinkInfo.getOtherParam().get("paramJson");
String shareId = paramJson.getString("shareId");
String fileId = paramJson.getString("fileId");
// 调用获取下载链接
getDownURLForById(shareId, fileId, parsePromise);
} catch (Exception e) {
parsePromise.fail("解析参数失败: " + e.getMessage());
}
return parsePromise.future();
}
/**
* 根据文件ID获取下载URL (用于 parseById)
*/
private void getDownURLForById(String shareId, String fileId, Promise<String> promise) {
String uuid = UUID.randomUUID().toString();
JsonArray fileIds = JsonArray.of(fileId);
String apiUrl = API_URL_PREFIX + "packageDownloadWithFileIds";
client.postAbs(apiUrl)
.putHeaders(HEADERS)
.sendJsonObject(JsonObject.of("fileIds", fileIds, "shareId", shareId, "browserId", uuid))
.onSuccess(res -> {
JsonObject resJson = asJson(res);
if (resJson.containsKey("result")) {
if (resJson.getBoolean("result")) {
JsonObject dataJson = resJson.getJsonObject("data");
String downloadUrl = dataJson.getString("downloadUrl");
if (downloadUrl == null) {
promise.fail("Result JSON数据异常: downloadUrl不存在");
return;
}
// 获取重定向链接
clientNoRedirects.getAbs(downloadUrl).send()
.onSuccess(res2 -> promise.complete(res2.headers().get("Location")))
.onFailure(err -> promise.fail(err));
} else {
promise.fail(resJson.getString("errcode") + ": " + resJson.getString("errmsg"));
}
} else {
promise.fail("Result JSON数据异常: result字段不存在");
}
}).onFailure(err -> promise.fail(err));
}
private void getDownURL(String key, String fileId) {
String uuid = UUID.randomUUID().toString();
JsonArray fileIds = JsonArray.of(fileId);
String apiUrl2 = API_URL_PREFIX + "packageDownloadWithFileIds";
// {"fileIds":[123],"shareId":"xxx","browserId":"uuid"}
client.postAbs(apiUrl2)
.putHeaders(HEADERS)
.sendJsonObject(JsonObject.of("fileIds", fileIds, "shareId", key, "browserId", uuid))
.onSuccess(res -> {
JsonObject resJson = asJson(res);
@@ -89,4 +335,51 @@ public class LeTool extends PanBase {
}
}).onFailure(handleFail(apiUrl2));
}
/**
* Create FileInfo object from JSON response
* Uses exact field names from the API response without fallback checks
*/
private FileInfo createFileInfo(JsonObject fileInfoJson) {
FileInfo fileInfo = new FileInfo();
try {
// Set fileId
String fileId = fileInfoJson.getString("fileId");
if (fileId != null) {
fileInfo.setFileId(fileId);
}
// Set fileName
String fileName = fileInfoJson.getString("fileName");
if (fileName != null) {
fileInfo.setFileName(fileName);
}
// Set file size
Long fileSize = fileInfoJson.getLong("fileSize");
if (fileSize != null) {
fileInfo.setSize(fileSize);
// Convert to readable size string
fileInfo.setSizeStr(FileSizeConverter.convertToReadableSize(fileSize));
}
// Set fileType (API returns it as an integer)
Integer fileTypeInt = fileInfoJson.getInteger("fileType");
if (fileTypeInt != null) {
fileInfo.setFileType(String.valueOf(fileTypeInt));
} else {
// Default to generic file type if not available
fileInfo.setFileType(DEFAULT_FILE_TYPE);
}
// Set panType
fileInfo.setPanType(shareLinkInfo.getType());
} catch (Exception e) {
log.warn("Error extracting file info from JSON: {}", e.getMessage());
}
return fileInfo;
}
}

View File

@@ -11,14 +11,12 @@ import io.vertx.core.Promise;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientSession;
import org.apache.commons.lang3.RegExUtils;
import org.openjdk.nashorn.api.scripting.ScriptObjectMirror;
import javax.script.ScriptException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -29,13 +27,14 @@ import java.util.regex.Pattern;
*/
public class LzTool extends PanBase {
public static final String SHARE_URL_PREFIX = "https://wwwwp.lanzoup.com";
WebClientSession webClientSession = WebClientSession.create(clientNoRedirects);
public static final String SHARE_URL_PREFIX = "https://w1.lanzn.com/";
MultiMap headers0 = HeaderUtils.parseHeaders("""
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cache-Control: max-age=0
Cookie: codelen=1; pc_ad1=1
DNT: 1
Priority: u=0, i
Sec-CH-UA: "Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"
@@ -63,6 +62,25 @@ public class LzTool extends PanBase {
.putHeaders(headers0)
.send().onSuccess(res -> {
String html = asText(res);
if (html.contains("var arg1='")) {
webClientSession = WebClientSession.create(clientNoRedirects);
setCookie(html);
webClientSession.getAbs(sUrl)
.putHeaders(headers0)
.send().onSuccess(res2 -> {
String html2 = asText(res2);
doParser(html2, pwd, sUrl);
});
} else {
doParser(html, pwd, sUrl);
}
}).onFailure(handleFail(sUrl));
return promise.future();
}
private void doParser(String html, String pwd, String sUrl) {
try {
setFileInfo(html, shareLinkInfo);
} catch (Exception e) {
@@ -76,40 +94,68 @@ public class LzTool extends PanBase {
try {
String jsText = getJsByPwd(pwd, html, "document.getElementById('rpt')");
ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, "down_p");
getDownURL(sUrl, client, scriptObjectMirror);
getDownURL(sUrl, scriptObjectMirror);
} catch (Exception e) {
fail(e, "js引擎执行失败");
}
} else {
}
else {
// 没有密码
String iframePath = matcher.group(1);
client.getAbs(SHARE_URL_PREFIX + iframePath).send().onSuccess(res2 -> {
String html2 = res2.bodyAsString();
// 去TMD正则
String absoluteURI = SHARE_URL_PREFIX + iframePath;
webClientSession.getAbs(absoluteURI).putHeaders(headers0).send().onSuccess(res2 -> {
String html2= asText(res2);
// Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'(\\w+)'").matcher(html2);
String jsText = getJsText(html2);
if (jsText == null) {
fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": js脚本匹配失败, 可能分享已失效");
headers0.add("Referer", absoluteURI);
setCookie(html2);
webClientSession.getAbs(absoluteURI).send().onSuccess(res3 -> {
String html3= asText(res3);
String jsText3 = getJsText(html3);
if (jsText3 != null) {
try {
ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText3, null);
getDownURL(sUrl, scriptObjectMirror);
} catch (ScriptException | NoSuchMethodException e) {
fail(e, "引擎执行失败");
}
} else {
fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": 获取失败0, 可能分享已失效");
return;
}
});
} else {
try {
ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, null);
getDownURL(sUrl, client, scriptObjectMirror);
getDownURL(sUrl, scriptObjectMirror);
} catch (ScriptException | NoSuchMethodException e) {
fail(e, "js引擎执行失败");
}
}
}).onFailure(handleFail(SHARE_URL_PREFIX));
}
}).onFailure(handleFail(sUrl));
return promise.future();
}
private void setCookie(String html2) {
int beginIndex = html2.indexOf("arg1='") + 6;
String arg1 = html2.substring(beginIndex, html2.indexOf("';", beginIndex));
String acw_sc__v2 = AcwScV2Generator.acwScV2Simple(arg1);
// 创建一个 Cookie 并放入 CookieStore
DefaultCookie nettyCookie = new DefaultCookie("acw_sc__v2", acw_sc__v2);
nettyCookie.setDomain(".lanzn.com"); // 设置域名
nettyCookie.setPath("/"); // 设置路径
nettyCookie.setSecure(false);
nettyCookie.setHttpOnly(false);
webClientSession.cookieStore().put(nettyCookie);
}
private String getJsByPwd(String pwd, String html, String subText) {
String jsText = getJsText(html);
if (jsText == null) {
throw new RuntimeException("js脚本匹配失败, 可能分享已失效");
throw new RuntimeException("获取失败1, 可能分享已失效");
}
jsText = jsText.replace("document.getElementById('pwd').value", "\"" + pwd + "\"");
int i = jsText.indexOf(subText);
@@ -131,7 +177,7 @@ public class LzTool extends PanBase {
return html.substring(startPos, endPos).replaceAll("<!--.*-->", "");
}
private void getDownURL(String key, WebClient client, Map<String, ?> obj) {
private void getDownURL(String key, Map<String, ?> obj) {
if (obj == null) {
fail("需要访问密码");
return;
@@ -163,7 +209,7 @@ public class LzTool extends PanBase {
headers.set("referer", key);
// action=downprocess&signs=%3Fctdf&websignkey=I5gl&sign=BWMGOF1sBTRWXwI9BjZdYVA7BDhfNAIyUG9UawJtUGMIPlAhACkCa1UyUTAAYFxvUj5XY1E7UGFXaFVq&websign=&kd=1&ves=1
String url = SHARE_URL_PREFIX + url0;
client.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> {
webClientSession.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> {
try {
JsonObject urlJson = asJson(res2);
String name = urlJson.getString("inf");
@@ -178,7 +224,6 @@ public class LzTool extends PanBase {
String downUrl = urlJson.getString("dom") + "/file/" + urlJson.getString("url");
headers.remove("Referer");
WebClientSession webClientSession = WebClientSession.create(client);
webClientSession.getAbs(downUrl).putHeaders(headers).send()
.onSuccess(res3 -> {
String location = res3.headers().get("Location");
@@ -195,12 +240,13 @@ public class LzTool extends PanBase {
nettyCookie.setPath("/"); // 设置路径
nettyCookie.setSecure(false);
nettyCookie.setHttpOnly(false);
webClientSession.cookieStore().put(nettyCookie);
webClientSession.getAbs(downUrl).putHeaders(headers).send()
WebClientSession webClientSession2 = WebClientSession.create(clientNoRedirects);
webClientSession2.cookieStore().put(nettyCookie);
webClientSession2.getAbs(downUrl).putHeaders(headers).send()
.onSuccess(res4 -> {
String location0 = res4.headers().get("Location");
if (location0 == null) {
fail(downUrl + " -> 直链获取失败, 可能分享已失效");
fail(downUrl + " -> 直链获取失败2, 可能分享已失效");
} else {
setDateAndComplate(location0);
}
@@ -248,9 +294,24 @@ public class LzTool extends PanBase {
String sUrl = shareLinkInfo.getShareUrl();
String pwd = shareLinkInfo.getSharePassword();
WebClient client = clientNoRedirects;
client.getAbs(sUrl).send().onSuccess(res -> {
webClientSession.getAbs(sUrl).send().onSuccess(res -> {
String html = res.bodyAsString();
// 检查是否需要 cookie 验证
if (html.contains("var arg1='")) {
webClientSession = WebClientSession.create(clientNoRedirects);
setCookie(html);
// 重新请求
webClientSession.getAbs(sUrl).send().onSuccess(res2 -> {
handleFileListParse(res2.bodyAsString(), pwd, sUrl, promise);
}).onFailure(err -> promise.fail(err));
return;
}
handleFileListParse(html, pwd, sUrl, promise);
}).onFailure(err -> promise.fail(err));
return promise.future();
}
private void handleFileListParse(String html, String pwd, String sUrl, Promise<List<FileInfo>> promise) {
try {
String jsText = getJsByPwd(pwd, html, "var urls =window.location.href");
ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, "file");
@@ -261,8 +322,27 @@ public class LzTool extends PanBase {
MultiMap headers = getHeaders(sUrl);
String url = SHARE_URL_PREFIX + "/filemoreajax.php?file=" + data.get("fid");
client.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> {
JsonObject fileListJson = asJson(res2);
webClientSession.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> {
String resBody = asText(res2);
// 再次检查是否需要 cookie 验证
if (resBody.contains("var arg1='")) {
setCookie(resBody);
// 重新请求
webClientSession.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res3 -> {
handleFileListResponse(asText(res3), promise);
}).onFailure(err -> promise.fail(err));
return;
}
handleFileListResponse(resBody, promise);
}).onFailure(err -> promise.fail(err));
} catch (ScriptException | NoSuchMethodException e) {
promise.fail(e);
}
}
private void handleFileListResponse(String responseBody, Promise<List<FileInfo>> promise) {
try {
JsonObject fileListJson = new JsonObject(responseBody);
if (fileListJson.getInteger("zt") != 1) {
promise.fail(baseMsg() + fileListJson.getString("info"));
return;
@@ -301,12 +381,9 @@ public class LzTool extends PanBase {
list.add(fileInfo);
});
promise.complete(list);
});
} catch (ScriptException | NoSuchMethodException e) {
} catch (Exception e) {
promise.fail(e);
}
});
return promise.future();
}
void setFileInfo(String html, ShareLinkInfo shareLinkInfo) {

View File

@@ -1,11 +1,13 @@
package cn.qaiu.parser.impl;
import cn.qaiu.entity.FileInfo;
import cn.qaiu.entity.ShareLinkInfo;
import cn.qaiu.parser.PanBase;
import cn.qaiu.util.FileSizeConverter;
import io.vertx.core.Future;
import io.vertx.core.MultiMap;
import io.vertx.core.json.JsonObject;
import io.vertx.uritemplate.UriTemplate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <a href="https://passport2.chaoxing.com">超星云盘</a>
@@ -19,24 +21,135 @@ public class PcxTool extends PanBase {
public Future<String> parse() {
client.getAbs(shareLinkInfo.getShareUrl())
.send().onSuccess(res -> {
// 'download': 'https://d0.ananas.chaoxing.com/download/de08dcf546e4dd88a17bead86ff6338d?at_=1740211698795&ak_=d62a3acbd5ce43e1e8565b67990691e4&ad_=8c4ef22e980ee0dd9532ec3757ab19f8&fn=33.c'
String body = res.bodyAsString();
// 获取download
String str = "var fileinfo = {";
String fileInfo = res.bodyAsString().substring(res.bodyAsString().indexOf(str) + str.length() - 1
, res.bodyAsString().indexOf("};") + 1);
fileInfo = fileInfo.replace("'", "\"");
JsonObject jsonObject = new JsonObject(fileInfo);
String download = jsonObject.getString("download");
if (download.contains("fn=")) {
try {
// 提取文件信息
setFileInfo(body);
// 直接用正则提取download链接
String download = extractDownloadUrl(body);
if (download != null && download.contains("fn=")) {
complete(download);
} else {
fail("获取下载链接失败: 不支持的文件类型: {}", jsonObject.getString("suffix"));
fail("获取下载链接失败");
}
} catch (Exception e) {
fail("解析文件信息失败: {}", e.getMessage());
}
}).onFailure(handleFail(shareLinkInfo.getShareUrl()));
return promise.future();
}
/**
* 从HTML中提取download链接
*/
private String extractDownloadUrl(String html) {
// 匹配 'download': 'https://xxx' 或 "download": "https://xxx"
Pattern pattern = Pattern.compile("['\"]download['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
/**
* 从HTML中提取文件信息并设置到shareLinkInfo
*/
private void setFileInfo(String html) {
try {
FileInfo fileInfo = new FileInfo();
// 提取文件名:从<title>标签或文件名input
String fileName = extractByRegex(html, "<title>([^<]+)</title>");
if (fileName == null) {
fileName = extractByRegex(html, "<input id=\"filename\" type=\"hidden\" value=\"([^\"]+)\"");
}
// 提取文件大小:'filesize': 'xxx' 或 "filesize": "xxx"
String fileSizeStr = extractByRegex(html, "['\"]filesize['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
Long fileSize = null;
if (fileSizeStr != null) {
try {
fileSize = Long.parseLong(fileSizeStr);
} catch (NumberFormatException ignored) {}
}
// 提取文件类型/后缀:'suffix': 'xxx' 或 "suffix": "xxx"
String suffix = extractByRegex(html, "['\"]suffix['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 提取objectId文件ID'objectId': 'xxx' 或 "objectId": "xxx"
String objectId = extractByRegex(html, "['\"]objectId['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 提取创建者:'creator': 'xxx' 或 "creator": "xxx"
String creator = extractByRegex(html, "['\"]creator['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 提取上传时间:'uploadDate': timestamp
String uploadDate = extractByRegex(html, "['\"]uploadDate['\"]\\s*:\\s*(\\d+)");
// 提取缩略图:'thumbnail': 'xxx' 或 "thumbnail": "xxx"
String thumbnail = extractByRegex(html, "['\"]thumbnail['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 设置文件信息
if (fileName != null) {
fileInfo.setFileName(fileName);
}
if (fileSize != null) {
fileInfo.setSize(fileSize);
fileInfo.setSizeStr(FileSizeConverter.convertToReadableSize(fileSize));
}
if (suffix != null) {
fileInfo.setFileType(suffix);
}
if (objectId != null) {
fileInfo.setFileId(objectId);
}
if (creator != null) {
fileInfo.setCreateBy(creator);
}
if (uploadDate != null) {
try {
long timestamp = Long.parseLong(uploadDate);
// 转换为日期格式
java.time.Instant instant = java.time.Instant.ofEpochMilli(timestamp);
java.time.LocalDateTime dateTime = java.time.LocalDateTime.ofInstant(instant,
java.time.ZoneId.systemDefault());
fileInfo.setCreateTime(dateTime.format(
java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
} catch (NumberFormatException ignored) {}
}
if (thumbnail != null) {
fileInfo.setPreviewUrl(thumbnail);
}
fileInfo.setPanType(shareLinkInfo.getType());
// 将文件信息存储到shareLinkInfo的otherParam中
shareLinkInfo.getOtherParam().put("fileInfo", fileInfo);
} catch (Exception e) {
log.warn("提取文件信息失败: {}", e.getMessage());
}
}
/**
* 使用正则表达式提取内容
*/
private String extractByRegex(String text, String regex) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
// public static void main(String[] args) {
// String s = new PcxTool(ShareLinkInfo.newBuilder().shareUrl("https://pan-yz.cldisk.com/external/m/file/953658049102462976")

22
pom.xml
View File

@@ -25,14 +25,16 @@
<packageDirectory>${project.basedir}/web-service/target/package</packageDirectory>
<vertx.version>4.5.22</vertx.version>
<!-- Vert.x 4.5.24 已包含安全修复,无需单独指定 Netty 版本 -->
<vertx.version>4.5.14</vertx.version>
<org.reflections.version>0.10.2</org.reflections.version>
<lombok.version>1.18.38</lombok.version>
<slf4j.version>2.0.5</slf4j.version>
<slf4j.version>2.0.16</slf4j.version>
<commons-lang3.version>3.18.0</commons-lang3.version>
<commons-beanutils2.version>2.0.0</commons-beanutils2.version>
<jackson.version>2.14.2</jackson.version>
<logback.version>1.5.19</logback.version>
<jackson.version>2.18.2</jackson.version>
<!-- Logback 最新稳定版 -->
<logback.version>1.5.18</logback.version>
<junit.version>4.13.2</junit.version>
</properties>
@@ -46,6 +48,18 @@
<scope>import</scope>
</dependency>
<!-- 统一管理 logback 版本 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>cn.qaiu</groupId>
<artifactId>core</artifactId>

View File

@@ -400,7 +400,7 @@ export default {
const data = result.data
// 检查是否支持目录解析
const supportedPans = ["iz", "lz", "fj", "ye"]
const supportedPans = ["iz", "lz", "fj", "ye", "le"]
if (!supportedPans.includes(data.shareLinkInfo.type)) {
this.$message.error("当前网盘不支持目录解析")
return

View File

@@ -18,7 +18,7 @@ playground:
# 是否启用演练场默认false不启用
enabled: true
# 公开模式默认false需要密码访问设为true则无需密码
public: true
public: false
# 访问密码,建议修改默认密码!
password: 'nfd_playground_2024'