# codexzc **Repository Path**: ljlao/codexzc ## Basic Information - **Project Name**: codexzc - **Description**: codex注册 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2026-05-26 - **Last Updated**: 2026-07-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Codex Registrar Lite - 批量注册工具 > 「账号热重载」与「React 16+ Bypass 状态同步」自动化跑批引擎。 --- ## 核心设计 ### 1. 标准的零停机动态热加载 (Dynamic Cache Eviction) * **解决痛点**:传统的 `nodemon` 遇到脚本修改就简单粗暴地杀掉整个 Node 进程。这会导致正在执行接码、滑块校验或表单提交的浏览器 Session 被强制中断,损坏当前跑批数据,甚至带来接码资金损耗。 * **设计实现**:主程序在每次拉起账号的单次大循环入口,自动执行动态清除 V8 内存模块缓存: ```javascript delete require.cache[require.resolve('./src/browserService')]; delete require.cache[require.resolve('./src/oauthService')]; ``` 实现了**“旧浏览器窗口安全平滑走完生命周期,新拉起账号快速应用最新规则”**的热升级,无需重启主 Node 进程。 --- ### 2. React 16+ Value Tracker Bypass 状态同步 * **解决痛点**:ChatGPT 注册表单使用 React 16+ 构建。在手动向 `HTMLInputElement.value` 写入字符后,React 内部的 `_valueTracker` 会拦截到旧状态而吞掉后续派发的原生 `input` / `change` 事件,导致密码强度指示器未响应、Continue 按钮置灰置盲卡死。 * **设计实现**:通过底层原生 prototype 赋值后,强制抹除 `_valueTracker` 内部的旧值记录,再重新派发冒泡的 `input` 与 `change` 事件: ```javascript const nativeSetter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set; nativeSetter.call(inputElement, value); const tracker = inputElement._valueTracker; if (tracker) { tracker.setValue(''); // 抹除历史值记录,欺骗 React } inputElement.dispatchEvent(new Event('input', { bubbles: true })); ``` 绕过 React 状态跟踪拦截,100% 根除密码强度检测与注册表单的无法点击的问题。 --- ### 3. 渐进式弹性自愈重试与页面刷新 (Resilient Retry & Reload) * **解决痛点**:OpenAI 页面有时由于 Cloudflare 瞬时同步延迟或接口响应微小的 504 抖动,会在页面渲染出 "Try again" 报错页面或按钮。如果采取激进的直接熔断,会大面积“误杀”原本可以通过简单重试就成功注册的账号。 * **设计实现**:引入三级弹性救灾与刷新自愈模型: * **第一波自愈**:自动检测捕获并**模拟点击 "Try again" / "重试" 按钮**,并配合 Cloudflare 瞬时重新校验。 * **第二波自愈**:若表单锁死,执行 `page.reload()` **强制刷新当前页面**。一旦刷新后 React 重新渲染出姓名与年龄输入框,脚本会快速同步状态并继续推进流程! * **第三波自愈**:只有在历经了 2 轮重试机会后依然完全加载不出任何输入框,脚本才会判定为彻底的 IP 级访问限制,并抛出异常自愈止损。 --- ### 4. 残留的 Chrome 进程清理机制 * **设计实现**:注册过程中将拉起的 Chrome 实体的系统 PID 记录入全局 Set 容器。 * 无论遇到任何系统级 Crash、未捕获异常、期约拒绝(Promise Rejection)或是用户 `Ctrl+C` 退出,都会无条件对该 Pids 执行 `process.kill(pid, 'SIGKILL')` 强制清理。 * 在 Linux 平台下,在退出时会自动通过 `ps -ef` 精准锁定并清理被 1号进程收养的 Chrome 孤儿僵尸进程。 * 每次浏览器关闭后,自动延迟 1 秒删除 Chrome 临时缓存目录(`userDataDir`),彻底防范磁盘爆满和内存堆积。 --- ## 项目架构与目录结构 ```bash codex-registrar-lite/ ├── config.json # 局部代理与接码服务配置文件 ├── index.js # 主控循环(含 0 停机动态模块热加载逻辑) ├── src/ │ ├── browserService.js # 核心 RPA 服务(React 16+ Bypass 及保护机制自愈机制) │ └── oauthService.js # OAuth 授权通道三向状态同步服务 └── test_suite.js # 全部通过自动化 TDD 测试套件 (9/9 Cases Green) ``` --- ## 启动与部署 ### 1. 本地回归测试 在项目根路径直接运行: ```bash node test_suite.js ``` 测试套件会自动运行 9/9 组包含了 React tracker 状态模拟、超时定时器 100% 回收等TDD 测试,全绿方可交付。 ### 2. 双端服务器部署(支持热生效) 已在双端(UK & SGP)服务器部署 50 个实例规模常驻后台跑批: ```bash # 启动常驻跑批命令 (数量可配置为 50) nohup node index.js 50 > register.log 2>&1 [!TIP] > **热加载更新方式**: > 后续若有任何代码变更,**无需重启任何常驻 Node 进程**,直接通过 `scp` 覆盖远程服务器的对应文件(例如 `browserService.js`)。主程序在拉起下一个账号大循环时会自动驱逐并重载最新逻辑! --- ## 401 账号重新登录脚本 (retryLogin.js) > 专门用于处理 `accounts_401.json` 中 token 失效(401)的账号:逐个重新走 Codex OAuth 邮箱登录流程,拿到全新的 access / refresh token,并按需推送到 CPA。 ### 工作原理 脚本复用了主流程里「邮箱登录拿 token」的核心链路(PKCE → `getAuthUrl` → `navigateToOAuth` → `oauthLoginAndAuthorize` → `exchangeTokenAndSave`),区别在于: 1. **输入**:读取当前目录下的 `accounts_401.json`,逐个账号处理。 2. **登录**:用账号自带的 `email / password / birthDate` 重新发起 OAuth,邮箱验证码通过 `mailSession` 复用的邮箱会话轮询获取(无需重新接码)。 3. **保存**:成功拿到新 token 后,写入 `retry/retry--free.json`(token 结构与 `codex-*-free.json` 完全一致)。 4. **回写状态**:处理结果实时写回 `accounts_401.json`: - 成功 → 该账号追加字段 `retryStatus: "success"` + `retryAt` 时间戳 - 失败 → 追加 `retryStatus: "failed"` + `retryError`(错误信息)+ `retryAt` 5. **CPA 推送**:默认把生成的 retry token 推送到 CPA;可用参数关闭。 ### 用法 在项目根目录(`codexzc/`)下运行,脚本通过 `process.cwd()` 定位 `accounts_401.json` 与 `retry/` 目录: ```bash # 默认:重新登录 + 推送 CPA node retryLogin.js # 重新登录但不推 CPA node retryLogin.js --no-cpa # 强制重跑已成功的账号(默认会跳过 retryStatus=success 的) node retryLogin.js --force ``` ### 命令行参数 | 参数 | 作用 | |---|---| | `--no-cpa` | 不推送 token 到 CPA(默认会推) | | `--force` | 强制重新登录所有账号,包括已标记 `retryStatus=success` 的 | ### 产物说明 - **token 文件**:`retry/retry--free.json`,字段与主流程产物一致(`access_token / refresh_token / account_id / email / expired / last_refresh / type` 等)。 - **状态回写**:`accounts_401.json` 中每个账号会新增 `retryStatus`、`retryAt`,失败时额外带 `retryError`。 ### 断点续跑与失败重试 - **断点续跑**:每处理完一个账号立即把 `retryStatus` 写回 `accounts_401.json`,中途 `Ctrl+C` 或崩溃不会丢进度;再次运行会自动跳过已成功的账号。 - **失败重试**:`retryStatus=failed` 的账号**不会**被跳过,下次运行会继续重试,直到成功为止。 - **账号间隔**:每个账号之间默认间隔 60 秒,避免触发风控。 ### 注意事项 - 脚本依赖 `accounts_401.json` 中每个账号带有 `email / password / birthDate / mailSession`(与主流程 `username.json` 同结构),否则会跳过或失败。 - 邮箱渠道(`outlook` / `yyds` / `legacy`)从账号的 `mailSession.provider` 或 `mailProvider` 字段解析,需保证 `config.json` 中对应渠道配置可用。 - 「刷新 token」指**重新登录换取全新的一套 access + refresh token**(401 json 中不存旧 refresh_token,无法走 refresh 接口换新)。 --- ## 外购账号登录脚本 (chongzhiLogin.js) > 专门处理从其他渠道购买、格式为 `email----password` 的账号:通过 `chongzhi.art` 拉邮箱验证码,遇到手机验证时用 HeroSMS 接码,完成 Codex OAuth 后保存 token 并推送 CPA。 ### 输入 - `chongzhi.txt`:每行一个账号,格式: ```text krammerharian0388@outlook.com----wVskYQAD49H ``` ### 流程 1. 读取 `chongzhi.txt` 2. Codex OAuth 邮箱登录(密码) 3. 邮箱 OTP:`POST https://chongzhi.art/api/mailbox/fetch` 4. 若出现手机号输入页:HeroSMS 动态取号并填写 5. 若出现短信验证码页:HeroSMS 轮询验证码 6. 换 token,保存到 `tokens/codex--free.json` 7. 推送到 CPA(`config.json` 的 `cpaBaseUrl` / `cpaManagementKey`) 8. 状态写入 `chongzhi_status.json` ### 用法 ```bash # 默认:只跑第一条账号 + 推送 CPA node chongzhiLogin.js # 显式只跑第一条 node chongzhiLogin.js --first # 跑全部账号 node chongzhiLogin.js --all # 不推 CPA node chongzhiLogin.js --no-cpa # 强制重跑已成功账号 node chongzhiLogin.js --force ``` ### 参数 | 参数 | 作用 | |---|---| | `--first` | 只处理第一条(默认行为) | | `--all` | 处理 `chongzhi.txt` 全部账号 | | `--no-cpa` | 不推送 CPA | | `--force` | 忽略已有 success 状态 / 已有 token,强制重登 | --- ## 重新接码脚本 (reSmsLogin.js) > 处理 `chongxinjiema.txt` 中的 Outlook 账号:通过 `outlookMailBaseUrl` 拉邮箱验证码登录 GPT/Codex,遇到手机验证时用 `config.json` 配置的 HeroSMS 国家取号接码,成功后保存本地 Codex token。 > **默认不推送 CPA**,需要推送时显式加 `--cpa`。 ### 输入 - `chongxinjiema.txt`:每行一个账号,支持两种格式: ```text # 仅邮箱(走邮箱一次性验证码登录) DestineeCorbishley100600@outlook.com # 邮箱 + 密码(有密码页时自动填密码) xxx@outlook.com----YourPassword ``` ### 流程 1. 读取 `chongxinjiema.txt` 2. Codex OAuth 邮箱登录 3. 邮箱 OTP:走 `config.json` 的 `outlookMailBaseUrl` / `outlookMailApiKey` 4. 若出现手机号输入页:按 `heroSmsCountry` 取号(无号则持续重试,不切换国家) 5. 若出现短信验证码页:HeroSMS 轮询验证码(优先 SMS,避开 WhatsApp) 6. 浏览器会话换 token,保存到 `tokens_resms/codex--free.json` 7. 状态写入 `chongxinjiema_status.json` 8. 默认**不推 CPA**;加 `--cpa` 才推送 ### 依赖配置 (`config.json`) | 字段 | 说明 | |---|---| | `outlookMailBaseUrl` | Outlook 邮箱服务地址 | | `outlookMailApiKey` | Outlook 邮箱 API Key | | `heroSmsApiKey` | HeroSMS Key | | `heroSmsService` | 服务码(OpenAI 一般为 `dr`) | | `heroSmsCountry` | 接码国家 ID(脚本严格按此国家取号) | | `cpaBaseUrl` / `cpaManagementKey` | 仅在加 `--cpa` 时使用 | ### 用法 在项目根目录(`codexzc/`)下运行: ```bash # 默认:只跑第一条 + 不推 CPA(本地保存) node reSmsLogin.js # 显式只跑第一条 + 不推 CPA node reSmsLogin.js --first # 跑全部账号 + 不推 CPA node reSmsLogin.js --all # 只跑第一条 + 推送 CPA node reSmsLogin.js --first --cpa # 跑全部账号 + 推送 CPA node reSmsLogin.js --all --cpa # 强制重跑已成功账号(默认会跳过 success / 已有 token) node reSmsLogin.js --all --force # 强制重跑全部 + 推送 CPA node reSmsLogin.js --all --force --cpa ``` ### 参数 | 参数 | 作用 | |---|---| | `--first` | 只处理第一条(**默认行为**,可不写) | | `--all` | 处理 `chongxinjiema.txt` 全部账号 | | (默认) | **不推送 CPA**,只保存本地 `tokens_resms/` | | `--cpa` | 成功后推送 token 到 CPA | | `--force` | 忽略已有 success 状态 / 已有 token,强制重登 | ### 产物说明 - **token 文件**:`tokens_resms/codex--free.json` 字段与主流程一致(`access_token / refresh_token / account_id / email / expired / last_refresh / type`) - **状态文件**:`chongxinjiema_status.json` - 成功:`status=success` + `tokenPath` + `phone` - 失败:`status=failed` + `error` ### 断点续跑 - 每处理完一个账号立即写 `chongxinjiema_status.json` - 再次运行会跳过 `status=success` 或已存在 token 的账号 - 失败账号下次会自动重试 - 账号间隔默认 60 秒 ### 注意事项 - 接码国家**只读** `config.heroSmsCountry`,无号时按该国家持续重试,不会自动切国家 - 邮箱必须在 Outlook 邮箱池(`outlookMailBaseUrl`)可拉取 - 测试阶段建议始终不带 `--cpa`,确认 token 无误后再用 `--cpa` 推送