
折腾开源阅读APP这件事我从最早用手机自带阅读器到后来陆陆续续试过七八个商业小说APP绕了一大圈最后还是回到这个开源项目上。原因说起来很简单它本身不提供任何内容只是一个干净的阅读外壳所有的书都来自你自己导入的书源。这意味着没有开屏广告、没有会员弹窗、没有试读三章请付费2613个书源听起来挺唬人但本质上就是2613套从哪里、按什么规则把正文抓下来的配置文件。我从2019年前后开始攒书源手机里删了又装、装了又删最后稳定下来的也就几十个能长期用。这篇就把我这些年折腾阅读APP、书源格式、导入方法、TTS 引擎和一堆踩坑经验完整梳理一遍不管你是第一次听说还是已经用过一阵子应该都能捞到点有用的东西。1. 开源阅读APP到底是干什么的先搞懂它的底层逻辑1.1 壳与数据分离为什么它敢说无广告理解这个软件最关键的一句话就是它是壳不是内容源。APP本体是一个托管在代码托管平台上的开源项目任何人可以下载源码、自己编译、自己改。作者没有服务器要养没有版权内容要买也没有广告商要接所以它天然就不需要靠弹窗和会员来变现。你打开它书架是空的搜索是搜不出结果的因为这时候它只是一个空壳。内容从哪来从书源来。书源是一份配置文件里面写清楚了某个网站的搜索接口长什么样、列表怎么解析、目录页的章节链接怎么提取、正文段落该怎么抓。你把这份配置导入APPAPP就按图索骥去那个网站把内容抓回来排版后展示给你看。所以同一个APP导入不同的书源能搜到的东西、抓取的速度、正文的干净程度完全不一样。很多人第一次用觉得怎么搜不到书十有八九不是软件的问题而是书源没导入、没启用或者导入的那批已经失效了。这个设计的好处是极强的可扩展性。今天某个站点倒了你换一个书源就行软件本身不用动。坏处也很明显书源需要维护站点一改版规则就可能失效这是所有用这类工具的人都躲不开的日常。1.2 和市面商业阅读APP的正面对比我把两类产品放在一起做了张表方便你直观判断自己该选哪条路。需要提前说明的是下面说的都是功能层面和使用体感不涉及任何版权判断正版付费阅读永远是值得支持的方向。对比项开源阅读APP典型商业阅读APP广告本体无广告开屏、章节间常见会员体系无有部分内容付费内容来源自己导入的书源平台自有书库格式支持支持导入 TXT、EPUB、部分 MOBI一般仅平台内内容换源一键换源多源对比不支持语音朗读可接系统或第三方 TTS平台内置音色固定隐私无账号数据本地或自建同步需登录数据在云端上手门槛需要理解书源概念装完即用维护成本书源会失效需不定期更新无从表里能看出来它把内容这一块完全交给了用户。你要省心商业APP更合适你要的是自由、干净、可控那这个开源壳子才是你的菜。我个人两个都用追正版新书用商业APP看一些冷门、跨平台的内容就用它。1.3 什么人适合折腾什么人真的别碰用了这么多年我大概能判断出谁适合、谁不适合。适合的看书口味杂一个平台满足不了经常要在好几个站之间切换的人对广告和弹窗极度敏感宁可花时间研究配置也不想看开屏的人喜欢本地导入 TXT、EPUB自己整理书库的人对隐私比较在意不想注册账号、不想让阅读记录上云的人愿意每周花五分钟维护一下书源的人。不太适合的只想装完就能看不想理解任何概念的人完全不能接受某天突然搜不到书需要换源的人需要平台级正版保障、想要作者分成支持的人。先把预期摆正后面用起来就不会有那么多落差感。这个软件不是万能免费阅读器它更像一把瑞士军刀好用但你得会用。2. 书源文件长什么样JSON结构与抓取原理拆解2.1 一个最小可用书源的结构书源本质是一个 JSON 对象几个核心字段撑起全部逻辑。下面这个示例我用了保留域名example.com只是为了让结构看得清楚字段含义是通用的{ bookSourceName: 示例站点, bookSourceUrl: https://www.example.com, bookSourceGroup: 自用, bookSourceType: 0, searchUrl: /search?keyword{{key}}page{{page}}, ruleSearch: { bookList: css:.book-item, name: css:.book-nametext, author: css:.authortext, bookUrl: css:ahref, coverUrl: css:imgsrc, intro: css:.introtext }, ruleBookInfo: { name: css:h1text, author: css:.info .authortext, intro: css:#introtext, tocUrl: }, ruleToc: { chapterList: css:#list dd a, chapterName: text, chapterUrl: href }, ruleContent: { content: css:#contenttext, nextContentUrl: } }几个字段单个拆开看bookSourceUrl是站点主域名所有相对路径都基于它拼接searchUrl里的{{key}}会被替换成你搜索的关键词{{page}}是页码ruleSearch负责在搜索结果页里定位每一本书ruleBookInfo处理详情页ruleToc抓目录ruleContent抓正文。这四段就是书源的骨架缺一段这个源就不完整。注意书源里的域名一定是真实存在的公开网站地址导入前先确认域名能正常打开域名都打不开的书源规则写得再漂亮也没用。2.2 四段式规则搜索、详情、目录、正文各管什么搜索规则决定你能不能搜到。它的核心是bookList也就是一条搜索结果的选择器。选错了可能整个搜索页只抓到一条或者一条都抓不到。列表里的name、author、bookUrl是必备三件套bookUrl尤其关键它是通往详情页的钥匙取错了会导致点进去就报错。有些站点搜索结果直接就是章节页这时候bookUrl指向的就是目录逻辑上一样成立。详情规则负责补全书名、作者、简介、封面这些信息。有的站点详情页信息很全有的很简陋甚至有的源干脆把详情页规则留空直接从搜索页带过来的信息拼凑。这不算错只是体验差一点。目录规则是最考验规则功底的地方。chapterList要能选中所有章节节点chapterName取章节名一般是textchapterUrl取章节链接一般是href。难点在于很多站点的目录是分页的或者正文页里直接带下一章链接这时候就要靠nextContentUrl这类下一页字段来补。我见过不少书源正文只能读一章就是目录或下一章规则没配好。正文规则的目标是把纯净的正文抠出来。理想情况下content一个选择器就能选中div idcontent里的所有段落但现实里很多站点会在正文里塞推广链接、作者的话、随机水印所以还要配合字符串替换把杂七杂八的东西清掉。2.3 规则语法速览正则、CSS、XPath 都要懂一点书源的规则语法其实是混合体这是新手最容易懵的地方。常见的几种写法默认正则式早期书源大量使用正则提取比如classbook-name(.*?)/a直接把匹配到的捕获组当结果css:前缀走 CSS 选择器比如css:.list li atexttext表示取文本href、src表示取属性json:前缀针对返回 JSON 的接口用 JSONPath 取值XPath:前缀走 XPath 路径##替换在取到结果后做二次清洗比如css:#contenttext##广告|推广把广告推广这两类词删掉{{}}变量用来拼接动态参数搜索关键词、页码、作者名等都可能用到。理解了这个混合体系你再看任何一份书源就能大致判断它写得规不规范。一般来说用css:的比纯正则可读性好得多纯正则的书源改起来非常痛苦因为一旦站点结构变了你要重新推一遍正则。2.4 判断一个书源值不值得留的硬指标不是书源越多越好。2613个听起来壮观但实际上能稳定用的可能不到十分之一。我通常按这几个指标筛搜索能否出结果拿一个常见关键词测比如随便一个高频词能搜出条目才算活着正文是否干净点进去看有没有大量站名水印、随机字符、分段粘连目录是否完整多看几本书确认不是只能抓最近几章是否需要登录需要登录才能看正文的源直接用不了除非站点开放了游客接口抓取速度太慢的源看书会一直转圈体验极差是否支持换源能和其他源互相印证的书通常质量更稳。我一般会保留 20 到 40 个通过上面测试的源够用了。剩下的全删不然每次搜索要等几百个源轮询一遍反而拖慢速度。3. 书源导入实操从2613条到真正可用的书架3.1 导入前的准备与格式确认书源导入的格式实际用到的就那么几种JSON 文件单个源或源数组、TXT 文本一行一个链接、网络链接指向一个 JSON 地址、二维码扫码导入。你拿到别人的2613个书源合集先别急着导入做两件事第一看一下文件编码和格式。如果是一个大 JSON 数组导入前用编辑器打开确认方括号闭合正常中间没有多余逗号否则导入会报数据格式错误。第二确认里面没有重复的bookSourceUrl。重复导入同一个源APP 会提示跳过但大量重复会让列表非常乱最好先去重再导。提示大合集尽量在电脑上先整理用文本编辑器做全局替换和去重比在手机上一条条删快得多。3.2 本地文件导入的标准步骤以常见的开源阅读类APP为例本地导入路径大体一致打开APP进入书源管理或我的-书源管理点右上角的菜单选择本地导入或从文件导入系统会拉起文件选择器找到你放好的.json或.txt文件选中后APP会解析解析完成会提示发现 N 条书源是否导入确认导入等待进度条走完回到书源列表检查是否全部勾选为启用状态。整个流程最常出问题的是第 4 步。如果文件里有非法字符、编码是 GBK 而APP按 UTF-8 解析就会直接失败。遇到这种情况用编辑器把文件另存为 UTF-8 编码基本能解决。3.3 网络导入与二维码导入怎么用网络导入适合别人给你一个在线地址的场景。在书源管理里选网络导入把形如https://xxx/booksource.json的地址粘贴进去APP会自己下载并解析。注意地址要能直接访问到原始 JSON不能是需要登录才能看的页面也不能是网盘分享页。二维码导入适合手机之间传递。把书源内容生成二维码在APP里选二维码导入扫码即可。这个方式一次能带的量有限适合分享几个精选源不适合导几千条的大合集二维码会复杂到扫不出来。我个人的习惯是大合集走文件导入精选源走二维码或者剪贴板。剪贴板导入也很方便复制一段 JSON 内容在书源管理里选从剪贴板导入APP会自动识别。3.4 2613个书源怎么筛选校验、分组、去重导入完成只是开始真正的功夫在筛选。我的做法是第一步批量校验。大多数阅读APP在书源管理里有校验书源功能它会拿一批测试关键词去跑每个源能出结果的标记为有效出不来的标记为失效。跑一遍动辄十几分钟但比手动一个个点强太多。第二步按分组归类。把通过的源按类型分组比如常用备用漫画出版。分组的好处是一键切换搜索范围不用每次全库轮询。第三步去重。重复源主要表现为域名相同、规则相似。去重标准是看bookSourceUrl相同域名且规则明显重复的只留一个。第四步定期复检。我大概每隔一个月跑一次校验把新失效的清掉。别攒攒到几百个失效源一起搜速度会让人抓狂。4. 阅读体验优化TTS、排版、缓存一个都别落下4.1 TTS语音引擎怎么挑这事有讲究TTS文字转语音是这个软件很加分的一块。它本身不带语音引擎靠调用系统或第三方 TTS。我用下来选择逻辑是这样的系统自带 TTS优点是零配置、稳定、耗电低缺点是音色机械长句断句偶尔别扭。适合通勤路上随便听听第三方 TTS 应用很多是开源项目支持导入更自然的音色模型中文朗读的流畅度明显好一截。配置时需要在系统设置里把默认 TTS 引擎切换过去再回到阅读APP里把朗读引擎指定为它多引擎组合有的开源 TTS 支持同时挂多个引擎按语言或场景切换比如中文用 A、英文用 B。调 TTS 时我关注三个参数语速别超过 1.2 倍再快就容易吞字音调默认就好调高会显得尖停顿长句的断句能力取决于引擎本身如果读起来断得奇怪可以在阅读APP里把按标点分段打开让它把长句拆短再送进 TTS。注意第三方 TTS 大多需要额外的语音数据包首次使用要联网下载下载完离线也能用。别在流量套餐里手滑下几十兆的模型。4.2 排版、字号和翻页的调优排版这块看起来琐碎但直接影响你每天看书的舒适度。我固定的几套设置正文字号手机用 18sp 左右平板可以到 22sp眼睛不累行距1.5 倍是舒适区间太密会累太疏翻页频繁段间距适中能让长段落有呼吸感背景色白天用米黄夜里用深灰或纯黑比纯白背景护眼翻页模式我偏爱上下滑动比仿真翻页更省事也更容易控制阅读节奏。这些设置都能在阅读界面的排版菜单里调调好后一般会记住不用每次改。有人喜欢用阅读主题一键切换我建议先手动调一次理解每个参数在干什么再决定用不用主题包。4.3 离线缓存与失效书源的处理离线缓存对通勤党太重要了。在目录页长按或者选中缓存全部APP会把已抓到的章节存到本地。缓存完就能断网看。要注意的是缓存依赖书源当时能不能抓到内容如果缓存那一刻正好源失效缓存下来的就是空白得回头重新抓。失效书源的判断有几个明显信号搜索没结果、点开章节一直转圈、正文一片空白、提示内容为空。遇到这些别急着重装APP先在书源管理里做一次校验大概率是那批源的问题。确认是源的问题后去换一个可用的源或者用换源功能让APP自动在已启用的源里找一个能抓的。换源功能是这个软件最实用的功能之一同一本书换三个源总有一个能读。5. 常见问题与排查技巧实录5.1 搜索为空、正文空白、乱码怎么破这三类是我遇到频率最高的问题排查看下表就够用现象最可能原因排查动作搜索完全没结果书源全部失效或未启用检查启用状态跑一次书源校验搜到但点进去报错详情页规则失效换一个源读同一本书目录能看但正文空白正文规则失效或被反爬换源或检查正文是否需要 referer正文出现乱码站点编码非 UTF-8在规则里声明编码或换源只能读前几章目录分页未处理检查是否有下一页规则朗读没声音TTS 引擎未授权或未选检查系统 TTS 设置和APP内引擎选择排查顺序永远是先看源是否启用再看源是否失效最后才怀疑APP本身。我见过太多人一上来就重装APP其实问题全在源那边。5.2 批量校验与长期维护的正确姿势书源维护不是一次性的活。我的节奏是每周随手用一次换源功能看哪些源最近不行了每月跑一次全量校验清掉失效源换季时整体更新一次合集网上流传的最新书源合集更新挺快挑几个口碑好的补充进来。校验时建议分批跑比如先跑 200 个看通过率再决定要不要继续别一上来就把几千个全跑一遍容易卡死。另外校验用的测试关键词也要换着来单一个词可能正好是某个站的冷门词会误判。5.3 独家避坑清单这些坑我替你踩过了最后把我这些年真实的坑列一下都是文档里不会写的别贪多。书源不是越多越好几百个失效源混在里面搜索一次能等半分钟。精简到几十个足够用别在刚导入完就批量离线缓存。先手动读两本确认源是活的再缓存不然缓存一堆空白备份很重要。书源列表、阅读进度、书架导出一次 JSON 存到网盘或本地换手机时能省大事注意隐私和账号。有些源要求登录能不登就别登也别在源里填自己的账号密码尊重内容来源。书源采集的是公开页面自用可以拿去商用或者大范围传播要谨慎版权意识还是要有的TTS 别开太大声。长时间戴耳机听书伤耳朵音量控制在六成以内比较舒服。6. 一些长期使用之后的想法用到现在我对这套东西的态度已经比较平和了。它不是那种装上就一劳永逸的神器更像是一个需要你定期打理的私人书库。你把书源当成书架上的书脊定期整理一下它就安安静静地给你干活你放着不管某天想看书的时候它就会告诉你搜不到。所以我的建议一直是先花一个晚上把书源体系搭好之后每周花五分钟维护剩下的时间就纯粹用来读书。这个投入产出比其实相当高。还有一个我个人特别喜欢的用法——把本地 TXT 和 EPUB 混着书源内容一起放在书架上。想看的出版书、网上追的连载、随手存的文档全在一个界面里阅读进度还都能同步。这种自己的图书馆的感觉是商业APP给不了的。真要说遗憾就是书源这件事终究要靠社区里一群人的持续付出哪天大家都不更新了这套玩法也就慢慢凉了。所以遇到好用的源偶尔也记得给作者或分享者点个赞这大概就是开源生态最朴素的正循环。