Skip to content

更新令牌

根据令牌 ID 更新 API Key 的名称、额度、过期时间、模型/IP 限制和令牌限流配置。

本示例会显示完整 API Key

更新成功后,脚本会在终端直接输出完整 API Key。请只在可信的本地设备运行,不要截图、分享或写入日志。

📌 接口地址

PUT   https://www.dmxapi.cn/api/token/

脚本还会依次调用以下辅助接口:

GET   https://www.dmxapi.cn/api/token/              # 查询令牌列表,用于找到 token_id
GET   https://www.dmxapi.cn/api/token/{token_id}    # 读取当前配置,构造全量更新请求
POST  https://www.dmxapi.cn/api/token/{token_id}/key # 更新后读取完整 API Key

一、查询要更新的令牌 ID

先列出当前账号下的令牌,从结果中找到要更新的 token_id

python
import requests

# 只需修改这里
SYSTEM_TOKEN = "请在这里填写系统访问令牌"  # 管理接口使用的系统访问令牌
USER_ID = "请在这里填写用户 ID"  # 与系统访问令牌同账号的用户 ID

# 下面无需修改
BASE_URL = "https://www.dmxapi.cn"  # 平台管理接口地址
headers = {
    "Authorization": f"Bearer {SYSTEM_TOKEN}",  # 使用系统访问令牌认证
    "Dmx-Api-User": str(USER_ID),  # 指定请求所属的用户 ID
}

response = requests.get(
    f"{BASE_URL}/api/token/",
    headers=headers,
    params={"page": 1, "page_size": 999},
    timeout=30,
)
response.raise_for_status()
result = response.json()
if not result.get("success"):
    raise RuntimeError(result.get("message") or "查询令牌失败")

items = result["data"]["items"]
print(f"找到 {len(items)} 个令牌")
for token in items:
    print(f"ID:{token['id']}  令牌名称:{token.get('name', '')}")

查询 ID 输出示例

text
找到 2 个令牌
ID:12345  令牌名称:DMXAPI创建测试
ID:12346  令牌名称:DMXAPI创建测试-2

把目标令牌前面的数字 ID 填入下一步的 token_id

二、根据 ID 更新令牌

填写上一步查到的 token_id,再像创建令牌一样修改参数后运行。除 token_id 外,参数名称、顺序和含义与创建令牌完全一致。

python
import time
from datetime import datetime

import requests

# 只需修改这里
SYSTEM_TOKEN = "请在这里填写系统访问令牌"  # 管理接口使用的系统访问令牌
USER_ID = "请在这里填写用户 ID"  # 与系统访问令牌同账号的用户 ID
token_id = 12345  # 填写第一步查询到的令牌 ID

name = "DMXAPI更新测试"  # 令牌名称
expired_time = -1  # 填 -1 表示永不过期;填正整数表示多少天后过期
unlimited_quota = True  # True 表示不限制令牌额度
remain_quota = 1  # 额度金额,单位 CNY;unlimited_quota=False 时生效,无限额度时忽略
model_limits_enabled = False  # 是否启用模型限制
model_limits = ""  # 允许的模型 ID,用英文逗号分隔
allow_ips = ""  # IP 白名单;换行分隔,留空表示不限制
rate_limits_enabled = True  # 是否启用单令牌限流
rate_limits_time = 60  # 限流时间窗口,单位为秒
rate_limits_count = 60  # 每个窗口允许的最大请求数
rate_limits_content = ""  # 超出限流时返回的提示语

# 下面无需修改
BASE_URL = "https://www.dmxapi.cn"
expired_time = -1 if expired_time == -1 else int(time.time() + expired_time * 86400)
headers = {
    "Authorization": f"Bearer {SYSTEM_TOKEN}",
    "Dmx-Api-User": str(USER_ID),
}

def time_text(value):
    if value == -1:
        return "永不过期"
    if not value:
        return "无记录"
    return datetime.fromtimestamp(value).astimezone().strftime("%Y-%m-%d %H:%M:%S %z")


response = requests.get(
    f"{BASE_URL}/api/token/{token_id}",
    headers=headers,
    timeout=30,
)
response.raise_for_status()
current = response.json()["data"]

payload = {
    "id": token_id,
    "name": name,
    "expired_time": expired_time,
    "remain_quota": int(remain_quota * 500000),  # 1 元 = 500000 原始额度
    "unlimited_quota": unlimited_quota,
    "model_limits_enabled": model_limits_enabled,
    "model_limits": model_limits,
    "allow_ips": allow_ips,
    "group": "default",
    "rate_limits_enabled": rate_limits_enabled,
    "rate_limits_time": rate_limits_time,
    "rate_limits_count": rate_limits_count,
    "rate_limits_content": rate_limits_content,
    "cross_group_retry": current.get("cross_group_retry", False),
    "status": current["status"],
}
response = requests.put(
    f"{BASE_URL}/api/token/",
    headers=headers,
    json=payload,
    timeout=30,
)
response.raise_for_status()
result = response.json()
if not result.get("success"):
    raise RuntimeError(result.get("message") or "更新令牌失败")
updated = result["data"]

response = requests.post(
    f"{BASE_URL}/api/token/{token_id}/key",
    headers=headers,
    timeout=30,
)
response.raise_for_status()
api_key = response.json()["data"]["key"]
api_key = api_key if api_key.startswith("sk-") else f"sk-{api_key}"

remain_quota_text = (
    "无限额度"
    if updated.get("unlimited_quota")
    else f"{updated.get('remain_quota', 0) / 500000:.4f} CNY"  # 500000 原始额度 = 1 元
)
model_limits_text = (
    str(updated.get("model_limits") or "").strip()
    if updated.get("model_limits_enabled")
    else ""
) or "无限制"
allow_ips_text = "、".join(
    item.strip()
    for item in str(updated.get("allow_ips") or "").splitlines()
    if item.strip()
) or "无限制"

print(
    "更新成功\n"
    f"令牌名称:{updated.get('name', '')}\n"
    f"所属用户 ID:{USER_ID}\n"
    f"状态:{'已启用' if updated.get('status') == 1 else '已禁用'}\n"
    f"API 密钥:{api_key}\n"
    f"剩余额度:{remain_quota_text}\n"
    f"消耗额度:{updated.get('used_quota', 0) / 500000:.4f} CNY\n"
    f"模型限制:{model_limits_text}\n"
    f"IP 限制:{allow_ips_text}\n"
    f"创建时间:{time_text(updated.get('created_time'))}\n"
    f"最后使用时间:{time_text(updated.get('accessed_time'))}\n"
    f"过期时间:{time_text(updated.get('expired_time'))}\n"
    "----------------------------------------"
)

更新结果输出示例

text
更新成功
令牌名称:DMXAPI更新测试
所属用户 ID:12345
状态:已启用
API 密钥:<此处会显示完整 API Key>
剩余额度:5.0000 CNY
消耗额度:1.0000 CNY
模型限制:无限制
IP 限制:无限制
创建时间:2026-07-27 10:00:00 +0800
最后使用时间:2026-07-27 10:15:00 +0800
过期时间:永不过期
----------------------------------------

© 2026 DMXAPI 更新令牌

一个 Key 用全球大模型