feat(route): 添加浙江大学控制科学与工程学院通知的路由 (#20141)
* Adding a route of zju/cse * Change route path to include '/zju/' prefix * Fix the route of zju/cse * Fix the route of zju/cse * Response to the reviewer * Update comment for content extraction in index.ts Removed comment about removing images from content extraction.
This commit is contained in:
parent
526eaa2e17
commit
fb37151003
|
|
@ -0,0 +1,102 @@
|
|||
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,
|
||||
};
|
||||
}
|
||||
Loading…
Reference in New Issue