谁在悄悄关注你?给博客装上 RSS 订阅计数器
由于博客程序更换为了 Hexo,现在只能通过引用 JavaScript 脚本,来实现博客流量的统计。长时间关注我的朋友都知道,我的博客一直通过 Feed 来向读者提供完整文章内容,以方便在我更新后能让更多的人能够尽快看到文章,所以有很多我博客的观众是通过 Feed 来订阅我的博客,这样就产生一个很大的问题:这部分读者,是通过 Feed 订阅来查看我的文章的,故此这部分读者的数量我无法统计。
诚然,有很多朋友博客的 Feed 是不推送完整的文章内容的,只有标题和摘要。但这样也把订阅的流量放到了整站流量的统计里,可能通过 Referer 域名来看到一小部分的订阅用户(因为有些读者是通过本地客户端来进行订阅的,并非通过 Web 的 Feed 的订阅服务)还会造成重复统计的问题,准确性大大降低,这样也无法获取有多少读者订阅了自己的博客。
很久之前就有这个想法,一般统计订阅的思路是通过网关的访问日志,来估算有多少用户订阅了博客,但这样做一来规整数据会极其麻烦,无法可视化简单的看到具体的用户信息,二来互联网中各种爬虫、Bot 防不胜防,你压根没有办法准确的获取其大概的订阅数量。
前段时间灵光一闪,那么我其实可以根据这部分数据来做点文章,所以写了一个小项目,来解决这个问题。
举例来说,我的 Feed 订阅地址为roy.wang/feed/ 但我的订阅文件位于 roy.wang/feed/index.xml ,看过我这篇《博客托管 Cloudflare Pages 后,关于 RSS 订阅链接的问题》的朋友或者把博客托管到 Cloudflare Pages 的朋友会知道,Cloudflare Pages 是不支持将非 index.html 的页面设置为默认页面的。这样这个项目也可以顺势解决这个问题。
其核心的处理逻辑如下:
- 当我访问
/feed/时,项目就会记录访问者的信息,并且返回/feed/index.xml文件的内容。 - 检测访问流量,其 UA 是否包含代码中匹配的 Feed 客户端标识符。如果是,则立即将其视为有效订阅用户。
- 如果不匹配,则开始计数。72小时内,访问3次,则视为有效订阅用户。
所有订阅用户有 3 个小时的访问冷却期,以确保单订阅用户多时 Cloudflare Workers & D1 不会产生额外费用或停机。
RSS-Stats
提前声明一下,这个小项目呢,只适合博客域名托管至 Cloudflare 的朋友来使用。
而且需要变更现在实际的订阅文件路径,但原本订阅 URI 需保留。
目前尚未验证 CNAME 接入域名是否可行。
这个小项目只是通过一种统计思路,您也可以将其二次开发,或者使用别的语言重构,来切合您自己的博客。准确性,按照我自己的需求来看,是完全够用的。
项目地址:RSS-Stats

开始部署
部署起来非常简单,首先请 Fork 本项目,使其添加到您的账号。

创建数据库
首先,在 Cloudflare 的控制台左侧的存储和数据库 –> D1 SQL 数据库 –> 右上角创建数据库。
填写数据库名称,点击创建即可。

此时,在顶部获取数据UUID,后面会用到。格式如36ef4192-973e-469e-b7b4-1536ab69b109
部署项目
在 Cloudflare 的控制台左侧的计算和AI –> Workers 和 Pages –> 右上角创建应用程序。
进入到创建 Worker 的页面后,点击 Continue with GitHub,选择刚刚 Fork 的仓库,点击下一步。

或者可以通过 Git URL 克隆公共存储库来进行部署:
1 | https://github.com/roywangdev/RSS-Stats |
Set up your application 此步骤,需自定义项目名,将部署命令修改为:
1 | echo 'name = "rss-stats-test"\nmain = "index.js"\ncompatibility_date = "2026-01-14"\n[[d1_databases]]\nbinding = "DB"\ndatabase_id = "cf1391d8-a25e-47bb-8e90-3427137f8574"' > wrangler.toml && npx wrangler deploy |
完成后点击部署即可。
设置环境变量
由于未设置环境变量,故部署完成后,打开链接会显示Error: 缺少必须的环境变量配置: RSS_URL,需要设置多个环境变量:
| 变量名 | 介绍 | 是否必须 |
|---|---|---|
| RSS_URL | 此变量填写 RSS 文件实际地址,如https://domain.com/feed/index.xml |
√ |
| STATS_PATH | 此变量填写 RSS-Stats 控制台访问路径,如 /stats/ |
√ |
| FEED_PATHS | 此变量填写 RSS 订阅路径,如 /feed/ |
√ |
| COOKIE_NAME | 登录 Cookie 名称 (默认 rss_stats_auth) |
|
| COOKIE_MAX_AGE | 登录有效期秒数 (默认 1年) | |
| PER_PAGE | 列表每页显示条数 (默认 20) |
点击项目的设置,找到变量和机密,点击添加。类型选择文本,输入完成后,点击部署。
配置项目
此时即可访问 Workers URL + STATS_PATH 即可开始初始化数据,如:
1 | https://rss-stats-test.roywangdev.workers.dev/stats/ |

点击立即初始化数据库,然后设置账号密码。点击保存并进入后台即可登录,进入仪表盘。

此时还需要设置路径路由,FEED_PATHS 必须设置,STATS_PATH可选。
进入设置,找到域和路由,添加选择路由,配置如下:
1 | 区域:博客域名 |
注意,如果 Feed 路由和实际订阅文件 URI 是包含关系,则不要写为 /feed/ 或 /feed**
总结
这个小项目,主旨是提供一种思路,用来统计具体的订阅用户数,如果有什么未讲到的,或者大佬们有什么更好的方案,可以评论区留言一下~
一点问题
还有一点要单独说明一下,如果有朋友发现配置之后访问 /feed/多次后并没有统计,请查看该页面的响应标头是否有 X-Rss-Stats Active 的响应标头。如未有,请检查,是否如文章《博客托管 Cloudflare Pages 后,关于 RSS 订阅链接的问题》所述,已设置 URL 重写来解决 Cloudflare Pages 不支持非 index.html 文件设置为默认页面的问题。
许可协议
本文由 ROYWANG 原创,采用 CC BY-NC-SA 4.0 协议。转载请注明出处。
PERMALINK
https://roy.wang/rss-stats/