diff --git a/docs/government.md b/docs/government.md index 1fd895790a..4f5710a0fe 100644 --- a/docs/government.md +++ b/docs/government.md @@ -111,6 +111,21 @@ pageClass: routes +#### 江苏省教育考试院 + + +注意: 其他栏目的内容格式不兼容, 且不便统一, 此处只做了下标的栏目 + +| 具体栏目 | 参数 | +| :------: | :--: | +| 招考要闻 | zkyw | +| 政策规定 | zcgd | +| 招考信息 | zkxx | +| 招考资料 | zkzl | +| 学习交流 | xxjl | + + + ### 山西省人民政府 #### 山西省人社厅 diff --git a/docs/university.md b/docs/university.md index dd754028c4..da346c8b43 100644 --- a/docs/university.md +++ b/docs/university.md @@ -963,6 +963,34 @@ https://rsshub.app/**nuist**/`bulletin` 或 https://rsshub.app/**nuist**/`bullet +### 武汉大学新闻网 + + + +注意: 除了 `kydt` 代表学术动态,其余页面均是拼音首字母小写. + +| **内容** | **参数** | +| :------: | :------: | +| 武大要闻 | wdyw | +| 媒体武大 | mtwd | +| 专题报道 | ztbd | +| 珞珈人物 | ljrw | +| 国际交流 | gjjl | +| 缤纷校园 | bfxy | +| 校友之声 | xyzs | +| 珞珈论坛 | ljlt | +| 新闻热线 | xwrx | +| 头条新闻 | ttxw | +| 综合新闻 | zhxw | +| 珞珈影像 | ljyx | +| 学术动态 | kydt | +| 点击排行 | djpx | +| 珞珈副刊 | ljfk | +| 校史钩沉 | xsgc | +| 来稿选登 | lgxd | + + + ## 西安电子科技大学 ### 教务处 diff --git a/lib/router.js b/lib/router.js index 1a676ede30..19475cfc10 100644 --- a/lib/router.js +++ b/lib/router.js @@ -668,6 +668,7 @@ router.get('/kmust/job/jobfairs', require('./routes/universities/kmust/job/jobfa // 武汉大学 router.get('/whu/cs/:type', require('./routes/universities/whu/cs')); +router.get('/whu/news/:type?', require('./routes/universities/whu/news')); // 华中科技大学 router.get('/hust/auto/notice/:type?', require('./routes/universities/hust/aia/notice')); @@ -1092,9 +1093,18 @@ router.get('/gov/province/:name/:category', require('./routes/gov/province')); router.get('/gov/city/:name/:category', require('./routes/gov/city')); router.get('/gov/statecouncil/briefing', require('./routes/gov/statecouncil/briefing')); router.get('/gov/news/:uid', require('./routes/gov/news')); + +// 苏州 router.get('/gov/suzhou/news/:uid', require('./routes/gov/suzhou/news')); router.get('/gov/suzhou/doc', require('./routes/gov/suzhou/doc')); + +// 江苏 +router.get('/gov/jiangsu/eea/:type?', require('./routes/gov/jiangsu/eea')); + +// 山西 router.get('/gov/shanxi/rst/:category', require('./routes/gov/shanxi/rst')); + +// 湖南 router.get('/gov/hunan/notice/:type', require('./routes/gov/hunan/notice')); // 中华人民共和国-海关总署 diff --git a/lib/routes/gov/jiangsu/eea.js b/lib/routes/gov/jiangsu/eea.js new file mode 100644 index 0000000000..2f8dedf14d --- /dev/null +++ b/lib/routes/gov/jiangsu/eea.js @@ -0,0 +1,84 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 参考 bit/jwc 北京理工大学的的页面写成 + +const baseUrl = 'http://www.jseea.cn/'; +const siteTitle = '--江苏省教育考试院'; + +const catrgoryMap = { + zkyw: { title: '招考要闻', suffix: 'zkyw/zkyw_channel173_1.html' }, + zcgd: { title: '政策规定', suffix: 'plank/plank_index_1.html' }, + zkxx: { title: '招考信息', suffix: 'enrollment/enrollment_index_1.html' }, + zkzl: { title: '招考资料', suffix: 'enrollmentinfo/enrollmentinfo_index_1.html' }, + xxjl: { title: '学习交流', suffix: 'learningexchange/learningexchange_index_1.html' }, +}; + +// 专门定义一个function用于加载文章内容 +async function load(link) { + // 异步请求文章 + const response = await got.get(link); + // 加载文章内容 + const $ = cheerio.load(response.data); + // 提取文章内容 + const description = $('#left-container').html(); + // 返回解析的结果 + return { description }; +} + +module.exports = async (ctx) => { + // 默认 正常规定 然后获取列表页面 + const type = ctx.params.type || 'zcgd'; + const listPageUrl = baseUrl + catrgoryMap[type].suffix; + const response = await got({ + method: 'get', + url: listPageUrl, + headers: { + Referer: baseUrl, + }, + }); + const $ = cheerio.load(response.data); + + // console.log(type+":"+listPageUrl); + // 获取当前页面的 list + const list = $('td.content_css2>ul>li'); + + const result = await Promise.all( + // 遍历每一篇文章 + list + .map(async (item) => { + const $ = cheerio.load(list[item]); // 将列表项加载成 html + const $rel_url = $('a').attr('href'); // 获取 每一项的url + + // 获取绝对路径 招考要闻是绝对路径 + const $item_url = type === 'zkyw' ? $rel_url : baseUrl + $rel_url; + const $title = $('a').attr('title'); // 获取每个的标题 + + const date_txt = $.text().match(/[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/); // 匹配 yyyy-mm-dd格式时间 + const $pubdate = new Date(date_txt); // 正则匹配发布时间 然后转换成时间 + + // console.log(item + ":" + $item_url + ":" + $title + ":" + date_txt); + // 列表上提取到的信息 + // 标题 链接 + const single = { + title: $title, + pubDate: $pubdate, + link: $item_url, + guid: $item_url, + }; + + // 对于列表的每一项, 单独获取 时间与详细内容 + const other = await ctx.cache.tryGet($item_url, async () => await load($item_url)); + // 合并解析后的结果集作为该篇文章最终的输出结果 + return Promise.resolve(Object.assign({}, single, other)); + }) + .get() + ); + + ctx.state.data = { + title: catrgoryMap[type].title + siteTitle, + link: baseUrl, + description: catrgoryMap[type].title + siteTitle, + item: result, + }; +}; diff --git a/lib/routes/universities/whu/news.js b/lib/routes/universities/whu/news.js new file mode 100644 index 0000000000..5accec2736 --- /dev/null +++ b/lib/routes/universities/whu/news.js @@ -0,0 +1,97 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); + +// 参考 bit/jwc 北京理工大学的的页面写成 + +const baseUrl = 'https://news.whu.edu.cn/'; +const sizeTitle = '武汉大学新闻网'; + +const catrgoryMap = { + wdyw: '武大要闻', + mtwd: '媒体武大', + ztbd: '专题报道', + ljrw: '珞珈人物', + gjjl: '国际交流', + bfxy: '缤纷校园', + xyzs: '校友之声', + ljlt: '珞珈论坛', + xwrx: '新闻热线', + ttxw: '头条新闻', + zhxw: '综合新闻', + ljyx: '珞珈影像', + kydt: '学术动态', + djpx: '点击排行', + ljfk: '珞珈副刊', + xsgc: '校史钩沉', + lgxd: '来稿选登', +}; + +// 专门定义一个function用于加载文章内容 +async function load(link) { + // 异步请求文章 + const response = await got.get(link); + // 加载文章内容 + const $ = cheerio.load(response.data); + + // 正则匹配发布时间 然后转换成时间 + const date_txt = $('div.news_attrib') + .text() + .match(/[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d/); // 匹配 yyyy-mm-dd hh:MM 格式时间 + const pubDate = new Date(date_txt[0]); + + // 提取文章内容 + const description = $('div.v_news_content').html(); + // 返回解析的结果 + return { description, pubDate }; +} + +module.exports = async (ctx) => { + // 默认 武大要闻 然后获取列表页面 + const type = ctx.params.type || 'wdyw'; + const listPageUrl = baseUrl + type + '.htm'; + const response = await got({ + method: 'get', + url: listPageUrl, + headers: { + Referer: baseUrl, + }, + }); + const $ = cheerio.load(response.data); + + // 获取当前页面的 list + const list = $('div.list>div>ul>li'); + list.splice(0, 1); // 删除第一个元素 标题栏 + + const result = await Promise.all( + // 遍历每一篇文章 + list + .map(async (item) => { + const $ = cheerio.load(list[item]); // 将列表项加载成 html + const $rel_url = $('div.infotitle>a').attr('href'); // 获取 每一项的url + const $item_url = baseUrl + $rel_url; // 获取绝对路径 + const $title = $('div>a').attr('title'); // 获取每个的标题 + + // 列表上提取到的信息 + // 标题 链接 + const single = { + title: $title, + // pubDate: $pubdate, + link: $item_url, + guid: $item_url, + }; + + // 对于列表的每一项, 单独获取 时间与详细内容 + const other = await ctx.cache.tryGet($item_url, async () => await load($item_url)); + // 合并解析后的结果集作为该篇文章最终的输出结果 + return Promise.resolve(Object.assign({}, single, other)); + }) + .get() + ); + + ctx.state.data = { + title: catrgoryMap[type] + sizeTitle, + link: baseUrl, + description: catrgoryMap[type] + sizeTitle, + item: result, + }; +};