Pingoo API 使用文档

🚀 通过 Pingoo API 获取网站统计数据,实现自定义报表、分析和二次开发

🚀 快速开始

基本信息

项目
Base URL http://localhost:5004/api
认证方式 Bearer Token (JWT)
响应格式 JSON
最后更新 2025年9月27日

请求头配置

{
  "Authorization": "Bearer yourtoken",
  "Content-Type": "application/json"
}

🔐 认证相关

用户注册

创建新用户账户

请求信息

  • URL: /auth/register
  • 方法: POST
  • 认证: ❌ 不需要

请求参数

{
  "email": "user@example.com",
  "password": "password123"
}

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "user": {
      "id": 1,
      "username": "user",
      "email": "user@example.com",
      "role": "user"
    },
    "expires_in": 259200
  }
}

用户登录

用户身份认证

请求信息

  • URL: /auth/login
  • 方法: POST
  • 认证: ❌ 不需要

请求参数

{
  "email": "user@example.com",
  "password": "password123"
}

响应示例

响应格式与注册接口相同。

刷新Token

更新访问令牌

请求信息

  • URL: /auth/refresh
  • 方法: POST
  • 认证: ❌ 不需要

请求参数

{
  "refresh_token": "refresh_token"
}

获取当前用户信息

获取已登录用户的详细信息

请求信息

  • URL: /auth/me
  • 方法: GET
  • 认证: ✅ 需要

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "id": 2,
    "username": "user",
    "email": "user@example.com",
    "role": "user"
  }
}

更新用户资料

修改用户基本信息

请求信息

  • URL: /auth/profile
  • 方法: PUT
  • 认证: ✅ 需要

请求参数

{
  "username": "new_username",
  "email": "new_email@example.com"
}

更新用户密码

修改用户登录密码

请求信息

  • URL: /auth/password
  • 方法: PUT
  • 认证: ✅ 需要

请求参数

{
  "old_password": "password123",
  "new_password": "password1234"
}

响应示例

{
  "code": 0,
  "msg": "success",
  "data": "密码修改成功"
}

📊 事件相关

创建事件

记录用户行为事件

请求信息

  • URL: /events
  • 方法: POST
  • 认证: ✅ 需要

请求参数

字段 类型 必填 描述
site_id int 站点ID
session_id string 会话ID
user_id string 用户ID(用于关联网站用户系统)
ip string IP地址(为空时自动获取)
url string 页面URL
referrer string 来源页面
user_agent string 用户代理
screen string 屏幕分辨率
event_type string 事件类型
event_value string 事件值

请求示例

{
  "site_id": 1,
  "session_id": "session_123",
  "user_id": "user_456",
  "ip": "66.249.72.20",
  "url": "https://example.com/page",
  "referrer": "https://google.com",
  "user_agent": "Mozilla/5.0...",
  "screen": "1920x1080",
  "event_type": "page_view",
  "event_value": "homepage"
}

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "ID": 153,
    "CreatedAt": "2025-09-24T14:58:37.7937739+08:00",
    "UpdatedAt": "2025-09-24T14:58:37.7937739+08:00",
    "site_id": 1,
    "session_id": "session_123",
    "user_id": "user_456",
    "ip": "66.249.72.20",
    "url": "https://example.com/page",
    "referrer": "https://google.com",
    "user_agent": "Mozilla/5.0...",
    "device": "desktop",
    "browser": "Mozilla 5.0...",
    "os": "",
    "screen": "1920x1080",
    "is_bot": false,
    "country": "美国",
    "subdivision": "",
    "city": "",
    "isp": "Google",
    "event_type": "page_view",
    "event_value": "homepage"
  }
}

获取事件列表

获取指定站点的事件记录

请求信息

  • URL: /events/:site_id
  • 方法: GET
  • 认证: ✅ 需要

查询参数

参数 类型 默认值 描述
page int 1 页码
page_size int 10 每页数量
session_id string - 会话ID筛选
user_id string - 用户ID筛选
event_type string - 事件类型筛选
start_time string - 开始时间
end_time string - 结束时间

使用示例

GET /api/events/1?page=1&page_size=20&event_type=page_view

响应示例

