hhhbook

https://hhhbook.com

zpccool (13551) 1天前 下载:428

小说 成人小说
3H淫書 - 色情文學
二维码导入(APP尚未完成该功能)
// @name        hhhbook
// @version     1.0.0
// @uuid        hhhbook
// @author      Ai
// @url         https://hhhbook.com
// @type        novel
// @enabled false
// @tags        成人小说
// @description 3H淫書 - 色情文學

var BASE = 'https://hhhbook.com';

async function explore(page, category) {
  legado.log('explore: page=' + page + ', category=' + category);
  if (category === 'GETALL' || !category) {
    return ['人妻文學', '亂倫文學', '都市生活', '暴力虐待', '校園師生'];
  }
  var catMap = {
    '人妻文學': 'category/%e4%ba%ba%e5%a6%bb%e6%96%87%e5%ad%b8',
    '亂倫文學': 'category/%e4%ba%82%e5%80%ab%e6%96%87%e5%ad%b8',
    '都市生活': 'category/%e9%83%bd%e5%b8%82%e7%94%9f%e6%b4%bb',
    '暴力虐待': 'category/%e6%9a%b4%e5%8a%9b%e8%99%90%e5%be%85',
    '校園師生': 'category/%e6%a0%a1%e5%9c%92%e5%b8%ab%e7%94%9f'
  };
  var path = catMap[category];
  if (!path) return [];
  var url = BASE + '/' + path + (page > 1 ? '/page/' + page : '');
  var html = await legado.http.get(url);
  var doc = legado.dom.parse(html);
  var items = [];
  var links = legado.dom.selectAll(doc, 'h2 a, .entry-title a');
  for (var i = 0; i < links.length; i++) {
    var href = legado.dom.attr(links[i], 'href');
    var name = legado.dom.text(links[i]);
    if (href && name && href.startsWith(BASE)) {
      items.push({
        name: name.trim(),
        author: '',
        bookUrl: href,
        coverUrl: '',
        kind: category,
        lastChapter: ''
      });
    }
  }
  return items;
}

async function bookInfo(bookUrl) {
  legado.log('bookInfo: ' + bookUrl);
  var html = await legado.http.get(bookUrl);
  var doc = legado.dom.parse(html);
  var title = legado.dom.selectText(doc, 'h1');
  var contentDiv = legado.dom.select(doc, 'article') || legado.dom.select(doc, '.entry-content') || legado.dom.select(doc, '.post-content');
  var intro = contentDiv ? legado.dom.text(legado.dom.select(contentDiv, 'p')) : legado.dom.selectText(doc, 'p');
  return {
    name: title,
    author: '',
    coverUrl: '',
    intro: intro,
    kind: '',
    lastChapter: '',
    tocUrl: bookUrl
  };
}

async function chapterList(tocUrl) {
  legado.log('chapterList: ' + tocUrl);
  // 单页小说
  return [{ name: '全文', url: tocUrl }];
}

async function chapterContent(chapterUrl) {
  legado.log('chapterContent: ' + chapterUrl);
  var html = await legado.http.get(chapterUrl);
  var doc = legado.dom.parse(html);
  legado.dom.remove(doc, 'script, nav, header, footer, aside, .sidebar, .widget, .ad');
  var content = legado.dom.select(doc, 'article') || legado.dom.select(doc, '.entry-content') || legado.dom.select(doc, '.post-content') || legado.dom.select(doc, 'body');
  var text = legado.dom.text(content);
  // 去除标题和链接
  text = text.replace(/^\s*#.*$/gm, '');
  text = text.replace(/### .*$/gm, '');
  text = text.replace(/^\s*\[.*\]\(.*\)$/gm, '');
  text = text.replace(/^\s*.*$/gm, '');
  text = text.replace(/^\s*.*$/gm, '');
  text = text.replace(/^\s*.*$/gm, '');
  text = text.replace(/^\s*.*$/gm, '');
  text = text.replace(/^\s*.*$/gm, '');
  text = text.trim();
  return text;
}

async function search(keyword, page) {
  legado.log('search: keyword=' + keyword + ', page=' + page);
  var url = BASE + '/?s=' + encodeURIComponent(keyword) + (page > 1 ? '&paged=' + page : '');
  var html = await legado.http.get(url);
  var doc = legado.dom.parse(html);
  var items = [];
  var links = legado.dom.selectAll(doc, 'h2 a, .entry-title a');
  for (var i = 0; i < links.length; i++) {
    var href = legado.dom.attr(links[i], 'href');
    var name = legado.dom.text(links[i]);
    if (href && name && href.startsWith(BASE) && name.toLowerCase().includes(keyword.toLowerCase())) {
      items.push({
        name: name.trim(),
        author: '',
        bookUrl: href,
        coverUrl: '',
        kind: '',
        lastChapter: ''
      });
    }
  }
  return items;
}

async function TEST(type) {
  if (type === '__list__') return ['search', 'explore'];
  if (type === 'search') {
    var r = await search('人妻', 1);
    if (!r || r.length < 1) return { passed: false, message: '搜索无结果' };
    return { passed: true, message: '搜索返回 ' + r.length + ' 条' };
  }
  if (type === 'explore') {
    var b = await explore(1, '人妻文學');
    if (!b || b.length < 1) return { passed: false, message: '发现页为空' };
    return { passed: true, message: '发现页 ' + b.length + ' 条' };
  }
  return { passed: false, message: '未知: ' + type };
}
广告