不蒜子这服务吧,好用是好用,就是经常挂。挂了之后博客底下的访问量就一直在那转圈圈,看着心烦。与其天天等它恢复,不如自己整一个,反正 Cloudflare Workers 免费额度够用,KV 也白给。

于是就有了这个项目:busuanzi-cloudflare-workers

一、这玩意儿是啥

简单说,就是一个部署在 Cloudflare Workers 上的访问统计服务,拿来替代不蒜子。

核心功能:

  • 站点/页面的 PV(访问量)和 UV(访客数)统计
  • 今日数据也能统计
  • 兼容原版不蒜子的标签 ID,换个脚本地址就能直接用
  • JSONP 接口也支持
  • 隐私友好:只存 IP 的 SHA-256 哈希,原始 IP 不记录
  • Pjax / swup 页面切换自动支持

说白了,就是不想再被不蒜子的稳定性绑架了 QWQ

二、怎么部署

第一步:克隆项目

1
2
3
git clone https://github.com/kazeecho/busuanzi-cloudflare-workers.git
cd busuanzi-cloudflare-workers
npm install

第二步:创建 KV 命名空间

KV 是 Cloudflare 提供的键值存储,咱们拿它来存计数数据。

1
npx wrangler kv namespace create BUSUANZI_KV

跑完会输出一段配置,把那个 id 填到 wrangler.toml 里就行:

1
2
3
[[kv_namespaces]]
binding = "BUSUANZI_KV"
id = "刚才输出的那个 id"

第三步:配置密钥

改一下 wrangler.toml 里的 SALT_SECRET,随便填个随机字符串:

1
2
[vars]
SALT_SECRET = "随便来一串"

或者用命令行设置(更安全,密钥不会明文出现在配置文件里):

1
npx wrangler secret put SALT_SECRET

这个密钥是用来给 UV 去重哈希加盐的,别填太简单的。

第四步:部署

1
npm run deploy

完事,你的 Worker 就上线了。

三、怎么用

方式一:嵌入脚本(最省心)

跟原版不蒜子用法一模一样,就换个脚本地址:

1
2
- <script src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" defer></script>
+ <script src="https://your-worker.workers.dev/busuanzi.js" defer></script>

然后 HTML 里这些标签不用动,直接就能用:

标签 ID 说明
busuanzi_site_pv 全站总访问量
busuanzi_site_uv 全站总访客数
busuanzi_page_pv 单页面阅读量
busuanzi_page_uv 单页面访客数
busuanzi_today_pv 今日全站访问量
busuanzi_today_uv 今日全站访客数

零修改迁移,舒舒服服。

方式二:直接调 API

想自己控制请求逻辑的,可以直接调接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 提交访问并获取数据
fetch("https://your-worker.workers.dev/api", {
method: "POST",
headers: { "x-bsz-referer": window.location.href },
})
.then((res) => res.json())
.then((data) => console.log(data));

// 只看不计数
fetch("https://your-worker.workers.dev/api", {
headers: { "Referer": window.location.href },
})
.then((res) => res.json())
.then((data) => console.log(data));

方式三:JSONP

老项目兼容需要 JSONP 的也支持:

1
2
3
4
5
6
<script>
function busuanziCallback(data) {
document.getElementById("my-pv").textContent = data.page_pv;
}
</script>
<script src="https://your-worker.workers.dev/jsonp?callback=busuanziCallback"></script>

详细的接口文档看这里:API.md

四、几个要注意的点

KV 并发计数

KV 不支持原子 increment,get → +1 → put 在高并发时可能丢几个计数。不过博客这种量级,一天能有几个并发?完全不用担心。

UV 归档

Cron Trigger 每天 UTC 00:05 跑一次归档,把昨天的 UV 加到累计值。记得确认 Worker 的 Cron Triggers 是开着的,不然 UV 数据会一直停留在昨天的当日值上。

花多少钱

资源 免费额度 博客大概用量
Worker 请求 100,000 次/天 ~200 次/天
KV 读取 100,000 次/天 ~200 次/天
KV 写入 1,000 次/天 ~200 次/天
Cron 触发 5 次/天 1 次/天

免费额度完全够用,放心部署。

历史数据

历史数据没法从不蒜子搬过来,统计会从零开始。反正也不是啥大事,重新攒呗(雾

五、UV 去重是怎么搞的

简单说就是:sha256(IP + 当日日期 + 密钥)

  • 同一个 IP 同一天访问多次只算 1 次
  • 哈希值没法反推出原始 IP,不侵犯隐私
  • 每天的去重 key 48 小时后自动过期清理

所以你不用担心 IP 泄露的问题,存下来的只是一串不可逆的哈希值。

结语

自建统计服务的好处就是它不会再突然挂掉了(除非 Cloudflare 挂,那咱也没办法)。而且数据在自己手里,想怎么查就怎么查。

项目地址:busuanzi-cloudflare-workers

给孩子点个 star 吧,球球了 🙏