UNPKG

rsshub

Version:
73 lines (71 loc) 2.71 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import { load } from "cheerio"; //#region lib/routes/69shu/article.ts const route = { path: "/article/:id", name: "章节", url: "www.69shuba.cx", maintainers: ["eternasuno"], example: "/69shu/article/47117", parameters: { id: "小说 id, 可在对应小说页 URL 中找到" }, categories: ["reading"], features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["www.69shuba.cx/book/:id.htm"], target: "/article/:id" }], handler: async (ctx) => { const { id } = ctx.req.param(); const link = `https://www.69shuba.cx/book/${id}.htm`; const $ = load(await get(link)); const item = await Promise.all($(".qustime li>a").toArray().map((chapter) => createItem(chapter.attribs.href))); return { title: $("h1>a").text(), description: $(".navtxt>p:first-of-type").text(), link, item, image: $(".bookimg2>img").attr("src"), author: $(".booknav2>p:first-of-type>a").text(), language: "zh-cn" }; } }; const createItem = (url) => cache_default.tryGet(url, async () => { const $ = load(await get(url)); const { articleid, chapterid, chaptername } = parseObject(/bookinfo\s?=\s?{[\S\s]+?}/, $("head>script:not([src])").text()); const decryptionMap = parseObject(/_\d+\s?=\s?{[\S\s]+?}/, $(".txtnav+script").text()); return { title: chaptername, description: decrypt($(".txtnav").html() || "", articleid, chapterid, decryptionMap), link: url }; }); const get = async (url, encoding = "gbk") => new TextDecoder(encoding).decode(await ofetch_default(url, { responseType: "arrayBuffer" })); const parseObject = (reg, str) => { const obj = {}; const match = reg.exec(str); if (match) for (const line of match[0].matchAll(/(\w+):\s?["']?([\S\s]+?)["']?[\n,}]/g)) obj[line[1]] = line[2]; return obj; }; const decrypt = (txt, articleid, chapterid, decryptionMap) => { if (!txt || txt.length < 10) return txt; const lineMap = {}; const articleKey = Number(articleid) + 3061711; const chapterKey = Number(chapterid) + 3421001; for (const key of Object.keys(decryptionMap)) lineMap[(Number(key) ^ chapterKey) - articleKey] = (Number(decryptionMap[key]) ^ chapterKey) - articleKey; return txt.replaceAll(/\u2003|\n/g, "").split("<br><br>").flatMap((line, index, array) => (lineMap[index] ? array[lineMap[index]] : line).split("<br>")).slice(1, -2).join("<br><br>"); }; //#endregion export { route };