返回文章列表

Post

Cockpit 反代教程:JSON 导入 + API 服务配置,账密登录拜拜

13 分钟读完

为什么需要反代

先问一个问题:为什么有人要搞一堆 Codex 账号?

答案很简单——额度不够用。Codex 免费额度有限,Plus 订阅也有每日上限。写代码写到一半被限额真的很扫兴。

于是就有了一个需求:手上有多个账号,怎么让它们轮着用?

最原始的办法:

  1. 浏览器登录账号 A → 用完了 → 退出
  2. 浏览器登录账号 B → 用完了 → 退出
  3. 切来切去,烦死了

反代要解决的,就是这个问题。

反代在这件事里做了什么

「反向代理」这个词放在这个场景下,实际干的事可以拆成三层:

第一层:请求劫持 + Token 注入

Codex CLI 以为自己直接连 OpenAI,实际上请求被本地代理工具截住了。这个工具把 Refresh Token 附加到每个请求上,冒充登录状态。

Codex CLI → 本地反代工具(注入 RT)→ OpenAI API

没有反代的时候,Codex 需要浏览器登录,因为那层认证在浏览器里。有了反代,认证信息直接在代理层注入,浏览器那一步就省了。

第二层:多账号调度

一个账号额度用完 → 自动切到下一个。

                      → 账号 A(额度耗完)
Codex CLI → 反代工具 ─→ 账号 B(工作中)
                      → 账号 C(排队)

这就是「账号池」。你塞几十个账号进去,反代工具帮你做负载均衡。哪个有额度就调哪个,你不用管。

第三层:统一 API 出口

所有账号聚合后暴露一个统一的 API 地址,比如 http://localhost:9090/v1。把 Codex 请求地址改成这个,剩下的交给反代工具。

代理的四种形态

讲清楚上面的事之后,有必要理一下四种代理的区别——不然你去看别的教程很容易被「反代」「正向代理」「透明代理」这些词搞晕。

正向代理(Forward Proxy)

你上不了某网站,找一台能上的服务器帮你去拿。

你的电脑 → 正向代理服务器 → 目标网站

目标网站看到的是代理的 IP,不是你的。你明确知道要去哪,代理帮你跑腿。

反向代理(Reverse Proxy)

反过来——客户端不知道最终请求落到哪台服务器。

客户端 → 反向代理(Nginx/Cockpit)→ 后端 A/B/C

在 Codex 场景里,Cockpit 就是那个反向代理。CLI 以为自己在跟 OpenAI 直接通信,实际上请求被 Cockpit 截住、附加 token、转发出去。背后是哪个账号在工作,CLI 完全不知道。

透明代理(Transparent Proxy)

你在家里上网,网关默默劫持了你的请求,你甚至不知道它的存在。

你的电脑(无感知)→ 网关(透明代理)→ 目标网站

公司上网行为管理、路由器广告过滤都是透明代理。在薅羊毛场景里,透明代理有时被用来批量劫持流量。

SOCKS5 / HTTP 代理

最传统的代理。你手动配一个 IP 和端口,应用通过它发请求。

浏览器/App → SOCKS5 代理(127.0.0.1:7890)→ 目标网站

Telegram 设置代理、浏览器 VPN 插件都是这种。Cockpit 的 API 服务也可以让局域网内机器通过 HTTP 代理方式连过来用你的账号池。

Token 原理:反代到底是怎么过 OpenAI 认证的

很多教程说「有了 refresh_token 就能调 Codex」,这话对了一半。

实际上反代工具做的事比「注入一个 token」复杂得多。它本质上是 OAuth Token 管理器 + 请求头规范化代理,中间经过了好几层处理。

Codex CLI 是怎么认证的

和 ChatGPT 网页版完全不一样。ChatGPT 网页版依赖浏览器 Cookie + session token,而 Codex CLI 走的是 OAuth 2.0 设备码流(Device Authorization Grant)

1. CLI → OpenAI:请求设备码(POST /api/auth/device/code)
2. CLI 打印一个链接给你:去浏览器打开,输入验证码
3. 你在浏览器授权后,CLI 轮询获得 refresh_token
4. CLI 用 refresh_token 换取短期 access_token(POST /api/auth/refresh)
5. access_token 挂了调用 /chat/completions

整个流程不依赖任何 Cookie。这是理解反代的关键前提。

Cockpit 在中间做了什么

当你把 JSON 导入 Cockpit 并启动后,每次请求的实际流程是这样的:

Codex CLI → Cockpit(拦截)
              │
              ├─ 检查缓存的 access_token 是否过期
              │   ├─ 没过期 → 直接用
              │   └─ 过期了 → 用 RT 调 /api/auth/refresh 换新的 AT
              │
              ├─ 替换请求头:
              │   ├─ Authorization: Bearer <新的 access_token>
              │   └─ User-Agent: openai-codex-cli/1.0  ← 关键!
              │
              ├─ (可选)改写请求体
              │   └─ 比如修正 model 名称、补充参数
              │
              └─ 转发到 OpenAI 后端

所以不是「拿到 RT 直接注入」就完事了。Cockpit 干了几件脏活:

