UNPKG

rsshub

Version:
70 lines (68 loc) 2.88 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 parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import { t as timezone } from "./timezone-D8cuwzTY.mjs"; import { t as invalid_parameter_default } from "./invalid-parameter-rr4AgGpp.mjs"; import { t as isValidHost } from "./valid-host-C-u5eW3j.mjs"; import { load } from "cheerio"; import iconv from "iconv-lite"; //#region lib/routes/people/index.ts const route = { path: "/:site?/:category{.+}?", name: "首页头条", maintainers: ["nczitzk", "pseudoyu"], example: "/people", handler }; async function handler(ctx) { const { site = "www" } = ctx.req.param(); let { category = site === "www" ? "59476" : "" } = ctx.req.param(); category = site === "cpc" && category === "24h" ? "87228" : category; const limit = ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit"), 10) : 30; if (!isValidHost(site)) throw new invalid_parameter_default("Invalid site"); const rootUrl = `http://${site}.people.com.cn`; const currentUrl = new URL(`GB/${category}`, rootUrl).href; const response = await ofetch_default(currentUrl, { responseType: "arrayBuffer" }); let decodedResponse = iconv.decode(Buffer.from(response), "utf-8"); const parsedCharset = decodedResponse.match(/<meta.*?charset=["']?([^"'>]+)["']?/i); const encoding = parsedCharset ? parsedCharset[1].toLowerCase() : "utf-8"; decodedResponse = encoding === "utf-8" ? decodedResponse : iconv.decode(Buffer.from(response), encoding); const $ = load(decodedResponse); $("em").remove(); $(".bshare-more, .page_n, .page").remove(); $("a img, h3 img").each((_, e) => { $(e).parent().remove(); }); let items = $(".p6, div.p2j_list, div.headingNews, div.ej_list_box, .leftItem").find("a").slice(0, limit).toArray().map((item) => { item = $(item); const link = item.attr("href").trim(); return { title: item.text(), link: link.indexOf("http") === 0 ? link : new URL(link.replace(/^\.\./, ""), rootUrl).href }; }); items = await Promise.all(items.map((item) => cache_default.tryGet(item.link, async () => { try { const detailResponse = await ofetch_default(item.link, { responseType: "arrayBuffer" }); const data = iconv.decode(Buffer.from(detailResponse), encoding); const content = load(data); content(".paper_num, #rwb_tjyd").remove(); item.description = content("#rwb_zw").html(); item.pubDate = timezone(parseDate(data.match(/(\d{4}年\d{2}月\d{2}日\d{2}:\d{2})/)?.[1] || "", "YYYY年MM月DD日 HH:mm"), 8); } catch (error) { item.description = String(error); } return item; }))); return { title: $("title").text(), link: currentUrl, item: items }; } //#endregion export { route };