Umami 统计工具可以方便地统计站点访问信息,相关数据可以通过自带的 API 访问,本文记录使用方法。
400 Bad Request
,这里直接用 Node 的 request 包完成相关功能POST /api/auth/login
First you need to get a token in order to make API requests. You need to make a POST request to the /api/auth/login endpoint with the following data:
{
"username": "your-username",
"password": "your-password"
}
If successful you should get a response like the following:
{
"token": "eyTMjU2IiwiY...4Q0JDLUhWxnIjoiUE_A"
}
工程中新建 login.js
文件
var request = require('request');
var url="http://<your.umami.website>/api/auth/login";
var requestData={
"username": "admin",
"password": "xxxxxxxx"
};
httprequest(url,requestData);
function httprequest(url,data){
console.log("hello world")
request({
url: url,
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: requestData
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // 请求成功的处理逻辑
}else{
console.log("failed")
console.log(response.statusCode)
console.log(error)
}
});
};
login.py
文件import requests
import json
url = "http://<your.umami.website>/api/auth/login"
requestData={
"username": "admin",
"password": "xxxxxxxx"
}
header = {
"content-type": "application/json",
}
res = requests.post(url=url, data=json.dumps(requestData), headers=header)
print(res.text)
将 <your.umami.website>
替换成你的 Umami url
运行就完了
成功后返回该用户的 token
{
token: 'eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWsadfkjasldkfj23405ujSDF654GD654asas6fdGSDGIUHOI453zTxZ0RMmJribpKsPAULlxDaiZQIUlrHU7Bo1S8u8hBrNUQ.Q2N4QfMFqHd7W2Pn0CYSNw.ps2KCcN4jnNVngJymTeHmUVhV9PBeMOmAH1Z3Qf11gKEMvQrSXGcWfgHJV188HmLZF_K3AlTIMl7Kf22HG8UI8VjwreMNQ_8BJ6s4zi8xB3ogBUr_DxXFqItRBnmNQH_fpS6AQvtgNA3mRq9ibOQMxCVio07R175BR2QzzxpeyDnhpMmqpW7cuZCD5DiiM4EOhXOaCnYkjRbl6NiXyQ.thwo7wexr3Vk3PSnSEXgyQ',
user: { user_id: 1, username: 'admin', is_admin: true }
}
headers={
"Accept": "application/json",
"Authorization": "Bearer <your token>"
}
Websites
和 website/{id}/stats
为例提供示例代码,供大家参考该 API 可以返回 Umami 追踪的网站列表
创建 websites.js
文件
var request = require('request');
var url="http://<your.umami.website>/api/websites";
var requestData={};
var headers={
"Accept": "application/json",
"Authorization": "Bearer eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWsadfkjasldkfj23405ujSDF654GD654asas6fdGSDGIUHOI453zTxZ0RMmJribpKsPAULlxDaiZQIUlrHU7Bo1S8u8hBrNUQ.Q2N4QfMFqHd7W2Pn0CYSNw.ps2KCcN4jnNVngJymTeHmUVhV9PBeMOmAH1Z3Qf11gKEMvQrSXGcWfgHJV188HmLZF_K3AlTIMl7Kf22HG8UI8VjwreMNQ_8BJ6s4zi8xB3ogBUr_DxXFqItRBnmNQH_fpS6AQvtgNA3mRq9ibOQMxCVio07R175BR2QzzxpeyDnhpMmqpW7cuZCD5DiiM4EOhXOaCnYkjRbl6NiXyQ.thwo7wexr3Vk3PSnSEXgyQ"
}
httprequest(url,requestData);
function httprequest(url,data){
console.log("hello world")
request({
url: url,
method: "GET",
json: true,
headers: headers,
body: requestData
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // 请求成功的处理逻辑
}else{
console.log("failed")
console.log(response.statusCode)
console.log(error)
}
});
};
import requests
import json
url = "http://<your.umami.website>/api/websites"
data = {}
header={
"Accept": "application/json",
"Authorization": "Bearer eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWsadfkjasldkfj23405ujSDF654GD654asas6fdGSDGIUHOI453zTxZ0RMmJribpKsPAULlxDaiZQIUlrHU7Bo1S8u8hBrNUQ.Q2N4QfMFqHd7W2Pn0CYSNw.ps2KCcN4jnNVngJymTeHmUVhV9PBeMOmAH1Z3Qf11gKEMvQrSXGcWfgHJV188HmLZF_K3AlTIMl7Kf22HG8UI8VjwreMNQ_8BJ6s4zi8xB3ogBUr_DxXFqItRBnmNQH_fpS6AQvtgNA3mRq9ibOQMxCVio07R175BR2QzzxpeyDnhpMmqpW7cuZCD5DiiM4EOhXOaCnYkjRbl6NiXyQ.thwo7wexr3Vk3PSnSEXgyQ"
}
res = requests.get(url=url, data=json.dumps(data), headers=header)
print(res.text)
将 <your.umami.website>
替换成你的 Umami url
运行成功后返回
[
{
website_id: 1,
website_uuid: 'bd554kgfh1-xxxx-xxxx-xxxx-8sdf5uc0',
name: '又见苍岚',
created_at: '2022-07-15T01:16:31.266Z',
user_id: 1,
domain: 'www.zywvvd.com',
share_id: 'r5xxxxxZ'
}
]
status.js
文件var request = require('request');
var url="http://<your.umami.website>/api/website/1/stats?start_at=1350679719687&end_at=1990039038644";
var requestData={};
var headers={
"Accept": "application/json",
"Authorization": "Bearer eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWsadfkjasldkfj23405ujSDF654GD654asas6fdGSDGIUHOI453zTxZ0RMmJribpKsPAULlxDaiZQIUlrHU7Bo1S8u8hBrNUQ.Q2N4QfMFqHd7W2Pn0CYSNw.ps2KCcN4jnNVngJymTeHmUVhV9PBeMOmAH1Z3Qf11gKEMvQrSXGcWfgHJV188HmLZF_K3AlTIMl7Kf22HG8UI8VjwreMNQ_8BJ6s4zi8xB3ogBUr_DxXFqItRBnmNQH_fpS6AQvtgNA3mRq9ibOQMxCVio07R175BR2QzzxpeyDnhpMmqpW7cuZCD5DiiM4EOhXOaCnYkjRbl6NiXyQ.thwo7wexr3Vk3PSnSEXgyQ"
}
httprequest(url,requestData);
function httprequest(url,data){
console.log("hello world")
request({
url: url,
method: "GET",
json: true,
headers: headers,
body: requestData
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // 请求成功的处理逻辑
}else{
console.log("failed")
console.log(response.statusCode)
console.log(error)
}
});
};
import requests
import json
url = "http://101.43.39.125:3000/api/website/1/stats?start_at=1350679719687&end_at=1990039038644"
data = {}
header={
"Accept": "application/json",
"Authorization": "Bearer eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWsadfkjasldkfj23405ujSDF654GD654asas6fdGSDGIUHOI453zTxZ0RMmJribpKsPAULlxDaiZQIUlrHU7Bo1S8u8hBrNUQ.Q2N4QfMFqHd7W2Pn0CYSNw.ps2KCcN4jnNVngJymTeHmUVhV9PBeMOmAH1Z3Qf11gKEMvQrSXGcWfgHJV188HmLZF_K3AlTIMl7Kf22HG8UI8VjwreMNQ_8BJ6s4zi8xB3ogBUr_DxXFqItRBnmNQH_fpS6AQvtgNA3mRq9ibOQMxCVio07R175BR2QzzxpeyDnhpMmqpW7cuZCD5DiiM4EOhXOaCnYkjRbl6NiXyQ.thwo7wexr3Vk3PSnSEXgyQ"
}
res = requests.get(url=url, data=json.dumps(data), headers=header)
print(res.text)
将 <your.umami.website>
替换成你的 Umami url
运行成功后返回 start_at
到 end_at
时间段内的站点访问数量
时间以 1970年1月1日起算的毫秒数计量
运行成功后返回
{
pageviews: { value: 3595, change: 3595 },
uniques: { value: 1536, change: 1536 },
bounces: { value: 1495, change: 1495 },
totaltime: { value: 260752, change: 260752 }
}
也可以用上述代码统计指定链接
只需在 url 后面家上参数即可
&url=<target url>
示例 url
var url="http://<your.umami.website>/api/website/1/stats?start_at=1350679719687&end_at=1990039038644&url=/";
表示访问我的主页的统计信息
成功后返回
{
pageviews: { value: 440, change: 440 },
uniques: { value: 192, change: 192 },
bounces: { value: 249, change: 249 },
totaltime: { value: 43290, change: 43290 }
}
http://<your.umami.website>/api/website/<id>/active
<id>
为网站编号[{"x":1}]
表示当前有一位活跃用户
Docker 部署项目的话可以进入容器中
docker exec -it umami_umami_1 sh
进入目录 /app/.next/server/pages/api
查看相关可执行的 api 接口(文档写的不是所有 API)
也可以查阅 官方文档