蚂蚁文学
https://www.mayiwsk.com
oldbruce (7756) 6小时前 下载:145
小说 免费 小说
V1.2.5
1. 修复发现功能
2. 经测试,该网站每次搜索结果只有一页,搜索功能不再优化
-----------------------------------------------------------------------------------------------------------------
V1.2.1存在问题
1. 搜索只能显示第一页,后续分页搜索结果与第一页相同,建议直接用书名全名搜索
2. 发现不可用
// @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();
}