三个 ChatGPT 注册项目分析报告¶
1. codex_register (Hermylivid261) ⭐⭐⭐ 最关键¶
核心发现 — 解决了我们 OAuth token 提取的问题:
关键流程(全部在同一个 session 里)¶
OAuth authorize (Codex client_id)
→ signup email
→ password
→ OTP
→ create_account
→ workspace/select
→ 跟随重定向链捕获 code
→ exchange token
我们缺的关键步骤:¶
- 一开始就用 Codex client_id 发起 OAuth(不是 ChatGPT Web client_id)
- create_account 后用
openai-sentinel-so-token(flow=oauth_create_account,不是authorize_continue) - 解码
oai-client-auth-sessioncookie 获取 workspace_id - POST workspace/select 后跟随 continue_url 的重定向链
- 在重定向中查找包含
code=和state=的 URL,提取 code
代码(核心逻辑,454行单文件):¶
# 关键差异1: sentinel so_token (flow=oauth_create_account)
so_token = fetch_sentinel_token(flow="oauth_create_account", did=did)
create_headers["openai-sentinel-so-token"] = so_token # 注意是 so-token!
# 关键差异2: workspace/select
auth_json = _decode_jwt_segment(auth_cookie.split(".")[0])
workspace_id = auth_json["workspaces"][0]["id"]
select_resp = s.post("/api/accounts/workspace/select",
json={"workspace_id": workspace_id},
headers={"referer": "https://auth.openai.com/sign-in-with-chatgpt/codex/consent"})
continue_url = select_resp.json()["continue_url"]
# 关键差异3: 跟随重定向链(不跟随自动重定向!)
for _ in range(6):
resp = s.get(current_url, allow_redirects=False)
location = resp.headers.get("Location")
if "code=" in next_url and "state=" in next_url:
# 提取 code 并换 token
2. chatgpt_register_v2 (Momenm3419) ⭐⭐¶
模块化架构,有 workspace 多来源提取:
- WorkspaceOperations 类从多个位置提取 workspace_id:
payload["workspace_id"]payload["default_workspace_id"]payload["workspace"]["id"]payload["workspaces"][0]["id"]- OTP 验证后也会返回 workspace_id(我们之前没注意)
- 有 session_token 兜底获取逻辑
3. izTeamSlots (izzzzzi) ⭐⭐⭐¶
生产级 Team 管理工具(Node.js):
- Team slot 管理:邀请 → 注册 → OAuth → codex token
- Codex 账号自动轮换(usage 90% 自动切)
- 自动刷新过期的 access_token
- 支持多邮箱提供商(boomlify, trickads, imap)
- 浏览器 profile 持久化
对我们代码的修复方案¶
根据 codex_register 的流程,需要做以下修改:
- 不走 ChatGPT Web 入口注册,直接用 Codex client_id 的 /oauth/authorize 开始
- create_account 时用
openai-sentinel-so-tokenheader(flow=oauth_create_account) - create_account 成功后解码 cookie 获取 workspace_id
- POST workspace/select 然后手动跟随重定向(allow_redirects=False)
- 在重定向链中捕获包含 code= 的 URL