RSS Impact 是一个支持 Hook 的 RSS 订阅工具,
支持推送通知、Webhook 、下载、BitTorrent、AI 大模型 等多种形式的 Hook。

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/

温馨提示:

如果需要草梅友仁协助解决问题,请先从博客底部的打赏支付费用,笔者承诺在能力范围内解决问题。

咨询问题 100 元起步;远程连线解决问题 200 元起步。

QQ:2774730186

草梅交流及 BUG 反馈群:807530287

如果不想支付费用的话,请尝试百度/Google ,你遇到的问题一定已经有人遇到过了,大家的时间都是很宝贵的,所以请尝试自己动手解决问题

前言

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

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

近期 DockerHub 无法正常访问,多个镜像站也无法使用,拉取镜像可能会受影响,因此请先配置好 DockerHub 有效的镜像站后继续看 通过 Docker Compose 部署 的相关内容

你真的需要 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-never-die,一个基于 hono 的 RSSHub 代理服务,支持自动负载均衡、自动容错和反向代理 RSSHub 实例,支持 Node.js/Docker/Vercel/Cloudflare Workers 等方式部署。

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

启用多个图片代理

如果你希望使用多个图片代理,例如对于 /weibo 路由使用 https://image.baidu.com/search/down?url=${href_ue},对于 /twitter 路由使用 https://images.weserv.nl/?url=${href_ue},此时就只能使用新的图片处理方式

将环境变量 ALLOW_USER_HOTLINK_TEMPLATE 设置为 true 即可启用。

此时就可以通过查询字符串 image_hotlink_template 来设置图片代理了。

例如 https://rsshub.app/weibo/user/5650270572?image_hotlink_template=https://image.baidu.com/search/down?url=%24%7Bhref_ue%7D

注意:这时需要将 HOTLINK_TEMPLATEHOTLINK_INCLUDE_PATHSHOTLINK_EXCLUDE_PATHS 等路由留空

1
2
environment:
ALLOW_USER_HOTLINK_TEMPLATE: 'true'

在 Nginx 层面处理图片代理参数

显然,在启用了 ALLOW_USER_HOTLINK_TEMPLATE 后,每次都要在路由中加入 image_hotlink_template 参数是一件很烦人的事情,那么,可不可以简化这件事情呢?

可以的。

以 Nginx 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
location / {
include nginxconfig.io/proxy.conf;
proxy_set_header Access-Control-Allow-Origin $http_origin;

# 重写 image_hotlink_template 参数
if ($request_uri ~* "(/weibo|/hellogithub)") {
rewrite ^/(.*)/(.*)$ /$1/$2?image_hotlink_template=https://image.baidu.com/search/down?url=%24%7Bhref_ue%7D break;
}
if ($request_uri ~* "(/twitter)") {
rewrite ^/(.*)/(.*)$ /$1/$2?image_hotlink_template=https://images.weserv.nl/?url=%24%7Bhref_ue%7D break;
}
proxy_pass http://127.0.0.1:1200;
}

这样,在访问 /weibo 路由的时候,就会使用 https://image.baidu.com/search/down?url=${href_ue}对图片进行代理;而在访问 /twitter 路由的时候,就会使用 https://images.weserv.nl/?url=${href_ue} 对图片进行代理。

这样就免去了在路由中加入 image_hotlink_template 参数的麻烦,还能根据不同路由分别进行图片代理。

在使用 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)

如果你更喜欢 JavaScript,则参考以下脚本

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import fs from 'fs';

var logger = console;
var cookieMap = {
"BILIBILI_COOKIE_114514": "bilibili.com",
"WEIBO_COOKIES": "weibo.cn"
};