{
    "code": 0,
    "msg": "success",
    "data": {
        "list": [{
                "ID": 153,
                "CreatedAt": "2025-09-24T14:58:37.793773+08:00",
                "UpdatedAt": "2025-09-24T14:58:37.793773+08:00",
                "DeletedAt": null,
                "site_id": 1,
                "session_id": "session_123",
                "user_id": "user_456",
                "ip": "66.249.72.20",
                "url": "https://example.com/page",
                "referrer": "https://google.com",
                "user_agent": "Mozilla/5.0...",
                "device": "desktop",
                "browser": "Mozilla 5.0...",
                "os": "",
                "screen": "1920x1080",
                "is_bot": false,
                "country": "美国",
                "subdivision": "",
                "city": "",
                "isp": "Google",
                "event_type": "page_view",
                "event_value": "homepage",
                "site": {
                    "ID": 0,
                    "CreatedAt": "0001-01-01T00:00:00Z",
                    "UpdatedAt": "0001-01-01T00:00:00Z",
                    "DeletedAt": null,
                    "user_id": 0,
                    "name": "",
                    "domain": "",
                    "user": {
                        "ID": 0,
                        "CreatedAt": "0001-01-01T00:00:00Z",
                        "UpdatedAt": "0001-01-01T00:00:00Z",
                        "DeletedAt": null,
                        "username": "",
                        "email": "",
                        "role": ""
                    }
                }
            }, {
                "ID": 152,
                "CreatedAt": "2025-09-24T14:54:45.980443+08:00",
                "UpdatedAt": "2025-09-24T14:54:45.980443+08:00",
                "DeletedAt": null,
                "site_id": 1,
                "session_id": "session_123",
                "user_id": "user_456",
                "ip": "::1",
                "url": "https://example.com/page",
                "referrer": "https://google.com",
                "user_agent": "Mozilla/5.0...",
                "device": "desktop",
                "browser": "Mozilla 5.0...",
                "os": "",
                "screen": "1920x1080",
                "is_bot": false,
                "country": "纯真网络",
                "subdivision": "",
                "city": "",
                "isp": "2025年07月09日IP数据",
                "event_type": "page_view",
                "event_value": "homepage",
                "site": {
                    "ID": 0,
                    "CreatedAt": "0001-01-01T00:00:00Z",
                    "UpdatedAt": "0001-01-01T00:00:00Z",
                    "DeletedAt": null,
                    "user_id": 0,
                    "name": "",
                    "domain": "",
                    "user": {
                        "ID": 0,
                        "CreatedAt": "0001-01-01T00:00:00Z",
                        "UpdatedAt": "0001-01-01T00:00:00Z",
                        "DeletedAt": null,
                        "username": "",
                        "email": "",
                        "role": ""
                    }
                }
            }
        ],
        "total": 153,
        "page": 1,
        "page_size": 10
    }
}

获取事件统计排名

获取事件的统计排名数据

请求信息

  • URL: /events/:site_id/stats
  • 方法: GET
  • 认证: ✅ 需要

查询参数

参数 类型 默认值 描述
date string 当天 日期(格式:20250915)
page int 1 页码
stat_type string "url" 统计类型
event_type string "page_view" 事件类型

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "list": [
      {
        "key": "/websites/1",
        "count": 31
      },
      {
        "key": "/",
        "count": 16
      }
    ],
    "total": 2,
    "page": 1,
    "page_size": 10
  }
}

获取网站整体流量指标

获取站点的综合统计数据

请求信息

  • URL: /events/:site_id/summary
  • 方法: GET
  • 认证: ✅ 需要

查询参数

参数 类型 默认值 描述
date string 当天 统计日期

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "site_id": 1,
    "pv": 81,
    "uv": 3,
    "ip_count": 3,
    "event_count": 0,
    "bounce_rate": 0,
    "avg_duration": 2016,
    "week_ip": 3,
    "week_pv": 134,
    "month_ip": 4,
    "month_pv": 142,
    "hourly_stats": [
      {
        "hour": 15,
        "count": 27
      }
    ],
    "start_time": "20250915",
    "end_time": "20250915"
  }
}

数据字段说明

字段 描述
pv 页面浏览量
uv 独立访客数
ip_count IP数量
event_count 事件总数
bounce_rate 跳出率
avg_duration 平均停留时长(秒)
week_ip 周IP数量
week_pv 周页面浏览量
month_ip 月IP数量
month_pv 月页面浏览量
hourly_stats 小时统计数据

🌐 站点相关

创建站点

添加新的监控站点

请求信息

  • URL: /sites
  • 方法: POST
  • 认证: ✅ 需要

请求参数

