# 让 Claude Code 自动用你的 ChatGPT 订阅生图：不要 API key，背后怎么绕过 Turnstile

![笔记本上一行命令出图，不用 API key](https://img.leeguoo.com/media/7be1dfdf-039e-4266-9ce7-fc0f5f1385a3/cover.png)

你让 Claude Code 写个 README、写篇技术文档，它能不能顺手把配图也生成了？能，而且不用 `OPENAI_API_KEY`、不另外掏钱，用你已经付着的 ChatGPT 订阅。本文这几张 doodle 配图，就是 Claude Code 写这篇时自己调出来的。

把生图能力接进 agent 有两条路，区别在花你订阅里的哪个桶、以及免费号能不能用。这篇讲背后最有意思的那条：web 后端，以及它怎么绕过 chatgpt.com 的反爬。

## 先纠正一个常见误解

很多人以为"用 ChatGPT 订阅生图"只有一种省钱姿势：复用 Codex CLI 的 OAuth token，直接 POST `backend-api/codex/responses`。我之前那篇[《把 ChatGPT 订阅转成生图 API》](https://blog.leeguoo.com/zh/posts/chatgpt-imagegen/)讲的就是这条。

它有两个没说透的地方。

第一，它花 Codex 计量额度。订阅不是一个桶，是两个独立限流桶：一个是你在 ChatGPT 网页里聊天的额度，一个是 Codex 用量。走 `codex/responses` 花的是后者，也就是你跑 Codex CLI 写代码时最不想浪费的那个。

第二，它要你装过 Codex CLI、`codex login` 过。免费 ChatGPT 账号没有 Codex，这条路根本走不通。

![聊天额度和 Codex 用量是两个独立的桶](https://img.leeguoo.com/media/47e5fdd7-c3a8-4ec6-bfe9-8fc605bb4154/two-buckets.png)

于是问题变成：能不能把图生在"网页对话"那条线上？那条线免费号也有，免费用户在 ChatGPT 网页里本来就能生图，花的是聊天额度，完全不碰 Codex 用量。

能，代价是你得真的去"网页"那一侧把图生出来。这就是 [`chatgpt-imagegen`](https://github.com/leeguooooo/chatgpt-imagegen) 的 **web 后端**，也是这篇的主角。

## 为什么不能像 codex 后端那样直接 POST

直觉方案：网页生图也是发 HTTP 请求，那抓个包、拿 cookie、重放不就行了？

试过的人都卡在 chatgpt.com 的反爬上。这里值得把防线拆开看，因为真正拦你的那层和大多数人猜的不一样。

| 防线 | 是什么 | 裸客户端能过吗 |
| --- | --- | --- |
| Cloudflare 边缘检查 | 常规 CF bot 检测 | ✅ 能过 |
| Sentinel 工作量证明 | `backend-api/sentinel/chat-requirements` + 页面内 `sentinel/sdk.js` 算一个 PoW token | ✅ 能过，算法在页面 JS 里可复刻 |
| **Cloudflare Turnstile token** | 交互式验证产出的一次性 token | ❌ **过不了** |

前两层一个纯 Python 客户端都能模拟。真正的墙是第三层：Turnstile token 只能由一个真实、交互式的浏览器现场产出，而且单次有效。没有"先在浏览器里薅一个 token、再拿去 headless 重放"的捷径，token 用一次就废，下一个请求又要一个新的，而生成新 token 必须有真浏览器在场。

![三道门，前两道开着，第三道 Turnstile 锁死](https://img.leeguoo.com/media/959571a6-2a9f-4bce-a389-1554a98c46d3/turnstile-wall.png)

所以结论挺反直觉：绕不过去，只能"在里面"。与其伪造一个浏览器才能产出的东西，不如直接驱动一个真浏览器。

## 方案：驱动你自己已登录的 Chrome

web 后端通过 [`chrome-use`](https://github.com/leeguooooo/chrome-use)（一个带 Chrome 扩展的浏览器自动化 CLI）连上你已经登录 chatgpt.com 的真实 Chrome，在一个普通对话里把图生出来。和你手动在 app 里打字让它"画一张"是同一个界面、同一份 cookie、同一个 Turnstile 上下文。

完整流程：

```
chatgpt-imagegen --backend web
   │
   ├── chrome-use 连上你已登录的 Chrome，打开 https://chatgpt.com/
   │     （必须是普通对话，Temporary Chat 会禁用生图工具）
   │
   ├── 解析 ChatGPT 项目（--project，默认 imagegen）
   │     页面内 fetch 列出项目；没有就 POST /backend-api/projects 建一个
   │     出图对话归档进这个项目，不污染主历史
   │
   ├── 用真实键盘事件把提示词打进输入框
   │     ChatGPT 的 ProseMirror/React 输入框不认纯 DOM 的 .value= / fill，
   │     必须模拟逐键敲击，否则提交上去是空的
   │
   ├── 轮询页面：等流式输出结束 且 一张新的 <img> 资源稳定下来
   │
   └── 在页面内 fetch 这张图的字节（credentials:'include'）→ base64 → 落盘
         （签名的 estuary/content URL 由浏览器自己的 cookie 授权，token 不出浏览器）
```

几个细节是踩出来的。

ProseMirror 输入框直接设 `value` 或用自动化工具的 `fill` 都不生效，React 不把它当用户输入，只能发真实键盘事件。

判断"图好了"不能只看流结束，得等对话 main 容器里新出现的那张 `<img>` 资源稳定，URL 不再变，否则会抓到占位图或上一轮的图。

图片字节也不在外面 `curl`。那张图的 URL 是签名的、要 cookie 才能下载，所以在页面内 `fetch(..., {credentials:'include'})`，让浏览器用自己的会话授权，token 全程不出浏览器。

## 一串绕不开的工程坑

把"能跑通"做到"能稳定跑"，中间这些是真金白银踩出来的。

**web 后端并发只能是 1。** 共享同一个登录 Chrome，早期并发出图会互相串图（[#7](https://github.com/leeguooooo/chatgpt-imagegen/issues/7)，v0.6.0 修复，把检测限定在本对话的 main 容器）。而且 chatgpt.com 页面侧限流很凶（"Too many requests… temporarily limited access to your conversations"）。所以 web 跨进程串行，多 fire 的进程在 flock 槽位上排队，安全，但墙钟约等于串行总和。要真并行（最多 4）就显式 `--backend codex`，代价是花 Codex 额度。这是省额度和出图快的取舍，工具不替你定，跟着 `--backend` 或默认 `auto` 走。

**限流要 fail fast，不能闷头重试。** 页面弹"Too many requests"时，web 后端识别这个弹窗立刻报错。提交前撞到，`auto` 模式降级 codex；提交后，干净停下、不重复花钱，那张图可能稍后还会出现在对话里，自己去看。

**默认不留历史。** 出图对话默认 `PATCH is_visible:false` 删掉，只是临时归进项目转个手，跑完不在你 ChatGPT 历史里留痕（`--keep-conversation` 可保留）。

**图生图走同一条线。** `-i/--ref` 把参考图传进 ChatGPT 输入框再发编辑提示词，和你手动拖张图进去让它改是同一个机制，还是订阅、还是不要 key。

## 两个新东西：风格预设 + 主动给文档配图

风格预设是一段可复用的提示词片段，存名字、一个参数套用：

```bash
chatgpt-imagegen "a robot mascot" --style doodle
chatgpt-imagegen style add brand "flat vector, bold shapes, white bg"
chatgpt-imagegen style use brand        # 设成默认，之后每次自动套
```

内置一个 `doodle` 风格，故意画得很烂、像老式画图程序里鼠标蹭出来的那种。这个仓库 README 里那些"丑萌"插图，包括本文这几张，就是它自己用这个风格生成的。开箱没有默认风格，不主动用就和以前一样。

主动配图是给 AI agent 用的。装成 skill 后，agent 写博客、技术方案、设计文档时会主动提配图、后台并行去生成，而不是等你开口要图。并行程度取决于你的后端配置：web 串行省额度，codex 并行计额度。

## 两个后端怎么选

| 场景 | 用哪个后端 | 为什么 |
| --- | --- | --- |
| 笔记本/台式机，Chrome 开着且登录 | **web**（默认） | 不花 Codex 额度；免费号也能用 |
| 服务器 / 无头 agent 机器 | **codex** | 那里没浏览器，`auto` 自己回退 |
| 要真并行批量出图 | codex | web 串行，codex 最多 4 并行，但计额度 |

默认 `auto` 先试 web、不行再回退 codex，也就是默认帮你省 Codex 额度。

## 什么时候别用这个，直接走官方 API

订阅通道不是 API 的免费版，是另一条产品形态，有自己的边界。

要严格 `quality=high` 或透明背景，订阅给不了，得用 `OPENAI_API_KEY` 调 `/v1/images/generations`。

做对外的生产服务，拿个人订阅给终端用户生图违反 [OpenAI 条款](https://openai.com/policies/row-terms-of-use/)，也会烧光你自己用 ChatGPT 的额度。还有一点：这工具骑在一个未公开的内部端点上，大规模滥用是让这个口子最快被封的方式，封了大家一起没。

要稳定 >10 张/分钟，订阅限流比 API 紧。

需要团队级、可远程调用的 HTTP 网关，用姊妹项目 [agent-cli-to-api](https://github.com/leeguooooo/agent-cli-to-api)，把同一条订阅暴露成 OpenAI 兼容接口。

## 上手

```bash
# 装 chrome-use（给 web 后端），连上你登录了 chatgpt.com 的 Chrome
curl -fsSL https://raw.githubusercontent.com/leeguooooo/chrome-use/main/install.sh | sh
chrome-use extension install   # 然后装 Chrome 扩展、重启、登录 chatgpt.com

# 装 CLI（给 agent 用，最省事）
npx skills add leeguooooo/chatgpt-imagegen -g

# 或独立用
git clone https://github.com/leeguooooo/chatgpt-imagegen
./chatgpt-imagegen "a watercolor cat on a windowsill" -o cat.png
```

没装 chrome-use 也不影响，`auto` 自动回退 codex，只在 stderr 提示一句"装上 chrome-use 出图可以不耗 Codex 额度"。

## 几个常见问题

**会不会封号？** 不太会，但有红线。web 后端驱动你自己已登录的浏览器，做你手动也会做的事，流量和在 app 里点几下没区别；codex 后端用真 auth token 重放 Codex CLI 协议，看着就是正常 Codex 使用。真正有风险的是两件事：一是量，持续 >10 张/分钟、或一次几十张大 fan-out 会撞限流，长期硬刷也容易招注意；二是拿个人订阅对外提供生图服务，这是明确违反条款的红线。工具默认压低足迹：出图对话默认删、归进项目、撞限流弹窗 fail-fast 不重试、并发有上限。个人本地、正常量级用风险低，但它骑在未公开端点上，自负风险，别滥用。

**chrome-use 是不是特别浪费 token？** 对这个工具来说，出图过程不耗任何 LLM token。web 后端不是让 AI 看着屏幕一步步操作浏览器，而是一段固定的 Python 脚本按写死的步骤调 chrome-use，中间没有模型推理。真正烧 token 的是截图驱动、每步喂大模型的玩法。chrome-use 本身恰恰相反，用无障碍树快照加紧凑的 `@eN` 引用，一次约 200-400 token，给 agent 用也比丢原始 HTML 或截图省得多。

## 写在最后

codex 后端是重放官方协议，web 后端是在真浏览器里把活干了。后者多绕，换来三件事：不要 API key、不耗 Codex 额度、免费号也能用。难点不是 Cloudflare 边缘，是那个只有真浏览器才生得出来、还单次作废的 Turnstile token。认清这点，方案就从"伪造"变成了"直接在里面操作"。

- GitHub: [leeguooooo/chatgpt-imagegen](https://github.com/leeguooooo/chatgpt-imagegen)
- HTTP 网关姊妹项目: [agent-cli-to-api](https://github.com/leeguooooo/agent-cli-to-api)
- skill 安装: `npx skills add leeguooooo/chatgpt-imagegen -g`

免责声明：本工具调用 ChatGPT 内部 `backend-api` 端点（Codex CLI 用的同一个），不是有文档保证的公开 API，OpenAI 随时可能改动或限制。请在 [OpenAI 服务条款](https://openai.com/policies/row-terms-of-use/)允许范围内、仅作个人或 agent 本地使用，不要对外提供商业化生图服务。
