蚂蚁文学

https://www.mayiwsk.com

oldbruce (7756) 6小时前 下载:145

小说 免费 小说



V1.2.5

1. 修复发现功能

2. 经测试,该网站每次搜索结果只有一页,搜索功能不再优化

-----------------------------------------------------------------------------------------------------------------

V1.2.1存在问题

1. 搜索只能显示第一页,后续分页搜索结果与第一页相同,建议直接用书名全名搜索

2. 发现不可用

二维码导入(APP尚未完成该功能)
// @uuid        019e29f8-dd0b-70b7-a38c-ce9ddf1ab871
// @name        蚂蚁文学
// @version     1.2.5
// @author      oldbruce
// @url         https://www.mayiwsk.com
// @url         https://m.mayiwsk.com
// @logo        https://www.mayiwsk.com/favicon.ico
// @enabled     true
// @minDelay     300
// @tags        免费,小说
// @description 蚂蚁文学小说源,支持搜索、分类、详情、目录与章节解析

var BASE = 'https://www.mayiwsk.com';
var UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Safari/537.36';

var CATEGORY_MAP = {
  '玄幻小说': '/xuanhuanxiaoshuo/',
  '修真小说': '/xiuzhenxiaoshuo/',
  '都市小说': '/dushixiaoshuo/',
  '穿越小说': '/chuanyuexiaoshuo/',
  '网游小说': '/wangyouxiaoshuo/',
  '科幻小说': '/kehuanxiaoshuo/',
  '悬疑小说': '/xuanyixiaoshuo/',
  '历史小说': '/lishixiaoshuo/',
  '军事小说': '/junshixiaoshuo/',
  '言情小说': '/yanqingxiaoshuo/',
  '其他小说': '/qitaxiaoshuo/',
  '全本小说': '/quanben/',
  '排行榜': '/paihangbang/'
};

var CATEGORIES = Object.keys(CATEGORY_MAP).map(function (title) {
  return { title: title, url: BASE + CATEGORY_MAP[title] };
});

function getCategoryUrl(type) {
  if (!type) return '';
  if (type.indexOf('http') === 0) return type;
  if (CATEGORY_MAP[type]) return BASE + CATEGORY_MAP[type];
  var normalizedPath = type;
  if (normalizedPath.indexOf('/') !== 0) normalizedPath = '/' + normalizedPath;
  return BASE + normalizedPath;
}

// ─────────────────────────────
// 搜索
// ─────────────────────────────
async function search(keyword, page) {
  legado.log('蚂蚁文学 search: ' + keyword + ' fetch all pages');
  var books = [];
  var addedUrls = {};
  var currentPage = 1;
  var maxPages = 1; // 限制为1页,因为官网搜索只显示1页
  var currentUrl = BASE + '/modules/article/search.php?searchkey=' + encodeURIComponent(keyword) + '&searchtype=articlename&page=' + currentPage;
  var headers = { 'User-Agent': UA, 'Referer': BASE + '/' };

  while (currentPage <= maxPages) {
    legado.log('蚂蚁文学 search page=' + currentPage + ' url=' + currentUrl);
    var html = await legado.http.get(currentUrl, headers);
    if (!html) break;

    var doc = legado.dom.parse(html);
    var items = legado.dom.selectAll(doc, 'tr#nr');
    if (!items || items.length === 0) {
      items = legado.dom.selectAll(doc, 'tbody tr');
    }
    legado.log('蚂蚁文学 search page=' + currentPage + ' items=' + (items ? items.length : 0));
    if (!items || items.length === 0) {
      legado.dom.free(doc);
      break;
    }

    for (var i = 0; i < items.length; i++) {
      var row = items[i];
      var linkEl = legado.dom.select(row, 'td:nth-child(1) a');
      var name = legado.dom.selectText(row, 'td:nth-child(1) a');
      var bookUrl = absUrl(legado.dom.attr(linkEl, 'href'));
      if (!bookUrl || addedUrls[bookUrl]) continue;
      addedUrls[bookUrl] = true;
      var latestChapter = legado.dom.selectText(row, 'td:nth-child(2) a');
      var latestChapterUrl = absUrl(legado.dom.attr(legado.dom.select(row, 'td:nth-child(2) a'), 'href'));
      var author = legado.dom.selectText(row, 'td:nth-child(3)');
      var updateTime = legado.dom.selectText(row, 'td:nth-child(5)');
      books.push({
        name: name,
        author: author,
        bookUrl: bookUrl,
        coverUrl: '',
        latestChapter: latestChapter,
        latestChapterUrl: latestChapterUrl,
        updateTime: updateTime,
        status: ''
      });
    }

    legado.dom.free(doc);
    // 由于官网搜索只显示1页,停止循环
    break;
  }

  legado.log('蚂蚁文学 search total result count: ' + books.length);
  return books;
}