{
  "name": "我的网站",
  "domain": "https://example.com"
}

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "id": 2,
    "user_id": 1,
    "name": "我的网站",
    "domain": "https://example.com",
    "created_at": "2025-09-24T17:38:33.7565505+08:00",
    "updated_at": "2025-09-24T17:38:33.7565505+08:00"
  }
}

获取站点列表

获取用户的所有站点

请求信息

  • URL: /sites
  • 方法: GET
  • 认证: ✅ 需要

查询参数

参数 类型 默认值 描述
page int 1 页码
limit int 10 每页数量
search string - 搜索关键词

响应示例

{
    "code": 0,
    "msg": "success",
    "data": {
        "list": [
            {
                "id": 2,
                "user_id": 1,
                "name": "我的网站",
                "domain": "https://example.com",
                "tracking_id": "",
                "created_at": "2025-09-24T17:38:33.75655+08:00",
                "updated_at": "2025-09-24T17:38:33.75655+08:00"
            },
            {
                "id": 1,
                "user_id": 1,
                "name": "Pingoo",
                "domain": "http://127.0.0.1:5004/",
                "tracking_id": "",
                "created_at": "2025-09-15T15:35:28.141283+08:00",
                "updated_at": "2025-09-15T15:35:28.141283+08:00"
            }
        ],
        "total": 2,
        "page": 1,
        "page_size": 10
    }
}

获取站点详情

获取指定站点的详细信息

请求信息

  • URL: /sites/:id
  • 方法: GET
  • 认证: ✅ 需要

响应示例

{
    "code": 0,
    "msg": "success",
    "data": {
        "id": 2,
        "user_id": 1,
        "name": "我的网站",
        "domain": "https://example.com",
        "tracking_id": "",
        "created_at": "2025-09-24T17:38:33.75655+08:00",
        "updated_at": "2025-09-24T17:38:33.75655+08:00"
    }
}

更新站点信息

修改站点基本信息

请求信息

  • URL: /sites/:id
  • 方法: PUT
  • 认证: ✅ 需要

请求参数

{
  "name": "新站点名称",
  "domain": "https://newdomain.com"
}

响应示例

{
    "code": 0,
    "msg": "success",
    "data": {
        "id": 2,
        "user_id": 1,
        "name": "新站点名称",
        "domain": "https://newdomain.com",
        "tracking_id": "",
        "created_at": "2025-09-24T17:38:33.75655+08:00",
        "updated_at": "2025-09-25T14:21:00.8914916+08:00"
    }
}

删除站点

删除指定站点及其相关数据

请求信息

  • URL: /sites/:id
  • 方法: DELETE
  • 认证: ✅ 需要

响应示例

{
  "code": 0,
  "msg": "success",
  "data": "站点删除成功"
}

清空站点统计

清空指定站点的所有统计数据

请求信息

  • URL: /sites/:id/stats
  • 方法: DELETE
  • 认证: ✅ 需要

响应示例

{
  "code": 0,
  "msg": "success",
  "data": {
    "message": "统计数据已清空"
  }
}

⚡ 其他接口

健康检查

检查API服务状态

请求信息

  • URL: /health
  • 方法: GET
  • 认证: ❌ 不需要

响应示例

{
  "code": 0,
  "msg": "服务运行正常"
}

❌ 错误处理

常见错误码

错误码 说明 解决方案
401 认证失败 检查token是否有效
403 权限不足 确认用户权限
404 资源不存在 检查请求路径和参数
500 服务器错误 联系技术支持

错误响应格式

{
  "code": 1,
  "msg": "错误描述",
  "data": null
}

认证相关错误

缺失认证请求头

{
  "error": "Authorization header required"
}

Token失效

{
  "error": "Invalid token: token is malformed: could not base64 decode header: illegal base64 data at input byte 36"
}

📖 使用示例

JavaScript/Node.js

// 获取站点列表
const response = await fetch('http://localhost:5004/api/sites', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer your-token-here',
    'Content-Type': 'application/json'
  }
});

const data = await response.json();
console.log(data);

Python

import requests

# 创建事件
url = "http://localhost:5004/api/events"
headers = {
    "Authorization": "Bearer your-token-here",
    "Content-Type": "application/json"
}

data = {
    "site_id": 1,
    "session_id": "session_123",
    "url": "https://example.com/page",
    "event_type": "page_view",
    "event_value": "homepage"
}

response = requests.post(url, headers=headers, json=data)
print(response.json())

cURL

# 用户登录
curl -X POST http://localhost:5004/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "user@example.com",
    "password": "password123"
  }'

最后更新日期:2025年9月27日