一次个人离线RSS体系的搭建过程
不想被算法瀑布洗脑,重新拾起了RSS,但是日常阅读的时间大部分都是在飞机上,没有网络环境。虽然Reeder自带了后台刷新功能,但是阅读时看不到图片是痛点,加上微信的公众号的稍后阅读功能很不好用,每次手动存到Instapaper很麻烦,所以希望能有一个更加舒适阅读姿势,决定搭建自己的RSS体系。苦于不懂代码和编程,在搭建过程中阅读了内外网的各种教程、论坛,遇到了一个又一个坑,折腾了3天,终于基本满足了需求,此文既是过程,也算是给像我一样普通人的教程和避坑指南。
注:我没有申请域名,也没有配置https,这的确导致了一点小问题,详情可以见后文。至于安全性问题,见仁见智。
我的需求:
整合常用网站的阅读文章,包括微信公众号。
类似Inoreader的RSS服务;
利用IFTTT自动推送至Instapaer。
理想流程为:
RSS源>>>RSS服务>>>Reeder以及Instapaper
Reeder或者Instapaper中希望收藏的文章都可以一键推送至Pinbox。
一、源的获取
就我阅读较多的站点来说,目前少数派、爱范儿都有自己的rss订阅链接,但是例如appso之类的爱范儿频道无法单独订阅,这时候就要使用RSSHUB了。
RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。RSSHub 借助于开源社区的力量快速发展中,目前已适配数百家网站的上千项内容
由于RSSHUB主站国内无法访问,我准备使用腾讯云服务器上的宝塔面板,利用方便的docker-compass自行搭建。
(我没有任何linux基础,宝塔面板在我的搭建过程中提供了很多方便。)
(以下的命令皆在宝塔面板左侧的“终端”中运行,如果需要在文件夹内运行,可以使用宝塔面板左侧的“文件”选项,进入相应文件夹,再使用文件夹内的“终端”功能,就可以直接在当前目录运行命令,无需cd命令了)
部署RSSHUB
下载 docker-compose.yml
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml
注:因为我使用的是图形化的宝塔面板,也手动可以下载这个yml文件,存入一个文件夹,在此文件夹内运行后面启动的命令。建议使用这种方式。
创建 volume 持久化 Redis 缓存
docker volume create redis-data
注:如果想了解docker中volme的原理,这里有一份参考
简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
启动
docker-compose up -d
命令中的up是“运行”,-d命令代表后台运行。上文提到可以手动下载xml,保存至文件夹内(举例:新建一个叫rsshub的文件夹,把docker-compose.yml上传进去),在rsshub文件夹内运行这个命令。
现在,使用docker ps
命令可以显示rsshub的实例已经运行,浏览器通过 http://IP地址:1200 就可以访问了,当然你需要在服务器供应商的控制面板内开放1200这个端口。
如果想更改默认的端口,安装前编辑docker-compose.yml中“1200:1200”中前面一个1200到你想要的端口即可。宝塔面板中双击此文件就可以方便的编辑了。
如果部署完成后,又想修改端口怎么做?
我们可以进入之前存放docker-compose.yml的文件夹,终端运行命令
docker-compose down
来停止RSSHUB的运行,再编辑docker-compose.yml中的端口,编辑完成后再启动就可以了。这也是使用docker-compose部署的方便之一。
后文中部署的其他服务也同样适用
RSSHUB使用的方法可以见其文档
公众号源
推荐WeRSS服务,在众多类似服务中已稳定运行多年,目前价格为40元/年,8个公众号,已经足够我使用。
初期想参考这个知乎回答尝试搭建Huginn来抓取公众号,搭建完成后没有成功,使用上对我这种零基础的人难度太大,遂还是继续使用WeRSS。
目前(2022.4)我知道的除了WeRSS,还可以使用的公众号订阅服务还有瓦斯阅读、今天看啥、VReadTech,皆为付费服务。
有代码基础的可以尝试自建Huggin,或者关注一下liuli项目。
使用Android手机,并且热爱分享精神,可以关注一下Feeddd项目。
其他源
我还订阅了少数派、爱范儿,网站都提供了RSS订阅链接,直接在Tiny Tiny RSS中订阅就好,通过RSSHUB单独订阅了爱范儿的AppSolution频道
今年少数派的RSS不再提供全文输出(来源:《少数派思考 007:关于 RSS 》,我个人是支持的。我使用的Reeder4可以自动抓取全文。如果需要稍后读,使用IFTTT、Instapaper、Tiny Tiny RSS三者配合,也有全文输出插件,不会影响使用。
加上几个微信公众号,已经达到我每日阅读量的极限,不建议添加过多订阅源,一定会出现“RSS恐慌”。
二、部署Tiny Tiny RSS
如果和我一样不进行反向代理配置,搭建之前请参阅后文Tiny Tiny RSS的“不便之处”,如果不能接受请选择后文的Awesome Tiny Tiny RSS
关于Tiny Tiny RSS的介绍,少数派文章已经很多了,类似软件还有FreshRSS、miniflux,在少数派站点里也有很多介绍这两者的文章。刚好目前TTRSS也推荐使用docker-compose搭建。官方指南和问答见此。
安装
git clone https://git.tt-rss.org/fox/ttrss-docker-compose.git ttrss-docker
从官方获取ttrss的拷贝,存入“root/ttrss-docker”目录
进入目录,可以看到文件结构如下:
与搭建RSSHUB不同的是,TTRSS不使用docker-compose.yml进行配置。
首先使用文件夹终端运行
copy .env-dist .env
将.env-dist文件拷贝为.env
我们将在.env文件中进行配置,在宝塔面板中打开.env文件,可以看到如下代码:
我们需要修改TTRSS_SELF_URL_PATH
和HTTP_PORT
字段
TTRSS_SELF_URL_PATH=http://IP地址:181/tt-rss
HTTP_PORT=181
这里由于我不使用反向代理,在HTTP_PORT
字段中删除了127.0.0.1:
这里我使用的端口是181,你可以更改成你想要的端口并在服务器上开放此端口,注意文件中#后面是注释,需要修改的是不带#的字段
修改完成后保存,继续使用文件夹内的终端运行:
docker-compose pull && docker-compose up -d
拉取指定镜像并在后台运行。
现在访问http://IP地址:181/tt-rss
就可以访问你搭建好的ttrss了。
默认账号名admin
,密码password
。
配置
你可以通过环境变量配置,配置文档见此。
例如:需要设置SELF_URL_PATH
,将下列字段添加到.env
文件中:
TTRSS_SELF_URL_PATH=http://example.com/tt-rss
数值周围没有引号,选项应该总是以TTRSS_
为前缀。
另外,你可以在tt-rss根目录下创建config.php,使用下列语法。
putenv('TTRSS_DB_HOST=myserver');
putenv('TTRSS_SELF_URL_PATH=http://example.com/tt-rss');
putenv('TTRSS_SESSION_COOKIE_LIFETIME='. (86400*30))。
注意数值周围没有引号。选项应该总是以TTRSS_为前缀。不要修改 classes/config.php。你不需要把所有的东西都放到config.php中,只需要把你从默认值中改变的选项放进去。
安装插件
对于官方的插件,在TTRSS界面中进入偏好设置
→插件
,即可勾选启用自带的插件或安装新的插件。
对于第三方插件,在《如何搭建属于自己的 RSS 服务,高效精准获取信息》以及《Tiny Tiny RSS 安装及填坑之路》这两篇文章中都有详细教程,这里不赘述,但是根据官网文档,提供更简单方便的一种方法:
运行命令:
docker volume inspect ttrss-docker_app | grep Mountpoint
这可以获取ttrss的volume文件路径,使用宝塔面板进入此路径,找到plugins.local
文件夹,将下载的插件文件夹上传,就可以使用图形界面替代命令行,方便的安装插件了。
wallabag_v2插件,目前Github仓库中是有bug的版本,可以前往我Fork的ttrss-to-wallabag-v2-fix仓库下载,根据其他贡献者的方法修改了代码。
一个不便之处
这时候我们的RSSHUB和TTRSS都搭建成功了,正当欢快的准备订阅RSSHUB生成的源时,发现订阅失败。
搜索了一下发现,原因是:
我没有使用反向代理,RSSHUB的地址是IP:1200。
引用自HenryQW:某安全公司发布针对 ttrss 的白帽测试报告,ttrss 有多个严重安全 bug。ttrss 作者根据报告一一修复了这些 bug,其中包括禁止非80和443端口feed的更新。链接
如何解决呢?见下:
另一个选择:Awesome TTRSS
目前中文网络下TTRS的教程多以HenryQW的Awesome TTRSS项目为主,支持docker-compose搭建,集成了Fever API、Mercury全文获取等插件,以及很多主题。
搭建Awesome TTRSS的教程可以参考如下两篇文章:
Awesone TTRSS可以在它的docker-compose.yml中使用ALLOW_PORT
环境变量自定义允许的端口。这可以避免上文中的不便之处。
TTRSS的开发者fox(他脾气不太好)对Awesome TTRRS的评价见此。
但不可否认的是Awesome TTRSS非常的方便,最重要的是可以自定义允许的端口。
我目前依然选用官方TTRSS,使用Vercel重新搭建了RSSHUB,规避了端口问题。
三、TTRSS和IFTTT
TTRSS搭建好后,就可以使用TTRSS的Published articles生成专属RSS源,配合IFTTT把专属源推送至Instapaper了。
但是有一个问题是:
TTRSS输出的源中,文章标题的代码为
<title>文章标题\</title>
但是TTRSS输出的格式中,标题代码为
<title type="html">文章标题\</title>
这会导致IFTTT错误的将source title订阅源标题抓取为文章标题。
根据TTRSS开发者fox在论坛内的指引:
首先运行
docker volume inspect ttrss-docker_app | grep Mountpoint
获得ttrss-docker_app的文件目录(使用宝塔的图形化界面可以很方便的进入),
再进入文件目录中的templates/generated_feed.txt文件更改输出摸板。
这样我已经实现了我的所有需求:
TTRSS筛选出的文章自动存入Instapaper
飞机起飞前打开Instapaper下载一次,就可以在离线条件下阅读了。