diff --git a/README.md b/README.md
index 403b65c99..2410a0eba 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,8 @@ RSSHub 是一个轻量、易于扩展的 RSS 生成器,可以给任何奇奇
- UP 主动态
- UP 主收藏夹
- UP 主投币视频
+ - UP 主粉丝
+ - UP 主关注用户
- 分区视频
- 微博
- 博主
diff --git a/docs/README.md b/docs/README.md
index 7949bf0c8..8e0e03467 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -50,6 +50,22 @@ RSSHub 是一个轻量、易于扩展的 RSS 生成器,可以给任何奇奇
参数: uid,用户 id,可在 UP 主主页中找到
+### UP 主粉丝
+
+举例: https://rss.now.sh/bilibili/user/followers/2267573
+
+路由: `/bilibili/user/followers/:uid`
+
+参数: uid,用户 id,可在 UP 主主页中找到
+
+### UP 主关注用户
+
+举例: https://rss.now.sh/bilibili/user/followings/2267573
+
+路由: `/bilibili/user/followings/:uid`
+
+参数: uid,用户 id,可在 UP 主主页中找到
+
### 分区视频
举例: [https://rss.now.sh/bilibili/partion/33](https://rss.now.sh/bilibili/partion/33)
diff --git a/router.js b/router.js
index 963fc2865..4412ca68b 100644
--- a/router.js
+++ b/router.js
@@ -15,6 +15,8 @@ router.get('/bilibili/user/video/:uid', require('./routes/bilibili/video'));
router.get('/bilibili/user/fav/:uid', require('./routes/bilibili/fav'));
router.get('/bilibili/user/coin/:uid', require('./routes/bilibili/coin'));
router.get('/bilibili/user/dynamic/:uid', require('./routes/bilibili/dynamic'));
+router.get('/bilibili/user/followers/:uid', require('./routes/bilibili/followers'));
+router.get('/bilibili/user/followings/:uid', require('./routes/bilibili/followings'));
router.get('/bilibili/partion/:tid', require('./routes/bilibili/partion'));
router.get('/bilibili/bangumi/:seasonid', require('./routes/bilibili/bangumi'));
diff --git a/routes/bilibili/followers.js b/routes/bilibili/followers.js
new file mode 100644
index 000000000..5626f03bf
--- /dev/null
+++ b/routes/bilibili/followers.js
@@ -0,0 +1,56 @@
+const axios = require('axios');
+const qs = require('querystring');
+const art = require('art-template');
+const path = require('path');
+const config = require('../../config');
+
+module.exports = async (ctx) => {
+ const uid = ctx.params.uid;
+
+ const nameResponse = await axios({
+ method: 'post',
+ url: 'https://space.bilibili.com/ajax/member/GetInfo',
+ headers: {
+ 'User-Agent': config.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ data: qs.stringify({
+ mid: uid
+ }),
+ });
+ const name = nameResponse.data.data.name;
+
+ const countResponse = await axios({
+ method: 'get',
+ url: `https://api.bilibili.com/x/relation/stat?vmid=${uid}`,
+ headers: {
+ 'User-Agent': config.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ }
+ });
+ const count = countResponse.data.data.follower;
+
+ const response = await axios({
+ method: 'get',
+ url: `https://api.bilibili.com/x/relation/followers?vmid=${uid}`,
+ headers: {
+ 'User-Agent': config.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ }
+ });
+ const data = response.data.data.list;
+
+ ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `${name} 的 bilibili 粉丝`,
+ link: `https://space.bilibili.com/${uid}/#/fans/fans`,
+ description: `${name} 的 bilibili 粉丝`,
+ lastBuildDate: new Date().toUTCString(),
+ item: data.map((item) => ({
+ title: `${name} 新粉丝 ${item.uname}`,
+ description: `${item.uname}
${item.sign}
总计${count}`,
+ pubDate: new Date(item.mtime * 1000).toUTCString(),
+ link: `https://space.bilibili.com/${item.mid}`
+ })),
+ });
+};
\ No newline at end of file
diff --git a/routes/bilibili/followings.js b/routes/bilibili/followings.js
new file mode 100644
index 000000000..e978773bc
--- /dev/null
+++ b/routes/bilibili/followings.js
@@ -0,0 +1,56 @@
+const axios = require('axios');
+const qs = require('querystring');
+const art = require('art-template');
+const path = require('path');
+const config = require('../../config');
+
+module.exports = async (ctx) => {
+ const uid = ctx.params.uid;
+
+ const nameResponse = await axios({
+ method: 'post',
+ url: 'https://space.bilibili.com/ajax/member/GetInfo',
+ headers: {
+ 'User-Agent': config.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ },
+ data: qs.stringify({
+ mid: uid
+ }),
+ });
+ const name = nameResponse.data.data.name;
+
+ const countResponse = await axios({
+ method: 'get',
+ url: `https://api.bilibili.com/x/relation/stat?vmid=${uid}`,
+ headers: {
+ 'User-Agent': config.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ }
+ });
+ const count = countResponse.data.data.following;
+
+ const response = await axios({
+ method: 'get',
+ url: `https://api.bilibili.com/x/relation/followings?vmid=${uid}`,
+ headers: {
+ 'User-Agent': config.ua,
+ 'Referer': `https://space.bilibili.com/${uid}/`,
+ }
+ });
+ const data = response.data.data.list;
+
+ ctx.body = art(path.resolve(__dirname, '../../views/rss.art'), {
+ title: `${name} 的 bilibili 关注`,
+ link: `https://space.bilibili.com/${uid}/#/fans/follow`,
+ description: `${name} 的 bilibili 关注`,
+ lastBuildDate: new Date().toUTCString(),
+ item: data.map((item) => ({
+ title: `${name} 新关注 ${item.uname}`,
+ description: `${item.uname}
${item.sign}
总计${count}`,
+ pubDate: new Date(item.mtime * 1000).toUTCString(),
+ link: `https://space.bilibili.com/${item.mid}`
+ })),
+ });
+};
\ No newline at end of file