Skip to content

小说书源

小说是默认的书源类型,不需要特殊的 @type 标记。

特点

  • chapterContent() 返回纯文本字符串
  • 段落间用 \n 分隔
  • 需要过滤广告噪声文本
  • 可能需要处理多页正文

完整示例

js
// @name        示例小说站
// @version     1.0.0
// @author      开发者
// @url         https://www.example.com
// @enabled     true
// @tags        免费,小说
// @description 示例小说书源

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

function search(keyword, page) {
  var html = legado.http.get(BASE + '/search?q=' + encodeURIComponent(keyword) + '&page=' + page);
  var doc = legado.dom.parse(html);
  var items = legado.dom.selectAll(doc, '.result-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: absUrl(legado.dom.selectAttr(items[i], 'a', 'href')),
      coverUrl: legado.dom.selectAttr(items[i], 'img', 'src')
    });
  }
  legado.dom.free(doc);
  return books;
}

function bookInfo(bookUrl) {
  var html = legado.http.get(bookUrl);
  var doc = legado.dom.parse(html);
  var info = {
    name: legado.dom.selectText(doc, 'h1'),
    author: legado.dom.selectText(doc, '.author'),
    bookUrl: bookUrl,
    tocUrl: bookUrl,
    coverUrl: legado.dom.selectAttr(doc, '.cover img', 'src'),
    intro: legado.dom.selectText(doc, '.intro')
  };
  legado.dom.free(doc);
  return info;
}

function chapterList(tocUrl) {
  var html = legado.http.get(tocUrl);
  var doc = legado.dom.parse(html);
  var names = legado.dom.selectAllTexts(doc, '#list a');
  var urls = legado.dom.selectAllAttrs(doc, '#list a', 'href');
  var chapters = [];
  for (var i = 0; i < names.length; i++) {
    chapters.push({ name: names[i], url: absUrl(urls[i]) });
  }
  legado.dom.free(doc);
  return chapters;
}

function chapterContent(chapterUrl) {
  var html = legado.http.get(chapterUrl);
  var doc = legado.dom.parse(html);
  var text = legado.dom.selectText(doc, '#content');
  legado.dom.free(doc);
  return cleanNoise(text);
}

// ── 工具函数 ──
function absUrl(path) {
  if (!path) return '';
  if (path.indexOf('http') === 0) return path;
  return BASE + (path.charAt(0) === '/' ? '' : '/') + path;
}

function cleanNoise(text) {
  if (!text) return '';
  return text
    .replace(/本章未完|加入书签|章节报错|请收藏|最快更新|手机阅读|天才一秒记住/g, '')
    .replace(/\n{3,}/g, '\n\n')
    .trim();
}

基于 MIT 许可发布