GPT/OpenAI 注册路线 API
这是最开始的 GPT 注册机链路,继续使用 /api/mailboxes/* 和 /api/mail/code。
AI 快速接入
你要接入 MailOps 的 GPT/OpenAI 注册路线 API。
BASE_URL = "http://ops.nanlizz.top"
API_KEY = "mak_xxx"
CATEGORY = "safe"
CODE_KEYWORD = "code,验证码,verification code,OpenAI,ChatGPT,gpt"
所有请求都带:
Authorization: Bearer API_KEY
Content-Type: application/json
固定流程:
1. 领取邮箱,只能用:
POST {BASE_URL}/api/mailboxes/reserve
body: {"category":CATEGORY,"consume":true}
2. 如果返回 email 为空,表示邮箱池耗尽,停止本轮注册。
3. 使用返回的 email 去 OpenAI/GPT 注册页面提交。
4. 等待 10-20 秒后查询验证码:
GET {BASE_URL}/api/mail/code?email={email}&keyword={CODE_KEYWORD}&limit=10&folders=inbox,junk
5. found=false 时继续轮询同一个 email,不要重新领取新邮箱。
6. 最终超时无验证码:
POST {BASE_URL}/api/mailboxes/report-code
body: {"email":email,"result":"timeout","detail":"180s no verification code"}
7. 注册结束后按需上报 GPT 账号:
POST {BASE_URL}/api/gpt-accounts/report
禁止事项:
- 不要用 GET /api/mailboxes 分配邮箱,它只是查看列表。
- GPT/OpenAI 旧注册机不要接 /api/reuse/v1/*。
- 每个并发 worker 一次注册只领取一次邮箱,不能共享 email。
- 默认 consume=true,邮箱返回前已被服务器标记 used,不会再次从 safe 池发出。
机器可读规格:/api-spec-gpt.json
推荐流程
- 管理员在控制台导入 Outlook/Hotmail 邮箱并完成扫描分类。
- 注册机启动时配置
base_url、api_key、category=safe、验证码关键词和并发数。 - 每个 worker 通过
POST /api/mailboxes/reserve领取唯一邮箱。 - 把该邮箱提交给 OpenAI/GPT 注册流程。
- 只对刚领取的邮箱调用
GET /api/mail/code轮询验证码。 - 注册成功后调用
POST /api/gpt-accounts/report上报账号资料。 - 最终收不到码时调用
POST /api/mailboxes/report-code,后台隔离到no_code。
接口明细
| 方法 | 路径 | 用途 | 是否用于分配 |
|---|---|---|---|
| POST | /api/mailboxes/reserve | 并发安全领取一个邮箱 | 是,推荐 |
| GET | /api/mail/code | 读取指定邮箱验证码 | 否 |
| GET | /api/mail/{email} | 兼容旧 MailManage 读码路径 | 否 |
| POST | /api/mailboxes/report-code | 上报 timeout/no_code 并隔离异常邮箱 | 否 |
| POST | /api/mailboxes/mark-used | consume=false 模式下手动确认邮箱已用 | 否 |
| POST | /api/mailboxes/release | consume=false 模式下释放未占用邮箱 | 否 |
| GET | /api/mailboxes | 列表/排查/导出 | 否,禁止用它分配 |
| POST | /api/gpt-accounts/report | 注册结束后上报 GPT 账号仓库 | 否 |
领取邮箱
POST /api/mailboxes/reserve
Authorization: Bearer mak_xxx
Content-Type: application/json
{
"category": "safe",
"consume": true,
"lease_seconds": 1800
}
成功:
{
"ok": true,
"email": "example@outlook.com",
"category": "used",
"used": 1,
"lease_token": ""
}
邮箱池为空:
{
"ok": true,
"email": "",
"reason": "empty"
}
默认 consume=true,返回前已经把邮箱标记为 used=1,并发 worker 不会拿到同一个邮箱。
读取验证码
GET /api/mail/code?email=example@outlook.com&keyword=code,验证码,verification code,OpenAI,ChatGPT,gpt&limit=10&folders=inbox,junk
找到:
{
"ok": true,
"found": true,
"email": "example@outlook.com",
"code": "123456"
}
暂未找到:
{
"ok": true,
"found": false,
"email": "example@outlook.com"
}
轮询时只轮询本次领取的邮箱。不要因为一次 found=false 就重新领取新邮箱。
验证码失败上报
POST /api/mailboxes/report-code
Authorization: Bearer mak_xxx
Content-Type: application/json
{
"email": "example@outlook.com",
"result": "timeout",
"detail": "180s no verification code"
}
后台会记录未收码结果,并把连续异常邮箱隔离出 safe 池,避免后续继续发给 GPT 注册机。
GPT 账号上报
POST /api/gpt-accounts/report
Authorization: Bearer mak_xxx
Content-Type: application/json
{
"result": "success",
"dedupe_key": "batch-001:login@example.com",
"login_email": "login@example.com",
"login_password": "optional",
"mailbox_email": "example@outlook.com",
"detail": {
"batch_id": "batch-001",
"worker": "worker-01"
}
}
dedupe_key 建议用批次 + 登录邮箱,重复上报会更新同一条记录,不会创建重复账号。
Python 示例
import time
import requests
BASE = "http://ops.nanlizz.top"
KEY = "mak_xxx"
KEYWORD = "code,验证码,verification code,OpenAI,ChatGPT,gpt"
HEADERS = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
reserved = requests.post(
f"{BASE}/api/mailboxes/reserve",
headers=HEADERS,
json={"category": "safe", "consume": True},
timeout=30,
).json()
if not reserved.get("email"):
raise RuntimeError("GPT 邮箱池耗尽")
email = reserved["email"]
# 把 email 提交给 OpenAI/GPT 注册页面后,只轮询这个 email。
deadline = time.time() + 180
while time.time() < deadline:
code = requests.get(
f"{BASE}/api/mail/code",
headers=HEADERS,
params={"email": email, "keyword": KEYWORD, "limit": 10, "folders": "inbox,junk"},
timeout=30,
).json()
if code.get("found"):
print(email, code.get("code"))
break
time.sleep(8)
else:
requests.post(
f"{BASE}/api/mailboxes/report-code",
headers=HEADERS,
json={"email": email, "result": "timeout", "detail": "180s no verification code"},
timeout=30,
)
raise RuntimeError("验证码超时")