关于页数据统计接入自建umami
又到了主题共建教程系列~今天的教程是如何在关于页接入自建umami数据
本文教程仅适用于通过vercel自建的umami追踪,通过服务器自托管的仅提供部分第三方教程,敬请谅解
搭建数据源
vercel部署umami
- fork一份官方的仓库
- 登录vercel控制台(若此前尚未注册vercel,请自行借助搜索引擎搜索教程,此处不做赘述)引用站外链接登录vercel登录vercel账号
- 在控制台首页顶栏中找到「Storage」,点击进入
- 点击「Create Database」新建数据库,选择「Postgres」
- 设置名称并确认
- 进入数据库控制台,此时页面上会显示一个用于连接数据库的字符串,点击
Show Secret
按钮后复制双引号中的内容(无需包含双引号) - 新建项目,选择刚刚fork的umami仓库
- 设置必要环境变量(数据库)
DATABASE_URL
,数据库值设置为第5步完成后复制的长字符串 - (可选)非必要环境变量
TRACKER_SCRIPT_NAME
,可设置umami跟踪器名称,以避免默认名称被广告拦截器拦截导致追踪失败。该处可任意填写自己喜欢的值 - 等待部署完成即可
- (可选)绑定自定义域名,此处不做赘述
- 访问umami地址,初次登录时默认用户名为
admin
,默认密码为umami
,可在登录后自行修改
Cloudflare-Workers搭建数据接口
以下教程来自「梦爱吃鱼」,特此鸣谢!原文地址:
引用站外链接CF Worker部署Umami的API通过CF Worker部署Umami API,实现白嫖方案
- 前往 Hoppscotch 获取token
- 成功后返回token信息
- 前往Cloudflare,创建一个Workers,设置好名称,确认部署并等待
- 部署完成,点击右上角编辑代码,修改worker.js的内容(注意,部分内容需修改为你的数据!!!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70addEventListener('fetch', event => {
event.respondWith(handleRequest(event));
});
const API_BASE_URL = '你的umami地址';
const TOKEN = '第2步中你获取到的token';
const WEBSITE_ID = '你的博客在umami中的website ID';
const CACHE_KEY = 'umami_cache'; // 缓存
const CACHE_TIME = 600; // 缓存时间,单位秒
async function fetchUmamiData(startAt, endAt) {
const url = `${API_BASE_URL}/api/websites/${WEBSITE_ID}/stats?startAt=${startAt}&endAt=${endAt}`;
const response = await fetch(url, {
headers: {
'Authorization': `Bearer ${TOKEN}`,
'Content-Type': 'application/json'
}
});
if (!response.ok) {
console.error(`Error fetching data: ${response.statusText}`);
return null;
}
return response.json();
}
async function handleRequest(event) {
const cache = await caches.open(CACHE_KEY);
const cachedResponse = await cache.match(event.request);
if (cachedResponse) {
return cachedResponse;
}
const now = Date.now();
const todayStart = new Date(now).setHours(0, 0, 0, 0);
const yesterdayStart = new Date(now - 86400000).setHours(0, 0, 0, 0);
const lastMonthStart = new Date(now).setMonth(new Date(now).getMonth() - 1);
const lastYearStart = new Date(now).setFullYear(new Date(now).getFullYear() - 1);
const [todayData, yesterdayData, lastMonthData, lastYearData] = await Promise.all([
fetchUmamiData(todayStart, now),
fetchUmamiData(yesterdayStart, todayStart),
fetchUmamiData(lastMonthStart, now),
fetchUmamiData(lastYearStart, now)
]);
const responseData = {
today_uv: todayData?.visitors?.value ?? null,
today_pv: todayData?.pageviews?.value ?? null,
yesterday_uv: yesterdayData?.visitors?.value ?? null,
yesterday_pv: yesterdayData?.pageviews?.value ?? null,
last_month_pv: lastMonthData?.pageviews?.value ?? null,
last_year_pv: lastYearData?.pageviews?.value ?? null
};
const jsonResponse = new Response(JSON.stringify(responseData), {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization'
}
});
event.waitUntil(cache.put(event.request, jsonResponse.clone()));
return jsonResponse;
} - 完成编辑后,保存并部署
- (可选)绑定自定义域名。在workers中点击设置,在
域和路由
项下添加自定义域名(受cloudflare限制,域名必须已托管至cloudflare才可绑定)
将数据引入about页面
修改./source/_data/about.yml文件中的统计部分
1 | tj: # 统计 |
配置完成~
写在最后
下次一定不还拖更
- 感谢您的赞赏
赞赏名单
因为有你们,让我更加有创作的动力
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自❖星港◎Star☆
评论 ()