diff --git a/docs/reading.md b/docs/reading.md index 787777be9..701344bed 100644 --- a/docs/reading.md +++ b/docs/reading.md @@ -139,6 +139,32 @@ pageClass: routes +## 超星 + +### 期刊 + + + +::: tip 看我 + +全部期刊可以在 [这里](http://qk.chaoxing.com/space/index) 找到,你也可以从 [学科分类](https://qikan.chaoxing.com/jourclassify) 和 [期刊导航](https://qikan.chaoxing.com/search/openmag) 中发现更多期刊。 + +如订阅 [**上海文艺**](http://m.chaoxing.com/mqk/list?sw=&mags=6b5c39b3dd84352be512e29df0297437&isort=20&from=space),其 URL 为 。`6b5c39b3dd84352be512e29df0297437` 即为期刊 id,所得路由为 [`/chaoxing/qk/6b5c39b3dd84352be512e29df0297437`](https://rsshub.app/chaoxing/qk/6b5c39b3dd84352be512e29df0297437) + +::: + +::: warning 提示 + +你可以设置参数 **需要获取文章全文** 为 `true` `yes` `t` `y` 等值(或者忽略这个参数),RSS 的条目会携带期刊中的 **文章全文**,而不仅仅是 **文章概要**。但因为发起访问请求过多会被该网站屏蔽,你可以将其关闭(设置该参数为 `false` `no` `f` `n` 等值),这将会大大减少请求次数从而更难触发网站的反爬机制。 + +路由默认会获取 **30** 个条目。在路由后指定 `?limit=<条目数量>` 减少或增加单次获取条目数量,同样可以减少请求次数,如设置为一次获取 **10** 个条目,路由可以更改为 [`/chaoxing/qk/6b5c39b3dd84352be512e29df0297437?limit=10`](https://rsshub.app/chaoxing/qk/6b5c39b3dd84352be512e29df0297437?limit=10) + +在根据上文设置 **需要获取文章全文** 为不需要时,你可以将 `limit` 值增大,从而获取更多的条目,此时因为不获取全文也不会触发反爬机制,如 [`/chaoxing/qk/6b5c39b3dd84352be512e29df0297437/false?limit=100`](https://rsshub.app/chaoxing/qk/6b5c39b3dd84352be512e29df0297437/false?limit=100) + +::: + + + ## 吹牛部落 ### 栏目 diff --git a/lib/v2/chaoxing/maintainer.js b/lib/v2/chaoxing/maintainer.js new file mode 100644 index 000000000..bc24a3dbd --- /dev/null +++ b/lib/v2/chaoxing/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/qk/:id/:needContent?': ['nczitzk'], +}; diff --git a/lib/v2/chaoxing/qk.js b/lib/v2/chaoxing/qk.js new file mode 100644 index 000000000..3d561d3ed --- /dev/null +++ b/lib/v2/chaoxing/qk.js @@ -0,0 +1,59 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); +const { art } = require('@/utils/render'); +const path = require('path'); + +module.exports = async (ctx) => { + const id = ctx.params.id; + const needContent = /t|y/i.test(ctx.params.needContent ?? 'true'); + + const rootUrl = 'http://m.chaoxing.com'; + const currentUrl = `${rootUrl}/mqk/json?size=${ctx.query.limit ?? 30}&mags=${id}&isort=20`; + + const headers = { + cookie: 'duxiu=userName_dsr%2C%3Dmmxy%2C!userid_dsr%2C%3D837%2C!enc_dsr%2C%3D7EDE234634FC80D554A7F6D1AA0D3629; AID_dsr=665; msign_dsr=1638170006420;', + }; + + const response = await got({ + method: 'get', + url: currentUrl, + headers, + }); + + let items = response.data.list.map((item) => ({ + title: item.infos.C301, + author: item.infos.C303, + link: item.infos.read, + category: [item.infos.C314, item.infos.C031], + pubDate: parseDate(item.infos.C103, 'YYYYMMDD'), + description: art(path.join(__dirname, 'templates/description.art'), { + description: (item.infos.M305 ?? item.infos.C305 ?? '').trim(), + }), + })); + + items = await Promise.all( + items.map((item) => + ctx.cache.tryGet(item.link, async () => { + if (needContent) { + const detailResponse = await got({ + method: 'get', + url: item.link, + headers, + }); + + const content = cheerio.load(detailResponse.data); + + item.description = content('#article_content').html() ?? content('body').html(); + } + return item; + }) + ) + ); + + ctx.state.data = { + title: response.data.list[0].infos.C307, + link: `${rootUrl}/mqk/list?mags=${id}&isort=20&from=space`, + item: items, + }; +}; diff --git a/lib/v2/chaoxing/radar.js b/lib/v2/chaoxing/radar.js new file mode 100644 index 000000000..17e8959ca --- /dev/null +++ b/lib/v2/chaoxing/radar.js @@ -0,0 +1,13 @@ +module.exports = { + 'chaoxing.com': { + _name: '超星', + '.': [ + { + title: '期刊', + docs: 'https://docs.rsshub.app/reading.html#chao-xing-qi-kan', + source: ['/'], + target: (params, url) => `/chaoxing/qk/${new URL(url).searchParams.get('mags')}`, + }, + ], + }, +}; diff --git a/lib/v2/chaoxing/router.js b/lib/v2/chaoxing/router.js new file mode 100644 index 000000000..1b223e6aa --- /dev/null +++ b/lib/v2/chaoxing/router.js @@ -0,0 +1,3 @@ +module.exports = function (router) { + router.get('/qk/:id/:needContent?', require('./qk')); +}; diff --git a/lib/v2/chaoxing/templates/description.art b/lib/v2/chaoxing/templates/description.art new file mode 100644 index 000000000..1053a98f8 --- /dev/null +++ b/lib/v2/chaoxing/templates/description.art @@ -0,0 +1,3 @@ +{{ if description }} +

{{ description }}

+{{ /if }} \ No newline at end of file