rsshub
Version:
Make RSS Great Again!
195 lines (189 loc) • 6.27 kB
JavaScript
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 };