446 字
1 分钟
自建Umami统计
写在前面
Umami 是一个开源的分析工具,它可以帮助你了解你的网站的流量来源、用户行为、页面访问等信息。
Umami官方地址 umami
Umami官方文档: Umami - Doc
Umami官方API: Umami - API
正文
这里需要注意一点,使用官方的api 只需要申请一个API KEY 就可以调用api了,如果使用自建服务器,需要先获取token,再进行调用。
认证
POST /api/auth/login
首先你需要获得一个令牌,才能发起 API 请求。你需要向端点发送以下请求:POST/api/auth/login
{ "username": "admin", "password": "umami"}如果成功,你应该会收到如下回复:
{ "token": "eyTMjU2IiwiY...4Q0JDLUhWxnIjoiUE_A", "user": { "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "username": "admin", "role": "admin", "createdAt": "2000-00-00T00:00:00.000Z", "isAdmin": true }}保存获取到的token值,在发送所有API请求时,需要在请求头中包含授权信息。你的请求头应该是这样的:Authorization: Bearer
Authorization: Bearer eyTMjU2IiwiY...4Q0JDLUhWxnIjoiUE_A每次需要权限的 API 调用都必须有授权令牌。
实现认证方式
/** * 获取登录 Token (通过用户名/密码) * @param {string} baseUrl * @param {string} apiKey - 此处实际为 password */async function fetchTokenData(baseUrl, apiKey) { const cached = localStorage.getItem(cacheTokenKey); if (cached) { try { const parsed = JSON.parse(cached); if (Date.now() - parsed.timestamp < cacheTTL) { return parsed.value; } } catch { localStorage.removeItem(cacheTokenKey); } } const res = await fetch(`${baseUrl}/api/auth/login`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ username: "admin", password: apiKey, }), }); if (!res.ok) { throw new Error("获取 Umami 登录信息失败"); } const data = await res.json(); localStorage.setItem( cacheTokenKey, JSON.stringify({ timestamp: Date.now(), value: data.token }), ); return data.token;}IMPORTANT使用这种方式会在浏览器中暴露请求的用户名和密码,建议创建一个单独的用户,只用于获取统计数据。
邪修玩法
我们可以采用share key 认证方式,这样就不会暴露用户名和密码了。
原理:在umami网站中,我们可以将统计数据分享出去,使用户可以免登录查看统计数据。
分享页面请求了一下 /api/share/{shareId} 接口,返回了一个token,并且后面所有对api的请求都会带一个header x-umami-share-token,并且值和之前返回的token一致。
我们可以直接将上面的认证方法替换为x-umami-share-token,不需要使用用户名密码了。
/** * 获取分享 Token 数据 * @param {string} baseUrl - Umami 实例地址 * @param {string} shareId - 分享 ID */async function fetchShareData(baseUrl, shareId) { const cached = localStorage.getItem(cacheShareKey); if (cached) { try { const parsed = JSON.parse(cached); if (Date.now() - parsed.timestamp < cacheTTL) { return parsed.value; } } catch { localStorage.removeItem(cacheShareKey); } } // 请求分享 API const res = await fetch(`${baseUrl}/api/share/${shareId}`); if (!res.ok) { throw new Error("获取 Umami 分享信息失败"); } const data = await res.json();
// 写入 LocalStorage 缓存 localStorage.setItem( cacheShareKey, JSON.stringify({ timestamp: Date.now(), value: data }), ); return data;} 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章 智能推荐
1
为了护住我那几块硬盘:我的 UPS 监控“三部曲
HomeLab 私有云 从 PVE 备注里的简陋脚本,到独立的 Node.js Web 监控页,记录一个 HomeLab 玩家的 UPS 监控进阶之路。
2
NAS 碎文件存储优化:VHDX 虚拟磁盘方案
HomeLab 私有云 针对 NAS 存储海量碎文件导致的卡顿与 SMB 传输缓慢问题,通过 VHDX 虚拟磁盘镜像实现“化零为整”的存储优化方案。
3
TrueNAS 全方位监控实战:Prometheus + Grafana 方案
HomeLab 私有云 通过 Graphite 协议采集 TrueNAS SCALE / Core 指标,经 graphite-prometheus 转换后交由 Prometheus 存储、Grafana 可视化,搭建一套独立于 TrueNAS 自带报告的长期监控。
4
NAS 变身播放机:Kodi Docker-Compose 硬解直通手册
HomeLab 私有云 在 FNOS 等 NAS 系统下用 Docker Compose 部署 Kodi,直通 Intel 核显实现 VA-API 硬解、HDMI 输出与手机遥控,把 NAS 变成客厅播放机。
5
突破内网延迟:ZeroTier 私有 Planet 节点搭建全攻略
HomeLab 私有云 基于 xubiaolin/docker-zerotier-planet 镜像搭建国内云服务器上的 ZeroTier 私有 Planet 根节点,从容器部署、客户端 planet 文件替换到延迟验证的完整流程,并给出局域网互访与 Moon 进阶方案。
