荏染柔木
https://m.po18.xyz/
zpccool (13551) 16小时前 下载:315
小说 小说
该用户很懒,什么介绍也没有写!
// @name 荏染柔木
// @uuid renranroumu
// @version 1.0.0
// @author AI
// @url https://m.po18.xyz/
// @type novel
// @enabled true
// @tags 小说
var source = {
name: "荏染柔木",
url: "https://m.po18.xyz/",
searchUrl: "/s.php,{\"method\":\"POST\",\"body\":\"type=articlename&s={{key}}\"}",
exploreUrl: "综合::/wapsort/16_{{page}}.html\n校园::/wapsort/1_{{page}}.html\n都市::/wapsort/2_{{page}}.html\n古代::/wapsort/3_{{page}}.html\n网游::/wapsort/4_{{page}}.html\n科幻::/wapsort/5_{{page}}.html\n玄幻::/wapsort/6_{{page}}.html\n奇幻::/wapsort/7_{{page}}.html\n穿越::/wapsort/8_{{page}}.html\n历史::/wapsort/9_{{page}}.html\n耽美::/wapsort/10_{{page}}.html\n高干::/wapsort/11_{{page}}.html\n同人文::/wapsort/12_{{page}}.html\n种田::/wapsort/13_{{page}}.html\n同人::/wapsort/14_{{page}}.html\n其他::/wapsort/15_{{page}}.html"
};
async function search(keyword, page) {
var url = source.url + "s.php";
var body = "type=articlename&s=" + encodeURIComponent(keyword);
var html = await legado.http.post(url, body, {});
return parseSearch(html);
}
function parseSearch(html) {
var doc = legado.dom.parse(html);
var items = legado.dom.selectAll(doc, ".common-bookele");
var books = [];
for (var i = 0; i < items.length; i++) {
var el = items[i];
var a = legado.dom.select(el, "a");
if (!a) continue;
var href = legado.dom.attr(a, "href") || "";
var m = href.match(/\/novel\/(\d+)\.html/);
if (!m) continue;
var id = m[1];
books.push({
name: legado.dom.text(a),
author: legado.dom.selectText(el, "strong") || "",
bookUrl: source.url + "novel/list/" + id + "/1.html",
coverUrl: "",
intro: ""
});
}
legado.dom.free(doc);
return books;
}
async function explore(page, category) {
if (category === "GETALL" || !category) {
return source.exploreUrl.split("\n").map(function(line) {
return line.split("::")[0];
});
}
var lines = source.exploreUrl.split("\n");
var catUrl = "";
for (var j = 0; j < lines.length; j++) {
var parts = lines[j].split("::");
if (parts[0] === category && parts[1]) { catUrl = parts[1]; break; }
}
if (!catUrl) return [];
catUrl = catUrl.replace("{{page}}", String(page || 1));
var baseUrl = source.url.replace(/\/+$/, "");
var path = catUrl.replace(/^\/+/, "");
var url = baseUrl + "/" + path;
var html = await legado.http.get(url, {});
return parseExplore(html);
}
function parseExplore(html) {
var doc = legado.dom.parse(html);
var allLinks = legado.dom.selectAll(doc, "a");
var books = [];
for (var i = 0; i < allLinks.length; i++) {
var link = allLinks[i];
var href = legado.dom.attr(link, "href") || "";
if (href.indexOf("/novel/") < 0) continue;
if (href.indexOf(".html") < 0) continue;
if (href.indexOf("/list/") >= 0) continue;
var m = href.match(/\/novel\/(\d+)\.html$/);
if (!m) continue;
var id = m[1];
var text = legado.dom.text(link) || "";
if (!text || text === "上一页" || text === "下一页") continue;
books.push({
name: text,
author: "",
bookUrl: source.url + "novel/list/" + id + "/1.html",
coverUrl: "",
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 title = legado.dom.selectText(doc, "title") || "";
var idx = title.lastIndexOf("-");
if (idx > 0) title = title.substring(0, idx).trim();
var idx2 = title.indexOf("PO18");
if (idx2 === 0) title = title.substring(4).trim();
var introEl = legado.dom.select(doc, "pre");
var intro = introEl ? legado.dom.text(introEl).replace(/\[\s\S]*?\]/g, "").trim() : "";
legado.dom.free(doc);
return {
name: title,
author: "",
coverUrl: "",
intro: intro,
kind: "",
lastChapter: "",
tocUrl: bookUrl,
wordCount: ""
};
}
async function chapterList(tocUrl) {
var html = await legado.http.get(tocUrl, {});
var doc = legado.dom.parse(html);
var links = legado.dom.selectAll(doc, "a");
var chapters = [];
var urlMap = {};
for (var i = 0; i < links.length; i++) {
var link = links[i];
var href = legado.dom.attr(link, "href") || "";
var cm = href.match(/\/novel\/(\d+)\/(\d+)\.html$/);
if (!cm) continue;
var name = legado.dom.text(link) || "";
if (!name) continue;
var chapterUrl = source.url + "novel/" + cm[1] + "/" + cm[2] + ".html";
if (urlMap[chapterUrl]) continue;
urlMap[chapterUrl] = true;
chapters.push({
name: name,
url: chapterUrl
});
}
var nextMatch = tocUrl.match(/\/list\/[^/]+\/(\d+)(?:\.html)?$/);
if (nextMatch) {
var curPage = parseInt(nextMatch[1], 10);
var nextUrl = tocUrl.replace(/\/(\d+)(?:\.html)?$/, "/" + (curPage + 1) + ".html");
var nextHtml = await legado.http.get(nextUrl, {});
var nextDoc = legado.dom.parse(nextHtml);
var nextLinks = legado.dom.selectAll(nextDoc, "a");
for (var j = 0; j < nextLinks.length; j++) {
var nl = nextLinks[j];
var nh = legado.dom.attr(nl, "href") || "";
var nm = nh.match(/\/novel\/(\d+)\/(\d+)\.html$/);
if (!nm) continue;
var nn = legado.dom.text(nl) || "";
if (!nn) continue;
var nurl = source.url + "novel/" + nm[1] + "/" + nm[2] + ".html";
if (urlMap[nurl]) continue;
urlMap[nurl] = true;
chapters.push({ name: nn, url: nurl });
}
legado.dom.free(nextDoc);
}
legado.dom.free(doc);
return chapters;
}
async function chapterContent(chapterUrl) {
var html = await legado.http.get(chapterUrl, {});
var doc = legado.dom.parse(html);
var content = legado.dom.selectText(doc, "#nr1") || "";
legado.dom.free(doc);
return formatContent(content.trim());
}
function formatContent(text) {
if (!text) return "";
text = text.replace(/ /g, " ");
text = text.replace(/<br\s*\/?>/gi, "\n");
text = text.replace(/<\/p>/gi, "\n\n");
text = text.replace(/<p[^>]*>/gi, "");
text = text.replace(/<[^>]+>/g, "");
text = text.replace(/[ \t]+/g, " ");
text = text.replace(/\n{3,}/g, "\n\n");
text = text.replace(/^\s+|\s+$/gm, "");
return text;
}