diff --git a/docs/social-media.md b/docs/social-media.md
index 453e0bec7..0ad5d725b 100644
--- a/docs/social-media.md
+++ b/docs/social-media.md
@@ -481,3 +481,7 @@
+
+## 方格子
+
+
diff --git a/lib/router.js b/lib/router.js
index 09b5141a7..b0ea54011 100755
--- a/lib/router.js
+++ b/lib/router.js
@@ -1260,4 +1260,7 @@ router.get('/21caijing/channel/:name', require('./routes/21caijing/channel'));
// 北京邮电大学
router.get('/bupt/yz/:type', require('./routes/universities/bupt/yz'));
+// VOCUS 方格子
+router.get('/vocus/publication/:id', require('./routes/vocus/publication'));
+
module.exports = router;
diff --git a/lib/routes/vocus/publication.js b/lib/routes/vocus/publication.js
new file mode 100644
index 000000000..1958749c1
--- /dev/null
+++ b/lib/routes/vocus/publication.js
@@ -0,0 +1,24 @@
+const axios = require('../../utils/axios');
+
+module.exports = async (ctx) => {
+ const { id } = ctx.params;
+
+ const { _id, title, abstract } = (await axios.get(`https://api.sosreader.com/api/publication/${id}`)).data;
+ const { articles } = (await axios.get(`https://api.sosreader.com/api/articles?publicationId=${_id}&status=2&num=10&page=1`)).data;
+ const items = await Promise.all(
+ articles.map(async (item) => ({
+ title: item.title,
+ author: item.user.fullname,
+ description: (await axios.get(`https://api.sosreader.com/api/article/${item._id}`)).data.article.content,
+ pubDate: new Date(item.updatedAt).toUTCString(),
+ link: `https://vocus.cc/${id}/${item._id}`,
+ }))
+ );
+
+ ctx.state.data = {
+ title: `${title} - 方格子`,
+ link: `https://vocus.cc/${id}/home`,
+ description: abstract,
+ item: items,
+ };
+};