var COOKIE_CLOUD_URL = "https://localhost:8088/get/aaaaaaaaaaaaaa"
var COOKIE_CLOUD_PASSWORD = "xxxxxxxxxxxxxxx";
async function getCloudCookie() {
if (!COOKIE_CLOUD_URL || !COOKIE_CLOUD_PASSWORD) {
logger.error("COOKIE_CLOUD_URL or COOKIE_CLOUD_PASSWORD is not set.");
process.exit(1);
}
const url = COOKIE_CLOUD_URL;
const payload = JSON.stringify({ password: COOKIE_CLOUD_PASSWORD });
const headers = { "Content-Type": "application/json" };
const response = await fetch(url, {
method: "POST",
headers,
body: payload
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
}
function encodeCookie(text) {
return encodeURIComponent(text);
}
function serializeCookie(cookie) {
return `${encodeCookie(cookie.name)}=${encodeCookie(cookie.value)}`;
}
function getEnvKey(domain) {
const domainParts = domain.split(".");
const domainWithoutSuffix = domainParts.at(-2);
return `${domainWithoutSuffix.toUpperCase()}_COOKIES`;
}
async function main() {
try {
logger.info("Fetching cloud cookie...");
const data = await getCloudCookie();
const { cookie_data } = data;
logger.info("Cloud cookie fetched successfully.");
let env = "";
for (const [key, value] of Object.entries(cookie_data)) {
const cookies = value;
const cookieStr = cookies.map(serializeCookie).join("; ");
const envKey = cookieMap[key] || getEnvKey(key);
const envStr = `${envKey}="${cookieStr}"
`;
env += envStr;
logger.info(`Processed cookies for domain: ${key}`);
}
env = env.trim();
logger.info("Writing cookies to .env file...");
fs.writeFileSync(".env", env, { encoding: "utf-8" });
logger.info(".env file written successfully.");
} catch (error) {
logger.error("Unexpected error:", error);
}
}
main();

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

6.请求代理配置

由于路由反爬,或是部署的服务器无法访问对应的路由,因此需要对请求进行代理。

参考 代理配置 即可。

例如,想对 pixiv.nettwitter.com 进行代理,此时可以进行如下配置:

1
2
3
environment:
PROXY_URI: 'http://127.0.0.1:8080' # 代理 URI,格式为 {protocol}://{host}:{port},protocol 只支持 http, https。
PROXY_URL_REGEX: 'pixiv.net|twitter.com' # 启用代理的 URL 正则表达式,默认全部开启 .*

额外提醒:如果你的 rsshub 实例是部署在 docker 上的,那么就需要获取到 docker 的主机 ip

在服务器控制台输入 ip addr show docker0 即可查看到主机的 ip,例如:172.17.0.1

此时就可以访问到主机的代理服务。

7.自动容灾和负载均衡

你可能会遇到这样一个问题,部署的 RSSHub 实例偶尔会无法访问,此时会希望自动切换到备用的 RSSHub 实例;或者有多个 RSSHub 实例,希望在其中进行负载均衡。

rsshub-never-die 就是这样一个工具。

个人更推荐通过 Cloudflare Workers 部署,原因是 Cloudflare Workers 的免费额度更高,可以支持更多的请求量。

具体请参考 部署 文档。

微信公众号转 RSS

如果你不需要订阅微信公众号,可以跳过本章节

是的,说起文章订阅,那就不可避免的要考虑到微信公众号。

由于一些历史原因,优质的中文内容有很大以一部分在微信公众号中。

而由于微信本身的封闭性,这部分内容往往难以转换为 RSS 进行订阅。

好在,现在也出现了一些开源项目,可以实现微信公众号文章转 RSS。

WeWe RSS 就是这样一个工具。

1.通过 Docker Compose 部署

下载 docker-compose.sqlite.yml,通过 Docker Compose 部署。(如果数据库使用 MySQL,则下载 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:
app:
image: cooderl/wewe-rss-sqlite:latest
ports:
- 4000:4000
environment:
# 数据库连接地址
# - DATABASE_URL=file:../data/wewe-rss.db
- DATABASE_TYPE=sqlite
# 服务接口请求授权码
- AUTH_CODE=123567
# 提取全文内容模式
# - FEED_MODE=fulltext
# 定时更新订阅源Cron表达式
# - CRON_EXPRESSION=35 5,17 * * *
# 服务接口请求限制,每分钟请求次数
# - MAX_REQUEST_PER_MINUTE=60
# 外网访问时,需设置为服务器的公网 IP 或者域名地址
# - SERVER_ORIGIN_URL=http://localhost:4000

volumes:
# 映射数据库文件存储位置,容器重启后不丢失
- ./data:/app/data

使用以下命令启动

1
docker-compose up -d

随后访问 http://localhost:4000 即可。

2.配置账号

image-20240928192315181

进入页面时会要求填写 AuthCode,就是配置中的 AUTH_CODE项。

随后即可进入主页面。

image-20240928192507311

在账号管理页面扫码登录即可。

在这一步你可能会遇到二维码出不来的情况,这是因为后端依赖于 weread.111965.xyz 的请求代理,如果服务器无法访问 weread.111965.xyz,就会无法登陆。具体问题参考:#214 #223

解决方案是修改 host,例如 172.64.80.1 weread.111965.xyz

然后重启容器 docker-compose restart

3.添加公众号源

image-20240928192946159

之后,回到主页面,添加公众号源。

从目标公众号随意分享一篇文章即可,例如 https://mp.weixin.qq.com/s/egN7We19zEwQXMFrWF0SCQ

就可以完成订阅了。

image-20240928193013685

随后点击右上角的 RSS 图标即可订阅全部或部分 RSS 了,例如:http://localhost:4000/feeds/all.atom

RSS 如何阅读

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

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

现在,更推荐你使用 Follow 进行 RSS 阅读。

Follow 是由 RSSHub 的主要开发者 DIYgodShiro 的主要开发者 Innei 等开发的下一代信息浏览器。

该软件旨在让您在一个地方关注您喜爱的网站、博客、社交媒体帐户、播客和通知。它被设计为一个现代、快速、方便的一体化信息中心。

桌面端

幸运的是,市面上已经有很多 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,即可抓取全文。点击左边的小眼睛预览下结果即可,选择效果更好的那个选择器。

如果看不见内容,或者内容只有简介,请在设置 css 后,点 重载文章 即可。

经过测试,单独一个 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

在 RSSHub 端配置

如果你的订阅源是来自 RSSHub 的,那么也可以使用 RSSHub 提供的抓取全文功能。

根据 RSSHub 的文档,只需要在 RSSHub 的路由链接中添加 mode=fulltext 参数即可抓取全文。

image-20240728192621187

例如:bilibili 专栏全文输出 https://rsshub.app/bilibili/user/article/334958638?mode=fulltext

不过由于抓取全文功能是根据 @postlight/parser 包自动解析的,未必符合所有人的要求,所以要精确控制抓取全文功能的话,还是建议在 FreshRSS 端配置抓取全文功能。

5.订阅 FreshRSS

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

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

image-20240413004747876

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

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

image-20240413004925850

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

另外提一下搜索参数

image-20240413005158965

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

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

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

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

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

在首页和分组中,都可以点击右上角的 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 等。

如果你希望更加精确的控制 RSS 下载(例如按文件体积、文件类型过滤),请参考下文的 RSS Hook 一栏

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

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

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

目前的 FreshRSS 在资源下载上存在问题,无法实现聚合下载。(但 RSS Hook 可以)

image-20240225182435697

RSS 推送

TODO

请参考下文的 RSS Hook 一栏

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

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

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

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

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

RSS Hook

现推荐由我本人开发的开源项目:rss-impact-server 来进行 RSS 推送/RSS 下载/RSS AI 总结。

RSS Impact 是一个支持 Hook 的 RSS 订阅工具。

demo 站(数据会定时清除,不保证可用性):https://rss-demo.cmyr.dev/

内测体验站(数据不会清除,但也不保证可用性):https://rss-impact.cmyr.ltd/

项目亮点:

  • 项目的核心在于 Hook ,本项目支持 推送通知、Webhook 、下载、BitTorrent、AI 总结 等多种形式的 Hook ,还支持反转触发(即 RSS 源出错的时候触发)
  • 推送通知 Hook 基于 push-all-in-one 开发,支持 Server 酱、自定义邮件、钉钉机器人、企业微信机器人 等多种推送方式。支持 markdown 格式推送。
  • BitTorrent Hook 支持调用 qBitTorrent 接口来自动下载 BitTorrent ,也支持按体积过滤 BitTorrent ,解决部分 BitTorrent RSS 源没有提供 enclosure.length 的问题。支持 <mediaContent/> tag。
  • Webhook 支持 GET/POST 等全部 HTTP 方法进行调用
  • 下载 Hook 支持按 md5 过滤资源,支持按后缀名过滤资源。
  • AI 总结 Hook 支持调用 OpenAI 对 RSS 内容进行总结。
  • 支持正则替换 Hook,可对正文内容进行替换,可用于替换链接为代理地址。
  • 支持自定义查询,并将查询结果转换为 RSS。自定义查询支持将 AI 总结输出到正文中。
  • 支持从 OPML 文件导入订阅,也支持导出订阅为 OPML 文件
  • 支持 docker 一键部署
  • 支持配置代理

下面讲述一下如何私有部署。

1.通过 Docker Compose 部署

下载 docker-compose.yml

1
wget https://github.com/CaoMeiYouRen/rss-impact-server/blob/master/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
version: "3"

services:
server:
# build: .
container_name: 'rss-impact-server'
image: ${DOCKER_IMAGE:-caomeiyouren/rss-impact-server}
restart: always
ports:
- "3000:3000"
environment:
NODE_ENV: production
PORT: 3000
TZ: "Asia/Shanghai"
TIMEOUT: 60000
# 部署在公网时请务必修改 ADMIN_PASSWORD
ADMIN_PASSWORD: ${ADMIN_PASSWORD:-123456}
ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@example.com}
# 部署在公网时请务必修改 SESSION_SECRET。推荐为尽可能随机的字符串
SESSION_SECRET: ${SESSION_SECRET:-RSS_IMPACT}
RESOURCE_DOWNLOAD_PATH: './data/download'
volumes:
- ./data:/app/data
- ./logs:/app/logs

检查有无需要修改的配置

1
vim docker-compose.yml  # 也可以是你喜欢的编辑器

在公网部署时请务必修改 ADMIN_PASSWORD、SESSION_SECRET 环境变量

如果要使用自定义查询功能,请修改 BASE_URL 环境变量

启动

1
docker-compose up -d

在浏览器中打开 http://{Server IP}:3000 即可查看结果

总结

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

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

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

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

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