自建 RSSHub
# 400.自建 RSSHub
本文着重讲讲根据 Docker 如何自建 RSSHub。
当然,根据官网文档,使用 npm/Vercel 的方式也是可以的,也很简单。
先声明下:
- 如果没有编程基础的话,搭建起来会有点麻烦,这没关系,每天学习一点,慢慢搭建,总能成功的。
- 网上有不少一键部署的教程,Vercel 一键部署 RSSHub (opens new window)
- 如果你实在不想动手,那就用我上一篇博客提到的 RSSHub 镜像实例,搭网友的便车。
# 什么是 Docker
如果你不了解什么是 Docker,可以看看我写的 Docker 教程:https://www.peterjxl.com/Docker (opens new window),看前几篇文章就行。
Docker 其实不是很复杂,能安装、启动、了解一些常用命令就可以完成日常的使用了。
如果你觉得我的博客比较难懂,也可以去看其他人写的教程,网上有很多。
# 官网文档
可以先简单看看官网文档(访问不到的话可以看看镜像站):
# 关于镜像的问题
默认的镜像是:diygod/rsshub
但我推荐使用 diygod/rsshub:chromium-bundled
,该镜像还包括了 puppeteer
,这是一个 Node 库,有些 RSS 源需要它。
例如,我原先使用的是 diygod/rsshub
,在订阅 B 站用户动态的时候,就遇到报错:
Error: Could not find Chrome (ver. 123.0.6312.86). This can occur if either 1. you did not perform an installation before running the script (e.g. `npx puppeteer browsers install chrome`) or 2. your cache path is incorrectly configured (which is: /app/node_modules/.cache/puppeteer). For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
经过这些参考的 issue,才知道换一个镜像,后续就没报错了:
- https://github.com/DIYgod/RSSHub/issues/7612 (opens new window)
- https://github.com/DIYgod/RSSHub/issues/14812 (opens new window)
- https://github.com/DIYgod/RSSHub/discussions/11047 (opens new window)
# Docker Compose
我这里使用 Compose 方式,就不用下载镜像后再配置了。新建 docker-compose.yml 文件,内容如下:
services:
rsshub:
# two ways to enable puppeteer:
# * comment out marked lines, then use this image instead: diygod/rsshub:chromium-bundled
# * (consumes more disk space and memory) leave everything unchanged
image: diygod/rsshub:chromium-bundled
restart: always
ports:
- '1200:1200'
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000' # marked
depends_on:
- redis
- browserless # marked
browserless: # marked
image: browserless/chrome # marked
restart: always # marked
ulimits: # marked
core: # marked
hard: 0 # marked
soft: 0 # marked
redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
volumes:
redis-data:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
PS:该文件来自官网 https://github.com/DIYgod/RSSHub/blob/master/docker-compose.yml (opens new window),我这里仅仅是修改了镜像为 diygod/rsshub:chromium-bundled
创建 volume 持久化 Redis 缓存:
docker volume create redis-data
启动(加了 -d
是后台启动的意思。如果不加则是前台启动,一关闭终端就会停止):
docker compose up -d
停止:
docker compose down
然后我们就可以开始订阅啦~
# 订阅 bilibili
订阅的时候,注意有些路由是要做配置的,原因在之前的博客讲“RSS 的没落”的时候也讲过。
例如,订阅 B 站需要 Cookie(可以理解为登录后的凭证,感兴趣的可以看我的另一篇博客:Cookie 笔记 (opens new window))
官网文档 (opens new window) 是这样说的:
我觉得这个步骤有点太简单了,我折腾了好久、查了很多 issue 才达到这个功能,接下来就详细说明下如何操作。
首先登录 bilibili,然后打开 https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/dynamic_new?uid = 0& type = 8 (opens new window)
然后按 F12 键打开浏览器的控制台,切换到 Network (网络)面板:
再次刷新网页,并且查找 dy 开头的网络请求,然后找到请求标头里的 Cookie 字段:
然后可以双击该字段,就会全选,然后按下 Ctrl + C 复制(注意 Cookie 是一个很长的字符串,这里我截图只截了一部分,此外不同路由需要的字段也不尽相同,具体请参考官网文档)
然后我们在 docker-compose.yml 的同级目录下,新建 rsshub.env 文件(新建 txt 后,然后改后缀名),文件内容格式为:
BILIBILI_COOKIE_{UID}=[Cookie]
例如我的文件内容如下:
BILIBILI_COOKIE_12345678 = buvid3=6049693D-979D-D59F-D0EF-02E96541F39075143...
注:
- 这个文件是
Docker
的环境变量文件 - 关于文件名:
env
是后缀,不能改;而rsshub
是应用的名字(在docker-compose.yml
里配置的)。 - 如果只命名为
.env
,会因为“. 开头的文件和目录被视为隐藏文件”而读取不到 - UID 随便填,填个 123456 都行
然后重启 RSSHub 即可,这样后续就可以订阅 B 站动态了。
注意:cookie 会更新,更新后原本的就会失效,导致 rsshub 抓取失败。所以需要定期更新,并且重启 docker。如果不提供 Cookie 或者 Cookie 已经失效了,那么订阅时会提示:
Error: 503 Service Unavailable
一些方案:
- 方法一:在浏览器无痕模式(隐身模式)下登录后获取相应的 Cookie。因为用户通过浏览器访问才会触发 Cookie 刷新,所以可以用该方法规避,能极大地延长 Cookie 有效时间。
- 方法二:使用 CookieCloud (opens new window) 同步 Cookie。这一步较为负责,不展开讲。
我平时用的是 Chrome 浏览器,然后我通过 Edge 浏览器获取的 Cookie,也能用很长一段时间。
参考的 issue:
- https://github.com/DIYgod/RSSHub/issues/15205 (opens new window)
- https://github.com/DIYgod/RSSHub/issues/12207 (opens new window)
- https://github.com/DIYgod/RSSHub/discussions/10765 (opens new window)
- https://github.com/DIYgod/RSSHub/issues/15476 (opens new window)
# RSSHub 日常维护
由于我是在 Windows 上使用,因此新建了一个 restart.bat
文件,里面的内容是:
docker compose down
docker compose up -d
pause
2
3
4
5
这样我双击该 bat 文件,即可完成 RSSHub 的重启,而不用动手输命令:
如果你使用的是 Linux,也可以新建一个 shell 脚本完成类似的功能。
——完——