借助 RSSHub 对源站 RSS 内容过滤 (和全文输出)

借助 RSSHub 对源站 RSS 内容过滤 (和全文输出)

小虎故洞

在阅读本教程之前,请确保您对 RSS 和 RSSHub 有一定的了解。否则,请先阅读这篇文章并亲身体验一段时间后,再决定自己是否有相关需求。

前两大节可直接跳过进入正题 ʕ ᵔᴥᵔ ʔ

一、序言

RSSHub 是一个非常强大的 RSS 生成器,支持为成百上千的网站生成 RSS 订阅源。借助开源的力量,RSSHub 项目正在蓬勃发展。

RSSHub 文档主页

在 RSS 日渐式微之势,RSSHub 毫无疑问承担起了复兴 RSS 的使命。除了为不支持 RSS 的网站生成 Feed,它还内置了强大的过滤功能,支持对标题、正文、作者、日期多个参数进行过滤,只输出你想要的内容。

现阶段,仍有不少网站自己提供 RSS 服务,直接订阅网站自带 RSS 方便快捷。大多数时候,都不需要再做什么。但如果里面出现了过多杂七杂八的东西,又不愿取关而错过感兴趣的内容,就需要对文章进行过滤了。

对于不通过 RSSHub 输出的订阅源,即网站自带的源。过滤的方法有主要有以下四种种:

第一:使用网站自带的过滤参数进行过滤,这是最原生的使用体检。只是支持的站点少之又少,故这种方法基本不予考虑。

第二:利用第三方服务过滤,好处是达到类原生的使用体验。缺点是依赖第三方服务的稳定性,更新可能不及时等等。

第三:在线上客户端上过滤,依靠强大的算法,过滤功能可以做得十分强大且智能,但是这类功能普遍收费(订阅制)且价格不菲。当然,如果你不能接受连续不断的订阅费用,你还可以在自己的服务器上搭建阅读器进行过滤,成本取决于服务器的获取方式(VPS or 家用微机 or 云平台部署)。

第四:在本地客户端上过滤,好处是不需要支付订阅费用。但缺点也很明显,保存的文章在只存放本地,无法跨终端同步。

——————

如果你对以上四种方式都不理想的话,不妨试试通过 RSSHub 对源站 RSS 进行反向代理,即对任何其它 RSS 进行再输出,这样就可以使用到 RSSHub 自带的过滤功能了,同时还能对仅输出摘要的源站 RSS 内容开启全文输出。

这种方法类似第二种,但服务器由自己掌控,稳定性也取决于自身。而且最重要的是,RSSHub 官方示例站由于访问、负载大不够稳定,以及部分目标站点的严格反爬策略,不少用户选择搭建自己的实例来获得更好的体验。所以对这部分用户来说,只需要在上面扩展它的功能即可。

二、为什么 RSSHub 不支持对源站 RSS 进行过滤?

这个问题来源已久,通过 RSSHub 进行反向代理的想法不止我一人想到。早在三年前(2018年),就有人在项目主页提出这种路由请求 #122。然而官方维护人员一致认为这种功能是客户端该做的事,RSSHub 不应该插手。

2019年、2020年,相同的需求 #1818#4329 又陆续被提出来,然而 RSSHub 项目维护人员以相同的理由关闭了 issue。

今年,一个 Pull request #7296 提出来了,里面包含了 RSSHub 反向代理的实现代码。毫无悬念,pr 被拒绝了。这次拒绝理由倒变得有点令人信服了:将这个功能作为一个独立项目(虽然我觉得这么做会徒增麻烦)。

我真的无法理解 RSSHub 维护人员为什么会以“这是客户端做的事”、“无意义”这种原因唐塞过去。如果真的毫无意义,RSSHub 为什么会自带过滤功能?这不应该是客户端做的事吗?

内容过滤是客户端该做的事,RSSHub 不应该提供

如果是安全和滥用问题,解决方法也很简单:官方示例站禁用反向代理路由,让有需要的用户自行搭建即可。

好在 RSSHub 是一个开源项目,我们可以对其修改并二次分发,为 RSSHub 衍生提供了无限可能。现在,为我们自建的 RSSHub 实例添加反向代理功能吧!

三、通过 GitHub 部署

RSSHub 项目的源代码发布在 GitHub 上,这意味着我们可以很轻易把源码拷贝一份到自己的项目下,为后续的部署提供便利。

1.首先我们进入 RSSHub 的 GitHub 项目页面,Fork 一份到自己的仓库下。

Fork RSSHub 项目
变成自己的项目,以 diygod/rsshub 为上游

2.在自己 forked 的项目里做出如下修改:

注意:Github 网页端不允许直接添加空文件夹,但在添加文件时可以指定一个不存在的路径,文件夹会随文件会一起生成。如果还是不懂,请看这里

——————

2.1 创建 /lib/routes/reverse-proxy/router.js 文件,内容如下:

module.exports = () => {
    const Router = require('@koa/router');
    const router = new Router();
    router.get('/reverse-proxy/:url', require('./index'));
    return router;
};
创建 router.js 文件

填写完成后,点击下方的 Commit new file 绿色按钮完成提交。

