fix(route/upc): fix FetchError bug when fetching the Full Text (#19645)

* fix(route/upc): fix FetchError bug when fetching the Full Text

- fix the bug in dealing with external links

* fix(route/upc): Add fetching full texts from additional sites
This commit is contained in:
sddzhyc
2025-07-22 17:05:06 +08:00
committed by GitHub
parent ea821def53
commit c522ca819e
+32 -46
View File
@@ -6,46 +6,24 @@ import { parseDate } from '@/utils/parse-date';
import cache from '@/utils/cache';
import timezone from '@/utils/timezone';
const typeDict = {
tzgg: '', // 默认为所有通知
'18519': '教学·运行-', // 教学·运行
'18520': '学业·学籍-', // 学业·学籍
'18521': '教学·研究-', // 教学·研究
'18522': '课程·教材-', // 课程·教材
'18523': '实践·教学-', // 实践·教学
'18524': '创新·创业-', // 创新·创业
yywwz: '语言·文字-', // 语言·文字
jxwjy: '继续·教育-', // 继续·教育
bkwzs: '本科·招生-', // 本科·招生
};
// module.exports = async (ctx) => {
const handler = async (ctx) => {
// 从 URL 参数中获取通知分类
const { type = 'tzgg' } = ctx.req.param();
// console.log(type);
const baseUrl = 'https://jwc.upc.edu.cn';
const { data: response } = await got(`${baseUrl}/${type}/list.htm`);
// console.log(`${baseUrl}/${typeDict[type]}/list.htm`);
const $ = load(response);
// const listItems = $('ul.news_list').find('li');
// console.log(`List item count: ${listItems.length}`);
// const list = $('ul.news_list') 只会得到第一个li
const list = $('ul.news_list')
.find('li')
// 使用“toArray()”方法将选择的所有 DOM 元素以数组的形式返回。
.toArray()
// 使用“map()”方法遍历数组,并从每个元素中解析需要的数据。
.map((item) => {
// console.log(item);
item = $(item);
const a = item.find('a').first();
let linkStr = a.attr('href');
// 若链接不是以http开头,则加上前缀
if (a.attr('href').startsWith('http://')) {
// 改为https访问
linkStr.replace('http://', 'https://');
} else {
// 改为https访问并补全站内链接
linkStr = linkStr.replace('http://', 'https://');
if (!a.attr('href').startsWith('https://')) {
linkStr = `${baseUrl}${a.attr('href')}`;
}
return {
@@ -58,33 +36,41 @@ const handler = async (ctx) => {
const items = await Promise.all(
list.map((item) =>
cache.tryGet(item.link, async () => {
const { data: response } = await got(item.link);
const $ = load(response);
// 选择类名为“comment-body”的第一个元素
item.description = $('.read').first().html();
// item.pubDate = $('.arti_update').html() === null ? '' : $('.arti_update').html().slice(5, 15);
// item.publisher = $('.arti_publisher').html();
item.author = $('.arti_publisher').html();
// console.log($('.arti_update').html().slice(5, 15));
// 上面每个列表项的每个属性都在此重用,
// 并增加了一个新属性“description”
try {
const { data: response } = await got(item.link);
const $ = load(response);
if (item.link.includes('news.upc.edu.cn')) {
item.description = $('.v_news_content').html();
item.author = $('.nr-zz h2').html();
} else if (item.link.includes('app.upc.edu.cn')) {
const scriptContent = $('body script').first().html();
let dataObj = null;
if (scriptContent) {
const match = scriptContent.match(/data\s*:\s*function\s*\(\)\s*{\s*return\s*{[^}]*data\s*:\s*({[\s\S]*?})/);
if (match && match[1]) {
const dataStr = match[1];
dataObj = JSON.parse(dataStr);
}
}
item.description = dataObj.content;
item.author = dataObj.author;
} else {
// 选择类名为“comment-body”的第一个元素
item.description = $('.read').first().html() || '无法获取正文内容,请手动访问';
item.author = $('.arti_publisher').html();
}
} catch {
item.description = '正文内容获取失败';
}
return item;
})
)
);
/* ctx.state.data = {
// 源标题
title: `${typeDict[type]}教务处通知-中国石油大学(华东)`,
// 源链接
link: `https://jwc.upc.edu.cn/tzgg/list.htm`,
// 源文章
item: items,
}; */
return {
// 源标题
title: `${typeDict[type]}教务处通知-中国石油大学(华东)`,
title: `${$('title').text()}-教务处通知-中国石油大学(华东)`,
// 源链接
link: `${baseUrl}/${type}/list.htm`,
// 源文章
@@ -111,7 +97,7 @@ export const route: Route = {
target: '/jwc/:type?',
},
],
name: '教务处通知公告',
name: '教务处',
maintainers: ['sddzhyc'],
description: `| 所有通知 | 教学·运行 | 学业·学籍 | 教学·研究 | 课程·教材 | 实践·教学 | 创新·创业 | 语言·文字 | 继续·教育 | 本科·招生 |
| -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |