UNPKG

rsshub

Version:
100 lines (97 loc) 3.21 kB
import "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import "./ofetch-BIyrKU3Y.mjs"; import { 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 { t as timezone } from "./timezone-D8cuwzTY.mjs"; import { load } from "cheerio"; //#region lib/routes/cast/index.ts const baseUrl = "https://www.cast.org.cn"; async function parsePage(html) { return await Promise.all(load(html)("li").toArray().map((el) => { const title = load(el)("a"); let articleUrl = title.attr("href"); if (articleUrl?.startsWith("http")) return { title: title.text(), link: title.attr("href") }; articleUrl = `${baseUrl}${title.attr("href")}`; return cache_default.tryGet(articleUrl, async () => { const article = load((await got_default.get(articleUrl)).data); const pubDate = timezone(parseDate(article("meta[name=PubDate]").attr("content"), "YYYY-MM-DD HH:mm"), 8); return { title: title.text(), pubDate, description: article("#zoom").html(), link: articleUrl }; }); })); } const route = { path: "/:column/:subColumn/:category?", categories: ["government"], example: "/cast/xw/tzgg/ZH", parameters: { column: "栏目编号,见下表", subColumn: "二级栏目编号", category: "分类" }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["cast.org.cn/:column/:subColumn/:category/index.html", "cast.org.cn/:column/:subColumn/index.html"], target: "/:column/:subColumn/:category?" }], name: "通用", maintainers: ["KarasuShin", "TonyRL"], handler, description: `::: tip 在路由末尾处加上 \`?limit=限制获取数目\` 来限制获取条目数量,默认值为\`10\` ::: | 分类 | 编码 | | -------- | ---- | | 全景科协 | qjkx | | 智库 | zk | | 学术 | xs | | 科普 | kp | | 党建 | dj | | 数据 | sj | | 新闻 | xw |` }; async function handler(ctx) { const { column, subColumn, category } = ctx.req.param(); const { limit = 10 } = ctx.req.query(); let link = `${baseUrl}/${column}/${subColumn}`; if (category) link += `/${category}/index.html`; const { data: indexData } = await got_default.get(link); const $ = load(indexData); let items = []; if (column === "xw" && subColumn === "SP" && !category) items = await parsePage(indexData); else { const buildUnitScript = $("script[parseType=\"bulidstatic\"]"); const queryUrl = `${baseUrl}${buildUnitScript.attr("url")}`; const queryData = JSON.parse(buildUnitScript.attr("querydata")?.replaceAll("'", "\"") ?? "{}"); queryData.paramJson = `{"pageNo":1,"pageSize":${limit}}`; const { data } = await got_default.get(queryUrl, { searchParams: new URLSearchParams(queryData) }); items = await parsePage(data.data.html); } return { title: $("head title").text(), link, image: "https://www.cast.org.cn/favicon.ico", item: items }; } //#endregion export { route };