diff --git a/docs/anime.md b/docs/anime.md
index 0f08540cf..e0a0e7ac7 100644
--- a/docs/anime.md
+++ b/docs/anime.md
@@ -191,6 +191,12 @@ pageClass: routes
+## Comicat
+
+### 搜索关键词
+
+
+
## CnGal
### 每周速报
diff --git a/lib/v2/comicat/maintainer.js b/lib/v2/comicat/maintainer.js
new file mode 100644
index 000000000..b32886472
--- /dev/null
+++ b/lib/v2/comicat/maintainer.js
@@ -0,0 +1,3 @@
+module.exports = {
+ '/search/:keyword': ['Cyang39'],
+};
diff --git a/lib/v2/comicat/radar.js b/lib/v2/comicat/radar.js
new file mode 100644
index 000000000..d6d348263
--- /dev/null
+++ b/lib/v2/comicat/radar.js
@@ -0,0 +1,11 @@
+module.exports = {
+ 'comicat.org': {
+ _name: 'Comicat',
+ '.': [
+ {
+ title: '搜索关键词',
+ docs: 'https://docs.rsshub.app/anime.html#comicat',
+ },
+ ],
+ },
+};
diff --git a/lib/v2/comicat/router.js b/lib/v2/comicat/router.js
new file mode 100644
index 000000000..5a0a66fe1
--- /dev/null
+++ b/lib/v2/comicat/router.js
@@ -0,0 +1,3 @@
+module.exports = function (router) {
+ router.get('/search/:keyword', require('./search'));
+};
diff --git a/lib/v2/comicat/search.js b/lib/v2/comicat/search.js
new file mode 100644
index 000000000..9b0b43d5c
--- /dev/null
+++ b/lib/v2/comicat/search.js
@@ -0,0 +1,42 @@
+const got = require('@/utils/got');
+const cheerio = require('cheerio');
+const { parseDate } = require('@/utils/parse-date');
+
+const baseUrl = 'https://comicat.org';
+
+module.exports = async (ctx) => {
+ const keyword = ctx.params.keyword;
+ const { data: response } = await got(`${baseUrl}/search.php?keyword=${encodeURIComponent(keyword)}`);
+ const $ = cheerio.load(response);
+ const list = $('#listTable tbody > tr')
+ .toArray()
+ .map((item) => ({
+ title: $(item).find('td:nth-child(3)').text().trim(),
+ link: `${baseUrl}/${$(item).find('td:nth-child(3) a').attr('href')}`,
+ category: $(item).find('td:nth-child(2)').text().trim(),
+ author: $(item).find('td:nth-child(8)').text().trim(),
+ }));
+
+ 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.pubDate = parseDate($('div.main > div.slayout > div > div.c1 > div:nth-child(1) > div > p:nth-child(4)').text().split('发布时间: ')[1]);
+ const marginLink = `magnet:?xt=urn:btih:${$('#text_hash_id').text().split(',特征码:')[1]}`.trim();
+ item.enclosure_url = marginLink;
+ item.enclosure_type = 'application/x-bittorrent';
+ item.description = $('#btm > div.main > div.slayout > div > div.c2 > div:nth-child(1) > div.intro').html();
+
+ return item;
+ })
+ )
+ );
+
+ ctx.state.data = {
+ title: `Comicat - ${keyword}`,
+ link: `${baseUrl}/search.php?keyword=${encodeURIComponent(keyword)}`,
+ item: items
+ };
+};