From f5698016d387a0c9902970f6a245395d8ffc0c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=86=E4=B8=BA=E5=90=9B=E6=95=85?= Date: Tue, 31 Dec 2024 02:54:26 +0800 Subject: [PATCH] feat: add NWMU router. (#17996) * Update package.json * Update package.json * feat: add RSS subscription for (NWMU) Northwestern Minzu University. * fix: fix array generation forms for dom-parser. * fix: fix url replacing behavior. * fix: fix cover images, typos and maintainer. * fix: remove router from deprecated routers. * fix: fix router name and example. * fix: fix items limit. * fix: fix date parser. * fix: use cache for the RSS data. * fix: typo --------- Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com> --- lib/routes/xbmu/academic.ts | 91 +++++++++++++++++++++++++++++++++ lib/routes/xbmu/announcement.ts | 91 +++++++++++++++++++++++++++++++++ lib/routes/xbmu/namespace.ts | 6 +++ 3 files changed, 188 insertions(+) create mode 100644 lib/routes/xbmu/academic.ts create mode 100644 lib/routes/xbmu/announcement.ts create mode 100644 lib/routes/xbmu/namespace.ts diff --git a/lib/routes/xbmu/academic.ts b/lib/routes/xbmu/academic.ts new file mode 100644 index 00000000000000..adc99f71b0aef4 --- /dev/null +++ b/lib/routes/xbmu/academic.ts @@ -0,0 +1,91 @@ +import { DataItem, Route } from '@/types'; +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { parseDate } from '@/utils/parse-date'; +import { load } from 'cheerio'; + +const BASE_URL = 'https://www.xbmu.edu.cn/xwzx/xsxx.htm'; + +const handler: Route['handler'] = async () => { + try { + // Fetch the academic page + const { data: listResponse } = await got(BASE_URL); + const $ = load(listResponse); + + // Select all list items containing academic information + const ITEM_SELECTOR = 'body > div.container.list-container.ny_mani > div > div.news_list > ul > li'; + const listItems = $(ITEM_SELECTOR); + + // Map through each list item to extract details + const academicLinkList = await Promise.all( + listItems.toArray().map((element) => { + const rawDate = $(element).find('span').text().trim(); + const [day, yearMonth] = rawDate.split('/').map((s) => s.trim()); + const formattedDate = parseDate(`${yearMonth}-${day}`).toUTCString(); + + const title = $(element).find('a').attr('title') || '学术信息'; + const relativeHref = $(element).find('a').attr('href') || ''; + const link = `https://www.xbmu.edu.cn/${relativeHref.replaceAll('../', '')}`; + + return { + date: formattedDate, + title, + link, + }; + }) + ); + + return { + title: '西北民族大学学术信息', + description: '西北民族大学近日学术信息', + link: BASE_URL, + image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg', + item: (await Promise.all( + academicLinkList.map((item) => + cache.tryGet(item.link, async () => { + const CONTENT_SELECTOR = '#vsb_content > div'; + const { data: contentResponse } = await got(item.link); + const contentPage = load(contentResponse); + const content = contentPage(CONTENT_SELECTOR).html() || ''; + return { + title: item.title, + pubDate: item.date, + link: item.link, + description: content, + category: ['university'], + guid: item.link, + id: item.link, + image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg', + content, + updated: item.date, + language: 'zh-cn', + }; + }) + ) + )) as DataItem[], + allowEmpty: true, + language: 'zh-cn', + feedLink: 'https://rsshub.app/xbmu/academic', + id: 'https://rsshub.app/xbmu/academic', + }; + } catch (error) { + throw new Error(`Error fetching academic information: ${error}`); + } +}; + +export const route: Route = { + path: '/academic', + name: '学术信息', + maintainers: ['PrinOrange'], + handler, + categories: ['university'], + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + example: '/xbmu/academic', +}; diff --git a/lib/routes/xbmu/announcement.ts b/lib/routes/xbmu/announcement.ts new file mode 100644 index 00000000000000..56d4486c0a701f --- /dev/null +++ b/lib/routes/xbmu/announcement.ts @@ -0,0 +1,91 @@ +import { DataItem, Route } from '@/types'; +import cache from '@/utils/cache'; +import got from '@/utils/got'; +import { parseDate } from '@/utils/parse-date'; +import { load } from 'cheerio'; + +const BASE_URL = 'https://www.xbmu.edu.cn/xwzx/tzgg.htm'; + +const handler: Route['handler'] = async () => { + try { + // Fetch the announcements page + const { data: listResponse } = await got(BASE_URL); + const $ = load(listResponse); + + // Select all list items containing announcement information + const ITEM_SELECTOR = 'body > div.container.list-container.ny_mani > div > div.news_list > ul > li'; + const listItems = $(ITEM_SELECTOR); + + // Map through each list item to extract details + const announcementLinkList = await Promise.all( + listItems.toArray().map((element) => { + const rawDate = $(element).find('span').text().trim(); + const [day, yearMonth] = rawDate.split('/').map((s) => s.trim()); + const formattedDate = parseDate(`${yearMonth}-${day}`).toUTCString(); + + const title = $(element).find('a').attr('title') || '通知公告'; + const relativeHref = $(element).find('a').attr('href') || ''; + const link = `https://www.xbmu.edu.cn/${relativeHref.replaceAll('../', '')}`; + + return { + date: formattedDate, + title, + link, + }; + }) + ); + + return { + title: '西北民族大学通知公告', + description: '西北民族大学近日通知公告', + link: BASE_URL, + image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg', + item: (await Promise.all( + announcementLinkList.map((item) => + cache.tryGet(item.link, async () => { + const CONTENT_SELECTOR = '#vsb_content > div'; + const { data: contentResponse } = await got(item.link); + const contentPage = load(contentResponse); + const content = contentPage(CONTENT_SELECTOR).html() || ''; + return { + title: item.title, + pubDate: item.date, + link: item.link, + description: content, + category: ['university'], + guid: item.link, + id: item.link, + image: 'http://210.26.0.114:9090/mdxg/img/weex/default_img.jpg', + content, + updated: item.date, + language: 'zh-cn', + }; + }) + ) + )) as DataItem[], + allowEmpty: true, + language: 'zh-cn', + feedLink: 'https://rsshub.app/xbmu/announcement', + id: 'https://rsshub.app/xbmu/announcement', + }; + } catch (error) { + throw new Error(`Error fetching announcements: ${error}`); + } +}; + +export const route: Route = { + path: '/announcement', + name: '通知公告', + maintainers: ['PrinOrange'], + handler, + categories: ['university'], + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + example: '/xbmu/announcement', +}; diff --git a/lib/routes/xbmu/namespace.ts b/lib/routes/xbmu/namespace.ts new file mode 100644 index 00000000000000..08c824cda68fa0 --- /dev/null +++ b/lib/routes/xbmu/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: '西北民族大学', + url: 'www.xbmu.edu.cn', +};