安全与风控
需要批量自动化 OpenAI OAuth…
适用于用 Chrome 扩展自动化 OpenAI OAuth 注册与登录,从指定邮箱获取验证码,并完成 CPA 回调验证和多轮批量执行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要批量自动化 OpenAI OAuth特定
解决思路
- 克隆仓库:`git clone https://github.com/QLHazyCoder/codex-oauth-automation-extension.git`,然后 `cd codex-oauth-automation-extension`。
- 在 Chrome 打开 `chrome://extensions/`,启用右上角 Developer mode,点击 Load unpacked,选择项目目录。
- 从 Chrome 工具栏打开 side panel,在侧边栏配置并运行。
- 按文件定位逻辑:`background.js` 主编排步骤 1-9、标签页管理与状态;`manifest.json` 扩展清单;`data/names.js` 随机姓名/生日;`content/utils.js` 共享等待元素、点击、停止控制;`content/vps-panel.js` CPA 面板 Step 1/9;`content/signup-page.js` OpenAI 注册/登录 Step 2/3/5/6/8;`content/duck-mail.js` 生成 DuckDuckGo @duck.com 地址;`content/qq-mail.js` QQ 邮箱 OTP 轮询;`content/mail-163.js` 163 邮箱 OTP 轮询;`content/inbucket-mail.js` Inbucket 邮箱 OTP 轮询;`sidepanel/` 侧边栏 UI。
- 在 side panel 配置 `CPA` 为 OAuth 管理面板 URL,例如 `https://your-host/management.html#/oauth`。
- 配置 `Mail` 为验证码来源:`163 Mail`、`QQ Mail` 或 `Inbucket`。
- 配置 `Email` 为注册邮箱;可点击 Email 旁 Auto 使用 @duck.com 地址。
- 配置 `Password` 自定义密码;留空则自动生成强密码,实际使用密码会写回侧边栏。
- 当 `Mail=Inbucket` 时配置 `Inbucket` 主机,例如 `your-inbucket-host`。
- 当 `Mail=Inbucket` 时配置 `Mailbox` 邮箱名,例如 `tmp-mailbox`。
- 使用 `chrome.storage.session` 保存运行状态(步骤、OAuth 链接、email、password、callback URL、标签页信息),浏览器关闭即清除。
- 使用 `chrome.storage.local` 保存持久配置(CPA URL、password、mail service、Inbucket 设置),浏览器重启后保留。
- Step 1:打开 CPA 面板,找到 `Codex OAuth` 卡片,点击登录,提取授权 URL,并保存到 `OAuth` 字段。
- Step 2:打开 OAuth 授权链接,定位并点击 `Sign up / Register / 创建账户` 按钮。
- Step 3:填写注册表单的 email 和 password;如果 password 为空则自动生成强密码,并将实际密码写回侧边栏。
- Step 4:轮询已配置邮箱获取 6 位 OTP;遇到 `Operation timed out` 错误时自动点击 retry。匹配规则:发件人包含 `openai`、`noreply`、`verify`、`auth`、`duckduckgo`、`forward`;主题包含 `verify`、`verification`、`code`、`验证`、`confirm`。
- Step 5:生成随机姓名和生日;处理两种页面变体:生日模式填写年/月/日;年龄模式直接填写 `input[name='age']`。
- Step 6:重新获取最新 CPA OAuth 链接,然后用新注册账号登录。
- Step 7:与 Step 4 相同获取登录 OTP,但使用登录专用关键词匹配。
- Step 8:手动 OAuth 确认自动尝试:定位 OAuth 同意页的 `Continue/Authorize` 按钮;使用 Chrome `debugger` API 派发输入事件点击;监听 `chrome.webNavigation.onBeforeNavigate` 等待 localhost 回调;只接受 `http(s)://localhost:<port>/auth/callback?code=...&state=...`;超时 120 秒。
- Step 9:CPA 验证:校验 callback URL 同时包含 `code` 和 `state` 参数;将 callback 提交到 CPA 面板;等待精确的 `认证成功!` 状态徽章;关闭残留的 `http://localhost:1455/auth*` 标签页。
- 点击侧边栏 `Auto` 按顺序运行全部 9 步,执行 N 轮(由数字输入设定)。
- Auto 流程:`Step 1 → Step 2 → [Duck email auto-fetch, retry up to 5x]`;若 Duck 失败则暂停并等待手动输入 email 后继续;然后 `Step 3 → Step 4 → Step 5 → Step 6 → Step 7 → Step 8 → Step 9`;再重复 N 轮。
- Auto 暂停后重新打开侧边栏时,选择 `重新开始` 重置进度并从 Step 1 开始新一轮;或选择 `继续当前` 将已完成/跳过步骤视为完成,并从第一个未处理步骤恢复。
- 等待元素时使用 `waitForElement(selector, timeout = 30000)`,循环检查 `chrome.storage.session` 中的 `stopFlow`;若为真抛出 `STOPPED`;每 500ms 查找 `document.querySelector(selector)`;超时抛出 `Timeout waiting for: ${selector}`。
- 读写运行状态:用 `await chrome.storage.session.set({ oauthLink: extractedUrl })` 保存 OAuth 链接;用 `await chrome.storage.session.get(['currentEmail','currentPassword'])` 读取邮箱密码;用 `await chrome.storage.session.set({ stepStatus: { ...existingStatus, step3: 'done' } })` 更新步骤状态。
- 后台到内容脚本通信:用 `chrome.tabs.query({ url: '*://chat.openai.com/*' })` 查标签页,再 `chrome.tabs.sendMessage(tab.id, { action: 'FILL_EMAIL', email: 'user@duck.com', password: 'GeneratedPass1!' })`。
- Inbucket 轮询:只处理 `.message-list-entry.unseen` 未读消息;从第 2 次轮询起点击 `[data-action="refresh"]` 并等待 1000ms;读取后删除邮件避免重复匹配。
- 使用 Chrome debugger 点击:`await chrome.debugger.attach({ tabId }, '1.3')`;用 `Input.dispatchMouseEvent` 发送 `mousePressed` 和 `mouseReleased`,坐标为按钮边界 `x,y`,`button: 'left'`,`clickCount: 1`;完成后 `await chrome.debugger.detach({ tabId })`。
- OAuth 回调监听:在 `chrome.webNavigation.onBeforeNavigate` 中仅处理 `details.frameId === 0` 且 `details.tabId === authTabId`;严格匹配 `/^https?:\/\/localhost:\d+\/auth\/callback\?/`;解析 URL,确认 `code` 和 `state` 都存在;保存到 `chrome.storage.session` 的 `callbackUrl`。
- 停止信号:从侧边栏 `await chrome.runtime.sendMessage({ action: 'STOP_FLOW' })`;background 设置 `await chrome.storage.session.set({ stopFlow: true })`,并向所有标签页发送 `{ action: 'STOP_FLOW' }`。
- DuckDuckGo 邮箱自动获取:`content/duck-mail.js` 打开 `https://duckduckgo.com/email/settings/autofill`;查找已有 private address 或点击 `[data-testid="generate-address"]` 生成;等待 `.address-display`;读取 `document.querySelector('.address-display').textContent.trim()` 得到新地址。
- 持久配置保存:`await chrome.storage.local.set({ cpaUrl: 'https://your-host/management.html#/oauth', mailService: 'Inbucket', inbucketHost: 'your-inbucket-host', inbucketMailbox: 'tmp-mailbox', customPassword: '' })`。
- 持久配置加载:`await chrome.storage.local.get(['cpaUrl','mailService','inbucketHost','inbucketMailbox','customPassword'])`。
- Step 8 超时 120s 时:检查 OAuth 同意页结构是否变化;手动点击 `Continue` 按钮并观察重定向 URL;检查 `content/signup-page.js` 中按钮选择器。
- Step 4/7 OTP 未到达时:运行前确认邮件服务标签页已打开并登录;Inbucket 确认 `https://<host>/m/<mailbox>/` 可访问;检查发件人/主题过滤器;QQ/163 确认 webmail 标签页是正确账号。
- Duck 邮箱自动获取失败(重试 5 次后暂停)时:确认 DuckDuckGo 扩展已安装并登录;autofill 设置页 URL 可能已变化;改用侧边栏手动输入邮箱。
- CPA 面板未检测到(Step 1/9)时:确认 CPA URL 匹配 `management.html#/oauth` 路径结构;`content/vps-panel.js` 选择器硬编码特定面板布局;手动运行 Step 1 查看 console 错误。
- 注册时 `Operation timed out`(Step 4):脚本会自动点击 retry 并重新提交;若循环,可能 OpenAI 注册端点限流 IP。
- 标签页清理问题:旧 localhost 标签页可能积累,Step 9 只清理 `http://localhost:1455/auth*`;若 CPA 使用不同端口,更新 `background.js` 中的清理过滤器。
- 推荐工作流:先配置侧边栏(CPA URL、Mail service、credentials);手动运行 Step 1 验证 OAuth 链接出现;手动运行 Step 2-4 确认 email + OTP 流程;成功后启用 Auto 且 N=5 做测试批次;稳定后扩大轮数。
- 启用 Auto 前始终先测试单步流程;最脆弱步骤是 Step 8(OAuth consent click)和 Step 4/7(OTP timing);自动化运行中用 Inbucket 获得最可靠 OTP 投递。
适用边界 · 注意事项
- 没有 CPA OAuth 管理面板或不能用 Chrome 加载该扩展时,不适合使用。
- 无法访问或登录 DuckDuckGo、QQ Mail、163 Mail、Inbucket 等验证码来源时,不适合使用。
- OpenAI 页面结构、CPA 面板选择器或 localhost 回调端口已变化且脚本未同步维护时,不应直接启用 Auto 批量运行。