From c522ca819eea29ae800494cebfc9bb93ebea9b25 Mon Sep 17 00:00:00 2001 From: sddzhyc <41501986+sddzhyc@users.noreply.github.com> Date: Tue, 22 Jul 2025 17:05:06 +0800 Subject: [PATCH] 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 --- lib/routes/upc/jwc.ts | 78 ++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/lib/routes/upc/jwc.ts b/lib/routes/upc/jwc.ts index 65f35b6090..10ed178d10 100644 --- a/lib/routes/upc/jwc.ts +++ b/lib/routes/upc/jwc.ts @@ -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: `| 所有通知 | 教学·运行 | 学业·学籍 | 教学·研究 | 课程·教材 | 实践·教学 | 创新·创业 | 语言·文字 | 继续·教育 | 本科·招生 | | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |