UNPKG

rsshub

Version:
195 lines (189 loc) 6.27 kB
import { t as parseDate } from "./parse-date-Cr0wQjV_.mjs"; import { t as cache_default } from "./cache-BkqOokyU.mjs"; import { t as got_default } from "./got-BTowW50G.mjs"; import { t as InvalidParameterError } from "./invalid-parameter-CGxhjomn.mjs"; import { t as isValidHost } from "./valid-host-BH9Dd2Pf.mjs"; import { load } from "cheerio"; //#region lib/routes/dut/defaults.ts var defaults_default = { news: "ttgz", teach: "xwkd/xwkd", perdep: "tzgg/tzgg", gs: "zytz", ssdut: "ywgg/xueyuanxinwen/jdxw", eda: "tzgg/tzgg", panjin: "index/gg", xsgzb: "index/zytz", pjteach: "index/xwkd", pjxqzwb: "index/tzgg", tjpj: "index/zxgg", dutdice: "xwsd/xxxw", tycgzx: "tzgg/tzgg", fldpj: "index/zytz" }; //#endregion //#region lib/routes/dut/shortcuts.ts var shortcuts_default = { news: { xwjj: "xwjj01", rcpy: "xwjj01/rcpy", kxyj: "xwjj01/kxyj", jlhz: "xwjj01-kxyj", yxfc: "yxfc1", dgrw: "dgrw/dgrw1", yxdg: "yxdg1", mtdg: "mtdg/mtdg" }, teach: { xwkd: "xwkd/xwkd", zytg: "zytg/zytg", bhgs: "zytg/bhgs" }, perdep: { tzgg: "tzgg/tzgg", gzdt: "gzdt/gzdt1", zcfg: "zcfg/zcfg" }, gs: { gzdt: "gzdt1", zcfg: "zcfg/zcfg" }, ssdut: { jdxw: "ywgg/xueyuanxinwen/jdxw", zhxw: "ywgg/xueyuanxinwen", xytz: "index/xytz", xsdt: "index/xsdt", bkstz: "index/bkstz", yjstz: "yjspy/yjspy/yjstz" }, eda: { tzgg: "tzgg/tzgg", xqxw: "xqxw/xqxw" }, panjin: { xqxw: "index/xqxw", xywh: "index/xywh", xyfc: "index/xyfc", xsdt: "index/xsdt", mtbd: "index/mtbd", gg: "index/gg" }, xsgzb: { zytz: "index/zytz", xgdt: "index/xgdt", gsgonggao: "index/gsgonggao" }, pjteach: { xwkd: "index/xwkd", zytz: "index/zytz", xkyks: "index/xkyks", jxwj: "index/jxwj", cjwt: "index/cjwt" }, pjxqzwb: { tzgg: "index/tzgg", zwkx: "index/zwkx" }, tjpj: { xyxw: "index/xyxw", zxgg: "index/zxgg" }, dutdice: { jstz: "tzgg/jstz", xstong_zhi: "tzgg/xstong_zhi", xwsd: "xwsd/xxxw" }, tycgzx: { tzgg: "tzgg/tzgg", hdrc: "hdrc/hdrc", xwdt: "xwdt/xwdt", jkzs: "jkzs/jkzs1" }, fldpj: { xsdt: "kxyj/xsdt", zytz: "index/zytz", ywgk: "index/ywgk" } }; //#endregion //#region lib/routes/dut/index.ts const route = { path: ["/*/*", "/:0?"], categories: ["university"], example: "/dut", name: "通用", maintainers: [ "beautyyuyanli", "nczitzk", "ueiu" ], handler, description: `订阅 **单级** 栏目如 [大连理工大学新闻网](https://news.dlut.edu.cn) 的 [头条关注](https://news.dlut.edu.cn/ttgz.htm) 分类栏目,分为 3 步: 1. 将 URL \`https://news.dlut.edu.cn/ttgz.htm\` 中 \`https://\` 与 \`.dlut.edu.cn/\` 中间的 \`news\` 作为 \`site\` 参数填入; 2. 将 \`https://news.dlut.edu.cn/\` 与 \`.htm\` 间的 \`ttgz\` 作为 \`category\` 参数填入; 3. 最终可获得 [\`/dut/news/ttgz\`](https://rsshub.app/dut/news/tzgg)。 订阅 **多级** 栏目如 [大连理工大学新闻网](https://news.dlut.edu.cn) 的 [人才培养](https://news.dlut.edu.cn/xwjj01/rcpy.htm) 分类栏目,同样分为 3 步: 1. 将 URL \`https://news.dlut.edu.cn/xwjj01/rcpy.htm\` 中 \`https://\` 与 \`.dlut.edu.cn/\` 中间的 \`news\` 作为 \`site\` 参数填入; 2. 把 \`https://news.dlut.edu.cn/\` 与 \`.htm\` 间 \`xwjj01/rcpy\` 作为 \`category\` 参数填入; 3. 最终可获得 [\`/dut/news/xwjj01/rcpy\`](https://rsshub.app/dut/news/xwjj01/rcpy)。 ::: tip 小提示 大连理工大学大部分站点支持上述通用规则进行订阅。下方的大连理工大学相关路由基本适用于该规则,在其对应的表格中没有提及的分类栏目,可以使用上方的方法自行扩展。 ::: ::: tip 小小提示 你会发现 [大连理工大学新闻网](https://news.dlut.edu.cn) 的 [人才培养](https://news.dlut.edu.cn/xwjj01/rcpy.htm) 分类栏目在下方 **新闻网** 参数表格中 \`category\` 参数为 \`rcpy\`,并非上面例子中给出的 \`xwjj01/rcpy\`。这意味着开发者对路由 \`/dut/news/xwjj01/rcpy\` 指定了快捷方式 \`/dut/news/rcpy\`。两者的效果是一致的。 :::` }; async function handler(ctx) { const site = ctx.params[0] ?? "news"; if (!isValidHost(site)) throw new InvalidParameterError("Invalid site"); let items; let category = ctx.params[1] ?? (Object.hasOwn(defaults_default, site) ? defaults_default[site] : ""); category = Object.hasOwn(shortcuts_default, site) && Object.hasOwn(shortcuts_default[site], category) ? shortcuts_default[site][category] : category; const rootUrl = `https://${site}.dlut.edu.cn`; const currentUrl = `${rootUrl}/${category}.htm`; const $ = load((await got_default({ method: "get", url: currentUrl })).data); if (site === "panjin") items = $("a.news").slice(0, -4); else if (site === "fldpj") items = $("li[id^=\"line_u9\"]").find("a"); else { $(".Next, .rjxw_left, .pb_sys_common").remove(); items = $(".txt, .itemlist, .wall, .list, .list01, .ny_list, .rjxw_right, .rj_yjs_con, .c_hzjl_list1, .winstyle67894, .winstyle80936, .winstyle50738, #lili").find("a"); } items = items.slice(0, ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 50).toArray().map((item) => { const $item = $(item); const result = { link: $item.attr("href").startsWith("http") ? $item.attr("href") : `${rootUrl}/${$item.attr("href").replace(/^[./]+/, "")}`, title: "" }; if (site === "fldpj") { result.title = $item.find("em").text(); result.pubDate = parseDate($item.find("span").text()); } else { const dateRegex = /(\d{4}[/年-]\d{2}[/月-]\d{2})/; let dateMatch = $item.parent().text().match(dateRegex); if (!dateMatch) dateMatch = $item.parent().parent().text().match(dateRegex); result.title = $item.text().trim() === "" ? $item.next().text() : $item.text(); if (dateMatch) result.pubDate = parseDate(dateMatch[1].replaceAll(/年|月/g, "-")); } return result; }); items = await Promise.all(items.map((item) => cache_default.tryGet(item.link, async () => { try { item.description = load((await got_default({ method: "get", url: item.link })).data)(".v_news_content, .conbox").html(); } catch {} return item; }))); return { title: $("title").text(), link: currentUrl, item: items, allowEmpty: true }; } //#endregion export { route };