书源找不到想看的书?花20分钟给ReadCat写一个专属书源插件
2026/8/14 2:36:30 网站建设 项目流程

书源找不到想看的书?花20分钟给ReadCat写一个专属书源插件

【免费下载链接】read-cat一款免费、开源、简洁、纯净、无广告的小说阅读器项目地址: https://gitcode.com/gh_mirrors/re/read-cat

“等一下,这书我明明在XX网站在线看,ReadCat里怎么搜不到?”——这是很多刚用上这款开源小说阅读器的用户第一句吐槽。原因其实很简单:ReadCat默认不携带任何书源插件,所有在线内容都靠你亲手导入或编写。好消息是,写一个能搜索、能看详情、能读正文的插件,全程只需要实现3个方法,你完全可以在一个午休时间里搞定自己的第一个专属书源。

为什么书源插件是ReadCat的灵魂

ReadCat定位是免费、开源、简洁、纯净、无广告的小说阅读器,它把“内容从哪来”这件事完全交给插件系统。插件跑在独立的JavaScript沙箱里,既不污染主程序,也让你可以放心粘贴自己写的代码。

所有插件的类型定义都集中在src/core/plugins/defined/booksource.d.ts,先花两分钟读一遍,你会发现它短得惊人——书源只需要三样东西:搜索、详情、正文。

第一关:给插件办一张“身份证”

ReadCat插件管理器在导入时会做严格校验(src/core/plugins/index.ts),身份证字段一个都不能少。照抄这个骨架,把值换成你自己的:

class MyBookSource { static ID = 'myBookSource_123456789'; // 16~32位,只允许字母数字和-_,别乱改 static TYPE = 0; // 0=书源,1=书城,2=TTS朗读 static GROUP = '原创'; static NAME = '我的小说源'; static VERSION = '1.0.0'; static VERSION_CODE = 1; static PLUGIN_FILE_URL = ''; // 留空代表不提供在线更新 static BASE_URL = 'https://example.com'; // 目标网站根地址 constructor({ request, cheerio }) { this.request = request; // 帮你封装好的网络请求,自动处理编码和代理 this.cheerio = cheerio; // 服务端版jQuery,解析HTML就靠它 } }

避坑提醒ID是插件唯一的身份证,导入时重复会直接报错“Plugin exists”。取个够长又独特的ID,能少踩一个坑。

第二关:点亮三个核心技能

接口定义在src/core/plugins/defined/booksource.d.ts,一共就三个方法,逐个点亮即可。

技能一:search——让用户搜得到你的书

async search(searchkey) { const { body } = await this.request.get( `${BookSource.BASE_URL}/search?q=${encodeURIComponent(searchkey)}` ); const $ = this.cheerio.load(body); return $('.book-item').map((_, el) => ({ bookname: $(el).find('.name').text(), // 书名 author: $(el).find('.author').text(), // 作者 detailPageUrl: $(el).find('a').attr('href'), // 详情页链接,必填 coverImageUrl: $(el).find('img').attr('src'), // 封面,可选 })).get(); }

看到没?ReadCat连encodeURIComponent都不限制你用,沙箱里给足了常用能力。返回的SearchEntity字段名必须严格对上:booknameauthordetailPageUrl

技能二:getDetail——把目录完整搬下来

用户点击一本书后,ReadCat会带着详情页链接来敲门:

async getDetail(detailPageUrl) { const { body } = await this.request.get(detailPageUrl); const $ = this.cheerio.load(body); const chapterList = $('.chapter-list a').map((i, el) => ({ title: $(el).text(), url: $(el).attr('href'), index: i, })).get(); return { bookname: $('.book-title').text(), author: $('.book-author').text(), coverImageUrl: $('.book-cover').attr('src'), intro: $('.book-intro').text(), chapterList, // 章节数组,一个都不能漏 }; }

技能三:getTextContent——把正文干干净净交出来

这是阅读体验的生死线。ReadCat会在你返回后自动对正文做HTML消毒,所以这里只负责取回正文,别塞广告脚本之类的脏东西进去:

async getTextContent(chapter) { const { body } = await this.request.get(chapter.url); const $ = this.cheerio.load(body); // 挑出正文节点,按段落切成数组返回 return $('#content').text().split(/\n+/).filter(t => t.trim()); }

chapter{ title, url, index }结构,直接按url请求即可。返回string[],每个元素是一段文字。

第三关:导入验证,见证奇迹

写完保存为my-source.js,打开ReadCat →设置 → 插件→ 点击导入,选中文件,插件就进入列表了。然后回到搜索页搜一本书——如果一路顺畅,你的书架里就会多出一个能用的新书源。

想在开发时快速看日志?ReadCat内置了插件调试窗口(相关代码在electron/plugin-devtools.ts),可以观察插件运行时的 console 输出,排查选择器写错这类问题会快很多。

常见错误:搜索不到结果时,八成是选择器没写对。先用浏览器打开目标网站按F12确认.book-item这类类名真的存在,再回到插件里跑。

从“能跑”到“好用”的进阶清单

三个方法跑通只是起点,想让插件值得被收藏,建议再做三件事:

  1. 错误处理:每个方法包一层try/catch,网站改版或断网时给出友好提示,而不是直接报红。
  2. 图片代理:部分网站封面防盗链,给coverImageUrl走一下项目里的代理配置能提升显示成功率。
  3. 参数化BASE_URL:如果网站有多域名镜像,把地址抽成变量,改一处即可全插件生效。

完整实现可参考src/core/plugins/built-in/tts/edge.ts这个内置TTS插件,它是官方沙箱写法的活教材。

下一步行动:现在就打开src/core/plugins/defined/booksource.d.ts对照接口,挑一个你常逛的小说网站,按“身份证→三技能→导入”的顺序走一遍。第一版不求完美,能搜到、能点开、能读就及格了。等你写完第一个书源,你大概就能体会到——开源阅读器真正的自由,是内容来源由你说了算

【免费下载链接】read-cat一款免费、开源、简洁、纯净、无广告的小说阅读器项目地址: https://gitcode.com/gh_mirrors/re/read-cat

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询