new-api 批量生成兑换码 (Batch Generate Redemption Codes)
目标
在 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 直插法)
备份
cp /opt/relay/na/one-api.db /root/one-api.db.bak-$(date +%Y%m%d_%H%M%S)生成 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拼 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.sqluser_id=1表示归属管理员;created_time用秒级 Unix 时间戳;expired_time留空 = 不过期。验证
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/redemptioncount≤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