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