1. Token 交换 用户提供的 JSON 里放的是 refresh_token(长期有效),但 OpenAI 的模型推理接口根本不认 refresh_token。Cockpit 需要主动调用 /api/auth/refresh 把它换成 access_token(JWT,有效期约 30 分钟),然后在后续请求的 Authorization 头里带上这个 access_token。

2. 自动续期 access_token 只有 30 分钟寿命。Cockpit 会在收到 401 或者检测到 token 即将过期时,自动用 refresh_token 换新的。用户完全无感。

3. User-Agent 伪造 这是很多人忽略的一点。OpenAI 的 Cloudflare WAF 会检查请求的 User-Agent 头。如果你直接用 curl 或 python-requests 去请求,User-Agent 是 python-requests/2.xcurl/8.x,直接给你 403 拦了。

Cockpit 会自动把 User-Agent 改成 openai-codex-cli/1.0,让后端以为请求来自官方 CLI,放行通过。

4. 请求体适配 有些客户端的请求体格式和 Codex CLI 不一样(比如 model 名称不同),Cockpit 可能会自动做负载重写——修正 model 字段、删除不支持参数、补充 stream 标记等。

总结

你以为是实际是
反代工具拿 RT 直接调 API用 RT 换 AT,再用 AT 调 API
只需要改 Authorization 头还要改 User-Agent、可能改请求体
一次注入搞定每 30 分钟自动续一次
浏览器那套认证OAuth 2.0 设备码流,无 Cookie

所以反代的核心价值不是「注入 token」,而是 把一套复杂的 OAuth 凭证管理 + 反爬对抗逻辑封装成一个本地服务,你只管把请求地址改成 localhost 就行。

为什么不同反代工具的 JSON 格式不一样

用过几个工具的人应该注意到了:Cliproxy2API 的 JSON、sub2api 的 JSON、Cockpit 的 JSON,字段名和结构都不一样。

原因很简单——这些工具是不同的人写的,没有统一标准。

一段最原始的 ChatGPT session JSON 长这样:

{
  "accessToken": "eyJhbGciOi...",
  "refreshToken": "eyJhbGciOi..."
}

但到了各个工具手里,格式就各自为政了:

工具格式特点
Cliproxy2API(CPA)字段名带 cpa_ 前缀,按邮箱分目录,适合 CLI 代理场景
sub2api多层嵌套结构,包含代理链路配置信息,适合路由器/服务器部署
Cockpit扁平结构,数组套对象,一个 token 一行,设计简单直接

打个比方:同一个人去银行、酒店、公司 HR 登记,填的表都不一样。数据是同一份,但每个系统有自己的字段结构。

你从卡密网站买的 JSON 一般是 CPA 或 sub2 的格式。如果你要用 Cockpit,就需要先做格式转换。下面开始实操。

格式转换:JSON 适配

每个反代软件的 JSON 格式都不一样。卡网激活网站下载的一般是 CPA 和 sub2 的格式,所以需要先做一步格式转换。

打开这个在线转换工具: 👉 https://gtxx3600.github.io/GPTSession2CPAandSub2API/

操作步骤:

  1. 点击 Cockpit 标签
  2. 点击「选择文件」,批量导入下载的 JSON 文件
  3. 在上方选择「Cockpit」格式
  4. 点击「下载 JSON」

转换完的 JSON 就可以导入 Cockpit 了。

Cockpit 下载和安装

先去 GitHub 下载 Cockpit Tools: 👉 https://github.com/jlcodes99/cockpit-tools/releases

版本方面我个人推荐 v0.23.9,老版本比较稳。想尝鲜也可以下最新的。Windows 选 -setup.exe,根据自己系统架构来。

下载完成后是这样的:

安装没什么特别的,双击安装包一路下一步就行。

Cockpit 导入 JSON

打开 Cockpit,左侧找到第四个按钮(Codex 标签),点开后点击蓝色 + 号 → 点击「导入」,然后把刚才转换好的 JSON 文件批量导进去:

导入完成后就能看到账号列表了:

想用哪个账号就点启动按钮。启动前先去设置里把 Codex 的启动路径选好,不知道在哪就点「默认自动选择」。

⚠️ 如果启动单个账号提示要登录 Codex,那是 Cockpit 的常见 bug。把账号加到 API 服务里启动即可解决,下面会讲。

API 服务:多账号自动切换

单个账号额度有限,用完要手动关掉再切另一个,很麻烦。

API 服务的作用是把一堆账号的额度合并到一起——一个账号用完自动切下一个,全程不用管。

配置方法:

  1. 如图 1,点击红框的「添加账号」
  2. 如图 2,不要限制 free 账号的使用,点全选,保存
  3. 回到图 1,点击「启动 API」

💡 API 服务有「标准」和「快速」两个模式。就算全是 free 账号,切到快速模式也能享受 Plus 的 1.5 倍速。

⚠️ 很重要的一点:不要来回切

API 服务和单个账号之间不要频繁切换。用账号就老老实实用账号,嫌麻烦就用 API 服务。

但 API 服务切回单独账号使用,会丢聊天记录

丢了可以这样恢复:

  1. 点击「会话管理」
  2. 选择要恢复的聊天记录线程(最好全选)
  3. 点击「恢复可见性」

不过要注意:每次恢复可见性,聊天记录会在本地 .codex 目录里重复下载一份。懂文件管理的可以手动删重复的。不太熟悉的话,用了 API 服务就别瞎切了。