尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

手写ReadCat书源插件要几步?3个方法搞定全网小说自由阅读

手写ReadCat书源插件要几步?3个方法搞定全网小说自由阅读 手写ReadCat书源插件要几步3个方法搞定全网小说自由阅读【免费下载链接】read-cat一款免费、开源、简洁、纯净、无广告的小说阅读器项目地址: https://gitcode.com/gh_mirrors/re/read-cat你有没有遇到过这种场景心仪的小说只在某个小众网站连载默认书源里搜遍全网也找不到最后只能打开浏览器忍受满屏弹窗广告这正是书源插件的用武之地。ReadCat作为一款免费、开源、简洁纯净的小说阅读器把连接任意小说网站做成了插件化的能力。这篇文章将带你亲手写一个属于自己的书源插件让ReadCat真正成为你的私人书架。一句话看懂书源插件到底是什么如果把网站比作一座座语言各异的图书馆书源插件就是你的随行翻译官——它负责把每个网站藏在HTML里的书名、作者、章节、正文翻译成ReadCat统一认识的数据格式。翻译得越准确你在阅读器里看到的书就越完整。想3分钟验证这个概念在本地任意目录新建一个my-novel-source.js把下面这段骨架代码写进去这只是一个空壳作用是通过ReadCat的插件校验帮你建立最小可行体验class MyNovelSource { static ID mynovelsource_000001; static TYPE 0; // 0 代表书源 static GROUP 我的源; static NAME 示例书源; static VERSION 1.0.0; static VERSION_CODE 1; static PLUGIN_FILE_URL ; static BASE_URL https://example.com; async search(searchkey) { return []; } async getDetail(detailPageUrl) { return null; } async getTextContent(chapter) { return []; } } plugin.exports MyNovelSource;把这行代码做的事记在心里它声明了插件的身份证ID、名称、分组、版本和三个方法再通过plugin.exports把类交给ReadCat的插件运行时。之后在ReadCat的插件管理页导入这个文件能导入成功、不报错你就已经迈出了第一步。✨小贴士插件是在src/core/plugins/index.ts的沙箱中运行的你不需要担心文件里有什么危险代码影响主程序——ReadCat用隔离环境接管了执行这本身就是一种安全保障。三个核心方法串起一本小说的完整旅程接口的权威定义在 src/core/plugins/defined/booksource.d.ts核心其实只有三个方法恰好对应你阅读一本书的三个必经阶段。搜索怎么让用户第一眼找到书search接收用户输入的关键词返回一个结果数组。每个结果最少要有bookname、author、detailPageUrl三个字段封面和最新章节是加分项async search(searchkey) { const { body } await this.request.get(${this.constructor.BASE_URL}/search?q${searchkey}); const $ this.cheerio.load(body); return $(.book-item).map((i, el) ({ bookname: $(el).find(.name).text().trim(), author: $(el).find(.author).text().trim(), detailPageUrl: $(el).find(a).attr(href), })).get(); }为什么用this.request和this.cheerio这是构造函数注入给你的两件利器request帮你绕过跨域问题直接抓网页cheerio则像jQuery一样帮你精准地抠出DOM里的数据。记住你的书源不需要自己发Http请求更不需要自己写正则硬啃HTML。详情怎么把整本书的骨架搭起来getDetail负责把一个搜索结果变成一本书——补全封面、简介更重要的是解析出完整的章节列表chapterListasync getDetail(detailPageUrl) { const { body } await this.request.get(detailPageUrl); const $ this.cheerio.load(body); return { bookname: $(#bookname).text().trim(), author: $(#author).text().trim(), coverImageUrl: $(#cover).attr(src), intro: $(#intro).text().trim(), chapterList: $(.chapter-list a).map((i, el) ({ title: $(el).text().trim(), url: $(el).attr(href), index: i, // 顺序从0开始别漏了 })).get(), }; }注意chapterList里每个章节的index是从0递增的这个顺序就是阅读器里章节列表的排序依据漏掉它会导致章节乱序。正文怎么把网页正文变成干净的阅读页getTextContent是阅读体验的核心。它返回的不是一段字符串而是一个字符串数组——数组里的每个元素就是正文的一段阅读器会按段渲染async getTextContent(chapter) { const { body } await this.request.get(chapter.url); const $ this.cheerio.load(body); return $(#content).html().split(br).map(v $(v).text().trim()).filter(v v); }为什么是数组这样段落天然分离既方便排版也方便后续做翻页、缓存。另外要注意ReadCat在拿到正文后会自动做一次HTML消毒见src/core/plugins/index.ts中对getTextContent的拦截处理把不安全的标签和空段落过滤掉所以你不需要在插件里过度清洗专注把内容抠出来就好。避坑指南新手最容易翻车的4个细节❌错误插件ID随手写个my-source结果导入时报ID格式不规范。✅正确做法插件ID长度必须在16到32位之间只能包含字母、数字、下划线和连字符。稳妥起见用来源名随机后缀比如mynovelsource_8f3a2b1c。校验逻辑在src/core/plugins/index.ts的_isPlugin里值得读一读。❌错误TYPE忘了写或写错导致插件被当成书城甚至语音引擎加载。✅正确做法TYPE是插件类型的数字代号0书源、1书城、2语音引擎TTS。写书源就一定填0否则校验直接拒绝。❌错误正则抠数据时.text()和.attr()混用抠出来一堆undefined。✅正确做法记住三类数据的取法——文本用.text().trim()链接和图片地址用.attr(href)/.attr(src)原始HTML用.html()。写完后用console.log打印一遍结果再继续。❌错误search和getDetail返回null或漏字段页面白屏却没报错。✅正确做法对照src/core/book/book.d.ts里SearchEntity、DetailEntity、Chapter三个接口逐字段核对。缺了必填字段宁可返回空数组也别返回null。进阶提升两个让开发效率翻倍的小技巧用内置插件开发工具实时调试ReadCat内置了插件开发工具位于 electron/plugin-devtools.ts核心逻辑在 src/core/plugin-devtools/index.ts。导入.rpdt开发工具包后你可以直接粘贴书源代码一键运行search、getDetail、getTextContent实时看返回结果和日志再也不用导入→搜索→失败→改→再导入的笨循环。每次改动即时生效调试速度直接翻倍。用插件级缓存给书源提速构造函数注入的store参数提供了getStoreValue/setStoreValue相当于每个插件专属的小型缓存库。对高频变化的请求比如首页推荐列表可以把结果缓存几分钟async search(searchkey) { const cached await this.store.getStoreValue(search:${searchkey}); if (cached) return cached; const result await this.doSearch(searchkey); await this.store.setStoreValue(search:${searchkey}, result); return result; }这样既减少了请求次数、降低被网站封IP的风险也明显加快了二次搜索的响应速度。从第一个方法开始把想看变成能读回头看一个书源插件不过三件事搜索帮用户找到书详情帮用户打开书正文帮用户读上书。整个过程没有高深算法拼的是对接口规范的理解和对HTML的耐心。现在就去动手吧——先克隆https://gitcode.com/gh_mirrors/re/read-cat这个仓库对照 src/core/plugins/defined/booksource.d.ts 看一遍接口定义再拿一个结构简单的网站练手写通你的第一个search方法。记住每个被社区广泛使用的优秀书源都是从第一行async search开始的。你的下一本书可能就藏在你写的第三十行代码里。【免费下载链接】read-cat一款免费、开源、简洁、纯净、无广告的小说阅读器项目地址: https://gitcode.com/gh_mirrors/re/read-cat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表