0%

2024-02-25 RSS 使用的最佳实践 RSSHub+FluentReader+FreshRSS

2024-02-25 RSS 使用的最佳实践 RSSHub+FluentReader+FreshRSS

参考链接:

RSS 简介:https://www.runoob.com/rss/rss-intro.html

RSSHub:https://docs.rsshub.app/

Fluent Reader:https://github.com/yang991178/fluent-reader

FreshRSS:https://github.com/FreshRSS/FreshRSS

重新捡起 RSS:RSSHub + FreshRSS 建立我的信息流:https://blog.l3zc.com/2023/07/rsshub-freshrss-information-flow/

前言

最近一段时间研究了下 RSS 的最佳实践,经过一番探究,得出了 RSSHub + Fluent Reader + FreshRSS 的最佳组合,现记录一下使用流程。

本文应该是全网最全面的 RSS 使用实践了,如果给你带来了一些收获,不甚荣幸。

你真的需要 RSS 吗?

或许,你在某些文章中会看到,文章作者对 RSS 夸的天花乱坠,似乎 RSS 就是无所不能,RSS 就是银弹。

但实质上,RSS 也就是种信息传播格式,未必适合每个人,RSS 不是万能的银弹。

来做个简单的小测验,这是RSSHub的官网:https://docs.rsshub.app/

  • 如果你可以正常访问 RSSHub,那么你可能会需要 RSS
  • 如果你无法(通过一些方式)访问 RSSHub,那么你多半不需要 RSS。
  • 如果你实在搞不清楚的话,那么你必然不需要 RSS。

在搞明白你是否需要 RSS 之后,再接着往下看吧。

RSS 是什么

在开始使用 RSS 之前,先需要知道 RSS 是什么。

RSS,全称 Really Simple Syndication,即“简易信息聚合”,是一种 XML 的内容格式。

一个标准的 RSS 例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<rss version="2.0">
<channel>
<title>网站标题</title>
<link>网站首页地址</link>
<description>描述</description>
<copyright>授权信息</copyright>
<language>使用的语言(zh-cn表示简体中文)</language>
<pubDate>发布的时间</pubDate>
<lastBuildDate>最后更新的时间</lastBuildDate>
<generator>生成器</generator>
<item>
<title>标题</title>
<link>链接地址</link>
<description>内容简要描述</description>
<pubDate>发布时间</pubDate>
<category>所属目录</category>
<author>作者</author>
</item>
</channel>
</rss>

RSS 有什么用

这是个好问题,也是你在开始折腾 RSS 前需要搞清楚的事情。

以一言盖之,RSS 订阅的本质就是种信息获取渠道,与微信公众号、博客、微博等一样,都是让你来获取信息的。

只是,RSS 订阅 允许你自己来主动获取你想要的信息,而排除一切你不想要的信息。

在这个充满了大数据推送的时代,RSS 订阅是化被动为主动的信息获取方式,让你的信息接收完全被自己掌控!

BitTorrent 资源网站大多也提供 RSS 订阅,可以添加到 BT 下载软件中订阅,实现自动下载资源。

RSS 如何订阅

在知道了 RSS 有什么用之后,接下来就得找 RSS 订阅源了。

1.网站自行提供

有些网站会自己提供 RSS 订阅源,例如 GitHub少数派等,大部分自建的博客也会提供 RSS 订阅源,例如 阮一峰的网络日志草梅友仁的博客等。

2.RSSHub 订阅

但对于大部分(国内的)网站来说,提供 RSS 订阅服务是没有必要的,所以基本上不提供 RSS 订阅服务。

在这里,就需要靠 RSSHub 来实现 RSS 订阅了。

RSSHub:https://docs.rsshub.app/

RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。

image-20240225002244974

以 B 站为例。

例如我希望订阅 bilibili 上一个名为 草梅友仁的 up 主的动态。

根据 UP 主动态 的文档,路由为 /bilibili/user/dynamic/:uid/:routeParams?

:uid替换为 草梅友仁的 uid: 10822025,得到路径为 /bilibili/user/dynamic/10822025

再加上域名 https://rsshub.app,于是就获得了一个订阅源:https://rsshub.app/bilibili/user/dynamic/10822025

基于相同的方法,你还可以得到以下 RSS 订阅源。

由于官方提供的域名仅供 demo,可用性不高,会因为反爬虫等原因失效,所以一般考虑自建来增强可用性(也增加了可自定义的部分),下面来讲一下这部分内容。

