diff --git a/docs/anime.md b/docs/anime.md
index 08bc59b2bf..f1e51af1e8 100644
--- a/docs/anime.md
+++ b/docs/anime.md
@@ -80,6 +80,18 @@ pageClass: routes
+## Hpoi 手办维基
+
+### 浏览周边
+
+
+
+| 角色手办 | 作品手办 |
+| --------- | -------- |
+| charactar | works |
+
+
+
## say 花火
### 文章
diff --git a/lib/router.js b/lib/router.js
index 26c8a39430..fbe8ff7c74 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -1361,6 +1361,9 @@ router.get('/manhuadb/comics/:id', require('./routes/manhuadb/comics'));
// 观察者风闻话题
router.get('/guanchazhe/topic/:id', require('./routes/guanchazhe/topic'));
+// Hpoi 手办维基
+router.get('/hpoi/:category/:words', require('./routes/hpoi'));
+
// 通用CurseForge
router.get('/curseforge/:gameid/:catagoryid/:projectid/files', require('./routes/curseforge/generalfiles'));
diff --git a/lib/routes/hpoi/index.js b/lib/routes/hpoi/index.js
new file mode 100644
index 0000000000..7380f3c2bd
--- /dev/null
+++ b/lib/routes/hpoi/index.js
@@ -0,0 +1,41 @@
+const axios = require('../../utils/axios');
+const cheerio = require('cheerio');
+
+const host = 'https://www.hpoi.net';
+
+const MAPs = {
+ charactar: {
+ url: `${host}/hobby/all?charactar={words}&order=release`,
+ title: '角色手办',
+ },
+ works: {
+ url: `${host}/hobby/all?works={words}&order=release`,
+ title: '作品手办',
+ },
+};
+
+module.exports = async (ctx) => {
+ const category = ctx.params && ctx.params.category;
+ const words = ctx.params && ctx.params.words;
+ const response = await axios({
+ method: 'get',
+ url: MAPs[category].url.replace(/{words}/, words),
+ headers: {
+ Referer: host,
+ },
+ });
+ const $ = cheerio.load(response.data);
+ ctx.state.data = {
+ title: MAPs[category].title + ' - ' + $('title').text(),
+ item: $('.bs-glyphicons-list .detail-grid')
+ .map((_index, _item) => {
+ _item = $(_item);
+ return {
+ title: _item.find('.detail-grid-title').text(),
+ link: host + '/' + _item.find('.detail-grid-title a').attr('href'),
+ description: _item.find('.detail-grid-info').text(),
+ };
+ })
+ .get(),
+ };
+};