diff --git a/lib/v2/sfacg/maintainer.js b/lib/v2/sfacg/maintainer.js
new file mode 100644
index 000000000..52f450a7f
--- /dev/null
+++ b/lib/v2/sfacg/maintainer.js
@@ -0,0 +1,3 @@
+module.exports = {
+ '/novel/chapter/:id': ['keocheung'],
+};
diff --git a/lib/v2/sfacg/novel-chapter.js b/lib/v2/sfacg/novel-chapter.js
new file mode 100644
index 000000000..32d4c751d
--- /dev/null
+++ b/lib/v2/sfacg/novel-chapter.js
@@ -0,0 +1,51 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+const { parseDate } = require('@/utils/parse-date');
+const timezone = require('@/utils/timezone');
+
+module.exports = async (ctx) => {
+ const { id } = ctx.params;
+ const limit = Number.parseInt(ctx.query.limit) || 20;
+
+ const baseUrl = 'https://book.sfacg.com';
+
+ const { data: response } = await got(`${baseUrl}/Novel/${id}/MainIndex/`);
+ const $ = cheerio.load(response);
+
+ const list = $('div.catalog-list ul li a')
+ .slice(-limit)
+ .toArray()
+ .map((item) => {
+ item = $(item);
+ return {
+ title: item.attr('title'),
+ link: `${baseUrl}${item.attr('href')}`,
+ };
+ });
+ const items = await Promise.all(
+ list.map((item) =>
+ ctx.cache.tryGet(item.link, async () => {
+ const { data: response } = await got(item.link);
+ const $ = cheerio.load(response);
+
+ item.description = $('div.article-content').html();
+
+ const rawDate = $('div.article-desc span').eq(1).text();
+ item.pubDate = timezone(parseDate(rawDate.replace('更新时间:', '')), +8);
+
+ return item;
+ })
+ )
+ );
+
+ const { data: intro } = await got(`${baseUrl}/Novel/${id}/`);
+ const $i = cheerio.load(intro);
+
+ ctx.state.data = {
+ title: `SF轻小说 ${$('h1.story-title').text()}`,
+ link: `${baseUrl}/Novel/${id}`,
+ description: $i('p.introduce').text(),
+ image: $i('div.summary-pic img').attr('src').replace('http://', 'https://'),
+ item: items,
+ };
+};
diff --git a/lib/v2/sfacg/radar.js b/lib/v2/sfacg/radar.js
new file mode 100644
index 000000000..674188b67
--- /dev/null
+++ b/lib/v2/sfacg/radar.js
@@ -0,0 +1,13 @@
+module.exports = {
+ 'sfacg.com': {
+ _name: 'SF 轻小说',
+ book: [
+ {
+ title: '章节',
+ docs: 'https://docs.rsshub.app/routes/reading#sf-qing-xiao-shuo',
+ source: ['/Novel/:id/*'],
+ target: '/sfacg/novel/chapter/:id',
+ },
+ ],
+ },
+};
diff --git a/lib/v2/sfacg/router.js b/lib/v2/sfacg/router.js
new file mode 100644
index 000000000..ce44237af
--- /dev/null
+++ b/lib/v2/sfacg/router.js
@@ -0,0 +1,3 @@
+module.exports = (router) => {
+ router.get('/novel/chapter/:id', require('./novel-chapter'));
+};
diff --git a/website/docs/routes/reading.mdx b/website/docs/routes/reading.mdx
index 858142e86..c219cf9f1 100644
--- a/website/docs/routes/reading.mdx
+++ b/website/docs/routes/reading.mdx
@@ -66,6 +66,12 @@
+## SF 轻小说 {#sf-qing-xiao-shuo}
+
+### 章节 {#sf-qing-xiao-shuo-zhang-jie}
+
+
+
## SoBooks {#sobooks}
### 首页 {#sobooks-shou-ye}