RSSHub 部署

注意,近期 RSSHub 进行了大规模的改动,本文所讲述的部署方法和配置可能会过时,一切以官方文档为准!

在 RSSHub 的官方文档中,就已经对如何部署进行了详细描述:https://docs.rsshub.app/zh/install

我个人最推荐的是通过 Docker Compose 部署。

1.通过 Docker Compose 部署

首先确保服务器上安装了 Docker 和 Docker Compose。

然后在合适的位置创建docker-compose.yml文件,内容参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.9'

services:
rsshub:
image: diygod/rsshub
restart: always
ports:
- '1200:1200'
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
depends_on:
- redis

redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data

volumes:
redis-data:

然后就可以使用以下命令启动了:

1
docker-compose up -d

然后可以通过访问 http://[服务器IP]:1200来判断启动是否成功。(在此之前,记得开放服务器的 1200 端口)

如果是在本地部署的话则访问 http://127.0.0.1:1200 即可。

停止

1
docker-compose down

如何同步最新的 Docker 镜像?

可以考虑通过增加镜像 Tag 来指定具体的镜像版本,例如:diygod/rsshub:2024-02-22。

也可以考虑使用同步更新的 Docker 源,例如:https://dockerproxy.com

2.通过 npm 包使用

也许你还想过通过云函数(阿里云/腾讯云等)来调用,可以考虑将 RSSHub 作为 npm 包来使用,参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
const RSSHub = require('rsshub');

RSSHub.init({
// config
});

RSSHub.request('/bilibili/user/dynamic/10822025')
.then((data) => {
console.log(data);
})
.catch((e) => {
console.log(e);
});

这种使用方法比较冷门,在更新上也有些不便。但如果你需要的话,这也是一种选择。

3.解决图片代理问题

提示:你可以在安装完 RSS 阅读器后再来处理这个问题

在使用 RSS 阅读器的过程中,你可能会遇到图片加载不出来的问题,例如来自微博的图片就会因为跨域而被禁止加载。

image-20240225012054331

此时就需要添加图片代理。

有关图片外链的解决方案可参考该文章:2023-10-14-免费图床之微博外链图片解决方案

这里以image.baidu.com为例。

以 RSSHub 为例,参考图片处理一栏中的方法,可以在 docker-compose.yml 进行如下配置。

1
2
3
environment:
HOTLINK_TEMPLATE: 'https://image.baidu.com/search/down?url=$${href_ue}'
HOTLINK_INCLUDE_PATHS: /weibo

这样就可以正常加载了。

实际的图片地址会变成:https://image.baidu.com/search/down?url=https%3A%2F%2Ftvax1.sinaimg.cn%2Flarge%2F008dLuZOgy1hn4knw0yq4j31c82141kx.jpg,从而规避微博图片的跨域限制

此时的 docker-compose.yml 完整配置参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3.9'

services:
rsshub:
image: diygod/rsshub
restart: always
ports:
- '1200:1200'
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: 'redis://redis:6379/'
HOTLINK_TEMPLATE: 'https://image.baidu.com/search/down?url=$${href_ue}'
HOTLINK_INCLUDE_PATHS: /weibo
depends_on:
- redis

redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data

volumes:
redis-data:

202402250127846.png

在使用 RSSHub 的过程中,你可能会遇到一些需要自建并提供 Cookie 的路由,例如 用户关注动态

image-20240225172518519

查阅文档可了解相关配置。

image-20240225172547861

不过这时往往也会遇到个问题,那就是 Cookie 失效问题。

B 站的 Cookie 每隔一段时间会自动刷新,此时就失效了。

下面以 B 站为例介绍两个方法

方法一:在浏览器无痕模式(隐身模式)下登录后获取相应的 Cookie。因为用户通过浏览器访问才会触发 Cookie 刷新,所以可以用该方法规避。

方法二:使用 CookieCloud 同步 Cookie。

受限于篇幅原因,此处就不再赘述如何部署 CookieCloud 了,主要来说下怎么用。

在浏览器端设置了要同步的域名后,就可以通过 CookieCloud 的接口来获取到 Cookie 了。

image-20240225173224592

以下是一个简单的 python 脚本,会在根目录生成 .env 文件,此时就可以被 Docker 读取到环境变量,也就解决了 Cookie 问题 。

