Umami API 使用方法

本文最后更新于:2022年8月16日 下午

Umami 统计工具可以方便地统计站点访问信息,相关数据可以通过自带的 API 访问,本文记录使用方法。

背景

认证

  • 在执行大部分 API 之前需要向 Umami 做身份认证,拿到相应身份的 token
  • 之后使用该 token 执行 API,因此认证是前提

官方文档

1
2
3
4
5
6
7
8
9
10
11
12
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"
}

操作方法

Node.js
  • 工程中新建 login.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
    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)
    }
    });
    };

Python
  • 新建 login.py 文件
1
2
3
4
5
6
7
8
9
10
11
12
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)
  • 一定要加入 Headers
运行结果
  • <your.umami.website> 替换成你的 Umami url

  • 运行就完了

    成功后返回该用户的 token

    1
    2
    3
    4
    {
    token: 'eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWsadfkjasldkfj23405ujSDF654GD654asas6fdGSDGIUHOI453zTxZ0RMmJribpKsPAULlxDaiZQIUlrHU7Bo1S8u8hBrNUQ.Q2N4QfMFqHd7W2Pn0CYSNw.ps2KCcN4jnNVngJymTeHmUVhV9PBeMOmAH1Z3Qf11gKEMvQrSXGcWfgHJV188HmLZF_K3AlTIMl7Kf22HG8UI8VjwreMNQ_8BJ6s4zi8xB3ogBUr_DxXFqItRBnmNQH_fpS6AQvtgNA3mRq9ibOQMxCVio07R175BR2QzzxpeyDnhpMmqpW7cuZCD5DiiM4EOhXOaCnYkjRbl6NiXyQ.thwo7wexr3Vk3PSnSEXgyQ',
    user: { user_id: 1, username: 'admin', is_admin: true }
    }

执行 API

  • 拿到 token 后就可以执行 Umami 的 API 了
  • 需要在 headers 中加入:
1
2
3
4
headers={
"Accept": "application/json",
"Authorization": "Bearer <your token>"
}
  • 这里以 Websiteswebsite/{id}/stats active 为例提供示例代码,供大家参考

Websites

  • 该 API 可以返回 Umami 追踪的网站列表
Node.js
  • 创建 websites.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
    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)
    }
    });
    };
Python
1
2
3
4
5
6
7
8
9
10
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

  • 运行成功后返回

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [
    {
    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'
    }
    ]

website/{id}/stats

站点访问统计
  • 该 API 可以返回站点统计信息,也就是核心需求
Node.js
  • 创建 status.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
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)
}
});
};

Python
1
2
3
4
5
6
7
8
9
10
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_atend_at 时间段内的站点访问数量

  • 时间以 1970年1月1日起算的毫秒数计量

  • 运行成功后返回

    1
    2
    3
    4
    5
    6
    {
    pageviews: { value: 3595, change: 3595 },
    uniques: { value: 1536, change: 1536 },
    bounces: { value: 1495, change: 1495 },
    totaltime: { value: 260752, change: 260752 }
    }
链接访问统计
  • 也可以用上述代码统计指定链接

  • 只需在 url 后面家上参数即可

    1
    &url=<target url>
  • 示例 url

    1
    var url="http://<your.umami.website>/api/website/1/stats?start_at=1350679719687&end_at=1990039038644&url=/";

    表示访问我的主页的统计信息

  • 成功后返回

    1
    2
    3
    4
    5
    6
    {
    pageviews: { value: 440, change: 440 },
    uniques: { value: 192, change: 192 },
    bounces: { value: 249, change: 249 },
    totaltime: { value: 43290, change: 43290 }
    }

当前活跃用户数量

  • url 替换为

    1
    http://<your.umami.website>/api/website/<id>/active
  • 即可

  • 其中 <id> 为网站编号

  • 正常运行时返回值:

1
[{"x":1}]

表示当前有一位活跃用户

其他 API

  • Docker 部署项目的话可以进入容器中

    1
    docker exec -it umami_umami_1 sh
  • 进入目录 /app/.next/server/pages/api 查看相关可执行的 api 接口(文档写的不是所有 API)

  • 也可以查阅 官方文档

参考资料


Umami API 使用方法
https://www.zywvvd.com/notes/tools/umami/umami-api/umami-api/
作者
Yiwei Zhang
发布于
2022年8月10日
许可协议