使用Electron本地部署RSSHub
📝2807 个字
 | ⌛要看完怎么也得8分钟吧
链接汇总
RSSHub官方文档:https://rsshub-doc.pages.dev
RSSHub官方仓库:https://github.com/DIYgod/RSSHub.git
Electron官方文档:https://www.electronjs.org/zh/docs/latest/
俺的RSSHub启动器仓库:https://github.com/Fantasy-Dm/RssHubLauncher.git
背景概述
- 因为可能有些小伙伴并不认识RSSHub,所以这里还是简单介绍一下。RSSHub其实就是一个RSS生成器,用来将各种平台的文章,转换成RSS的形式。因此只要配合上各种RSS订阅软件,即可非常简单地聚合各平台的小作文。所以如果你正好苦于设备上杂七杂八软件数量只增不减,又或者早就不爽原平台上各种奇奇怪怪的推送,那通过这个工具即可完美满足你的需求。
- 我自己很多平台上的小作文,都是通过RSS的形式进行订阅。不过毕竟原文章需要通过RSSHub进行转换,才能变成RSS订阅软件识别的格式。所以为了大伙都能正常享受到便利,网上很多热心小伙伴,都在自己的服务器上部署并公开分享了出来,俺也有幸白嫖到。但关键就在上周的时候,之前一直订阅的某个平台(为了防止被盯上,之后咱就称之为V平台了🙈)的小文章,突然开始就没了后续更新。
- 一开始以为是服务器宕机了,毕竟公益服务器,啥时候跑路都不奇怪🤣。但检查之后发现,源服务器并没有任何异常,就是单纯获取V平台上的文章时,返回的都是报错信息。于是又换了其他几个公益服务器试了一下,收到的依然是同样的结果。

- 所以为了查明原因,又去RSSHub官方仓库的issue上翻了一下报错信息,发现雀食有很多小伙伴发现了这个问题。至此基本可以断定,这个V平台对原有的消息接口,做了一些小小的改动,所以大伙集体嗝屁了🤪。不过令人欣喜的是,已经有网友发现了平台具体改动的内容,甚至有小伙伴重新修改RSSHub代码,修复了这个问题。
- 但关键这个修改提交的时间非常新,所以基本所有的公益服务器,都没有更新对应的代码。那既然机会都给到这了,之前偷懒的伏笔基本也该回收了,是时候自己研究一下本地部署RSSHub了🤡。
本地部署RSSHub
- 幸运的是RSSHub是支持本地部署的,官网上也提供了各平台的具体部署步骤,因此操作起来非常方便。因为俺个人使用的是windows机器,所以后续主要叙述的是在windows平台上,进行本地部署的一些步骤和遇到的坑。如果是其他平台的小伙伴,可以看看官网上有没有对应的信息,这里就不再单独展开了。
- 首先就是要下载RSSHub的源码,如果是本地有安装git的小伙伴,直接clone官方的仓库地址即可。当然如果没有安装,或者不想clone的话,也可以直接去网页上下载源码。
git clone https://github.com/DIYgod/RSSHub.git
- 下载完成后,咱们还需要进入到工程的跟目录,能看到一堆杂七杂八的文件就对了。这时候再在当前目录执行指令,安装所需要的各种依赖。虽然官方文档说的是使用npm和yarn,但我本地不管使用哪个,都会出现报错和依赖冲突。所以没辙,最后还是直接使用pnpm安装依赖,让pnpm自动解决依赖问题。所以后续的流程,和官方文档的有些差异。建议大伙先跟随官方文档的步骤进行尝试,如果不行可以再试试的步骤。
- 安装依赖指令如下:
pnpm install
- 如果看到
Done in xxxx了,说明安装成功了,就可以继续下个步骤了。 
- 但毕竟没用官方的指令,所以安装完依赖后,还需要手动build生成最终代码资源。
pnpm build
- 于是喜闻乐见又出现报错了🤡。。

- 不过好在报错信息还算好理解,无非就是还差个依赖包
@rolldown/binding-win32-x64-msvc,咱们再手动安装一下。
pnpm add @rolldown/binding-win32-x64-msvc
- 同样,看到done后,再次输入
pnpm build。稍等片刻,如果看到✔ Build complete in xxxx,就是构建成功了。 
- 然后就可以启动RSSHub了,因为前面用的都是pnpm,所以这里启动索性也就保持一致,使用pnpm:
pnpm start
- 看到一堆ip地址就说明启动成功了,咱们随便打开一个,如果看到欢迎界面,就说明RSSHub在正常运行了。

- 这时候虽然看着没问题了,但如果再试试看解析原来有问题的V平台链接,你依然会受到一个明晃晃的error💩。

