Skip to content

快速开始

本节将带你从零创建一个最小可用的书源文件。

前置条件

  • 已安装 Legado Tauri 应用
  • 了解基本的 JavaScript 和 CSS 选择器语法

创建书源文件

在应用的书源目录中创建一个 .js 文件(如 我的书源.js),或使用应用内的书源编辑器。

最小模板

js
// @name        我的书源
// @version     1.0.0
// @author      你的名字
// @url         https://www.example.com
// @logo        https://www.example.com/favicon.ico
// @enabled     true
// @description 示例书源

var BASE = "https://www.example.com";

// ── 搜索 ─────────────────────────────────────────
async function search(keyword, page) {
  var html = await legado.http.get(
    BASE + "/search?q=" + encodeURIComponent(keyword) + "&page=" + page,
  );
  var doc = legado.dom.parse(html);
  var items = legado.dom.selectAll(doc, ".book-item");
  var books = [];
  for (var i = 0; i < items.length; i++) {
    books.push({
      name: legado.dom.selectText(items[i], ".title"),
      author: legado.dom.selectText(items[i], ".author"),
      bookUrl: legado.dom.selectAttr(items[i], "a", "href"),
      coverUrl: legado.dom.selectAttr(items[i], "img", "src"),
      latestChapter: legado.dom.selectText(items[i], ".latest a"),
      latestChapterUrl: legado.dom.selectAttr(items[i], ".latest a", "href"),
      wordCount: legado.dom.selectText(items[i], ".words"),
      updateTime: legado.dom.selectText(items[i], ".updated"),
      status: legado.dom.selectText(items[i], ".status"),
    });
  }
  legado.dom.free(doc);
  return books;
}

// ── 书籍详情 ─────────────────────────────────────
async function bookInfo(bookUrl) {
  var html = await legado.http.get(bookUrl);
  var doc = legado.dom.parse(html);
  var info = {
    name: legado.dom.selectText(doc, "h1"),
    author: legado.dom.selectText(doc, ".author"),
    coverUrl: legado.dom.selectAttr(doc, ".cover img", "src"),
    intro: legado.dom.selectText(doc, ".intro"),
    latestChapter: legado.dom.selectText(doc, ".latest a"),
    latestChapterUrl: legado.dom.selectAttr(doc, ".latest a", "href"),
    wordCount: legado.dom.selectText(doc, ".words"),
    chapterCount:
      Number(legado.dom.selectText(doc, ".chapter-count").replace(/\D/g, "")) ||
      0,
    updateTime: legado.dom.selectText(doc, ".updated"),
    status: legado.dom.selectText(doc, ".status"),
    tocUrl: bookUrl,
  };
  legado.dom.free(doc);
  return info;
}

// ── 章节目录 ─────────────────────────────────────
async function chapterList(tocUrl) {
  var html = await legado.http.get(tocUrl);
  var doc = legado.dom.parse(html);
  var names = legado.dom.selectAllTexts(doc, ".chapter-list a");
  var urls = legado.dom.selectAllAttrs(doc, ".chapter-list a", "href");
  var chapters = [];
  for (var i = 0; i < names.length; i++) {
    chapters.push({ name: names[i], url: urls[i], vip: false });
  }
  legado.dom.free(doc);
  return chapters;
}

// ── 章节正文 ─────────────────────────────────────
async function chapterContent(chapterUrl) {
  var html = await legado.http.get(chapterUrl);
  var doc = legado.dom.parse(html);
  var text = legado.dom.selectText(doc, "#content");
  legado.dom.free(doc);
  return text;
}

验证书源

使用 CLI 工具逐步测试:

bash
# 测试搜索
legado_tauri cli booksource-test ./我的书源.js search 斗破苍穹

# 测试全部功能
legado_tauri cli booksource-test ./我的书源.js all 斗破苍穹

或在应用内打开「书源管理 → 调试」面板进行可视化调试。

VIP 站点可在章节对象中返回 vippricecurrency,并额外实现 purchaseChapter(chapterUrl, chapter)。应用只会在用户确认购买 VIP 章节后调用购买函数,成功后再重试正文读取。

两种网站类型

HTML 站点

大多数网站使用 HTML 页面,通过 legado.http.get() 获取 HTML 后,使用 legado.dom.* 解析:

js
var html = await legado.http.get(url);
var doc = legado.dom.parse(html);
var title = legado.dom.selectText(doc, "h1.title");
legado.dom.free(doc);

JSON API 站点

部分站点提供 JSON API,直接 JSON.parse() 即可:

js
var resp = await legado.http.get("https://api.example.com/books?q=" + keyword);
var data = JSON.parse(resp);
return data.list.map(function (item) {
  return {
    name: item.title,
    bookUrl: item.url,
    author: item.author,
    latestChapter: item.lastChapter,
    wordCount: item.wordCountText,
    chapterCount: item.chapterCount,
    updateTime: item.updateTime,
    status: item.status,
  };
});

下一步

基于 MIT 许可发布