From 0c30c886ced1c4e1b7a82ca8c1cf2c40053d3ea2 Mon Sep 17 00:00:00 2001 From: Jonathan Goh <3853064+hang333@users.noreply.github.com> Date: Sat, 3 Oct 2020 07:31:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20=E6=9A=A8=E5=8D=97=E5=A4=A7?= =?UTF-8?q?=E5=AD=A6=20JNU=20(#5762)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/university.md | 18 +++++ lib/router.js | 4 ++ lib/routes/universities/jnu/xysx/index.js | 40 +++++++++++ lib/routes/universities/jnu/yw/index.js | 81 +++++++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 lib/routes/universities/jnu/xysx/index.js create mode 100644 lib/routes/universities/jnu/yw/index.js diff --git a/docs/university.md b/docs/university.md index f9bf8e16d..14ea083dc 100644 --- a/docs/university.md +++ b/docs/university.md @@ -454,6 +454,24 @@ xskb1 对应 +## 暨南大学 + +## 暨南要闻 + + + +| 暨大头条 | 暨南要闻 | +| -------- | -------- | +| tt | yw | + +### 暨南大学校园时讯 + + + +| 院系速递 | 部门快讯 | +| -------- | -------- | +| yxsd | bmkx | + ## 桂林电子科技大学 ### 新闻资讯 diff --git a/lib/router.js b/lib/router.js index 8be0af795..3ea814be5 100644 --- a/lib/router.js +++ b/lib/router.js @@ -2590,6 +2590,10 @@ router.get('/sustyjs', require('./routes/universities/sustyjs/sustyjs')); // 广州大学 router.get('/gzyjs', require('./routes/universities/gzyjs/gzyjs')); +// 暨南大学 +router.get('/jnu/xysx/:type', require('./routes/universities/jnu/xysx/index')); +router.get('/jnu/yw/:type?', require('./routes/universities/jnu/yw/index')); + // 深圳大学 router.get('/szuyjs', require('./routes/universities/szuyjs/szuyjs')); diff --git a/lib/routes/universities/jnu/xysx/index.js b/lib/routes/universities/jnu/xysx/index.js new file mode 100644 index 000000000..bb564435e --- /dev/null +++ b/lib/routes/universities/jnu/xysx/index.js @@ -0,0 +1,40 @@ +const got = require('@/utils/got'); +const url = require('url'); +const cheerio = require('cheerio'); + +const xysxUrl = 'https://news.jnu.edu.cn/xysx/'; +const xysxType = { yxsd: '院系速递', bmkx: '部门快讯' }; + +module.exports = async (ctx) => { + const type = ctx.params.type; + // 发起 HTTP GET 请求 + const response = await got({ + method: 'get', + headers: { + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', + }, + url: `${xysxUrl}${type}/`, + }); + + const $ = cheerio.load(response.data); + const list = $('ul[class=newsConList] > li') + .map(function () { + const info = { + title: $(this).find('div[class=title] > a').text(), + link: url.resolve(xysxUrl, $(this).find('div[class=title] > a').attr('href')), + description: $(this).find('div[class=intro]').text(), + pubDate: new Date($(this).find('div[class=date]').text()).toUTCString(), + }; + return info; + }) + .get(); + + const desc = `暨南大学校园时讯 - ${xysxType[type]}`; + + ctx.state.data = { + title: desc, + description: desc, + link: `${xysxUrl}${type}/`, + item: list, + }; +}; diff --git a/lib/routes/universities/jnu/yw/index.js b/lib/routes/universities/jnu/yw/index.js new file mode 100644 index 000000000..3e7a8368d --- /dev/null +++ b/lib/routes/universities/jnu/yw/index.js @@ -0,0 +1,81 @@ +const got = require('@/utils/got'); +const url = require('url'); +const cheerio = require('cheerio'); + +module.exports = async (ctx) => { + const type = ctx.params.type || 'yw'; + + const ywUrl = type !== 'tt' ? 'https://news.jnu.edu.cn/jnyw/List/List_149.html' : 'https://news.jnu.edu.cn/jnyw/jdtt/'; + // 发起 HTTP GET 请求 + const response = await got({ + method: 'get', + headers: { + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', + }, + url: `${ywUrl}`, + }); + + const $ = cheerio.load(response.data); + + if (type === 'tt') { + // 暨大头条 + const list = $('ul[class=newsConList] > li') + .map(function () { + const info = { + title: $(this).find('div[class=title] > a').text(), + link: url.resolve(ywUrl, $(this).find('div[class=title] > a').attr('href')), + description: $(this).find('div[class=intro]').text(), + pubDate: new Date($(this).find('div[class=date]').text()).toUTCString(), + }; + return info; + }) + .get(); + + const desc = '暨大头条'; + ctx.state.data = { + title: desc, + description: desc, + link: `${ywUrl}`, + item: list, + }; + } else { + // 暨南要闻 + const list = $('ul[class="newsList infoList infoListA"] > li') + .map(function () { + const info = { + title: $(this).find('a').text(), + link: $(this).find('a').attr('href'), + description: '', + pubDate: new Date($(this).find('span[class=date]').text()).toUTCString(), + }; + return info; + }) + .get(); + + const out = await Promise.all( + list + .filter((item) => item.link) + .map(async (item) => { + const itemUrl = url.resolve(ywUrl, item.link); + const cache = await ctx.cache.get(itemUrl); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + const response = await got.get(itemUrl); + const $ = cheerio.load(response.data); + item.description = $('div[class=conTxt]').html(); + ctx.cache.set(itemUrl, JSON.stringify(item)); + return Promise.resolve(item); + }) + ); + + const desc = '暨南要闻'; + + ctx.state.data = { + title: desc, + description: desc, + link: `${ywUrl}`, + item: out, + }; + } +};