UNPKG

rsshub

Version:
84 lines (82 loc) 2.9 kB
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import { t as logger_default } from "./logger-Czu8UMNd.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as art } from "./render-BQo6B4tL.mjs"; import "./proxy-Db7uGcYb.mjs"; import { n as puppeteer_default } from "./puppeteer-DGmvuGvT.mjs"; import path from "node:path"; import { load } from "cheerio"; //#region lib/routes/hitcon/zeroday.ts init_esm_shims(); const route = { name: "漏洞", categories: ["programming"], path: "/zeroday/vulnerability/:status?", example: "/hitcon/zeroday/vulnerability", parameters: { status: "漏洞状态,见下表" }, maintainers: ["KarasuShin"], radar: [{ source: ["zeroday.hitcon.org/vulnerability/:status?"] }], features: { requirePuppeteer: true }, handler, description: `| 缺省 | all | closed | disclosed | patching | | ------ | ---- | ------ | --------- | -------- | | 活動中 | 全部 | 關閉 | 公開 | 修補中 |` }; const baseUrl = "https://zeroday.hitcon.org/vulnerability"; const titleMap = { all: "全部", closed: "關閉", disclosed: "公開", patching: "修補中" }; async function handler(ctx) { let url = baseUrl; const status = ctx.req.param("status"); if (status) url += `/${status}`; const browser = await puppeteer_default(); const page = await browser.newPage(); await page.setRequestInterception(true); page.on("request", (request) => { request.resourceType() === "document" ? request.continue() : request.abort(); }); logger_default.http(`Requesting ${url}`); await page.goto(url, { waitUntil: "domcontentloaded" }); const response = await page.evaluate(() => document.documentElement.innerHTML); await browser.close(); const $ = load(response); const items = $(".zdui-strip-list>li").toArray().map((el) => { const title = $(el).find(".title a"); const vulData = $(el).find(".vul-data"); const code = vulData.find(".code").contents().filter(function() { return this.nodeType === 3; }).text(); const risk = vulData.find(".risk span").eq(1).text(); const vender = vulData.find(".vender").find(".v-name-full").text(); const status$1 = vulData.find(".status").text().replace("Status:", "").trim(); const date = vulData.find(".date").text().replace("Date:", "").trim(); const reporter = vulData.find(".zdui-author-badge").find("a>span").text(); const description = art(path.join(__dirname, "templates/zeroday-08cb6861.art"), { code, risk, vender, status: status$1, date, reporter }); return { title: title.text(), link: title.attr("href"), description, pubDate: parseDate(date) }; }); return { title: status ? titleMap[status] ?? "ZeroDay" : "活動中", link: url, item: items, image: "https://zeroday.hitcon.org/images/favicon/favicon.png" }; } //#endregion export { route };