——————

2.2 创建 /lib/routes/reverse-proxy/index.js 文件,内容如下:

const parser = require('@/utils/rss-parser');

module.exports = async (ctx) => {
    const { url } = ctx.params;
    const feed = await parser.parseURL(url);

    ctx.state.data = {
        title: feed.title,
        link: feed.link,
        description: feed.description,
        allowEmpty: false,
        item: feed.items.map((item) => ({
            title: item.title,
            description: item.content,
            pubDate: item.pubDate,
            link: item.link,
            author: item.creator,
        })),
    };
};
创建 index.js 文件

填写完成后,点击下方的 Commit new file 绿色按钮完成提交。

3.将修改后的项目部署到服务器上

RSSHub 官方文档提供了非常详尽且简单的多个部署方法,跟着文档走就行了(Docker 部署会另外讲解)。唯一需要注意的是,把 RSSHub 官方的项目地址改成你自己的地址。

部署后如果成功显示 RSSHub 欢迎页,请转到本教程第五大节。

4.同步上游更新(可选)

RSSHub 是一个活跃的开源项目,如果你想让自己项目的代码跟上游(也就是 DIYgod/RSSHub)保持同步的话,点击 Fetch upstream,然后更新之前的部署。

此外,你还可以安装 pull 应用实现自动同步。

同步上游代码

四、通过 Docker 部署

如果你有一台 VPS 或家用服务器,Docker 部署或许是最省事的方式。

1.准备工作

确保你的服务器上已安装 docker 并成功运行。

在你的服务器的 Home 目录上新建 reverse-proxy 文件夹,在文件夹里创建两个新文件 router.js 和 index.js,文件内容跟本教程第三大节里的一样vi 使用教程

cd ~
mkdir reverse-proxy
cd reverse-proxy
vi router.js
vi index.js

2.下载镜像并启动容器

拉取官方镜像

docker pull diygod/rsshub

下载好之后,输入如下命令创建并运行 RSSHub 容器即可:

docker run -d --name rsshub -p 1200:1200 -v $HOME/reverse-proxy:/app/lib/routes/reverse-proxy

启动后访问 你的域名:1200,如果成功显示 RSSHub 欢迎页,请转到本教程第五大节。

P.S. 由于 RSSHub 的更新频率较高,如需使搭建好的容器自动更新,可搭配 Watchtower 使用,更新不会丢失修改过的配置。

3.如何通过 Docker 调试路由(题外话)

如果你想为 RSSHub 开源项目做贡献,想调试自己写的脚本路由。除了官方文档上介绍的调试方式。我们还可以利用 docker 容器进行调试。

3.1 创建数据卷

docker volume create --driver local \
    --opt type=none \
    --opt device=/home/你的用户名/routes \
    --opt o=bind \
    rsshub_vol

3.2 在 Home 目录下新建文件夹 routes

cd ~
mkdir routes

3.3 创建专用于调试的容器

docker run -d --name rsshub -p 1200:1200 -v rsshub_vol:/app/lib/routes -e NODE_ENV=development diygod/rsshub

如果你此前已经创建了 RSSHub 容器,修改端口映射和容器名以免冲突。

3.4 开始调试,每次修改文件后需要重启容器。

docker restart rsshub

P.S. 为什么不使用 -v 主机目录:容器目录 的形式直接挂载文件夹,原因见 #1 #2 #3

五、路由规则

反向代理

作者: @ccat3z

举例: http(s)://yourdomain.example/reverse-proxy/https%3A%2F%2Fsspai.com%2Ffeed

路由: /reverse-proxy/:urlencode

参数:

urlencode, 必选 - URL 编码的 RSS/Atom 地址,需用到转换工具

注意事项:

如果 urlencode 以 .rss.atom 结尾,须在末尾加上 /,避免跟 通用参数-输出格式 冲突。


成功输出

然后你就可以使用 RSSHub 自带的所有通用参数了。通用参数 | RSSHub

————————

这里举两个例子:

5.1 如果你只想在少数派里获取有关 Windows11 的文章,那么只需要输入:

http(s)://yourdomain.example/reverse-proxy/https%3A%2F%2Fsspai.com%2Ffeed?filter=Windows11

不想区分大小写?那就改为:

http(s)://yourdomain.example/reverse-proxy/https%3A%2F%2Fsspai.com%2Ffeed?filter=Windows11&filter_case_sensitive=false

5.2 如果你关注的源站 RSS 没有全文输出,可以加上 mode=fulltext 参数,虽然不是 100% 成功。

提示:在 urlencode 末尾加上 "?" 并填入你想要的参数,多个参数之间用 "&" 连接。

六、尾声

本人也是 RSSHub 项目的一名贡献者和赞助者,虽然我在本文第二大节里表达了一些不满,但这并不影响我对 RSS 和 RSSHub 的热爱。本教程旨在充分发挥开源项目的优势,填补那些想要 RSS 代理功能的用户的遗憾,也顺便进一步提高目标群体对 RSSHub 的黏性 XD。


本文以 CC-BY-SA-4.0 发布,你可以转载、演绎、并用于任何目的,只需保留署名并以相同方式共享即可。

Report Page