leeguoo

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

让 Claude Code、Cursor 这类 agent 在写文档、写 README 时顺手把配图也生成了,不用 OPENAI_API_KEY、不另外掏钱,用你已经付着的 ChatGPT 订阅。这篇拆它背后最有意思的那条实现路径:web 后端。为什么不能直接 POST,三层反爬里真正的墙是单次有效的 Turnstile token,以及驱动你已登录 Chrome 出图的完整流程。

2026年6月22日 · 文章 · 公开

本页目录

笔记本上一行命令出图,不用 API key

你让 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》讲的就是这条。

它有两个没说透的地方。

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

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

聊天额度和 Codex 用量是两个独立的桶

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

能,代价是你得真的去"网页"那一侧把图生出来。这就是 chatgpt-imagegenweb 后端,也是这篇的主角。

为什么不能像 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 锁死

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

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

web 后端通过 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,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 自己回退
要真并行批量出图codexweb 串行,codex 最多 4 并行,但计额度

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

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

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

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

做对外的生产服务,拿个人订阅给终端用户生图违反 OpenAI 条款,也会烧光你自己用 ChatGPT 的额度。还有一点:这工具骑在一个未公开的内部端点上,大规模滥用是让这个口子最快被封的方式,封了大家一起没。

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

需要团队级、可远程调用的 HTTP 网关,用姊妹项目 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。认清这点,方案就从"伪造"变成了"直接在里面操作"。

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

下一篇 →
让 Claude Code 自己把图画了:chatgpt-imagegen 的初心与原理

评论

评论发布后会立即公开,如触发规则可能被审核下架。

最多 1000 字。