- 不过值得注意的是,这时候的错误日志已经发生了变化。通过分析错误日志,其实主要还是因为缺少了对应的chrome组件。至于为啥需要用到chrome,主要还是因为这个V平台新的规则使用了cookie进行鉴权,所以咱们也得虚拟个环境出来。具体的原理感兴趣的话,可以去官方仓库看看对应的issue,里面的内容还算详细。
- 要修复这个报错也简单,只要使用指令安装对应的chrome就行。不过注意需要安装对应的版本,错误的版本并不能被识别,同时安装依赖前,需要先停止RSSHub。具体安装指令如下:
npx puppeteer browsers install chrome@136.0.7103.49
- 同样,安装完成后使用
pnpm start启动RSSHub,再次尝试解析对应订阅。如果看到的是xml信息,那恭喜你已经成功在本地部署RSSHub了,并且也适配了V平台的妙妙小修改,接下来只要把本地RSS订阅软件的服务器地址,改成本地地址就行。 
使用Electron制作启动器
- 虽然到此为止已经成功在本地部署RSSHub了,但是对俺来说还存在一个问题。就是这个命令提示符的黑框框太不优雅了,在任务栏里面一直占着一个坑位,多少是有点吵到我的眼睛了。万一一个手滑不小心关掉了,那RSSHub也就随之一起阵亡,紧随而来的又是各种RSS订阅软件的错误通知,所以这一点也不酷。
- 而且黑框框还有个问题,就是不适合开机自启。虽然解决的方法也有很多,比如添加个计划任务,又或者写个开机自动执行的vbs,姑且都可以解决上述问题。但关键是这俩太透明了,都不造RSSHub是否正在正常工作,还是不利于操控。所以思前想后,最好的方式,还是能像正常软件那样,在任务栏的系统托盘里面显示一个对应的图标。这样不管是在控制,还是查看状态上都相对方便不少。
- 诶,刚好nodejs里面有个electron包,这个包提供了非常丰富的UI接口,其中就包含了咱们想要的系统托盘功能,感兴趣的小伙伴也可以上官网看看。因为咱们只用到系统托盘功能,所以其他部分的内容这里就不单独展开了。
- 基本思路也很简单,无非就是通过electron,在系统托盘上创建一个任务图标,然后再把想要的功能添加到对应的右键菜单中。然后启动RSSHub的方式也很简单,直接在对应目录创建一个shell进程,执行上述的
pnpm start指令即可。想要停止的时候,就直接kill对应进程即可。但因为pnpm执行指令时,会额外创建多个子进程,所以为了停止时能彻底关闭所有进程,这里有引入了treeKill包,部分代码如下:
function updateTrayMenu2(serverIsRunning) {
const contextMenu = Menu.buildFromTemplate([
{
label: serverIsRunning ? '🟢 RSSHub运行中' : '⚫ RSSHub已停止',
enabled: false
},
{ type: 'separator' },
{
label: '启动RSSHub',
click: startServer,
enabled: !serverIsRunning
},
{
label: '停止RSSHub',
click: stopServer,
enabled: serverIsRunning
},
{
label: '退出',
click: () => {
if (serverProcess) {
stopServer();
setTimeout(() => {
app.quit();
}, 1000);
} else {
app.quit();
}
}
}
]);
tray.setContextMenu(contextMenu);
}
function startServer() {
if (serverProcess) {
console.log('RSSHub已经在运行!');
return;
}
console.log('运行RSSHub!');
serverProcess = spawn('pnpm', ['start'], {
cwd: path.join(__dirname, 'RSSHub'),
stdio: 'ignore',
shell: true
});
serverProcess.on('error', (err) => {
console.error('启动RSSHub失败:', err);
serverProcess = null;
updateTrayMenu(false);
});
serverProcess.on('exit', (code, signal) => {
console.log(`RSSHub进程已退出,代码: ${code}, 信号: ${signal}`);
serverProcess = null;
updateTrayMenu(false);
});
updateTrayMenu(true);
tray.setToolTip('RSSHub - 运行中');
}
function stopServer() {
if (!serverProcess) {
console.log('RSSHub并未运行。');
return;
}
// 使用treeKill关闭所有进程
treeKill(serverProcess.pid, 'SIGTERM', (err) => {
if (err) {
console.error('停止RSSHub失败:', err);
treeKill(serverProcess.pid, 'SIGKILL');
}
serverProcess = null;
console.log('RSSHub已停止');
});
}
- 同时electron官方也支持开机自启的接口,所以实现起来也非常简单,只要在右键菜单中增加对应的配置即可:
{
type : 'checkbox',
label: '开机启动',
checked : app.getLoginItemSettings().openAtLogin,
click : function () {
if(!app.isPackaged){
app.setLoginItemSettings({
openAtLogin: !app.getLoginItemSettings().openAtLogin,
path: process.execPath
})
}else{
app.setLoginItemSettings({
openAtLogin: !app.getLoginItemSettings().openAtLogin
})
}
console.log(app.getLoginItemSettings().openAtLogin)
console.log(!app.isPackaged);
}
}
- 除了这些,俺后续又增加了一些功能,因为篇幅有限,就不再单独说明了,咱们直接看最终的运行效果吧:

- 虽然现有功能都已经足够使用,但为了适配开机自启,这里还需要把工程进行最终打包,生成正式的exe才能正常启动。使用的打包工具,就是官方提供的Electron Forge包。具体的安装方式,官方也有详细的说明,咱们直接照猫画虎即可。
// 安装electron-forge
npm install --save-dev @electron-forge/cli
//安装依赖并生成默认配置
npx electron-forge import
- 完成后直接执行对应指令,即可自动打包当前工程,二者选其一即可:
// 打包当前工程,生成发布后工程文件(便携版)
npm run package
//打包当前工程,生成对应平台安装文件
npm run make
- 因为我个人不喜欢安装包,所以推荐直接使用
package指令,生成最终应用软件目录,然后拷贝到自己喜欢的目录下运行即可。进行简单配置后,即可完美实现开机自动启动对应目录的RSSHub了。同时因为是通过shell的方式启动RSSHub,如果后续又遇到某些平台修改接口,只要在修复后更新RSSHub工程即可,无需对启动器再进行任何修改。 - 同时所有的代码,俺都已经上传到了github仓库上,如果有需要的话,大伙也可以自行下载取用。有条件的也可以手动改造新增一些功能,敬请发挥大伙的艺术创想🌟!