不过在实际使用中也会遇到 Cookie 更新了,但 RSSHub 这边没有同步更新 Cookie 的问题。

因为 RSSHub 只在启动的时候读取环境变量,所以需要定期重启以同步 Cookie 。

1
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
36
37
38
39
40
import urllib
import requests
import json
import urllib.parse

# 环境变量;域名
cookie_map = {
"BILIBILI_COOKIE_114514": "bilibili.com",
"WEIBO_COOKIES": "weibo.cn"
}

def get_cloud_cookie():
url = "https://localhost:8088/get/aaaaaaaaaaaaaa"
payload = json.dumps(
{"password": "xxxxxxxxxxxxxxx"}
)
headers = {"Content-Type": "application/json"}
response = requests.request("POST", url, headers=headers, data=payload)
return json.loads(response.text)

def encode_cookie(text):
return urllib.parse.quote_plus(text)

def serialize_cookie(cookie):
str = f"{encode_cookie(cookie['name'])}={encode_cookie(cookie['value'])}"
return str

if __name__ == "__main__":
data = get_cloud_cookie()
env = ""
for key, value in cookie_map.items():
cookies = data["cookie_data"][value]
cookie_str = "; ".join([serialize_cookie(c) for c in cookies])
env_str = f'{key}="{cookie_str}"\n'
env += env_str

env = env.strip()
with open(".env", "w", encoding="utf-8") as f:
f.write(env)

5.访问控制配置

如果你的 RSSHub 实例部署在公网上,那么你可能并不希望任何人都能访问你的 RSSHub 实例,尤其是你还配置了自己的 Cookie 的时候。

由于 RSSHub 官方已删除 允许清单拒绝清单,故之前的配置方法已失效。

如果你还想实现之前的效果的话,下面提供一个用 Nginx 实现的版本。

具体的细节请参考这篇博客:在 Nginx 的 if 条件中使用“与”、“或”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
location / {
include nginxconfig.io/proxy.conf;
proxy_set_header Access-Control-Allow-Origin $http_origin;
set $deny_access 0;
# 检查是否为禁止 url
if ($request_uri ~* "(/bilibili/user/followers|/bilibili/user/followings)") {
set $deny_access 1;
}
# 检查查询字符串中是否包含key
if ($arg_key = "123456") {
# 如果包含,则允许访问
set $deny_access 0;
}

if ($deny_access = 1) {
# 如果不允许,返回403 Forbidden
return 403;
}
proxy_pass http://127.0.0.1:1200;
}

注意,近期 RSSHub 进行了大规模的改动,该配置已过时,一切以官方文档为准!

这时,你就需要用到 RSSHub 提供的 访问控制配置 功能来限制其他人访问了。

image-20240227145240761

在这里,我推荐的是通过 DENYLIST + ACCESS_KEY 的模式来实现部分路由限制。

例如,我希望禁止其他人访问/bilibili/user/followers,但除此以外的路由不限制,那么就可以做如下配置

1
2
3
environment:
DENYLIST: '/bilibili/user/followers'
ACCESS_KEY: '114514'

在没有访问密钥 key 的情况下访问/bilibili/user/followers,都会被拒绝;同时其他路由不受影响。

此时需要正常的访问的话就会变成:/bilibili/user/followers?key=114514

image-20240227145738568

RSS 如何阅读

在解决了 RSS 订阅源的问题之后,我们将面临下一个问题:如何阅读 RSS?

很显然的是,原始的 xml 格式的文本,并不适合人类阅读,所以需要一个阅读器来美化内容。

桌面端

幸运的是,市面上已经有很多 RSS 阅读器了,在这里我推荐的是 Fluent Reader,一个开源的、美观的 RSS 阅读器(也支持中文)。

image-20240225005621620

前往 releases 页面下载最新版本的安装包即可,按自己的操作系统来下载,Windows 用户下载 .exe后缀的安装包。

image-20240225005745346

在安装完成后,即可进入软件查看。

默认情况下,Fluent Reader 里面什么都没有,需要自己手动添加 RSS 订阅源。

点击右上角的设置按钮

image-20240225010604284

然后输入一个 RSS 订阅源,例如:https://blog.cmyr.ltd/atom.xml

image-20240225010706988

然后再回到主页面,就可以看到订阅的内容了。

image-20240225010830611

基于同样的方式,可以将之前 RSSHub 的那些订阅源都添加进去。

