rsshub
Version:
Make RSS Great Again!
103 lines (88 loc) • 3.52 kB
text/typescript
import { Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';
export const route: Route = {
path: '/cse/:category?',
categories: ['university'],
example: '/zju/cse/bksjy',
parameters: {
category: '类别:`bksjy`,默认为简讯专栏,详情在描述中',
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
name: '控制学院通知',
maintainers: ['Rabbits-sys'],
handler,
description: `栏目类型
| 简讯专栏 | 本科生教育 | 研究生教育 | 科研学术 | 人事工作 | 学生思政 | 对外交流 | 就业指导 |
| ------ | ------- | ------- | ------ | ------ | ------ | ------ | ------ |
| - | bksjy | yjsjy | kyxs | rsgz | xssz | dwjl | jyzd |`,
};
async function handler(ctx) {
const category = ctx.req.param('category') ?? ''; // 默认是首页
const baseUrl = 'http://www.cse.zju.edu.cn/';
const categoryMap = {
bksjy: { title: '本科生教育', tag: '39322' },
yjsjy: { title: '研究生教育', tag: '39333' },
kyxs: { title: '科研学术', tag: '39312' },
rsgz: { title: '人事工作', tag: '39306' },
xssz: { title: '学生思政', tag: '39342' },
dwjl: { title: '对外交流', tag: '39353' },
jyzd: { title: '就业指导', tag: '39351' },
} as const;
const rootUrl = Object.keys(categoryMap).includes(category) ? `${baseUrl}/${categoryMap[category].tag}/list.htm` : `${baseUrl}/39283/list.htm`;
const response = await got(rootUrl);
const $ = load(response.data);
const list = $('div.con1rm2rt.xi20')
.toArray()
.map((element) => {
const item = $(element);
const a = item.find('a');
const title = a.text();
const href = a.attr('href');
// 过滤无效链接与包含 http/https 的绝对链接
if (!href || /https?:\/\//i.test(href)) {
return null;
}
const resolved = new URL(href, baseUrl).href;
return {
title,
link: resolved,
};
})
.filter((item): item is { title: string; link: string } => item !== null);
const items = await Promise.all(
list.map((item) =>
cache.tryGet(item.link, async () => {
const res = await got(item.link);
const content = load(res.data);
const infoDiv = content('span.xi14').text();
const dateText = infoDiv.match(/\b\d{4}-\d{2}-\d{2}\b/);
const pubDate = timezone(parseDate(dateText ? dateText[0] : ''), +8);
// 获取正文
const description = content('div.wp_articlecontent').html();
return {
title: item.title,
pubDate,
link: item.link,
guid: item.link,
description,
};
})
)
);
return {
title: `浙江大学控制学院通知 - ${categoryMap[category]?.title || '简讯专栏'}`, // 使用对象查找配合默认值
link: rootUrl,
item: items,
};
}