rsshub
Version:
Make RSS Great Again!
147 lines (137 loc) • 4.57 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';
const urlRoot = 'https://jwc.sjtu.edu.cn';
async function getFullArticle(link) {
const response = await got(link);
if (!response) {
return null;
}
const $ = load(response.body);
const content = $('.content-con');
if (content.length === 0) {
return null;
}
// resolve links of <img> and <a>
content.find('img').each((_, e) => {
const relativeLink = $(e).attr('src');
const absLink = new URL(relativeLink, urlRoot).href;
$(e).attr('src', absLink);
});
content.find('a').each((_, e) => {
const relativeLink = $(e).attr('href');
const absLink = new URL(relativeLink, urlRoot).href;
$(e).attr('href', absLink);
});
return content.html() + ($('.Newslist2').length ? $('.Newslist2').html() : '');
}
export const route: Route = {
path: '/jwc/:type?',
categories: ['university'],
example: '/sjtu/jwc',
parameters: { type: '默认为 notice' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
name: '教务处通知公告',
maintainers: ['SeanChao'],
handler,
description: `| 新闻中心 | 通知通告 | 教学运行 | 注册学务 | 研究办 | 教改办 | 综合办 | 语言文字 | 工会与支部 | 通识教育 | 面向学生的通知 |
| -------- | -------- | --------- | -------- | ------ | ------ | ------ | -------- | ---------- | -------- |
| news | notice | operation | affairs | yjb | jgb | zhb | language | party | ge | students |`,
};
async function handler(ctx) {
const type = ctx.req.param('type') ?? 'notice';
const config = {
all: {
section: '通知通告',
link: '/xwtg/tztg.htm',
},
news: {
link: '/xwtg/xwzx.htm',
section: '新闻中心',
},
notice: {
link: '/xwtg/tztg.htm',
section: '通知通告',
},
operation: {
link: '/xwtg/jxyx.htm',
section: '教学运行',
},
affairs: {
link: '/xwtg/zcxw.htm',
section: '注册学务',
},
yjb: {
link: '/xwtg/yjb.htm',
section: '研究办',
},
jgb: {
link: '/xwtg/jgb.htm',
section: '教改办',
},
zhb: {
link: '/xwtg/zhb.htm',
section: '综合办',
},
language: {
link: '/xwtg/yywz.htm',
section: '语言文字',
},
party: {
link: '/xwtg/ghyzb.htm',
section: '工会与支部',
},
ge: {
link: '/xwtg/tsjy.htm',
section: '通识教育',
},
students: {
link: '/index/mxxsdtz.htm',
section: '面向学生的通知',
},
};
const sectionLink = urlRoot + config[type].link;
const response = await got({
method: 'get',
url: sectionLink,
});
const $ = load(response.body);
const out = await Promise.all(
$('body > div.list-box > div.container > div > div.ny_right > div > div.ny_right_con > div > ul')
.find('li')
.toArray()
.map((e) => {
const info = $(e).find('.wz');
const relativeLink = info.find('a').attr('href');
const link = new URL(relativeLink, sectionLink).href;
const title = info.find('a > h2').text();
const timeElement = $(e).find('.sj');
const day = timeElement.find('h2').text();
const yearAndMonth = timeElement.find('p').text();
const pubDate = parseDate(`${yearAndMonth}.${day}`, 'YYYY.MM.DD');
return cache.tryGet(link, async () => {
const description = await getFullArticle(link);
return {
title,
link,
pubDate,
description,
};
});
})
);
return {
title: '上海交通大学教务处 ' + config[type].section,
link: sectionLink,
item: out,
};
}