Skip to content

总消耗 日志查询

总消耗查询内容在DMXAPI的位置

log_query

接口地址

https://www.dmxapi.cn/api/log/self/stat

日志接口认证格式

Authorization 直接填写 SYSTEM_TOKEN,不带 Bearer 前缀;这与令牌管理接口不同。

代码示例

python
"""
================================================================================
                           API 总消耗统计查询工具
================================================================================
功能描述: 查询 dmxapi.cn 平台的 API 使用统计数据,包括总消耗额度、
         请求频率(RPM)、Token消耗(TPM)、消息数量(MPM)等指标。
使用方法:
    1. 配置 SYSTEM_TOKEN 和 USER_ID
    2. 运行脚本: python 总消耗查询.py
    3. 查看统计结果

返回数据说明:
    - quota : 总消耗额度
    - rpm   : Requests Per Minute  - 每分钟请求数
    - tpm   : Tokens Per Minute    - 每分钟 Token 消耗数
    - mpm   : Messages Per Minute  - 每分钟消息数

================================================================================
"""
import requests
from datetime import datetime
# ==============================================================================
#                               配置信息区域
# ==============================================================================

# API 平台根地址
BASE_URL = "https://www.dmxapi.cn"
QUOTA_PER_CNY = 500_000

# ------------------------------------------------------------------------------
# 认证信息配置 (请替换为你自己的信息)
# ------------------------------------------------------------------------------
# SYSTEM_TOKEN: 系统访问令牌,用于平台管理接口认证
#               获取方式: 登录 dmxapi.cn -> 个人设置 -> 安全 -> 访问令牌
SYSTEM_TOKEN = "YOUR_SYSTEM_TOKEN"  # 替换为你的系统令牌

# USER_ID: 用户唯一标识
#          获取方式: 登录 dmxapi.cn -> 个人设置 -> 个人资料
USER_ID = "YOUR_USER_ID"  # 替换为你的用户 ID

# ------------------------------------------------------------------------------
# 时间范围配置
# ------------------------------------------------------------------------------
# query_mode: 查询模式选择
#   "today"      - 查询今天的数据
#   "yesterday"  - 查询昨天的数据
#   "week"       - 查询最近7天的数据
#   "month"      - 查询最近30天的数据
#   "custom"     - 自定义时间范围(需要设置下方的 start_time_text 和 end_time_text)
query_mode = "month"

# 自定义时间范围(仅当 query_mode = "custom" 时生效)
# 格式: "YYYY-MM-DD" 或 "YYYY-MM-DD HH:MM:SS"
start_time_text = "2025-01-01 00:00:00"
end_time_text = "2025-01-01 23:59:59"


# ==============================================================================
#                               核心功能函数
# ==============================================================================

def get_stat_data(start_timestamp: int, end_timestamp: int, log_type: int = 0,
                  name: str = "", group: str = "", model_name: str = ""):
    """
    获取 API 总消耗统计数据

    通过调用 /api/log/self/stat 接口,查询指定时间范围内的 API 使用统计信息。

    Args:
        start_timestamp (int): 查询开始时间的 Unix 时间戳 (秒)
                               例如: 1702080000 表示 2023-12-09 00:00:00
        end_timestamp (int):   查询结束时间的 Unix 时间戳 (秒)
                               例如: 1702166399 表示 2023-12-09 23:59:59
        log_type (int):        日志类型,默认为 0 (全部统计)
        name (str):            按令牌名称筛选 (空字符串表示不筛选)
        group (str):           按令牌分组筛选 (空字符串表示不筛选)
        model_name (str):      按模型名称筛选 (空字符串表示不筛选)

    Returns:
        dict: 包含统计数据的字典,结构如下:
              {
                  "quota": int,  # 总消耗额度 
                  "rpm": int,    # 每分钟请求数
                  "tpm": int,    # 每分钟 Token 数
                  "mpm": int     # 每分钟消息数
              }
              请求失败时返回空字典 {}

    Raises:
        无异常抛出,错误信息通过 print 输出
    """
    # -------------------------------------------------------------------------
    # 构建请求头 - 使用 Token 认证
    # -------------------------------------------------------------------------
    headers = {
        "Accept": "application/json",              # 期望返回 JSON 格式
        "Authorization": f"{SYSTEM_TOKEN}", # Token 认证
        "Dmx-Api-User": USER_ID,                   # 用户标识头
    }

    # -------------------------------------------------------------------------
    # 构建查询参数
    # -------------------------------------------------------------------------
    params = {
        "type": log_type,                     # 日志类型
        "token_name": name,                   # 令牌名称筛选
        "token_group": group,                 # 令牌分组筛选
        "model_name": model_name,             # 模型名称筛选
        "start_timestamp": start_timestamp,   # 开始时间戳
        "end_timestamp": end_timestamp        # 结束时间戳
    }

    # -------------------------------------------------------------------------
    # 发送 GET 请求
    # -------------------------------------------------------------------------
    response = requests.get(f"{BASE_URL}/api/log/self/stat", headers=headers, params=params)

    # 检查 HTTP 状态码
    if response.status_code != 200:
        print(f"请求失败: HTTP {response.status_code}")
        return {}

    # -------------------------------------------------------------------------
    # 解析响应数据
    # -------------------------------------------------------------------------
    result = response.json()

    # 检查业务状态
    if not result.get("success"):
        print(f"接口返回错误: {result.get('message', '未知错误')}")
        return {}

    return result.get("data", {})


