diff --git a/docs/README.md b/docs/README.md index f2117c27e3..a232c6ed4a 100755 --- a/docs/README.md +++ b/docs/README.md @@ -662,6 +662,8 @@ RSSHub 提供下列 API 接口: + + ## 编程 ### 掘金 diff --git a/lib/router.js b/lib/router.js index f437af2a3a..16236aee6c 100755 --- a/lib/router.js +++ b/lib/router.js @@ -283,6 +283,7 @@ router.get('/jiemian/list/:cid', require('./routes/jiemian/list.js')); // 好奇心日报 router.get('/qdaily/column/:id', require('./routes/qdaily/column')); router.get('/qdaily/category/:id', require('./routes/qdaily/category')); +router.get('/qdaily/tag/:id', require('./routes/qdaily/tag')); // 爱奇艺 router.get('/iqiyi/dongman/:id', require('./routes/iqiyi/dongman')); diff --git a/lib/routes/qdaily/tag.js b/lib/routes/qdaily/tag.js new file mode 100644 index 0000000000..04fbf5c9ec --- /dev/null +++ b/lib/routes/qdaily/tag.js @@ -0,0 +1,59 @@ +const cheerio = require('cheerio'); +const axios = require('../../utils/axios'); + +module.exports = async (ctx) => { + const url = `https://www.qdaily.com/tags/${ctx.params.id}.html`; + + const res = await axios.get(url); + const $ = cheerio.load(res.data); + const list = $('.article').get(); + + const proList = []; + const indexList = []; + + const out = await Promise.all( + list.map(async (item, i) => { + const $ = cheerio.load(item); + const time = $('.smart-date').attr('data-origindate'); + let title = $('.title').text(); + if (!title) { + title = $('.smart-dotdotdot').text(); + } + const itemUrl = $('a').attr('href'); + const allUrl = `https://www.qdaily.com${itemUrl}`; + const cache = await ctx.cache.get(allUrl); + if (cache) { + return Promise.resolve(JSON.parse(cache)); + } + const single = { + title, + pubDate: new Date(time).toUTCString(), + link: allUrl, + guid: allUrl, + }; + proList.push(axios.get(allUrl)); + indexList.push(i); + return Promise.resolve(single); + }) + ); + const responses = await axios.all(proList); + for (let i = 0; i < responses.length; i++) { + const res = responses[i]; + const $ = cheerio.load(res.data); + $('img').each((index, item) => { + item = $(item); + item.attr('src', item.attr('data-src')); + item.attr('referrerpolicy', 'no-referrer'); + }); + $('.article-detail-bd .author-share').remove(); + $('.article-detail-ft').remove(); + + out[indexList[i]].description = $('.main .com-article-detail').html(); + ctx.cache.set(out[indexList[i]].link, JSON.stringify(out[i]), 24 * 60 * 60); + } + ctx.state.data = { + title: $('title').text(), + link: url, + item: out, + }; +};