1. Codex 手机号验证卡住时,反向代理能做什么
最近打开 Codex 时突然弹出手机号验证,填完号码又收不到验证码,尤其是英国号码在 GitHub Issue 区被反复讨论。这个问题的本质不是 Codex 本身坏了,而是账号来源和登录环境触发了额外的安全校验。如果你用的是官方渠道正常订阅的 GPT Plus,一般不会遇到这道门槛;但如果你手里有多个来源不一的账号,或者通过非官方渠道拿到的账号,验证弹窗就会频繁出现,甚至直接卡死无法继续。
这时候单靠换号解决不了根本问题,因为每个账号都可能被单独验证。更稳的思路是把请求先收拢到一个反向代理层,由代理层统一管理多个账号、做流量分发和轮询,Codex 客户端只认一个固定的 API 地址。这样即使某个账号被要求验证,代理层可以自动切到下一个可用账号,前端几乎无感。
Sub2API 负责的就是这个反向代理和流量分发,CCSwitch 负责在多个 Provider 之间一键切换调用目标。两者配合,你可以把多个 Codex 兼容账号挂到 Sub2API 后面,再用 CCSwitch 把 Codex 的请求指向 Sub2API 的本地地址。整个链路里,Codex 不再直接暴露账号,验证弹窗的触发概率会明显下降,多账号管理也从手工切换变成自动轮询。
这篇文章面向的是已经有一定 Codex 使用经验、手里有多个账号或 API Key、想用反向代理解决验证和分发问题的开发者。下面会给出 Sub2API 和 CCSwitch 的可复制配置骨架,以及用 TaoToken 统一 Key 接入的方式,最后附上验证多账号轮询是否生效的具体操作。
2. 前置准备:Sub2API、CCSwitch 与 TaoToken 通道
在动手之前,先把三个角色的定位理清楚。Sub2API 是反向代理和流量分发的核心,它接收 Codex 发来的请求,然后按你配置的账号池轮流转发。CCSwitch 是 Provider 切换工具,它不直接处理流量,而是帮你把 Codex 或 Codex 插件的 API 地址改到 Sub2API 的监听端口上。TaoToken 在这里扮演统一 Key 和 API 通道的角色,你可以把它理解为一个稳定的上游入口,避免每个账号都去直连原始地址。
TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。注意 API 地址后面不加 UTM 参数,直接用于配置里的 base_url。如果你还没有 Key,可以先到 API Keys 页面创建一个,后面 Sub2API 的 Provider 配置会用到。
环境方面,Sub2API 推荐用 Docker Compose 部署,前置条件是 Docker 20.10+ 和 Docker Compose v2+。CCSwitch 直接下载对应平台的安装包即可,Windows、macOS、Linux 都有 release。Codex 这边你至少需要准备两个以上的可用账号或 API Key,否则多账号轮询没有意义。账号可以是 GPT Plus 订阅账号,也可以是 Codex 兼容的 API Key,但要注意账号来源的合规性,非官方渠道的账号本身就可能触发验证,代理层只能缓解不能根治。
部署 Sub2API 时,你可以选择云服务器部署给团队共用,也可以本地部署只给自己用。本地部署的问题更少,因为不涉及公网暴露和额外的网络策略。下面以本地 Docker Compose 部署为例,给出完整的命令和配置骨架。
3. 可复制配置:Sub2API 部署与 CCSwitch 接入
先创建部署目录并拉取部署脚本。Sub2API 的官方仓库提供了自动化部署脚本,执行以下命令:
mkdir -p sub2api-deploy && cd sub2api-deploy curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh | bash docker compose up -d docker compose logs -f sub2api脚本会生成 docker-compose.yml,里面包含 Sub2API 主服务、PostgreSQL 和 Redis 三个容器。启动后查看日志,确认服务监听端口,默认一般是 8080 或 3000,具体以日志输出为准。首次启动后需要初始化管理员账号,你可以通过日志里的提示或直接查数据库拿到初始密码,登录后台后第一件事是修改密码。
登录 Sub2API 后台后,按以下顺序配置。第一步创建分组,分组的作用是把不同来源的账号隔离开,比如你可以建一个 codex-plus 分组放 GPT Plus 账号,再建一个 codex-api 分组放 API Key 账号。第二步导入账号,Sub2API 支持上传 JSON 文件批量导入。如果你用的是 GPT 账号,需要先登录 ChatGPT 获取 session,访问 https://chatgpt.com/api/auth/session ,把返回的 JSON 内容全选复制,存成 json 文件后上传到 Sub2API。导入完成后把账号分配到对应分组。
第三步创建密钥。在 Sub2API 后台的密钥管理里新建一个 Key,这个 Key 是给 CCSwitch 或 Codex 客户端用的,不是上游账号的 Key。创建后保存好,后面配置里会用到。
接下来配置 CCSwitch。打开 CCSwitch,新建一个 Provider,类型选择 OpenAI 兼容或自定义,base_url 填 Sub2API 的本地地址,比如 http://127.0.0.1:8080/v1 ,API Key 填刚才在 Sub2API 创建的密钥。注意这里不要填 localhost,因为部分客户端无法识别 localhost,统一用 127.0.0.1。保存后点击测速,如果测速通过,说明反向代理链路已经通了。
如果你希望上游走 TaoToken 的统一通道,可以在 Sub2API 的 Provider 配置里把上游地址设为 https://taotoken.net/api ,Key 用 TaoToken 的 API Key。这样 Sub2API 负责多账号分发,TaoToken 负责提供稳定的上游入口,两层配合可以进一步降低单个账号被验证的概率。TaoToken 的模型对话入口在 https://taotoken.net/api ,Coding Plan 适合长期编码场景,具体可以在官网看对应说明。
4. 验证多账号轮询与请求结果
配置完成后,不要急着在 Codex 里直接写代码,先用 curl 验证 Sub2API 的轮询是否生效。执行以下命令,把 base_url 和 Key 替换成你自己的:
curl -X POST http://127.0.0.1:8080/v1/chat/completions \ -H "Authorization: Bearer 你的Sub2API密钥" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 10 }'如果返回正常的 JSON 响应,说明 Sub2API 已经能把请求转发到上游账号。接下来验证轮询,连续执行多次同样的请求,然后到 Sub2API 后台的请求日志里查看,每次请求命中的账号应该不同。如果始终命中同一个账号,检查分组里是否只导入了一个账号,或者轮询策略是否被设成了固定。
再验证 CCSwitch 的切换是否生效。在 CCSwitch 里把当前 Provider 切到 Sub2API,然后打开 Codex 或 Codex 插件,发一个简单的代码补全请求。如果 Codex 能正常返回结果,说明 CCSwitch 已经把请求指向了 Sub2API。这时候你可以故意在 Sub2API 后台禁用其中一个账号,再发请求,如果 Codex 仍然能正常返回,说明故障转移也生效了。
实测下来,多账号轮询生效后,Codex 的验证弹窗出现频率会明显下降,因为请求不再集中在一个账号上。但要注意,如果所有账号都触发了验证,代理层也无能为力,这时候需要补充新的可用账号。另外,Sub2API 的日志里会记录每个请求的账号、耗时和状态码,排障时优先看这里。
5. 本篇常见错排查
测速不通过,提示连接被拒绝。最常见的原因是 base_url 填了 localhost。CCSwitch 和部分客户端在解析 localhost 时可能走 IPv6 或解析失败,统一改成 127.0.0.1。如果还是不通,检查 Sub2API 容器是否真的在监听对应端口,用docker compose ps看容器状态,用curl http://127.0.0.1:8080/health看健康检查接口。
导入账号后请求仍然报 401。先确认 Sub2API 里创建的密钥有没有复制错,注意前后不要有空格。然后检查账号分组是否正确,导入的账号是否被分配到了你请求时指定的分组。如果用的是 GPT session 导入,session 过期也会导致 401,需要重新登录 ChatGPT 获取新的 session。
Codex 里切换 Provider 后没有生效。CCSwitch 修改配置后,部分客户端需要重启才能读取新配置。先完全退出 Codex 再重新打开。如果还是不行,检查 CCSwitch 是否真的写入了配置文件,可以手动打开 Codex 的配置文件确认 base_url 是否已经变成 Sub2API 的地址。
轮询不生效,始终走同一个账号。检查 Sub2API 的分组策略,有些版本默认是加权轮询,如果某个账号权重特别高会一直命中。把权重调成一致,或者改成严格轮询。另外确认分组里确实有多个账号处于启用状态,被禁用的账号不会参与轮询。
请求超时或响应很慢。先看 Sub2API 日志里上游账号的响应时间,如果某个账号特别慢,把它从分组里临时禁用。如果所有账号都慢,可能是上游通道的问题,这时候可以切到 TaoToken 的统一通道试试,TaoToken 的接入文档里有 base_url 和 Key 的配置说明,按文档改一下 Sub2API 的上游地址即可。
6. 接入方式与后续操作入口
如果你在排障过程中需要重新生成 Key 或查看接入参数,直接到 API Keys 页面操作,接入文档里有完整的 base_url 和请求示例。验证模型是否可用时,可以用模型对话页面发一条测试消息,确认上游通道正常。如果你打算长期用 Codex 做编码或跑 Agent,建议看一下 Coding Plan,它更适合高频调用场景,配合 Sub2API 的多账号分发可以进一步稳住可用性。
整个链路的核心思路是:Codex 只认 CCSwitch,CCSwitch 只认 Sub2API,Sub2API 负责多账号轮询和故障转移,TaoToken 提供统一的上游通道。这样即使某个账号触发手机号验证,也不会直接卡死你的编码流程。配置完成后,记得定期检查 Sub2API 的账号状态,及时补充新账号,保持轮询池的可用性。