跳转至

三个 ChatGPT 注册项目分析报告

1. codex_register (Hermylivid261) ⭐⭐⭐ 最关键

核心发现 — 解决了我们 OAuth token 提取的问题:

关键流程(全部在同一个 session 里)

OAuth authorize (Codex client_id) 
  → signup email 
  → password 
  → OTP 
  → create_account 
  → workspace/select 
  → 跟随重定向链捕获 code 
  → exchange token

我们缺的关键步骤:

  1. 一开始就用 Codex client_id 发起 OAuth(不是 ChatGPT Web client_id)
  2. create_account 后用 openai-sentinel-so-token(flow=oauth_create_account,不是 authorize_continue
  3. 解码 oai-client-auth-session cookie 获取 workspace_id
  4. POST workspace/select 后跟随 continue_url 的重定向链
  5. 在重定向中查找包含 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 的流程,需要做以下修改:

  1. 不走 ChatGPT Web 入口注册,直接用 Codex client_id 的 /oauth/authorize 开始
  2. create_account 时用 openai-sentinel-so-token header(flow=oauth_create_account)
  3. create_account 成功后解码 cookie 获取 workspace_id
  4. POST workspace/select 然后手动跟随重定向(allow_redirects=False)
  5. 在重定向链中捕获包含 code= 的 URL