目标

在 new-api 批量生成 N 个等额兑换码(如 1000 个 10 刀卡),并导出成一行一个的 txt 用于分发。

前置知识

  • 额度换算:QuotaPerUnit = 500000(默认),即 1 美元 = 500000 额度,所以 $10 = 5,000,000。
    换算与倍率关系见 New API 模型定价与倍率配置 (Model Pricing and Ratio Configuration)。
  • 原生码格式:key = UUID 去掉横线,32 位小写 hex(源码 common.GetUUID())。
    列类型 char(32),key 有唯一索引,status=1 才可兑换。
  • 管理 API 限制:POST /api/redemption 的 count 上限 100,且响应不回传生成的 key,
    要再查列表才能拿到。大批量(>100)直接写库比调 API 快且确定。
  • 认证:管理接口要 Authorization: Bearer <JWT>,JWT 由 POST /api/user/login 获取。

机器与库(LA 服务器)

  • 服务:new-api.service(端口 3000,WorkingDirectory /opt/relay/na)
  • 数据库:/opt/relay/na/one-api.db(SQLite,sqlite3 已在机器上)
  • 管理员:admin(id=1, role=100);会话 JWT 存于 /root/na_token.txt
  • SSH:ssh la

步骤(SQL 直插法)

  1. 备份

    cp /opt/relay/na/one-api.db /root/one-api.db.bak-$(date +%Y%m%d_%H%M%S)
  2. 生成 N 个码(原生格式,逐行写入)

    : > /tmp/codes.txt
    for i in $(seq 1 1000); do cat /proc/sys/kernel/random/uuid | tr -d '-'; done > /tmp/codes.txt

    立即校验,不合格就中止:

    wc -l < /tmp/codes.txt          # 必须 = N
    sort -u /tmp/codes.txt | wc -l  # 必须 = N(撞唯一索引会插失败)
    awk 'length($0)!=32' /tmp/codes.txt | wc -l   # 必须 = 0
  3. 拼 INSERT 并执行(整批包在事务里,任一行失败不会留下半批)

    now=$(date +%s)
    {
      echo "BEGIN;"
      while IFS= read -r k; do
        printf "INSERT INTO redemptions (user_id,key,status,name,quota,created_time) VALUES (1,'%s',1,'10美元',5000000,%s);\n" "$k" "$now"
      done < /tmp/codes.txt
      echo "COMMIT;"
    } > /tmp/insert.sql
    sqlite3 -bail /opt/relay/na/one-api.db < /tmp/insert.sql

    user_id=1 表示归属管理员;created_time 用秒级 Unix 时间戳;expired_time 留空 = 不过期。

  4. 验证

    sqlite3 /opt/relay/na/one-api.db \
      "SELECT COUNT(*), MIN(quota), COUNT(DISTINCT key) FROM redemptions WHERE name='10美元';"

常见失败点

  • 没做 sort -u 校验:key 撞唯一索引 → 整批事务失败或半批写入。
  • 用管理 API 传 count>100:直接报 count 不能大于 100。
  • sqlite3 默认不回报 SQL 错误:执行 INSERT 时加 -bail,否则某条失败也当成功返回。
  • name 别太长:管理 API 校验 name ≤ 20 个字符;直接写库不受限但建议保持一致。

适用边界

  • 适合"已知额度、纯新增、一次性大批量";若需要审计/统计、或 code 要系统回显,
    走管理 API(POST /api/redemption count≤100 + GET /api/redemption 回查)。
  • 兑换码是一次性用品:redeem 后 status 变更,无法复用;同一批码不要重复插入。

本次实例证据(2026-09-24)

  • 生成 1000 个 10美元 兑换码,额度 5,000,000,插入后总数/唯一 key 均 = 1000。
  • 导出:C:\Users\18086\Desktop\10美元兑换码1000个.txt(一行一个码,LF)。
  • 备份:/root/one-api.db.bak-20260924_022011。

本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/AI apps