传统的 RSS 订阅方式因其高度的自定义灵活性和对隐私友好的特性,被广泛用于博客、论坛等内容平台。而 rssCloud 是一种轻量级协议,它能够让 RSS 订阅从“主动轮询”转变为“实时推送”。其核心理念是:当内容发布源更新时,主动“通知”所有订阅者,而无需订阅者频繁发起请求,从而有效解决传统 RSS 存在的更新延迟和资源浪费问题。

今天,我就简单分享一下如何给自己的 RSS “赋能”,加入推送功能。

小提示:据博主观察,rssCloud 协议目前并未被主流阅读器广泛支持,同时可能与某些订阅源缓存机制存在冲突,这一点稍后会提及。不过,作为一个附加功能,部署起来相对简单,适合用来收获一点成就感。

本次教程选用博主较为熟悉的 PHP 来实现。你需要一个能运行 PHP 的 Web 服务器或虚拟主机;此外,订阅者数据会存储在 MySQL 数据库中,因此需要创建一个具有读写权限的账号,特殊情况也可使用读写权限分离的两个账号。

为兼容虚拟主机环境和照顾新手操作,我们采用最直接的方式,下载源码并上传。

源码仓库地址:colin-walker/php-rssCloud

打开后,请点击那个明显最想让您点击的绿色按钮旁边的倒三角,在下拉菜单中选择 “Download zip”。如果打不开页面,可以搜索 “Github 文件下载加速” 并按照相关指引操作,或直接向 AI 求助。

下载完成后,打开虚拟主机控制面板,在根目录下新建一个文件夹,建议使用英文命名,比如我将它命名为 /server/。进入该文件夹,选择上传文件,将压缩包拖入并解压。解压后请确认 index.html 是否位于你创建的文件夹内;如果不在,请打开解压出的文件夹,将所有文件和子文件夹全选,剪切到你创建的文件夹中。

接着,进入 config 文件夹,打开 config.php,在文件开头找到以下配置段,将中文部分替换为你的数据库信息(数据库连接信息通常在面板首页可查)。如果是单账号,按说明填写相同内容即可:

define('DB_SERVER', '你的数据库地址');   // 例如 localhost
define('DB_NAME', '你的数据库名');
define('DB_USERNAME', '有写入权限的用户名');
define('DB_PASSWORD', '写入用户密码');
define('DB_USERNAMESEL', '有读取权限的用户名'); // 若与写入用户相同,可填写一致
define('DB_PASSWORDSEL', '读取用户密码');

确认无误后保存文件。返回上一级目录,找到 tables.txt,将其内容复制到本地记事本中。然后进入面板中的数据库管理,跳转至 phpMyAdmin,点击左侧第二个数据库(即你拥有账号密码的那个库)。在顶部菜单栏找到 “SQL” 按钮并点击。

回到记事本,你会看到明显分为三段的 SQL 代码。依次复制第一段,粘贴到 SQL 查询框中并点击执行,出现绿色提示即为成功;然后点击显示查询框,再粘贴第二段,按同样方式操作,第三段同理。

接下来,通过浏览器访问你的可视化界面,地址格式为:http(s)://你的域名/你创建的文件夹名/,例如我的就是 https://zooyoo.top/server/。若页面正常不抽风或显示 404 ,点击 “Ping Form”,将你的 RSS 地址完整填入(如 https://zooyoo.top/feed/),看到返回状态码 200 即为成功。

接口已经搭建完成,那么是不是就可以发文让大家来填写表单订阅了呢?并非如此,rssCloud 是为阅读器设计的,并非供人工提交。因此我们还需要修改 feed 文件。以 Typecho 为例,常见两种做法:一种是直接修改系统文件,另一种是借助插件钩子(更推荐,也更灵活)。这部分请自行参考 AI 或相关资料,注意做好文件备份。提示词:阅读我的 rssCloud 文档 http(s)://你的域名/你创建的文件夹名/docs/,例如我的是 https://zooyoo.top/server/docs/,理解并以简单的方式教我在 RSS 输出中插入对应的 <cloud> 标签,我使用某博客系统,版本为某。

配置完成后,每次发布更新,就可以通过之前访问的 “Ping Form”表单提交,系统会自动推送给所有订阅者。如果觉得手动操作不便,也可以开发一个插件来完成自动推送。更好的思路是找一个类似 IndexNow 的推送插件,让 AI 阅读插件代码和你的 rssCloud 文档,在原有基础上稍作增改即可实现发布文章时自动触发推送。

到这里,部署基本结束。但因为我使用了 CDN,并且 RSS 缓存时间为 15 分钟,实际运行中遇到了两个问题:

  1. 发布文章后,通过插件去 ping rssCloud,rssCloud 立刻访问 RSS 源,此时读取到的仍是缓存内容,经比对发现与上次内容一致,因此不会触发推送。
  2. PHP 版的 rssCloud 采用的是“瘦通知”机制,虽然我可以在 CDN 规则中设置让服务器 IP 访问时绕过缓存,但通知内容仅告知订阅源有更新,并未说明具体更新了什么。客户端收到通知后会立即去拉取 RSS,但读到的仍是旧的缓存内容,从而认为没有新内容,相当于被“耍”了。

针对这两个问题,我考虑到三种解决方案:

  • 不缓存 RSS:能解决问题,但会消耗更多资源,而我的博客流量主要来自 RSS,因此没有采用。
  • 在触发推送前先调用 API 清除节点缓存,并等待几秒后再 ping rssCloud:效果最好,但代码改动较大,超出我的可控范围,也没选择。
  • 玄学方案:发文后等待 0~15 分钟,人工查看 RSS 更新后,手动通过表单提交推送,没想到吧,我最后选了这个,跟我早期手搓博客时手动提交 RSS 更新一样,神秘的东方力量又派上用场了。

文末彩蛋:考虑到该方案可能还会导致源站 IP 暴露等系列问题,又想到这似乎是一个独立的系统,于是博主使用闲置的主机搭建了一个,稳定性一般,不保证服务持续性,限制连接数在 10 个以内,不嫌弃的话可以使用,方法如下:

  • 在 RSS 2.0 生成方法中,于 <link><image> 标签下插入下面的标签。
<cloud domain="m.3d3k.org" port="443" path="/server/pleaseNotify/" protocol="http-post"/>
  • 于更新后手动访问 Ping Form 表单,填写你的 RSS 地址,或根据 文档 说明配置相同作用的自动化插件。
  • 如果你需要更为稳定的服务,我看到 WordPress rssCloud 似乎已经集成在 WordPress 中,通过插件开启后由 rsscloud.wordpress.com 提供相关服务。