小说解析 1.6.0:在原来的壳里加一个下载中心,特别感谢 YunX


这次不是把“小说解析”重新拉回抓取主线,而是在原有 App 壳里补一个独立的下载工具箱。功能参考了 CYQawa/YunX,外观仍然沿用原来的蓝白卡片、六宫格底栏和本地服务结构;排版可以变,设计语言没有换。
先说清楚边界
YunX 是一个很完整的 Android 网盘 / 视频解析下载器,Kotlin + Compose,支持夸克、UC、迅雷、百度、139、123、115、光鸭、蓝奏云,也覆盖抖音、小红书、快手、微博、AcFun、B 站和 Pixiv。它解决的是“登录之后,把平台里的文件或媒体拿下来”。
小说解析不是原生 Compose,而是 Java WebView + Chaquopy Python 本地服务,所以不能直接把 Kotlin 代码搬进来。这次做的是同设计语言下的轻量版:
- 下载管理:公开直链、Range 分片、暂停继续、断点记录、任务持久化;
- 链接识别:识别上述网盘 / 视频 / 图集平台,显示平台、类型和提取码;
- 公开媒体探测:抓取公开页面里的
og:video、og:image、<video>、<img>等媒体地址; - 多平台登录入口:原生 WebView 登录遮罩,登录完成后把 Cookie 保存到本机。
边界必须写明白:这一版没有实现夸克、UC、百度等平台的私有文件列表接口,也没有绕过登录、付费墙或 DRM。平台私有接口要跟登录态、风控和账号权限打交道,不适合用“公开页面抓取”糊过去;当前能实际下载的是公开直链和公开媒体,网盘链接先做识别、提取码和登录入口,后续再按平台规则逐个适配。这个缺口比“看起来什么都能下”更重要,所以放在文章最前面。
为什么是第六个底栏,而不是新做一个 App
小说解析原来的底栏是五个:书架、解析、设置、反馈、关于。这次在“解析”和“设置”之间插入了第六个「下载」,顺序是 书架 → 解析 → 下载 → 设置 → 反馈 → 关于。
没有另起一套界面,也没有把原来的阅读器、导出、书架改掉。下载页继续用现有 CSS 变量、圆角卡片、浅色背景和蓝色主按钮;只新增了下载任务条、平台 chips、媒体网格这些局部组件。换句话说:排版可以调整,外观风格没有换。

下载内核:不依赖第三方下载器
下载中心落在 Python 本地服务里,文件保存在 App 数据目录的 downloads/,任务元数据写在 tasks.json,分片临时文件用 .part 后缀。它不经过云端中转,也不把下载内容上传到服务器。
具体行为:
- 先 HEAD,拿不到
Content-Length再退回 GET; - 支持 Range 时按 4 MB 一片、4 线程并发,每片完成后写进临时文件;
- 暂停只停调度,不删已下载分片;继续时从已有分片续传;
- 任务状态区分
new / queued / running / paused / done / error,失败可以重试; - 文件名会做清洗,HTML 页面会被拒绝当成文件下载,避免“点一下下回来一个登录页”。
实测下载一个 23.6 MB 的 APK,状态从 running 到 done,文件大小和 MD5 都对得上。之前遇到过一个状态机 bug:任务初始写成 queued,start 判断到队列状态就直接 return,任务永远不动;后来改成初始 new,只有 running 才跳过。这类问题不在 UI 上,只有真的跑一次下载才会露出来。
链接识别:先知道它是什么,再决定能不能下
解析入口可以贴一整段分享文案,也可以只贴 URL。识别结果会返回:
- 平台:夸克、UC、迅雷、百度、移动云盘、123、115、光鸭、蓝奏云 / 优享版;
- 类型:网盘、视频、图集、直链;
- 提取码:从
提取码:xxxx、pwd=、password=这类写法里取; - 是否可直接下载:普通
.mp4 / .jpg / .zip / .pdf / .apk / .bin这类直链返回downloadable:true,网盘分享返回false,避免误把分享页 HTML 当文件下下来。
这一步不承诺“识别出来就能下”。它的作用是先把平台、类型和提取码摆清楚,再让下载按钮只在真正有直链的时候可用。
公开媒体探测:给图集和视频一个入口
对公开页面,服务会抓取 og:title、og:image、og:video,再补上页面里的 <video>、<source>、<img> 和可下载链接。返回标题、封面和媒体项列表,前端用网格展示,点单项可以加入下载。
测试一个本地 HTML,返回了 4 项:一个视频、一张图片、一个 zip,说明探测链路是通的。它仍然只处理“公开页面里已经给出的地址”,不会去解平台的私有播放接口。
多平台登录:Cookie 只留在本机
网页端不能直接弹系统浏览器登录再拿 Cookie,所以 Android 端加了一个原生 WebView 登录遮罩:
- 下载页选择平台,点「打开登录页」;
- 原生 Activity 打开对应平台登录页,顶部有取消和完成;
- 用户完成登录后点完成,
CookieManager读取当前 URL 的 Cookie; - 通过 JS 回调
window.onPlatformCookie把 Cookie 交给本地服务; - 服务保存到
accounts.json,账号列表接口只返回hasCookie,不返回 Cookie 本体。
登录页开启了第三方 Cookie,避免部分平台跳转后拿不到会话。Cookie 只用于本机探测公开页面,不往服务器同步;账号删除也只是删本地文件。
外观与版本
这次版本号是 1.6.0(versionCode 9),包名仍是 com.novelparse.pro,minSdk 30、targetSdk 34,签名沿用原来的 keystore。构建环境是 Gradle 8.7 + JDK 17 + Android SDK 34,release APK 约 24 MB。
下载页底部和「关于」页底部都加了 YunX 的归属说明;文章末尾再单独致谢一次。没有把 YunX 的 Kotlin 源码复制进来,也没有把 AGPL 代码混进本项目;这里参考的是功能边界、交互顺序和信息架构,代码仍是本项目自己的 Java / Python / HTML 实现。
怎么试
- APK:https://dl.foldx.cn/novelparse-1.6.0.apk(24 MB,MD5
269ad0f69663e8eb9c16ffe3065f6979) - GitHub:foldx-cn/novel-parse-pro-retrospective
- YunX:https://github.com/CYQawa/YunX
如果你只想要一个“贴直链就能下、能暂停继续、能在手机里打开”的小工具,这一版已经可用;如果你期待它像 YunX 一样登录后直接列出网盘文件,那还需要继续做平台适配。这个差距我会留在明面上,不靠文案补。
特别感谢
本项目的下载管理、链接识别、公开媒体探测和多平台登录入口,参考自 CYQawa/YunX。YunX 以 AGPL-3.0 开源,作者把网盘、视频、图集、下载、登录这些完整链路整理得非常清楚;没有这份开源参考,这次改版不会这么快落地。特别感谢 CYQawa 的分享。
本文及新增代码仅用于学习与个人工具,不绕过登录、付费墙或 DRM;请遵守各平台服务条款和内容版权。
