diff --git a/docs/install/README.md b/docs/install/README.md index 12b67b42b9..954c644ec3 100644 --- a/docs/install/README.md +++ b/docs/install/README.md @@ -379,6 +379,10 @@ $ docker run -d --name rsshub -p 1200:1200 rsshub:arm32v7 - `GITHUB_ACCESS_TOKEN`: GitHub Access Token +- `bilibili`: 控制台执行 document.cookie + + - `BILIBILI_COOKIE_{uid}`: 对应 uid 的 b 站用户登录后的 Cookie 值 + ### 访问控制 可以通过修改 `middleware/access-control.js` 或者设置环境变量来配置黑名单和白名单. diff --git a/docs/social-media.md b/docs/social-media.md index c5c2d4e8d5..a3bb1a1696 100644 --- a/docs/social-media.md +++ b/docs/social-media.md @@ -134,6 +134,14 @@ + +::: warning 注意 + +用户动态需要 b 站登录后的 Cookie 值,所以只能自建,详情见部署页面的配置模块。 + +::: + + ### 直播开播 见 [#哔哩哔哩直播](/live.html#哔哩哔哩直播) diff --git a/lib/config.js b/lib/config.js index 405aa4d6f5..a6971a6844 100644 --- a/lib/config.js +++ b/lib/config.js @@ -1,3 +1,12 @@ +const bilibili_cookies = {}; +const envs = process.env; +for (const name in envs) { + if (name.startsWith('BILIBILI_COOKIE_')) { + const uid = name.slice(16); + bilibili_cookies[uid] = envs[name]; + } +} + module.exports = { connect: { port: process.env.PORT || 1200, // 监听端口 @@ -52,6 +61,10 @@ module.exports = { name: process.env.HTTP_BASIC_AUTH_NAME || 'usernam3', pass: process.env.HTTP_BASIC_AUTH_PASS || 'passw0rd', }, + bilibili: { + cookies: bilibili_cookies, + }, + puppeteerWSEndpoint: process.env.PUPPETEER_WS_ENDPOINT, loggerLevel: process.env.LOGGER_LEVEL || 'info', proxy: { diff --git a/lib/router.js b/lib/router.js index 1933252c4c..694e280d99 100644 --- a/lib/router.js +++ b/lib/router.js @@ -120,6 +120,7 @@ router.get('/bilibili/user/channel/:uid/:cid', require('./routes/bilibili/userCh router.get('/bilibili/topic/:topic', require('./routes/bilibili/topic')); router.get('/bilibili/audio/:id', require('./routes/bilibili/audio')); router.get('/bilibili/vsearch/:kw/:order?', require('./routes/bilibili/vsearch')); +router.get('/bilibili/followings/video/:uid', require('./routes/bilibili/followings_video')); // bangumi router.get('/bangumi/calendar/today', require('./routes/bangumi/calendar/today')); diff --git a/lib/routes/bilibili/followings_video.js b/lib/routes/bilibili/followings_video.js new file mode 100644 index 0000000000..aecb978f63 --- /dev/null +++ b/lib/routes/bilibili/followings_video.js @@ -0,0 +1,43 @@ +const axios = require('../../utils/axios'); +const cache = require('./cache'); +const config = require('../../config'); + +module.exports = async (ctx) => { + const uid = String(ctx.params.uid); + const name = await cache.getUsernameFromUID(ctx, uid); + + const cookie = config.bilibili.cookies[uid]; + if (cookie === undefined) { + throw Error('缺少对应uid的b站用户登录后的Cookie值'); + } + + const response = await axios({ + method: 'get', + url: `https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid=${uid}&type=8`, + headers: { + Referer: `https://space.bilibili.com/${uid}/`, + Cookie: cookie, + }, + }); + const cards = response.data.data.cards; + + const out = await Promise.all( + cards.map(async (card) => { + const card_data = JSON.parse(card.card); + + const item = { + title: card_data.title, + description: `${card_data.desc}
`, + pubDate: new Date(card_data.pubdate * 1000).toUTCString(), + link: `https://www.bilibili.com/video/av${card_data.aid}`, + }; + return Promise.resolve(item); + }) + ); + + ctx.state.data = { + title: `${name} 关注视频动态`, + link: `https://t.bilibili.com/?tab=8`, + item: out, + }; +};