diff --git a/assets/radar-rules.js b/assets/radar-rules.js
index d3cc62791e..9bc1aee0a9 100644
--- a/assets/radar-rules.js
+++ b/assets/radar-rules.js
@@ -1561,13 +1561,23 @@
'biquge5200.com': {
www: [
{
- title: '当前小说',
- docs: 'https://docs.rsshub.app/reading.html#bi-qu-ge',
+ title: 'biquge5200.com',
+ docs: 'https://docs.rsshub.app/reading.html#bi-qu-ge-biquge5200-com',
source: '/:id',
target: '/novel/biquge/:id',
},
],
},
+ 'biquge.info': {
+ www: [
+ {
+ title: 'biquge.info',
+ docs: 'https://docs.rsshub.app/reading.html#bi-qu-ge-biquge-info',
+ source: '/:id',
+ target: '/novel/biqugeinfo/:id',
+ },
+ ],
+ },
'matters.news': {
_name: 'Matters',
'.': [
diff --git a/docs/reading.md b/docs/reading.md
index 32cbd8eeef..f78bebe823 100644
--- a/docs/reading.md
+++ b/docs/reading.md
@@ -56,9 +56,9 @@ pageClass: routes
## 笔趣阁
-### 小说更新
+### biquge5200.com
-
+
::: tip 提示
@@ -66,7 +66,15 @@ pageClass: routes
:::
-
+### biquge.info
+
+
+
+::: tip 提示
+
+由于笔趣阁网站有多个,各站点小说对应的小说 id 不同。此 feed 只对应在[`www.biquge.info`](http://www.biquge.info/)中的小说 id.
+
+:::
## 吹牛部落
@@ -201,7 +209,7 @@ count 的取值范围为 1-12,为防止请求次数过多,推荐设置为 5
-具体栏目编号,去网站上看标签
+具体栏目编号,去网站上看标签
| 网址 | 对应路由 |
| ------------------------------------------------ | ----------------------------------- |
diff --git a/lib/router.js b/lib/router.js
index 78ee0f4c1c..0659dec07c 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -528,14 +528,9 @@ router.get('/earthquake/:region?', require('./routes/earthquake'));
// 中国地震台网
router.get('/earthquake/ceic/:type', require('./routes/earthquake/ceic'));
-// 笔趣阁
-router.get('/biquge/novel/latestchapter/:id', require('./routes/novel/biquge'));
-
-// UU看书
-router.get('/uukanshu/chapter/:uid', require('./routes/novel/uukanshu'));
-
// 小说
router.get('/novel/biquge/:id', require('./routes/novel/biquge'));
+router.get('/novel/biqugeinfo/:id/:limit?', require('./routes/novel/biqugeinfo'));
router.get('/novel/uukanshu/:uid', require('./routes/novel/uukanshu'));
router.get('/novel/wenxuemi/:id1/:id2', require('./routes/novel/wenxuemi'));
router.get('/novel/booksky/:id', require('./routes/novel/booksky'));
diff --git a/lib/routes/novel/biquge.js b/lib/routes/novel/biquge.js
index 722eb52a57..b27237208b 100644
--- a/lib/routes/novel/biquge.js
+++ b/lib/routes/novel/biquge.js
@@ -1,6 +1,7 @@
const got = require('@/utils/got');
const cheerio = require('cheerio');
const iconv = require('iconv-lite');
+const asyncPool = require('tiny-async-pool');
const baseUrl = 'https://www.biquge5200.com/';
// 获取小说的最新章节列表
@@ -27,33 +28,31 @@ module.exports = async (ctx) => {
}))
.get();
- const items = await Promise.all(
- chapter_item.map(async (item) => {
- const cache = await ctx.cache.get(item.link);
- if (cache) {
- return Promise.resolve(JSON.parse(cache));
- }
+ const items = await asyncPool(3, chapter_item, async (item) => {
+ const cache = await ctx.cache.get(item.link);
+ if (cache) {
+ return Promise.resolve(JSON.parse(cache));
+ }
- const response = await got({
- method: 'get',
- url: item.link,
- responseType: 'buffer',
- });
+ const response = await got({
+ method: 'get',
+ url: item.link,
+ responseType: 'buffer',
+ });
- const responseHtml = iconv.decode(response.data, 'GBK');
- const $ = cheerio.load(responseHtml);
+ const responseHtml = iconv.decode(response.data, 'GBK');
+ const $ = cheerio.load(responseHtml);
- const description = $('#content').html();
+ const description = $('#content').html();
- const single = {
- title: item.title,
- description,
- link: item.link,
- };
- ctx.cache.set(item.link, JSON.stringify(single));
- return Promise.resolve(single);
- })
- );
+ const single = {
+ title: item.title,
+ description,
+ link: item.link,
+ };
+ ctx.cache.set(item.link, JSON.stringify(single));
+ return Promise.resolve(single);
+ });
ctx.state.data = {
title: `笔趣阁 ${title}`,
link: `${baseUrl}${id}/`,
diff --git a/lib/routes/novel/biqugeinfo.js b/lib/routes/novel/biqugeinfo.js
new file mode 100644
index 0000000000..44fcb52d86
--- /dev/null
+++ b/lib/routes/novel/biqugeinfo.js
@@ -0,0 +1,69 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+const iconv = require('iconv-lite');
+const url = require('url');
+const asyncPool = require('tiny-async-pool');
+
+const firstDay = new Date('2020-01-01');
+const baseUrl = 'http://www.biquge.info';
+// 获取小说的最新章节列表
+module.exports = async (ctx) => {
+ const { id, limit = 10 } = ctx.params; // 小说id
+ const pageUrl = url.resolve(baseUrl, `/${id}/`);
+
+ const response = await got({
+ method: 'get',
+ url: pageUrl,
+ // responseEncoding: 'gbk', //该配置项在 0.18版本中没有打包进去
+ responseType: 'buffer',
+ });
+ const responseHtml = iconv.decode(response.data, 'utf-8');
+ const $ = cheerio.load(responseHtml);
+ const title = $('#info > h1').text();
+ const description = $('#intro>p').eq(0).text();
+ const cover_url = $('#fmimg>img').eq(0).attr('src');
+ const nItems = $('dd', '#list>dl').length;
+ const list = $('dd', '#list>dl').slice(-parseInt(limit));
+ const chapter_item = list
+ .find('a')
+ .map((i, e) => ({
+ title: e.children[0].data,
+ link: url.resolve(pageUrl, e.attribs.href),
+ pubDate: new Date(firstDay.getTime() + (nItems - parseInt(limit) + i) * 1000 * 60 * 60 * 24),
+ }))
+ .get();
+
+ const items = await asyncPool(3, chapter_item, async (item) => {
+ const cache = await ctx.cache.get(item.link);
+ if (cache) {
+ return Promise.resolve(JSON.parse(cache));
+ }
+
+ const response = await got({
+ method: 'get',
+ url: item.link,
+ responseType: 'buffer',
+ });
+
+ const responseHtml = iconv.decode(response.data, 'utf-8');
+ const $ = cheerio.load(responseHtml);
+
+ const description = $('#content').text();
+
+ const single = {
+ title: item.title,
+ description,
+ link: item.link,
+ pubDate: item.pubDate,
+ };
+ ctx.cache.set(item.link, JSON.stringify(single));
+ return Promise.resolve(single);
+ });
+ ctx.state.data = {
+ title: `笔趣阁 ${title}`,
+ link: pageUrl,
+ image: cover_url,
+ description: description,
+ item: items,
+ };
+};
diff --git a/package.json b/package.json
index f8ce862bb8..1153457503 100644
--- a/package.json
+++ b/package.json
@@ -108,6 +108,7 @@
"require-all": "3.0.0",
"rss-parser": "3.8.0",
"socks-proxy-agent": "5.0.0",
+ "tiny-async-pool": "1.1.0",
"tough-cookie": "4.0.0",
"tunnel": "0.0.6",
"twit": "2.2.11",
diff --git a/yarn.lock b/yarn.lock
index c55936f383..eb90f82334 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -11757,6 +11757,14 @@ timsort@^0.3.0:
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+tiny-async-pool@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/tiny-async-pool/-/tiny-async-pool-1.1.0.tgz#cd3fdafaae84f2aa2539a07b428b40f801219c5b"
+ integrity sha512-jIglyHF/9QdCC3662m/UMVADE6SlocBDpXdFLMZyiAfrw8MSG1pml7lwRtBMT6L/z4dddAxfzw2lpW2Vm42fyQ==
+ dependencies:
+ semver "^5.5.0"
+ yaassertion "^1.0.0"
+
tiny-emitter@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
@@ -13074,6 +13082,11 @@ xtend@^4.0.1:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+yaassertion@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/yaassertion/-/yaassertion-1.0.2.tgz#f1a90166e1cc4ad44dbb71487009ebca017e9874"
+ integrity sha512-sBoJBg5vTr3lOpRX0yFD+tz7wv/l2UPMFthag4HGTMPrypBRKerjjS8jiEnNMjcAEtPXjbHiKE0UwRR1W1GXBg==
+
yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"