// ─────────────────────────────
// 分类 / 发现页
// ─────────────────────────────
async function explore(page, type) {
  page = page || 1;
  legado.log('蚂蚁文学 explore: page=' + page + ' type=' + type);

  if (!type || type === 'GETALL') {
    return Object.keys(CATEGORY_MAP);
  }

  // 由于官网分类只显示1页,防止无限加载
  if (page > 1) {
    return [];
  }

  var path = CATEGORY_MAP[type] || type;
  if (!path) return [];

  var url = BASE + path;
  legado.log('[EXPLORE] 请求 URL: ' + url);
  var headers = { 'User-Agent': UA, 'Referer': BASE + '/' };
  var html = await legado.http.get(url, headers);
  if (!html) return [];

  var doc = legado.dom.parse(html);
  var items = legado.dom.selectAll(doc, '.novelslist2 li');
  if (!items || items.length === 0) items = legado.dom.selectAll(doc, '.novelslist li');
  if (!items || items.length === 0) items = legado.dom.selectAll(doc, '#main li');

  var books = [];
  var addedUrls = {};
  for (var i = 0; i < items.length; i++) {
    var item = items[i];
    var link = legado.dom.select(item, 'a');
    if (!link) continue;
    var name = legado.dom.text(link).trim();
    if (!name || name === '文章名称') continue;
    var bookUrl = absUrl(legado.dom.attr(link, 'href'));
    if (!bookUrl || addedUrls[bookUrl]) continue;
    addedUrls[bookUrl] = true;

    var author = '';
    var authorEl = legado.dom.select(item, '.s2, .author, span');
    if (authorEl) author = legado.dom.text(authorEl).replace(/作者[::]\s*/, '').trim();

    books.push({
      name: name,
      author: author,
      bookUrl: bookUrl,
      coverUrl: '',
      kind: type,
      intro: ''
    });
  }

  legado.dom.free(doc);
  return books;
}

// ── 书籍详情 ─────────────────────────────────────
async function bookInfo(bookUrl) {
  var html = await legado.http.get(bookUrl);
  var doc = legado.dom.parse(html);
  var name = legado.dom.attr(legado.dom.select(doc, 'meta[property="og:novel:book_name"]'), 'content');
  if (!name) { name = legado.dom.selectText(doc, '#info h1'); }

  var author = legado.dom.attr(legado.dom.select(doc, 'meta[property="og:novel:author"]'), 'content');
  if (!author) { author = legado.dom.selectText(doc, '#info p:first-of-type').replace(/作\s*者[::]/, ''); }

  var coverUrl = absUrl(legado.dom.attr(legado.dom.select(doc, '#fmimg img'), 'src'));
  var intro = legado.dom.selectText(doc, '#intro');

  var latestChapter = legado.dom.attr(legado.dom.select(doc, 'meta[property="og:novel:latest_chapter_name"]'), 'content');
  if (!latestChapter) { latestChapter = legado.dom.selectText(doc, '#info p:last-of-type a'); }

  var latestChapterUrl = absUrl(legado.dom.attr(legado.dom.select(doc, '#info p:last-of-type a'), 'href'));

  var updateTime = legado.dom.attr(legado.dom.select(doc, 'meta[property="og:novel:update_time"]'), 'content');
  if (!updateTime) { updateTime = legado.dom.selectText(doc, '#info p:nth-child(3)').replace(/最后更新[::]/, ''); }

  var chapterCount = legado.dom.selectAll(doc, '#list dd').length;

  var info = {
    name: name,
    author: author,
    bookUrl: bookUrl,
    tocUrl: bookUrl,
    coverUrl: coverUrl,
    intro: intro,
    latestChapter: latestChapter,
    latestChapterUrl: latestChapterUrl,
    chapterCount: chapterCount,
    updateTime: updateTime,
    status: ''
  };
  legado.dom.free(doc);
  return info;
}

// ─────────────────────────────
// 章节目录
// ─────────────────────────────
async function chapterList(tocUrl) {
  var html = await legado.http.get(tocUrl);
  var doc = legado.dom.parse(html);
  var dds = legado.dom.selectAll(doc, '#list dd');
  var chapters = [];
  for (var i = 0; i < dds.length; i++) {
    chapters.push({
      name: legado.dom.selectText(dds[i], 'a'),
      url: absUrl(legado.dom.attr(legado.dom.select(dds[i], 'a'), 'href'))
    });
  }
  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 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(/本章未完|加入书签|章节报错|请收藏|手机阅读|推荐本书|最新地址[::]*[^\n]*/g, '')
             .replace(/\n{3,}/g, '\n\n').trim();
}
广告