手机端

手机端这里推荐的是同个作者的 Fluent Reader Lite

同样前往 releases 页面下载最新版本的安装包即可。

image-20240225011511695

如果想支持下作者的话也可以通过 Google PlayApp Store 安装,需要支付 1.99 美元作为费用。

image-20240225011641999

在进入软件后,默认也是没有任何 RSS 订阅源的,需要自己手动添加。

image-20240225011911167

并且和电脑端不同的是,甚至没有给你一个手动添加订阅源的地方,因此,需要一个 RSS 订阅服务。

如果你不想部署 FreshRSS 的话,也可以选择 Read YouFolio Reader 等其他手机端 RSS 阅读器。

FreshRSS 部署

如果说 RSSHub 提供了 RSS 源的话,那么 FreshRSS 就是负责订阅这些 RSS 源的。

1.通过 Docker Compose 部署

关于部署方式,推荐通过 Docker Compose 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
freshrss:
image: freshrss/freshrss
container_name: freshrss
restart: always
ports:
- "8080:80"
environment:
TZ: 'Asia/Shanghai'
CRON_MIN: 1,31
volumes:
- freshrss_data:/var/www/FreshRSS/data
- freshrss_extensions:/var/www/FreshRSS/extensions
volumes:
freshrss_data:
freshrss_extensions:

然后就可以通过 8080 端口来访问了,建议改成自己喜欢的端口。

进去之后的第一步就是选择语言了,这里选择简体中文即可。

image-20240225014348892

步骤二是检查环境,通过 Docker Compose 部署的一般不存在环境问题,直接点击下一步即可。

image-20240225014432617

第三步是数据库配置,选默认的 SQLite 即可,如有需要可以选其他数据库。

image-20240225014512247

第四步就是配置管理员账号了,自己配置即可。

image-20240225014613536

然后就大功告成了!

image-20240225014632634

之后就会跳转到登录页面,登录即可。

image-20240225014703994

在首页里,默认只有 FreshRSS releases 这一个订阅源,可以考虑删除。

之后就可以自己添加 RSS 订阅源了!

image-20240225014723352

2.启用 API 访问

点击右上角进入配置页面

image-20240225175329143

认证页面中启用允许 API 访问 (用于手机应用)

image-20240225175511317

然后再回到账户页面,设置API 密码

image-20240225175626355

然后就可以点击下方的http://localhost:40201/api/来检测 API 状态,两个都为 PASS 即为成功。

image-20240225175741094

3.配置 Google Reader compatible API

在这里要说明下为什么不配置Fever compatible API,原因是经过实测,Fluent Reader 和 Fluent Reader Lite 都无法正常配置Fever compatible API(虽然提供了相关的配置项),所以这里就选择经过实测可行的 Google Reader compatible API

Fluent Reader 配置

Google Reader API中,端点就设置为上文中的http://localhost:40201/api/greader.php,注意,域名(或 IP)和端口需要根据你自己的配置改动。

用户名则是你的账号名称。

密码是API 密码,不是账号的密码!!

同步数量自行选择。

image-20240225180232076

随后可以在 分组与排序中导入分组,这样就可以和服务端同步订阅源与分组(默认情况下分组不会同步)

image-20240225180543045

至此就完成了桌面端的配置

Fluent Reader Lite 配置

手机端也是类似的配置,此处不再赘述。

image-20240225181116973

4.抓取全文

你可能偶尔会遇到像 少数派 这样的 RSS 订阅源,只提供了一个简介,而没有正文,这时你就需要抓取全文功能。

image-20240315003425273

image-20240315003441905

有两种解决方案。

在阅读器端配置

在 Fluent Reader 和 Fluent Reader Lite 中都提供了抓取全文。

临时切换,可在右上角点击按钮切换。

image-20240315003625349

永久配置,在打开方式中配置。

image-20240315003651804

手机端配置

image-20240315004437661

在 FreshRSS 端配置

FreshRSS 中当然也提供了抓取全文功能,只是要自己配置一下。

原文的 CSS 选择器 一项中填入 bodyp,即可抓取全文。点击左边的小眼睛预览下结果即可,选择效果更好的那个选择器。

经过测试,单独一个 p 选择器会把图片给排除了,因此建议写成 img,p,h1,h2,h3,h4,h5,h6

