diff --git a/docs/README.md b/docs/README.md index 51dfd330fd..465f04bb82 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1239,6 +1239,14 @@ category 列表: + + +| 通知公告 | 院所新闻 | 教学信息 | 学术动态 | 学院简报 | +| -------- | -------- | -------- | -------- | -------- | +| 0 | 1 | 2 | 3 | 4 | + + + ## 传统媒体 ### 央视新闻 diff --git a/router.js b/router.js index a3e83bbcd7..882bb3e7d0 100644 --- a/router.js +++ b/router.js @@ -560,6 +560,7 @@ router.get('/hust/auto/news/', require('./routes/universities/hust/auto/news')); router.get('/sdu/grad/academic', require('./routes/universities/sdu/grad/academic')); router.get('/sdu/sc/:type?', require('./routes/universities/sdu/sc')); router.get('/sdu/cmse/:type?', require('./routes/universities/sdu/cmse')); +router.get('/sdu/mech/:type?', require('./routes/universities/sdu/mech')); // ifanr router.get('/ifanr/appso', require('./routes/ifanr/appso')); diff --git a/routes/universities/sdu/mech.js b/routes/universities/sdu/mech.js new file mode 100644 index 0000000000..030d86aa92 --- /dev/null +++ b/routes/universities/sdu/mech.js @@ -0,0 +1,59 @@ +const axios = require('../../../utils/axios'); +const cheerio = require('cheerio'); +const url = require('url'); + +const typelist = ['通知公告', '院所新闻', '教学信息', '学术动态', '学院简报']; +const urlList = ['xwdt/tzgg.htm', 'xwdt/ysxw.htm', 'xwdt/jxxx.htm', 'xwdt/xsdt.htm', 'xwdt/xyjb.htm']; +const host = 'http://www.mech.sdu.edu.cn/'; + +module.exports = async (ctx) => { + const type = parseInt(ctx.params.type) || 0; + const link = url.resolve(host, urlList[type]); + const response = await axios.get(link); + + const $ = cheerio.load(response.data); + + const list = $('#page_list li a') + .map((i, e) => $(e).attr('href')) + .get(); + + const out = await Promise.all( + list.filter((e) => e.startsWith('../info') || e.startsWith('http://www.rd.sdu.edu.cn/')).map(async (itemUrl) => { + const isFromMech = itemUrl.startsWith('../info'); + if (isFromMech) { + itemUrl = url.resolve(host, itemUrl.slice('3')); + } + const cache = await ctx.cache.get(itemUrl); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + + const response = await axios.get(itemUrl); + const $ = cheerio.load(response.data); + + const rawDate = $('#show_info') + .text() + .split(/\s{4}/); + let date = rawDate[0].split(':')[1]; + date = date.slice(0, 4) + '-' + date.slice(5, 7) + '-' + date.slice(8, 10) + ' ' + date.slice(11); + + const single = { + title: $('#show_title') + .text() + .trim(), + link: itemUrl, + author: '山东大学机械工程学院', + description: $('#show_content').html(), + pubDate: new Date(date), + }; + ctx.cache.set(itemUrl, JSON.stringify(single), 24 * 60 * 60); + return Promise.resolve(single); + }) + ); + + ctx.state.data = { + title: `山东大学机械工程学院${typelist[type]}`, + link, + item: out, + }; +};