From 5199ebbee22506e01c658988c85523337f5bc795 Mon Sep 17 00:00:00 2001 From: Neutrino <1784986256@qq.com> Date: Wed, 21 Aug 2019 23:51:23 +0800 Subject: [PATCH] fix: update sysu/sdcs router, fix #2905 (#2906) --- docs/university.md | 2 +- lib/routes/universities/sysu/sdcs.js | 144 ++++++++++++++++++--------- 2 files changed, 97 insertions(+), 49 deletions(-) diff --git a/docs/university.md b/docs/university.md index 014c88bdb..f6a530326 100644 --- a/docs/university.md +++ b/docs/university.md @@ -1009,4 +1009,4 @@ https://rsshub.app/**nuist**/`bulletin` 或 https://rsshub.app/**nuist**/`bullet ### 数据科学与计算机学院动态 - + diff --git a/lib/routes/universities/sysu/sdcs.js b/lib/routes/universities/sysu/sdcs.js index d91629f88..117351ecc 100644 --- a/lib/routes/universities/sysu/sdcs.js +++ b/lib/routes/universities/sysu/sdcs.js @@ -1,56 +1,104 @@ const got = require('@/utils/got'); -const { load } = require('cheerio'); -const { resolve } = require('url'); - -const base = 'http://sdcs.sysu.edu.cn/'; +const cheerio = require('cheerio'); module.exports = async (ctx) => { - const { data } = await got.get('http://sdcs.sysu.edu.cn/'); - const $ = load(data); + const response = await got({ + method: 'get', + url: 'http://sdcs.sysu.edu.cn/', + headers: { + Referer: `http://sdcs.sysu.edu.cn/`, + }, + }); + const $ = cheerio.load(response.data); - const urls = $('.view-content li > a') - .slice(0, 10) - .map((_, ele) => $(ele).attr('href')) - .toArray() - .map((path) => path.match(/\/content\/(\d+)/)[1]) // extract article-id - .sort() - .reverse() // sort by article-id (or to say, date), latest first - .map((aid) => resolve(base, `/content/${aid}`)); + // 首页有多个板块,每个板块的css选择器不同,而且每个板块的信息分类也不一样 + const block_index = [ + { + index: 1, + description_header: '学院新闻', + }, + { + index: 2, + description_header: '学院通知', + }, + { + index: 3, + description_header: '人才招聘', + }, + { + index: 4, + description_header: '学术活动', + }, + { + index: 5, + description_header: '学工通知', + }, + { + index: 6, + description_header: '学生活动', + }, + { + index: 7, + description_header: '教务通知', + }, + { + index: 8, + description_header: '科研通知', + }, + { + index: 9, + description_header: '人事通知', + }, + { + index: 10, + description_header: '党群工作', + }, + { + index: 11, + description_header: '校友工作', + }, + { + index: 12, + description_header: '社会工作', + }, + ]; + + function getDetail(item, description_header) { + return { + title: description_header + ': ' + item.attribs.title, + description: description_header + ': ' + item.attribs.title, + link: item.attribs.href, + category: description_header, + }; + } + + const item_data = []; + for (let i = 0; i < block_index.length; i++) { + const block_news = $('#block-views-homepage-block-' + block_index[i].index + '> div > div.view-content > div > ul > li > a'); + for (let j = 0; j < block_news.length; j++) { + console.log(block_news[j]); + item_data.push(getDetail(block_news[j], block_index[i].description_header)); + } + } + + function compareLink(a, b) { + let a_str = a.link; + a_str = a_str.substr(a_str.length - 4, 4); + const a_int = parseInt(a_str); + let b_str = b.link; + b_str = b_str.substr(b_str.length - 4, 4); + const b_int = parseInt(b_str); + return b_int - a_int; + } + // 使得新的通知排在前面,假设通知的发布和链接地址是相关的,而且链接地址都是"/content/4961"这样,只有四位数的。 + item_data.sort(compareLink); + // console.log(item_data); ctx.state.data = { - title: '中山大学 - 数据科学与计算机学院', - link: 'http://sdcs.sysu.edu.cn/', - description: '中山大学 - 数据科学与计算机学院', - item: await getDetails(ctx.cache, urls), - }; -}; - -const getDetails = (cache, urls) => Promise.all(urls.map((url) => cache.tryGet(url, () => getDetail(url)))); - -const timezone = 8; -const serverOffset = new Date().getTimezoneOffset() / 60; -const shiftTimezone = (date) => new Date(date.getTime() - 60 * 60 * 1000 * (timezone + serverOffset)).toUTCString(); - -const getDetail = async (url) => { - const { data } = await got.get(url); - const $ = load(data); - - // transforming images - $('.content img').each((_, ele) => { - $(ele).attr('referrerpolicy', 'no-referrer'); - $(ele).attr('src', resolve(base, $(ele).attr('src'))); - }); - - return { - title: $('section > h1').text(), - description: $('.content').html(), - link: url, - pubDate: shiftTimezone( - new Date( - $('.submitted-by') - .text() - .match(/(\d+\/\d+\/\d+)/)[1] - ) - ), + title: `中山大学 - 数据科学与计算机学院`, + link: `http://sdcs.sysu.edu.cn`, + description: `中山大学 - 数据科学与计算机学院`, + language: `zh-cn`, + item: item_data, }; };