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