一次个人离线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的介绍,少数派文章已经很多了,类似软件还有FreshRSSminiflux,在少数派站点里也有很多介绍这两者的文章。刚好目前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_PATHHTTP_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下载一次,就可以在离线条件下阅读了。