{"id":48632035,"url":"https://github.com/cnlimiter/codex-manager-v3","last_synced_at":"2026-04-11T07:00:45.653Z","repository":{"id":349335218,"uuid":"1201768756","full_name":"cnlimiter/codex-manager-v3","owner":"cnlimiter","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-06T05:25:39.000Z","size":258,"stargazers_count":162,"open_issues_count":3,"forks_count":64,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-09T05:39:55.612Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cnlimiter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-05T06:03:29.000Z","updated_at":"2026-04-09T05:06:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cnlimiter/codex-manager-v3","commit_stats":null,"previous_names":["cnlimiter/codex-register-v3","cnlimiter/codex-manager-v3"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cnlimiter/codex-manager-v3","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager-v3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager-v3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager-v3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager-v3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cnlimiter","download_url":"https://codeload.github.com/cnlimiter/codex-manager-v3/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnlimiter%2Fcodex-manager-v3/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31671630,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-09T05:33:03.613Z","updated_at":"2026-04-11T07:00:45.610Z","avatar_url":"https://github.com/cnlimiter.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# codex-register-v3\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://linux.do\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/LINUX-DO-FFB003?style=for-the-badge\u0026logo=linux\u0026logoColor=white\" alt=\"LINUX DO\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\nChatGPT 账号无头浏览器自动批量注册工具。\n\n支持双浏览器引擎（Playwright Chromium / Camoufox Firefox）、多种邮件服务（GPTMail / NPCmail / YYDS Mail / 通用 IMAP / Outlook）、代理池轮换，asyncio 并发执行，SQLite 持久化存储，注册完成后自动完成 Codex OAuth Token 换取。\n\n---\n\n## 功能特性\n\n| 功能 | 说明 |\n|------|------|\n| 双引擎 | Playwright (Chromium) 或 Camoufox (Firefox)，可通过 WebUI 或 CLI 即时切换 |\n| 反检测 | Chromium 注入 13 点 stealth JS；Camoufox 内置指纹混淆 + GeoIP |\n| 手机指纹 | 顶层 `mobile: true` 即可全程使用手机端 UA / 视口 / 触控，注册与 OAuth 复用同一 session |\n| 多邮件后端 | GPTMail / NPCmail / YYDS Mail / **通用 IMAP** / **Outlook**，统一工厂接口 |\n| IMAP 别名 | qq.com / gmail.com 自动启用 `+alias` 子地址，每次注册生成唯一别名，并发互不干扰 |\n| 多 IMAP 账户 | 支持配置多个 IMAP 邮箱，随机轮换或按索引固定使用 |\n| WebUI 配置 | WebUI/FastAPI 配置存储在 SQLite `settings` 表；支持页面直接修改各配置 section |\n| OAuth Token | 注册完成后自动完成 Codex PKCE OAuth2 流程，写入 `access_token` / `refresh_token` / `id_token` |\n| OAuth OTP 重试 | OAuth 登录阶段若直接进入邮箱验证码，支持自动检测；验证码错误时自动重发、拉取新码并重试 |\n| 代理池 | 从文本文件导入，轮询分配，失败 3 次自动禁用 |\n| 并发 | asyncio.Semaphore 控制同时运行的浏览器数量 |\n| 持久化 | aiosqlite 驱动的 SQLite，账号去重 upsert |\n| CLI / WebUI | typer + rich CLI，以及 FastAPI + React WebUI |\n| 日志 | loguru 双路输出：终端彩色 INFO + 文件 DEBUG（register.log，10 MB 自动轮转） |\n\n---\n\n## 注册流程（7 步状态机）\n\n注册流程完全逆向自 `plan/browser/tool.js` (`_0x548_inner`) 并在 Python 中忠实复现：\n\n```\nGOTO_SIGNUP → FILL_EMAIL → FILL_PASSWORD → WAIT_CODE\n            → FILL_CODE  → FILL_PROFILE  → COMPLETE\n```\n\n| 状态 | 动作 |\n|------|------|\n| `GOTO_SIGNUP` | 打开 `chatgpt.com/auth/login`，等待 Auth0 跳转；若邮箱框已出现直接填写，否则查找并点击\"Sign up\"按钮 |\n| `FILL_EMAIL` | 等待邮箱输入框，用 React 原生 setter 填入生成的邮箱，点击 Continue |\n| `FILL_PASSWORD` | 等待密码框，填入自动生成的强密码（大写+小写+数字+特殊字符），点击 Continue |\n| `WAIT_CODE` | 轮询邮件服务获取 6 位验证码（最长 60 s，可配置） |\n| `FILL_CODE` | 将 6 位验证码逐位填入 `input[maxlength=\"1\"]` 方格或单字段，点击 Continue |\n| `FILL_PROFILE` | 填写 firstName / lastName；生日优先走 `[role=\"spinbutton\"]`，不足时回退到 `\u003cselect\u003e` 下拉或 `input[type='date']`；点击 Agree |\n| `COMPLETE` | 等待跳回 `chatgpt.com`，账号标记为「注册完成」；随即执行 Codex OAuth 换取 Token |\n\n每步失败后最多重试 5 次，指数退避（网络错误最长 60 s，其他错误最长 30 s）；任何步骤检测到错误页面均自动重试。\n\nOAuth 阶段会复用注册完成后的同一个浏览器会话 / Cookie；若 Auth0 要求邮箱 OTP，当前实现支持：\n\n- 邮箱提交后**直接跳到验证码页**（无密码框）\n- 验证码输错后自动点击 **Resend**、拉取**新验证码**并重试\n- 若回调 URL 已变为 `http://localhost:1455/auth/callback?code=...`，即使路由拦截未触发，也会从当前页面 URL 直接提取 `code` 并进入换 token\n\n---\n\n## 环境要求\n\n- Python ≥ 3.11\n- [uv](https://docs.astral.sh/uv/) 包管理器\n\n---\n\n## 安装\n\n```powershell\n# 1. 克隆项目\ngit clone \u003crepo-url\u003e\ncd codex-register-v3-single\n\n# 2. 安装依赖\nuv sync\n\n# 3. 安装浏览器\nuv run python -m playwright install chromium\nuv run python -m camoufox fetch   # 下载 GeoIP 数据库（约 65 MB）\n\n# 4. 初始化数据库\nuv run python -m src.main db init\n\n```\n\n---\n\n## 配置\n\n当前项目的**唯一运行时配置源**是 SQLite `accounts.db` 中的 `settings` 表，由 `src/settings_db.py` 管理。\n\n### 推荐用法\n\n- 日常使用 **WebUI** 修改配置：\n\n```powershell\nuv run python -m src.main webui\n```\n\n- 也可以用 CLI 直接读写 SQLite 配置：\n\n```powershell\nuv run python -m src.main config show\nuv run python -m src.main config get engine\nuv run python -m src.main config set engine camoufox\nuv run python -m src.main config set timeouts.otp_code 240\n```\n\n### 主要配置 section\n\n| Section | 内容 |\n|--------|------|\n| `general` | `engine` / `headless` / `slow_mo` / `mobile` / `max_concurrent` / `mail_provider` / `proxy_strategy` / `proxy_static` |\n| `mail.gptmail` / `mail.npcmail` / `mail.yydsmail` | API 邮箱配置 |\n| `mail.imap` / `mail.outlook` | 自有邮箱账号列表 |\n| `registration` | 邮箱前缀 / 域名 |\n| `oauth` | 是否启用 OAuth / OAuth 总超时 |\n| `mouse` | 人工轨迹点击配置 |\n| `timeouts` | 各阶段超时 |\n| `timing` | 页面动作节奏参数 |\n| `team` / `sync` | 预留的同步相关配置 |\n\n### 配置字段速查\n\n| 字段 | 默认值 | 说明 |\n|------|--------|------|\n| `engine` | `playwright` | `playwright` \\| `camoufox` |\n| `headless` | `true` | `false` 可在窗口中实时观察注册过程 |\n| `slow_mo` | `0` | 每步额外延迟 ms，`0` = 自动 |\n| `mobile` | `false` | `true` = 整个流程（含 OAuth）使用手机指纹 |\n| `max_concurrent` | `2` | 最大并发浏览器数量 |\n| `mail_provider` | `gptmail` | 见下方[邮件服务说明](#邮件服务说明) |\n| `proxy_strategy` | `none` | `pool` \\| `static` \\| `none` |\n| `proxy_static` | `\"\"` | 固定代理 URL |\n| `oauth.enabled` | `true` | 注册后自动换取 Codex Token |\n| `mouse.human_simulation` | `true` | `false` 时关键按钮退回直接点击，不走人工轨迹 |\n\n如果你是通过 WebUI 使用本项目，可以把 SQLite `settings` 直接视为唯一配置源。\n\n---\n\n## 邮件服务说明\n\n### API 类（临时邮箱）\n\n| 服务 | `mail_provider` 值 | 获取 Key |\n|------|--------------------|---------|\n| **GPTMail** | `gptmail` | 公共 Key `gpt-test` 可免费使用，有频率限制；大批量请申请付费 Key |\n| **NPCmail** | `npcmail` | 注册 [dash.xphdfs.me](https://dash.xphdfs.me) 获取 |\n| **YYDS Mail** | `yydsmail` | 注册 [maliapi.215.im](https://maliapi.215.im/v1) 获取 |\n\n### IMAP（自有真实邮箱）\n\n使用自己的 Gmail / QQ 邮箱直接收取验证码，无需第三方 API Key。\n\n**启用方法：**\n\n- 在 WebUI 中将 `general.mail_provider` 设为 `imap` / `imap:0` / `imap:1`\n- 在 `mail.imap` section 中配置账号列表，结构示例：\n\n```json\n[\n  {\n    \"email\": \"yourname@gmail.com\",\n    \"password\": \"abcd efgh ijkl mnop\",\n    \"host\": \"imap.gmail.com\",\n    \"port\": 993,\n    \"ssl\": true,\n    \"folder\": \"INBOX\"\n  },\n  {\n    \"email\": \"123456@qq.com\",\n    \"password\": \"xxxxxxxxxxxxxx\",\n    \"host\": \"imap.qq.com\",\n    \"port\": 993,\n    \"ssl\": true,\n    \"folder\": \"INBOX\"\n  }\n]\n```\n\n**别名模式（`+alias` 子地址）：**\n\n`qq.com` 和 `gmail.com` 域名**自动启用**：每次注册生成独立别名地址（如 `yourname+a3k9xm2b@gmail.com`），验证码仍投递到原收件箱，`poll_code()` 通过 `To:` 头部过滤，多并发任务互不干扰。\n\n其他域名如需别名模式，在账户配置中加 `use_alias: true`。\n\n**前置步骤：**\n\n| 邮箱 | 步骤 |\n|------|------|\n| Gmail | 账户安全 → 应用专用密码（生成 16 位密码）；Gmail 设置 → IMAP → 启用 |\n| QQ 邮箱 | 设置 → 账户 → IMAP/SMTP 服务 → 开启，获取授权码 |\n\n### Outlook / Hotmail（Microsoft OAuth2）\n\n使用 Outlook、Hotmail 或 Live 邮箱通过 Microsoft Graph API 或 IMAP XOAUTH2 收取验证码。需要在 Azure AD 注册一个应用，并预先完成 OAuth2 设备码授权流程获得 `refresh_token`。\n\n#### 前置步骤：在 Azure AD 注册应用\n\n1. 登录 [Azure 门户](https://portal.azure.com) → **Microsoft Entra ID（Azure AD）** → **应用注册** → **新注册**。\n2. **受支持的账户类型** 选 _个人 Microsoft 账户（仅 outlook.com / hotmail.com）_，填入任意名称。\n3. **重定向 URI** 选 _公共客户端/本机_ → 填入：\n   ```\n   https://login.microsoftonline.com/common/oauth2/nativeclient\n   ```\n4. 注册完成后，在 **概览** 页面复制 **应用程序（客户端）ID**（即 `client_id`）。\n5. 进入 **API 权限** → **添加权限** → **Microsoft Graph** → **委托权限**，添加：\n   - `Mail.Read`（Graph 收信模式，推荐）\n   - `offline_access`（允许刷新 Token）\n   - 若使用 IMAP 模式，改为添加 `IMAP.AccessAsUser.All` + `offline_access`\n6. 进入 **身份验证** → 底部勾选 **允许公共客户端流**（_Enable the following mobile and desktop flows_）。\n\n#### 获取 refresh_token（一次性操作）\n\n**推荐方法：设备码流**\n\n```powershell\n# Graph 模式（推荐）\n$clientId = \"你的 client_id\"\n$scope    = \"https://graph.microsoft.com/Mail.Read offline_access\"\n\n# 1. 发起设备码请求\n$resp = Invoke-RestMethod -Method Post `\n  -Uri \"https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode\" `\n  -Body @{ client_id=$clientId; scope=$scope }\n\n# 2. 按提示在浏览器中打开链接并登录\nWrite-Host $resp.message\n\n# 3. 轮询获取 Token（登录完成后执行）\n$token = Invoke-RestMethod -Method Post `\n  -Uri \"https://login.microsoftonline.com/consumers/oauth2/v2.0/token\" `\n  -Body @{\n    client_id=$clientId; grant_type=\"urn:ietf:params:oauth:grant-type:device_code\"\n    device_code=$resp.device_code\n  }\n\nWrite-Host \"refresh_token:\" $token.refresh_token\n```\n\n\u003e 也可以使用 [msal-python](https://github.com/AzureAD/microsoft-authentication-library-for-python) 等工具完成设备码流程，或在 Web UI 中通过 **Settings → Outlook/Hotmail → 添加账户** 界面完成。\n\n#### 配置 Outlook 账户\n\n- 在 WebUI 中将 `general.mail_provider` 设为 `outlook` / `outlook:0` / `outlook:1`\n- 在 `mail.outlook` section 中配置账号列表，结构示例：\n\n```json\n[\n  {\n    \"email\": \"yourname@outlook.com\",\n    \"client_id\": \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n    \"tenant_id\": \"consumers\",\n    \"refresh_token\": \"0.AXXXXXXXXXXXXX...\",\n    \"fetch_method\": \"graph\"\n  }\n]\n```\n\n\u003e `fetch_method` 说明：\n\u003e - `graph`（默认）：通过 Microsoft Graph REST API 收信，**无需开启 IMAP**，推荐使用。\n\u003e - `imap`：通过 IMAP XOAUTH2 收信，需在 Azure 权限中添加 `IMAP.AccessAsUser.All`。\n\n#### CLI 启动注册\n\n```powershell\n# 切换邮件服务为 outlook 并注册 3 个账号\nuv run python -m src.main config set mail_provider outlook\nuv run python -m src.main register --count 3\n\n# 或者直接用 --provider 参数（不改当前 DB 配置）\nuv run python -m src.main register --count 3 --provider outlook\n\n# 固定使用第 0 个 Outlook 账户注册\nuv run python -m src.main register --count 5 --provider outlook:0\n\n# 搭配代理注册\nuv run python -m src.main register --count 3 --provider outlook --proxy \"http://user:pass@host:port\"\n\n# 有头调试模式（可在浏览器窗口观察注册过程）\nuv run python -m src.main register --count 1 --provider outlook --headed\n```\n\n**注意事项：**\n- Outlook 账号直接用于注册（邮箱地址即被注册的 ChatGPT 账号），不支持 `+alias` 别名模式；多账户并发时每个浏览器任务使用不同的 Outlook 账号。\n- `access_token` 由程序自动管理（约 1 小时有效期），无需手动填写；`refresh_token` 长期有效，只要不撤销授权即可一直使用。\n- 若报错 `No refresh_token configured`，说明该账户的 `refresh_token` 为空，需重新完成设备码授权流程。\n\n---\n\n## CLI 命令\n\n### 注册账号\n\n```powershell\n# 注册 5 个账号\nuv run python -m src.main register --count 5\n\n# 指定引擎和邮件服务（覆盖当前 DB 配置）\nuv run python -m src.main register --count 3 --engine camoufox --provider imap:0\n\n# 覆盖并发数\nuv run python -m src.main register --count 10 --concurrency 4\n\n# 临时指定代理（优先级最高）\nuv run python -m src.main register --count 3 --proxy \"http://user:pass@host:port\"\n\n# 有头模式调试（可在浏览器窗口实时观察）\nuv run python -m src.main register --count 1 --headed\n```\n\n### 查看账号\n\n```powershell\n# 列出全部账号\nuv run python -m src.main list-accounts\n\n# 按状态筛选\nuv run python -m src.main list-accounts --status 注册完成\n```\n\n### 导出账号\n\n```powershell\nuv run python -m src.main export --format json --output accounts.json\nuv run python -m src.main export --format csv  --output accounts.csv\n```\n\n### 导入账号\n\n```powershell\nuv run python -m src.main import-accounts accounts.json\nuv run python -m src.main import-accounts accounts.txt   # email:password 格式\n```\n\n### 管理代理\n\n```powershell\n# 从文件导入代理（默认 proxies.txt）\nuv run python -m src.main import-proxies\nuv run python -m src.main import-proxies my_proxies.txt\n\n# 启用代理池\nuv run python -m src.main config set proxy_strategy pool\n\n# 固定代理\nuv run python -m src.main config set proxy_static \"http://user:pass@host:port\"\nuv run python -m src.main config set proxy_strategy static\n\n# 关闭代理\nuv run python -m src.main config set proxy_strategy none\n```\n\n\u003e **代理优先级**：`--proxy` CLI 参数 \u003e `proxy_strategy=static` \u003e `proxy_strategy=pool` \u003e `none`\n\n### 配置管理\n\n```powershell\n# 查看全部运行时配置（SQLite）\nuv run python -m src.main config show\n\n# 读取单项\nuv run python -m src.main config get engine\n\n# 修改（自动推断 int / float / bool 类型）\nuv run python -m src.main config set engine camoufox\nuv run python -m src.main config set max_concurrent 4\nuv run python -m src.main config set mail_provider imap\nuv run python -m src.main config set headless false\nuv run python -m src.main config set mobile true\nuv run python -m src.main config set timeouts.otp_code 240\n```\n\n### WebUI\n\n```powershell\nuv run python -m src.main webui\n```\n\n默认地址：`http://localhost:7860`\n\nWebUI 启动后会：\n\n- 初始化数据库\n- 通过 FastAPI 提供配置、任务、账号、代理等接口\n- 使用 `webui_frontend/` 构建后的前端页面\n\n### 数据库\n\n```powershell\nuv run python -m src.main db init\n```\n\n---\n\n## 代理文件格式\n\n`proxies.txt` 每行一个代理：\n\n```\nhttp://host:port\nhttp://user:pass@host:port\nsocks5://user:pass@host:port\n```\n\n---\n\n## 项目结构\n\n```\ncodex-register-v3-single/\n├── proxies.txt          # 代理列表\n├── accounts.db          # SQLite 数据库\n├── register.log         # 调试日志（10 MB 自动轮转，保留 7 天）\n├── pyproject.toml\n├── plan/                # 只读参考资料，不要修改\n│   ├── oauth.har        # 实录 OAuth 流程 HAR 包\n│   └── browser/\n│       └── tool.js      # 原始 JS 用户脚本（注册状态机逆向来源）\n├── src/\n│   ├── main.py          # CLI 入口（typer）\n│   ├── config.py        # SQLite 兼容层（保留 load/get/set_key 旧接口）\n│   ├── settings_db.py   # WebUI/运行时配置的 SQLite 存储层\n│   ├── db.py            # SQLite schema 初始化\n│   ├── accounts.py      # 账号 CRUD / 导入导出\n│   ├── proxy_pool.py    # 代理池（轮询 + 失败计数自动禁用）\n│   ├── browser/\n│   │   ├── engine.py    # 浏览器工厂（playwright / camoufox，含手机指纹）\n│   │   ├── helpers.py   # DOM 工具（React input 填充、人工鼠标移动等）\n│   │   ├── register.py  # 7 步注册状态机\n│   │   └── oauth.py     # Codex PKCE OAuth2 Token 换取（含 OTP 重试 / callback URL 补抓取）\n│   ├── webui/\n│   │   └── server.py    # FastAPI WebUI 后端\n│   └── mail/\n│       ├── base.py      # 抽象基类 MailClient\n│       ├── gptmail.py   # GPTMail 客户端\n│       ├── npcmail.py   # NPCmail 客户端\n│       ├── yydsmail.py  # YYDS Mail 客户端\n│       ├── imap.py      # 通用 IMAP 客户端（含多账户/别名）\n│       └── outlook.py   # Outlook / Hotmail 客户端\n└── webui_frontend/\n    ├── package.json     # React + Vite 前端\n    └── src/\n```\n\n---\n\n## 开发与调试\n\n```powershell\n# 测试浏览器引擎（访问 chatgpt.com 并截图）\nuv run python -m src.browser.engine playwright\nuv run python -m src.browser.engine camoufox --headed\n\n# 注册状态机空跑（不启动浏览器，仅打印 7 步日志）\nuv run python -m src.browser.register\n\n# 测试 IMAP 邮箱连通性（等待 30 s 内是否能收到验证码）\nuv run python -m src.mail.imap\n\n# 测试其他邮件服务\nuv run python -m src.mail.gptmail YOUR_API_KEY\n```\n\n---\n\n## 超时配置参考\n\n所有超时单位为**秒**，保存在 SQLite `settings.timeouts` section：\n\n| 键 | 默认值 | 阶段 |\n|----|--------|------|\n| `page_load` | 30 | `page.goto()` 导航超时 |\n| `auth0_redirect` | 8 | 等待跳转到 auth.openai.com |\n| `email_input` | 15 | 等待邮箱输入框出现 |\n| `password_input` | 60 | 等待密码输入框出现 |\n| `otp_input` | 60 | 等待 OTP 输入框出现 |\n| `otp_code` | 180 | 轮询邮箱获取验证码的最长时间 |\n| `profile_detect` | 15 | 等待姓名输入框出现 |\n| `profile_field` | 5 | 等待生日/姓名等单个资料字段 |\n| `complete_redirect` | 20 | 等待跳回 chatgpt.com |\n| `oauth_navigate` | 20 | OAuth authorize 导航超时 |\n| `oauth_flow_element` | 8 | OAuth 中间页按钮等待 |\n| `oauth_login_email` | 8 | OAuth 登录页邮箱框等待 |\n| `oauth_login_password` | 10 | OAuth 登录页密码框等待 |\n| `oauth_token_exchange` | 30 | `/oauth/token` HTTP 请求超时 |\n| `oauth_total` | 45 | Codex OAuth 全流程硬超时 |\n\n使用慢速代理时建议将 `page_load` 调大至 60：\n\n```powershell\nuv run python -m src.main config set timeouts.page_load 60\nuv run python -m src.main config set timeouts.otp_code 240\n```\n\n---\n\n## 依赖项\n\n| 包 | 用途 |\n|----|------|\n| `playwright` | Chromium 浏览器自动化 |\n| `camoufox[geoip]` | Firefox 指纹混淆引擎 |\n| `httpx` | 异步 HTTP 客户端（邮件 API / OAuth） |\n| `aioimaplib` | 异步 IMAP 客户端 |\n| `aiosqlite` | 异步 SQLite |\n| `loguru` | 结构化日志 |\n| `typer` | CLI 框架 |\n| `rich` | 终端美化输出 |\n\n---\n\n## 注意事项\n\n- 本工具仅供学习研究使用，请遵守 ChatGPT 服务条款。\n- 建议搭配质量稳定的代理使用，避免 IP 被封禁。\n- Gmail / QQ 邮箱的 IMAP 密码须使用**应用专用密码**（授权码），而非登录密码。\n- 日志文件 `register.log` 超过 10 MB 自动轮转，保留 7 天。\n- 注册密码由程序自动生成（16 位，含大写+小写+数字+特殊字符），写入数据库。\n- 调试时设置 `headless: false` 可在浏览器窗口中实时观察每一步操作。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnlimiter%2Fcodex-manager-v3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcnlimiter%2Fcodex-manager-v3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnlimiter%2Fcodex-manager-v3/lists"}