[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80957":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":16,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":14,"starSnapshotCount":14,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},80957,"keytoauth","highkay\u002Fkeytoauth","highkay","一个自动icloud取码到登录chatgpt取auth session最后转cpa+sub2api的脚本",null,"Python",37,8,31,0,1,3,6,2.86,false,"main",true,[],"2026-06-12 02:04:09","# ChatGPT Key to Auth Converter\n\n将 `key code` 批量转换为 ChatGPT Web 会话 JSON，输出 `CPA` 和 `Sub2API` 两种格式。\n\n## 前置条件\n\n运行前必须满足以下条件：\n\n1. 安装 Python 3.9+\n2. 安装依赖\n\n```bash\npip install -r requirements.txt\n```\n\n3. 安装 Patchright Chrome\n\n```bash\npatchright install chrome\n```\n\n4. 启动本地 FlareSolverr\n\n默认地址为 `http:\u002F\u002F127.0.0.1:8191\u002Fv1`。程序会在使用浏览器代理时调用它预解 Cloudflare。\n\n5. 如果使用代理\n\n- 代理只作用于浏览器和 FlareSolverr 链路，不作用于邮件接口请求\n- 推荐格式：`http:\u002F\u002F...`、`https:\u002F\u002F...`、`socks4:\u002F\u002F...`、`socks5:\u002F\u002F...`\n- 代理较慢时，可能需要调大 `config.py` 里的 `EMAIL_FORM_STABILIZE_SECONDS` 和 `EMAIL_POST_SUBMIT_TIMEOUT_SECONDS`\n- 邮件接口请求超时由 `MAIL_API_TIMEOUT` 控制\n- 如果 key 取件服务器不是默认地址，可以用 `--mail-server-base-url` 覆盖\n- `--mail-server-base-url` 只影响 `mail-keys` \u002F `mail-code` 两个接口，不影响浏览器代理或 FlareSolverr\n\n6. 如果要启用 CPA 存活邮箱过滤（可选）\n\n- 需要一个可访问的 [CLIProxyAPI](https:\u002F\u002Fgithub.com\u002Frouter-for-me\u002FCLIProxyAPI) 管理接口\n- 需要能访问 `\u002Fv0\u002Fmanagement\u002Fauth-files` 的 Bearer Token\n- 程序会先取回 CPA 里仍可用的邮箱，再和 key 接口返回的邮箱比对，跳过已存在且仍存活的账号\n\n## 使用方法\n\n准备你自己的输入文件，例如 `keys.txt`。仓库只保留脱敏样例 `keys.example.txt`。\n\n### 单个 key\n\n```bash\npython main.py --key \"AAAA-BBBB-CCCC\"\n```\n\n### 批量处理\n\n```bash\npython main.py --input keys.txt\n```\n\n### 覆盖 key 取件服务器地址\n\n```bash\npython main.py --input keys.txt --mail-server-base-url \"https:\u002F\u002Fplus.keria.cc.cd\"\n```\n\n也支持直接传到 `\u002Fapi\u002Fpickup`：\n\n```bash\npython main.py --input keys.txt --mail-server-base-url \"https:\u002F\u002Fplus.keria.cc.cd\u002Fapi\u002Fpickup\"\n```\n\n也可以通过环境变量提供：\n\n```bash\nset MAIL_SERVER_BASE_URL=https:\u002F\u002Fplus.keria.cc.cd\npython main.py --input keys.txt\n```\n\n### 使用浏览器代理\n\n```bash\npython main.py --input keys.txt --proxy \"socks5:\u002F\u002F127.0.0.1:1080\"\n```\n\n### 跳过 CPA 已存活邮箱\n\n```bash\npython main.py --input keys.txt --skip-active-cpa-emails --cpa-management-url \"http:\u002F\u002F127.0.0.1:8317\" --cpa-management-key \"\u003CMANAGEMENT_TOKEN>\"\n```\n\n也可以通过环境变量提供：\n\n```bash\nset CPA_MANAGEMENT_URL=http:\u002F\u002F127.0.0.1:8317\nset CPA_MANAGEMENT_KEY=\u003CMANAGEMENT_TOKEN>\npython main.py --input keys.txt --skip-active-cpa-emails\n```\n\n### 常用参数\n\n```bash\npython main.py [选项]\n\n选项:\n  --key KEY\n  --input FILE\n  --format {cpa,sub2api,both}\n  --headless\n  --proxy PROXY\n  --flaresolverr-url FLARESOLVERR_URL\n  --mail-server-base-url MAIL_SERVER_BASE_URL\n  --skip-active-cpa-emails\n  --cpa-management-url CPA_MANAGEMENT_URL\n  --cpa-management-key CPA_MANAGEMENT_KEY\n```\n\n## 当前已验证流程\n\n程序会按下面的页面状态推进，并在关键节点检查当前页面是否符合预期：\n\n1. `email`\n   填邮箱前会额外等待一段时间，避免代理环境下页面尚未稳定导致空提交\n2. `password`（可选）\n   某些账号会先落到密码页；程序会自动点击“使用一次性验证码登录”\n3. `one_time_code`\n   获取最新验证码并提交\n4. `logged_in`\n   提取 `https:\u002F\u002Fchatgpt.com\u002Fapi\u002Fauth\u002Fsession`\n\n成功后会立即：\n\n1. 导出 session\n2. 写入 `output\u002F`\n3. 关闭浏览器窗口\n\n这属于当前设计，不是异常。\n\n## 输出文件\n\n生成的文件位于 `.\u002Foutput\u002F`：\n\n- `{email_key}_cpa.json`\n- `{email_key}_sub2api.json`\n\n程序默认不会清空整个 `output\u002F` 目录，只会创建目录并覆盖同名账号文件。\n\n这些文件包含真实会话信息，默认不应提交到仓库。\n\n## CPA 过滤规则\n\n启用 `--skip-active-cpa-emails` 后，程序会请求 `CLIProxyAPI` 的管理接口 `\u002Fv0\u002Fmanagement\u002Fauth-files`，读取其中的邮箱，并按下面规则认定为“仍存活”：\n\n- 有有效 `email`\n- `unavailable` 不为 `true`\n- `status` 不属于 `error`、`expired`、`invalid`、`revoked`、`unavailable`\n\n`disabled` 状态不会被额外处理。\n\n## 环境变量\n\n如果不想在命令行里重复输入，可以使用下面几个环境变量：\n\n- `MAIL_SERVER_BASE_URL`\n- `CPA_MANAGEMENT_URL`\n- `CPA_MANAGEMENT_KEY`\n\n## 调试产物\n\n每次运行都会生成：\n\n- `logs\u002Frun-YYYYMMDD-HHMMSS.log`\n- 失败时的 `artifacts\u002F*.png`\n- 失败时的 `artifacts\u002F*.html`\n- 失败时的 `artifacts\u002F*.txt`\n\n建议排障顺序：\n\n1. 先看控制台里的失败摘要\n2. 再看对应的 `logs\u002Frun-*.log`\n3. 如果是页面问题，再打开 `artifacts\u002F` 下的截图和 HTML\n\n## 敏感信息与清理规则\n\n仓库默认忽略以下内容：\n\n- `keys.txt`\n- `output\u002F`\n- `logs\u002F`\n- `artifacts\u002F`\n- `browser_profile\u002F`\n- `browser_profile_probe*\u002F`\n- 调试截图和临时 bundle\n\n如果需要分享仓库，请只保留代码、文档和脱敏样例，不要保留：\n\n- key 输入文件\n- 导出的 session JSON\n- 浏览器 profile\n- 调试截图\n\n## 常见问题\n\n### 1. 看起来登录成功了，但窗口直接关闭\n\n这是正常行为。程序已经提取 session 并写入 `output\u002F`，随后自动关闭浏览器。\n\n### 2. 邮箱页点了“继续”但没有进入下一步\n\n先看日志里的页面状态输出：\n\n- 如果还停在 `email`，通常是代理环境下页面接管较慢\n- 如果跳到 `password`，程序会自动回退到“一次性验证码登录”\n- 如果长时间未到 `one_time_code`，优先调大 `config.py` 中的等待时间\n\n### 3. FlareSolverr 预解失败\n\n- 先确认 `http:\u002F\u002F127.0.0.1:8191\u002F` 返回 `FlareSolverr is ready!`\n- 程序会打印错误并继续尝试原始浏览器流程\n\n### 4. 代理环境很慢\n\n优先调整：\n\n- `EMAIL_FORM_STABILIZE_SECONDS`\n- `EMAIL_POST_SUBMIT_TIMEOUT_SECONDS`\n- `FLARESOLVERR_MAX_TIMEOUT`\n\n### 5. 登录后没有保存文件\n\n检查控制台是否出现：\n\n- `Session extracted successfully`\n- `Saved CPA`\n- `Saved Sub2API`\n\n如果已经看到 `Session extracted successfully`，但最后仍然失败，优先看：\n\n- `output\u002F` 是否可写\n- 运行日志里是否出现 `Failed to save ...`\n- 控制台打印的绝对输出路径是否符合预期\n\n### 6. 需要更详细的错误上下文\n\n现在失败信息会附带：\n\n- 当前阶段的页面状态\n- 失败时保存下来的截图 \u002F HTML \u002F 文本状态文件路径\n- 本次运行的日志文件路径\n\n## 项目结构\n\n```text\nkeytoauth\u002F\n├── api_client.py\n├── browser_automation.py\n├── config.py\n├── keys.example.txt\n├── main.py\n├── README.md\n├── requirements.txt\n├── session_converter.py\n├── test_browser_automation_helpers.py\n└── test_runtime_helpers.py\n```\n\n## 验证命令\n\n```bash\nruff check api_client.py browser_automation.py config.py main.py test_browser_automation_helpers.py test_runtime_helpers.py\npython -m unittest test_browser_automation_helpers.py test_runtime_helpers.py\n```\n\n## 友情链接\n\n- [linux.do](https:\u002F\u002Flinux.do)\n","highkay\u002Fkeytoauth 是一个用于将 iCloud 验证码自动转换为 ChatGPT Web 会话 JSON 的脚本，支持输出 CPA 和 Sub2API 两种格式。该项目使用 Python 编写，依赖于 Patchright Chrome 和 FlareSolverr 来处理浏览器自动化和 Cloudflare 解析。其核心功能包括批量处理 key code、支持多种代理配置以及可选的 CPA 存活邮箱过滤机制，以避免重复处理已存在的有效账号。适用于需要自动化管理多个 ChatGPT 会话或频繁更换登录凭证的场景，如开发者测试环境搭建、多用户管理等。通过简单的命令行参数设置即可启动运行，具有较高的灵活性与实用性。",2,"2026-06-11 04:03:00","CREATED_QUERY"]