diff --git a/lib/routes/zjut/jwc/index.ts b/lib/routes/zjut/jwc/index.ts new file mode 100644 index 000000000..170848480 --- /dev/null +++ b/lib/routes/zjut/jwc/index.ts @@ -0,0 +1,117 @@ +import { Data, Route } from '@/types'; +import cache from '@/utils/cache'; +import { parseDate } from '@/utils/parse-date'; +import { load } from 'cheerio'; +import ofetch from '@/utils/ofetch'; +import timezone from '@/utils/timezone'; + +const rootUrl = 'http://www.jwc.zjut.edu.cn/'; +const host = 'www.jwc.zjut.edu.cn'; + +export const route: Route = { + path: '/jwc/:type', + categories: ['university'], + example: '/zjut/jwc/1839', + parameters: { type: '分类,见下表' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + name: '浙江工业大学教务处', + maintainers: ['zhullyb'], + url: 'www.jwc.zjut.edu.cn', + handler, + radar: [ + { + source: ['www.jwc.zjut.edu.cn/:type/list.htm'], + target: '/jwc/:type', + }, + ], + description: `| 板块 | 参数 | +| ------- | ------- | +| 新闻动态 | 1838 | +| 课程思政 | 1842 | +| 校内动态 | 2613 | +| 学习思考 | 2614 | +| 成果展示 | 2615 | +| 媒体聚焦 | 2616 | +| 制度文件 | 2617 | +| 教学运行 | 1849 | +| 实践竞赛 | 1850 | +| 留学生Notice | 1851 | +| 项目申报 | 1852 | +| 学籍管理 | 1853 | +| 办事指南 | 1839 |`, +}; + +async function handler(ctx) { + const type = Number.parseInt(ctx.req.param('type')); + const response = await ofetch(rootUrl + type + '/list.htm'); + const $ = load(response); + + const list = $('.news.clearfix') + .toArray() + .map((item) => { + const cheerioItem = $(item); + const a = cheerioItem.find('a'); + + try { + const title = a.attr('title') || ''; + let link = a.attr('href'); + if (!link) { + link = ''; + } else if (!link.startsWith('http')) { + link = rootUrl.slice(0, -1) + link; + } + const pubDate = timezone(parseDate(cheerioItem.find('.news_meta').text()), +8); + + return { + title, + link, + pubDate, + }; + } catch { + return { + title: '', + link: '', + pubDate: Date.now(), + }; + } + }) + .filter((item) => item.title && item.link); + + const items = await Promise.all( + list.map((item) => + cache.tryGet(item.link, async () => { + const newItem = { + ...item, + description: '', + }; + if (host === new URL(item.link).hostname) { + if (new URL(item.link).pathname.startsWith('/_upload')) { + // 链接为一个文件,直接返回链接 + newItem.description = item.link; + } else { + const response = await ofetch(item.link); + const $ = load(response); + newItem.description = $('.wp_articlecontent').html() || ''; + } + } else { + // 涉及到其他站点,不方便做统一的 html 解析,直接返回链接 + newItem.description = item.link; + } + return newItem; + }) + ) + ); + + return { + title: $('head > title').text() + ' - 浙江工业大学教务处', + link: rootUrl + type + '/list.htm', + item: items, + } as Data; +}