diff --git a/docs/picture.md b/docs/picture.md
index 927cd99ecc..3d674461c2 100644
--- a/docs/picture.md
+++ b/docs/picture.md
@@ -269,6 +269,17 @@ R18 显示
+## Mic Mic Idol
+
+### 最新
+
+
+
+### 标签
+
+
+获取数量可以通过 [limit](https://docs.rsshub.app/parameter.html#tiao-shu-xian-zhi) 参数控制。默认值为`50`。
+
## MM 范
### 分类
diff --git a/lib/router.js b/lib/router.js
index c2a87a4b13..bd6d61f9bc 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -4212,6 +4212,10 @@ router.get('/right/forum/:id?', lazyloadRouteHandler('./routes/right/forum'));
// 香港經濟日報
router.get('/hket/:category?', lazyloadRouteHandler('./routes/hket/index'));
+// micmicidol
+router.get('/micmicidol', lazyloadRouteHandler('./routes/micmicidol/latest'));
+router.get('/micmicidol/search/:label', lazyloadRouteHandler('./routes/micmicidol/search'));
+
// 香港高登
router.get('/hkgolden/:id?/:limit?/:sort?', lazyloadRouteHandler('./routes/hkgolden'));
diff --git a/lib/routes/micmicidol/article.js b/lib/routes/micmicidol/article.js
new file mode 100644
index 0000000000..1c8976314c
--- /dev/null
+++ b/lib/routes/micmicidol/article.js
@@ -0,0 +1,28 @@
+const Cheerio = require('cheerio');
+const got = require('@/utils/got');
+const { parseDate } = require('@/utils/parse-date');
+const regStripAnchor = /(?:
*)?(?:<\/a>)(?: *
)?/i;
+
+async function loadArticle(link) {
+ const resp = await got(link);
+ const $ = Cheerio.load(resp.body);
+ const matchResult = $('#post-header-top > script')
+ .html()
+ .match(/var timestamp="\w+,(.+)";/i)[1]
+ .trim();
+ // Ex. "August 20, 2021"
+ const pubDate = parseDate(matchResult + '+0000', 'MMMM D, YYYYZ');
+
+ const labels = $('.post-labels a')
+ .text()
+ .split('\n')
+ .filter((item) => item !== '');
+ return {
+ title: $('.entry-title').text().trim(),
+ description: $('.post-body.entry-content').html().replace(regStripAnchor, ''),
+ category: labels,
+ pubDate,
+ link,
+ };
+}
+module.exports = loadArticle;
diff --git a/lib/routes/micmicidol/latest.js b/lib/routes/micmicidol/latest.js
new file mode 100644
index 0000000000..28d60e0dbf
--- /dev/null
+++ b/lib/routes/micmicidol/latest.js
@@ -0,0 +1,3 @@
+const parse = require('./parse');
+
+module.exports = (ctx) => parse(ctx, '', 'Latest');
diff --git a/lib/routes/micmicidol/parse.js b/lib/routes/micmicidol/parse.js
new file mode 100644
index 0000000000..95063775f9
--- /dev/null
+++ b/lib/routes/micmicidol/parse.js
@@ -0,0 +1,22 @@
+const got = require('@/utils/got');
+const Cheerio = require('cheerio');
+const loadArticle = require('./article');
+
+module.exports = async (ctx, urlParam, title) => {
+ const link = new URL(urlParam, 'https://www.micmicidol.com/').toString();
+ const response = await got(link);
+ ctx.state.data = {
+ title: `micmicidol-${title}`,
+ link,
+ item:
+ response.body &&
+ (await Promise.all(
+ Cheerio.load(response.body)('.post.hentry')
+ .map((_, entry) => {
+ const { href } = Cheerio.load(entry)('.post-title.entry-title a')[0].attribs;
+ return ctx.cache.tryGet(href, () => loadArticle(href));
+ })
+ .toArray()
+ )),
+ };
+};
diff --git a/lib/routes/micmicidol/search.js b/lib/routes/micmicidol/search.js
new file mode 100644
index 0000000000..f39fc6a538
--- /dev/null
+++ b/lib/routes/micmicidol/search.js
@@ -0,0 +1,7 @@
+const parse = require('./parse');
+
+module.exports = (ctx) => {
+ const max = ctx.query.limit || 50;
+ const { label } = ctx.params;
+ return parse(ctx, `search/label/${label}?max-results=${max}`, label);
+};