update: 更新Umami API路径和响应数据处理逻辑

更新Umami API基础URL至自定义域名,并调整API路径以适配v3版本
修改统计数据获取逻辑以匹配新版API响应格式
更新文档说明以反映API变更
This commit is contained in:
二叉树树
2025-10-11 19:42:12 +08:00
parent b085541a5c
commit 4112bb23f1
6 changed files with 28 additions and 35 deletions

View File

@@ -14,7 +14,7 @@
localStorage.removeItem(cacheKey);
}
}
const res = await fetch(`${baseUrl}/api/share/${shareId}`);
const res = await fetch(`${baseUrl}/analytics/us/api/share/${shareId}`);
if (!res.ok) {
throw new Error('获取 Umami 分享信息失败');
}

View File

@@ -130,7 +130,7 @@ const { remarkPluginFrontmatter } = await entry.render();
// 第二步:获取统计数据
const currentTimestamp = Date.now();
const statsUrl = `${umamiConfig.baseUrl}/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&url=%2Fposts%2F${slug}%2F&compare=false`;
const statsUrl = `${umamiConfig.baseUrl}/analytics/us/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&path=eq.%2Fposts%2F${slug}%2F&compare=false`;
const statsResponse = await fetch(statsUrl, {
headers: {
@@ -148,8 +148,8 @@ const { remarkPluginFrontmatter } = await entry.render();
}
const statsData = await statsResponse.json();
const pageViews = statsData.pageviews?.value || 0;
const visits = statsData.visits?.value || 0;
const pageViews = statsData.pageviews || 0;
const visits = statsData.visitors || 0;
const displayElement = document.getElementById(`page-views-${slug}`);
if (displayElement) {

View File

@@ -95,7 +95,7 @@ const className = Astro.props.class;
// 第二步:获取统计数据
const currentTimestamp = Date.now();
const statsUrl = `${umamiConfig.baseUrl}/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&url=%2Fposts%2F${slug}%2F&compare=false`;
const statsUrl = `${umamiConfig.baseUrl}/analytics/us/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&path=eq.%2Fposts%2F${slug}%2F&compare=false`;
const statsResponse = await fetch(statsUrl, {
headers: {
@@ -112,8 +112,8 @@ const className = Astro.props.class;
}
const statsData = await statsResponse.json();
const pageViews = statsData.pageviews?.value || 0;
const visits = statsData.visits?.value || 0;
const pageViews = statsData.pageviews || 0;
const visits = statsData.visitors || 0;
const displayElement = document.getElementById('page-views-display');
if (displayElement) {

View File

@@ -63,7 +63,7 @@ const config = profileConfig;
// 第二步获取全站统计数据不指定url参数获取全站数据
const currentTimestamp = Date.now();
const statsUrl = `${umamiConfig.baseUrl}/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&compare=false`;
const statsUrl = `${umamiConfig.baseUrl}/analytics/us/api/websites/${websiteId}/stats?startAt=0&endAt=${currentTimestamp}&unit=hour&timezone=${encodeURIComponent(umamiConfig.timezone)}&compare=false`;
const statsResponse = await fetch(statsUrl, {
headers: {
@@ -82,8 +82,8 @@ const config = profileConfig;
}
const statsData = await statsResponse.json();
const pageviews = statsData.pageviews?.value || 0;
const visitors = statsData.visits?.value || 0;
const pageviews = statsData.pageviews || 0;
const visitors = statsData.visitors || 0;
const statsElement = document.getElementById('site-stats');
if (statsElement) {

View File

@@ -118,7 +118,7 @@ export const imageFallbackConfig: ImageFallbackConfig = {
export const umamiConfig: UmamiConfig = {
enable: true,
baseUrl: "https://cloud.umami.is",
baseUrl: "https://umami.2b2x.cn",
shareId: "hN3l7PGcxsUCBHfU",
timezone: "Asia/Shanghai",
};

View File

@@ -25,7 +25,7 @@ lang: ''
现在我们确实可以看到每个文章(即/posts/xxx的访问量了但是我们要如何展示给用户呢
# 逆向Umami的只读页面
# 逆向Umami的只读页面新版v3
> 感谢nightNya提供的方案你是天才
@@ -35,7 +35,8 @@ lang: ''
注意这里的 `7PoDRgCzHFTs2vWB` ,每个站点都不一样
接着我们请求 `https://us.umami.is/api/share/7PoDRgCzHFTs2vWB`,得到
接着我们请求 `https://cloud.umami.is/analytics/us/api/share/7PoDRgCzHFTs2vWB`,得到
*注意,这里的 `us` 为你创建的账号区域美国为us欧盟为eu*
```json
{
@@ -46,7 +47,7 @@ lang: ''
再接着我们请求,携带请求头 `x-umami-share-token` 值为上一步获得的Token
`https://us.umami.is/api/websites/a66a5fd4-98b0-4108-8606-cb7094f380ac/stats?startAt=0&endAt=1750805999999&unit=hour&timezone=Asia/Hong_Kong&url=/posts/cf-fastip/&compare=false`
`https://cloud.umami.is/analytics/us/api/websites/a66a5fd4-98b0-4108-8606-cb7094f380ac/stats?startAt=0&endAt=1750805999999&unit=hour&timezone=Asia/Hong_Kong&path=eq./posts/cf-fastip/&compare=false`
这里解释几个关键Params其他的照搬
@@ -54,36 +55,28 @@ lang: ''
- endAt统计结束时间。Unix时间戳我们可以使用 `Date.now()` 即当前时间和startAt参数联动即可实现统计总浏览量
- url要查询的路径填写为你的文章页去除了Host的路径`/posts/hello` 。注意Umami会将 `/posts/hello``/posts/hello/` 视为两个不同的路径,请注意你的博客框架是否使用 `/`
- path要查询的路径填写为你的文章页去除了Host的路径`/posts/hello` 。注意Umami会将 `/posts/hello``/posts/hello/` 视为两个不同的路径,请注意你的博客框架是否使用 `/`。在v3版本中需要使用 `eq.` 前缀来进行精确匹配,例如 `path=eq./posts/hello/`
你会得到
```json
{
"pageviews": {
"value": 1655,
"prev": 0
},
"visitors": {
"value": 343,
"prev": 0
},
"visits": {
"value": 411,
"prev": 0
},
"bounces": {
"value": 183,
"prev": 0
},
"totaltime": {
"value": 30592,
"prev": 0
"pageviews": 1655,
"visitors": 343,
"visits": 411,
"bounces": 183,
"totaltime": 30592,
"comparison": {
"pageviews": 0,
"visitors": 0,
"visits": 0,
"bounces": 0,
"totaltime": 0
}
}
```
`pageviews.vlaue` 即浏览量。 `visits.value` 即访问数。
`pageviews` 即浏览量。 `visitors` 即访问数。
> Tips浏览量记录为任意用户只要访问了则计数一次。而访问数记录不会记录单IP多次重复访问和同一时间段的多次请求不同页面