def print_stat(data: dict, start_datetime: datetime, end_datetime: datetime):
    """
    格式化输出统计数据

    将 API 返回的统计数据以美观的表格形式输出到控制台。

    Args:
        data (dict):           API 返回的统计数据字典
                               必须包含: quota, rpm, tpm, mpm 字段
        start_datetime (datetime): 查询开始时间
        end_datetime (datetime):   查询结束时间

    Returns:
        None: 直接输出到控制台

    输出格式:
        ==================================================
                      API 总消耗统计
        ==================================================
        查询时间: YYYY-MM-DD HH:MM 至 YYYY-MM-DD HH:MM
        --------------------------------------------------
          总消耗额度: X.XXXX
          原始值: XXXXXXXX
        --------------------------------------------------
          每分钟请求数 (RPM): XXX
          每分钟Token数 (TPM): XXXXXXX
          每分钟消息数 (MPM): XXXXXXX
        ==================================================
    """
    # -------------------------------------------------------------------------
    # 输出表头
    # -------------------------------------------------------------------------
    print("=" * 50)
    print("              API 总消耗统计")
    print("=" * 50)
    print(f"查询时间: {start_datetime.strftime('%Y-%m-%d %H:%M')}{end_datetime.strftime('%Y-%m-%d %H:%M')}")
    print("-" * 50)

    # -------------------------------------------------------------------------
    # 数据为空时的处理
    # -------------------------------------------------------------------------
    if not data:
        print("  没有数据")
        print("=" * 50)
        return

    # -------------------------------------------------------------------------
    # 提取并转换数据
    # -------------------------------------------------------------------------
    quota = data.get("quota", 0)           # 原始额度值
    total_consumed_quota_cny = quota / QUOTA_PER_CNY  # 转换为总消耗(CNY)

    # -------------------------------------------------------------------------
    # 输出统计结果
    # -------------------------------------------------------------------------
    print(f"  总消耗额度: {total_consumed_quota_cny:.4f}")
    print(f"  原始值: {quota}")
    print("-" * 50)
    print(f"  每分钟请求数 (RPM): {data.get('rpm', 0)}")
    print(f"  每分钟Token数 (TPM): {data.get('tpm', 0)}")
    print(f"  每分钟消息数 (MPM): {data.get('mpm', 0)}")
    print("=" * 50)


def get_time_range(query_mode: str) -> tuple:
    """
    根据查询模式获取时间范围

    Args:
        query_mode (str): 查询模式
                    - "today": 今天
                    - "yesterday": 昨天
                    - "week": 最近7天
                    - "month": 最近30天
                    - "custom": 自定义时间范围

    Returns:
        tuple: (start_timestamp, end_timestamp, start_datetime, end_datetime)
    """
    from datetime import timedelta

    now = datetime.now()
    today = now.replace(hour=0, minute=0, second=0, microsecond=0)

    if query_mode == "today":
        start_datetime = today
        end_datetime = today.replace(hour=23, minute=59, second=59)
    elif query_mode == "yesterday":
        start_datetime = today - timedelta(days=1)
        end_datetime = start_datetime.replace(hour=23, minute=59, second=59)
    elif query_mode == "week":
        start_datetime = today - timedelta(days=6)
        end_datetime = now
    elif query_mode == "month":
        start_datetime = today - timedelta(days=29)
        end_datetime = now
    elif query_mode == "custom":
        try:
            if len(start_time_text) == 10:
                start_datetime = datetime.strptime(start_time_text, "%Y-%m-%d")
            else:
                start_datetime = datetime.strptime(start_time_text, "%Y-%m-%d %H:%M:%S")

            if len(end_time_text) == 10:
                end_datetime = datetime.strptime(end_time_text, "%Y-%m-%d").replace(hour=23, minute=59, second=59)
            else:
                end_datetime = datetime.strptime(end_time_text, "%Y-%m-%d %H:%M:%S")
        except ValueError as e:
            print(f"时间格式错误: {e}")
            print("请使用格式: YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS")
            exit(1)
    else:
        print(f"未知的查询模式: {query_mode}")
        print("支持的模式: today, yesterday, week, month, custom")
        exit(1)

    return (
        int(start_datetime.timestamp()),
        int(end_datetime.timestamp()),
        start_datetime,
        end_datetime,
    )


# ==============================================================================
#                               主程序入口
# ==============================================================================

if __name__ == "__main__":
    """
    主程序执行流程:

    1. 根据配置的查询模式获取时间范围
    2. 调用 API 获取统计数据
    3. 格式化输出统计结果
    """

    # -------------------------------------------------------------------------
    # Step 1: 根据配置获取时间范围
    # -------------------------------------------------------------------------
    start_timestamp, end_timestamp, start_datetime, end_datetime = get_time_range(query_mode)

    # -------------------------------------------------------------------------
    # Step 2: 显示查询信息
    # -------------------------------------------------------------------------
    print(f"查询模式: {query_mode}")
    print(f"查询时间范围: {start_datetime.strftime('%Y-%m-%d %H:%M:%S')}{end_datetime.strftime('%Y-%m-%d %H:%M:%S')}")
    print()

    # -------------------------------------------------------------------------
    # Step 3: 调用 API 获取数据并输出
    # -------------------------------------------------------------------------
    data = get_stat_data(start_timestamp, end_timestamp)
    print_stat(data, start_datetime, end_datetime)

返回示例

text
查询模式: month
查询时间范围: 2026-06-08 00:00:00 至 2026-07-07 12:09:17

==================================================
              API 总消耗统计
==================================================
查询时间: 2026-06-08 00:00 至 2026-07-07 12:09
--------------------------------------------------
  总消耗额度: 3772.8467
  原始值: 1886423362
--------------------------------------------------
  每分钟请求数 (RPM): 0
  每分钟Token数 (TPM): 0
  每分钟消息数 (MPM): 0
==================================================

© 2025 DMXAPI 总消耗 日志查询 🍌

一个 Key 用全球大模型