diff --git a/docs/traditional-media.md b/docs/traditional-media.md index 651f9495c49cb7..d72e092766ab1b 100644 --- a/docs/traditional-media.md +++ b/docs/traditional-media.md @@ -885,6 +885,27 @@ Type 栏目: +## 湖南日报 + +### 电子刊物 + + + +| 版 | 编号 | +| ------------ | -- | +| 全部 | | +| 第 01 版:头版 | 1 | +| 第 02 版:要闻 | 2 | +| 第 03 版:要闻 | 3 | +| 第 04 版:深度 | 4 | +| 第 05 版:市州 | 5 | +| 第 06 版:理论・学习 | 6 | +| 第 07 版:观察 | 7 | +| 第 08 版:时事 | 8 | +| 第 09 版:中缝 | 9 | + + + ## 华尔街见闻 ### 华尔街见闻 diff --git a/lib/v2/hnrb/index.js b/lib/v2/hnrb/index.js new file mode 100644 index 00000000000000..a619299ba4d10c --- /dev/null +++ b/lib/v2/hnrb/index.js @@ -0,0 +1,85 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); + +module.exports = async (ctx) => { + const id = ctx.params.id; + + const rootUrl = 'https://hnrb.voc.com.cn'; + const currentUrl = `${rootUrl}/hnrb_epaper`; + + let response = await got({ + method: 'get', + url: currentUrl, + }); + + response = await got({ + method: 'get', + url: `${currentUrl}/${id ? response.data.match(/URL=(.*)"/)[1].replace(/node_\d+\.htm$/, `node_20${id}.htm`) : response.data.match(/URL=(.*)"/)[1]}`, + }); + + const $ = cheerio.load(response.data); + + const matches = response.data.match(/images\/(\d{4}-\d{2}\/\d{2})\/\d{2}\/\d+_brief/); + const link = `${rootUrl}/hnrb_epaper/html/${matches[1]}`; + + let items = $('tbody') + .eq(1) + .find('a') + .toArray() + .map((a) => `${link}/${$(a).attr('href').replace(/\.\//, '')}`) + .filter((a) => /div=-1$/.test(a)); + + if (!id) { + await Promise.all( + $('#pageLink') + .slice(1) + .toArray() + .map((p) => `${link}/${$(p).attr('href').replace(/\.\//, '')}`) + .map(async (p) => { + const pageResponse = await got({ + method: 'get', + url: p, + }); + + const page = cheerio.load(pageResponse.data); + + items.push( + ...page('tbody') + .eq(1) + .find('a') + .toArray() + .map((a) => `${link}/${page(a).attr('href').replace(/\.\//, '')}`) + .filter((a) => /div=-1$/.test(a)) + ); + }) + ); + } + + items = await Promise.all( + items.map((item) => + ctx.cache.tryGet(item, async () => { + const detailResponse = await got({ + method: 'get', + url: item, + }); + + const content = cheerio.load(detailResponse.data); + + return { + link: item, + title: content('.font01').text(), + description: content('#ozoom').html(), + pubDate: timezone(parseDate(matches[1], 'YYYY-MM/DD'), +8), + }; + }) + ) + ); + + ctx.state.data = { + title: `湖南日报${id ? ` - ${$('strong').first().parent().text()}` : ''}`, + link: currentUrl, + item: items, + }; +}; diff --git a/lib/v2/hnrb/maintainer.js b/lib/v2/hnrb/maintainer.js new file mode 100644 index 00000000000000..77e7f46e2f9997 --- /dev/null +++ b/lib/v2/hnrb/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/:id?': ['nczitzk'], +}; diff --git a/lib/v2/hnrb/radar.js b/lib/v2/hnrb/radar.js new file mode 100644 index 00000000000000..18b274121451f8 --- /dev/null +++ b/lib/v2/hnrb/radar.js @@ -0,0 +1,13 @@ +module.exports = { + 'voc.com.cn': { + _name: '华声在线', + '.': [ + { + title: '湖南日报', + docs: 'https://docs.rsshub.app/journal.html#hu-nan-ri-bao-dian-zi-kan-wu', + source: ['/'], + target: '/hnrb/:id', + }, + ], + }, +}; diff --git a/lib/v2/hnrb/router.js b/lib/v2/hnrb/router.js new file mode 100644 index 00000000000000..c7491b29f46f5d --- /dev/null +++ b/lib/v2/hnrb/router.js @@ -0,0 +1,3 @@ +module.exports = function (router) { + router.get('/:id?', require('./index')); +};