UNPKG

rsshub

Version:
130 lines (127 loc) 4.12 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import { n as parseRelativeDate, t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import "./helpers-DxBp0Pty.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { load } from "cheerio"; //#region lib/routes/kanxue/topic.ts const baseUrl = "https://bbs.kanxue.com/"; const categoryId = { iot: [128, "智能设备"], android: [161, "Android安全"], ios: [166, "iOS安全"], harmonyos: [178, "HarmonyOS安全"], re: [4, "软件逆向"], coding: [41, "编程技术"], unpack: [88, "加壳脱壳"], crypto: [132, "密码应用"], vuln: [150, "二进制漏洞"], ctf: [37, "CTF对抗"], pwn: [171, "Pwn"], web: [151, "WEB安全"], chat: [45, "茶余饭后"], geekzone: [172, "极客空间"], translate: [32, "外文翻译"] }; const route = { path: "/topic/:category?/:type?", categories: ["bbs"], example: "/kanxue/topic/android/digest", parameters: { category: "版块, 缺省为`all`", type: "类型, 缺省为`latest`" }, name: "论坛", maintainers: ["renzhexigua"], handler, description: `| 版块 | category | | -------------- | --------- | | 智能设备 | iot | | Android 安全 | android | | iOS 安全 | ios | | HarmonyOS 安全 | harmonyos | | 软件逆向 | re | | 编程技术 | coding | | 加壳脱壳 | unpack | | 密码应用 | crypto | | 二进制漏洞 | vuln | | CTF 对抗 | ctf | | Pwn | pwn | | WEB 安全 | web | | 茶余饭后 | chat | | 极客空间 | geekzone | | 外文翻译 | translate | | 全站 | all | | 类型 | type | | -------- | ------ | | 最新主题 | latest | | 精华主题 | digest |` }; const timeDiff = 1e3 * 60 * 60 * 24 * 3; async function handler(ctx) { const category = ctx.req.param("category") || "all"; const type = ctx.req.param("type") || "latest"; let path; let title; if (Object.hasOwn(categoryId, category)) if (type === "digest") { path = `forum-${categoryId[category][0]}-1.htm?digest=1`; title = `看雪论坛精华主题 - ${categoryId[category][1]}`; } else { path = `forum-${categoryId[category][0]}.html`; title = `看雪论坛最新主题 - ${categoryId[category][1]}`; } else if (category === "digest") { path = "new-digest.htm"; title = "看雪论坛精华主题"; } else { path = "new-tid.htm"; title = "看雪论坛最新主题"; } const $ = load((await got_default({ method: "get", url: baseUrl + path, headers: { Referer: baseUrl } })).data); const list = $(".thread"); const resultItem = await Promise.all(list ? list.toArray().filter((elem) => { const timeStr = $(".date", elem).eq(0).text(); const pubDate = timeStr.endsWith("前") ? parseRelativeDate(timeStr) : parseDate(timeStr.slice(1)); return !elem.attribs.class.includes("top") || Date.now() - pubDate.valueOf() < timeDiff; }).map((elem) => { const subject = $(".subject a", elem).eq(1); const timeStr = $(".date", elem).eq(0).text(); const pubDate = timeStr.endsWith("前") ? parseRelativeDate(timeStr) : parseDate(timeStr.slice(1)); const link = `${baseUrl}${subject.attr("href")}`; const key = `kanxue: ${link}`; return cache_default.tryGet(key, async () => { const $$1 = load((await got_default({ method: "get", url: link })).data); $$1(".card").eq(0).find(".message img").each((_, item) => { item = $$1(item); const src = item.attr("src"); if (src !== void 0 && !src.startsWith("https://") && !src.startsWith("http://")) item.attr("src", `https://bbs.kanxue.com/${src}`); }); const description = $$1(".card").eq(0).find(".message").html(); return { title: subject.text(), link, pubDate, description }; }); }) : []); return { title, link: baseUrl + path, item: resultItem, allowEmpty: true }; } //#endregion export { route };