仅针对少数派的话,可以写成 .article-body p, .article-body img, .article-body h1, .article-body h2, .article-body h3, .article-body h4, .article-body h5, .article-body h6

image-20240315004607185

然后点击最下方的重载文章,即可看到抓取后的全文。

image-20240315004753615

image-20240315004825916

5.订阅 FreshRSS

实际上,FreshRSS 本身,也是可以被订阅的!

在 1.24 版本中,该功能有所变化,请参考官方文档。

https://freshrss.github.io/FreshRSS/en/users/user_queries.html

在 FreshRSS 1.24 以上版本,更推荐通过 自定义查询 来实现聚合订阅。

image-20240413004747876

具体而言,就是点击分组后,再收藏当前查询即可。

此时再通过 就可以获取到聚合后的 RSS 订阅地址。

image-20240413004925850

相较于之前的方式,这种方式减少了 token 泄漏带来的影响,因为每一个查询的 token 都是不一样的。

另外提一下搜索参数

image-20240413005158965

通过搜索参数可以非常方便的筛选出需要的 RSS 文章,这对于源站未提供筛选功能的 RSS 订阅源是一个极大的加强。

可以通过在 FreshRSS 这边筛选来曲线救国。

使用的最多的应该是基于 pubdate 筛选,例如 pubdate:2024-04-11/ 就是只保留 2024-04-11 之后的。注意 /不能丢。更具体的可以参考官方文档

在首页和分组中,都可以点击右上角的 RSS 按钮来订阅。

image-20240318202804091

点进去之后就会发现是一个在 FreshRSS 中聚合的 RSS 订阅源。

对于一些没有提供 FreshRSS 订阅支持的 RSS 阅读器,可以采用这种方法来曲线救国;也可以用于聚合同类型的 RSS 订阅源。

image-20240318203118208

注意:要先在账号管理中设置认证口令。

image-20240318202934157

至此,我们就实现了 RSS 从订阅源、到同步、到阅读的全流程,尽情的体验 RSS 带来的全新信息流吧!

发现 RSS

好像还有一个问题,那就是我要怎么知道一个网站是否提供了 RSS 呢?或者说,我要怎么知道 RSSHub 是否提供了某个网站的 RSS 呢?

答案是通过 RSSHub Radar

image-20240225181629402

通过在设置中配置 自定义 RSSHub 域名一键订阅,就可以实现这样的效果,这样一来,订阅 RSS 就方便很多了。

images-202403072138911.png

RSS 下载

对于支持 BitTorrent/磁力链接的 RSS 订阅源,只要使用支持 BitTorrent/磁力订阅源的 BitTorrent 客户端即可,例如 qBittorrent 等。

建议使用迅雷以外的任何主流的开源 BitTorrent 客户端,反吸血人人有责。

结合 FreshRSS 提供的聚合 RSS 功能使用有奇效。

简而言之,首先在 FreshRSS 中创建一个 下载 分组,然后将需要下载的 RSS 加进去,然后再订阅这个 下载分组 的 RSS,就可以实现在一个 RSS 链接中下载所有资源。

目前的 FreshRSS 在资源下载上存在问题,无法实现聚合下载。

image-20240225182435697

RSS 推送

TODO

实际上,在目前的 RSS 相关应用中,还缺少一类应用,那就是 RSS 推送,即把更新的 RSS 消息推送到某个消息渠道,例如微信、钉钉、邮件等。

虽然已经有 rsspush 在前了,但该软件和 Server 酱 强绑定,也没有和 FreshRSS 等 RSS 订阅服务联动。虽然能用,但没有达到笔者理想中的程度。

如果对 RSS 推送有需求的,可以尝试一下 rsspush。

如果结合 FreshRSS 提供的聚合 RSS 功能使用的话,可以实现比较神奇的效果。

简而言之,首先在 FreshRSS 中创建一个 订阅 分组,然后将需要订阅的 RSS 加进去,然后再订阅这个 订阅分组 的 RSS,就可以实现在一个 RSS 链接中订阅所有信息来源

总结

使用 RSS 是件麻烦事,只有少数愿意折腾的人才会去干这件事。

如果你也愿意为之折腾,那就说明你也有颗不安分的心。

愿你在这充满大数据推送的时代,能有受自己掌控自己的信息流。

本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/499d4cee.html
版权声明:转载请注明出处!

坚持原创技术分享,您的支持将鼓励我继续创作!