Google Gemini 的免费额度其实够用,但官方 API 的配额限制让人烦。有没有办法白嫖 Gemini 的能力,同时用 OpenAI 格式调用呢。
有。WebAI2API 干的就是这件事——一个开源项目,通过浏览器自动化把 Gemini 网页版转成 OpenAI 兼容 API。
这个项目是什么
说白了就是个"中间人"。它通过浏览器自动化操控 Gemini 网页版,把你的 API 请求翻译成网页操作,再把 Gemini 的回复解析成标准的 OpenAI 格式。
你的应用 → OpenAI API 格式 → WebAI2API → Camoufox 浏览器 → Gemini 网页
意味着你可以用任何支持 OpenAI API 的工具来调用 Gemini,LobeChat、ChatBox、OpenClaw 都行。

为什么选它而不是别的
翻了一圈同类项目,最后选了 WebAI2API,原因很直接:
- 自带无头浏览器(Camoufox),登录和 Token 刷新全自动
- 文本和图片生成都支持,一个服务搞定
- 自带 Web 管理界面,改配置不用碰代码
- Docker 镜像现成的,拉下来就能跑
其他几个备选都各有硬伤:AIStudioToAPI 要企业账号,gemini-business2api 要 Gemini Business 订阅,Amm1rr 那个不带浏览器刷新 Token 得手动,nano-banana 的 Cookie 过期太快。
部署过程
建目录
mkdir -p /vol1/1000/docker/webai2api/data
cd /vol1/1000/docker/webai2api
写配置
data/config.yaml:
logLevel: info
server:
port: 13000
auth: sk-你的API密钥
keepalive:
mode: comment
backend:
pool:
strategy: least_busy
instances:
- name: browser_default
proxy:
enable: true
type: socks5
host: 127.0.0.1
port: 10800
workers:
- name: gemini_web
type: gemini
- name: gemini_txt
type: gemini_text
browser:
headless: true
humanizeCursor: camou
proxy:
enable: true
type: socks5
host: 127.0.0.1
port: 10800
Docker Compose
services:
webai-2api:
image: foxhui/webai-2api:latest
container_name: webai-2api
restart: unless-stopped
network_mode: host
volumes:
- ./data:/app/data
shm_size: '2gb'
init: true
这里有个坑,必须用 network_mode: host。我试过 bridge 模式加端口映射,但容器内没法加载 iptable_nat 模块,端口转发直接废了。host 模式虽然粗暴但省心。
跑起来
docker compose up -d
浏览器打开 http://你的NAS_IP:13000,能看到管理界面就对了。
登录 Google
第一次用得通过 WebUI 的 VNC 界面登录 Google 账号。登完浏览器会自动存 Cookie,后面就不用管了。
试一下
文本请求:
curl -X POST http://192.168.1.202:13000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{
"model": "gemini-3.1-flash",
"messages": [{"role": "user", "content": "Say hello"}]
}'
图片生成:
curl -X POST http://192.168.1.202:13000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{
"model": "gemini-3-pro-image-preview",
"messages": [{"role": "user", "content": "画一只穿宇航服的猫在月球上"}]
}'
图片返回的 content 里是 base64 编码,解码保存就行。
踩过的坑
代理配置:如果你的 NAS 需要代理才能访问 Google,注意 config.yaml 里的 socks5 代理。Docker 内部和宿主机之间的端口要互通,我这边 host.docker.internal:10800 能通。
Docker 权限:我另一个 OpenClaw 容器需要操作 Docker(比如重启 WebAI2API),得把用户加到 docker 组:
sudo usermod -aG docker 你的用户名
加完之后要么重新登录,要么重启容器,不然补充组不刷新。
图片生成速度:浏览器自动化就这样,每次请求都要走一遍:打开页面、输提示词、选模型、发送、等回复、解析。一轮下来 20 到 50 秒。用免费就得接受这个延迟。
我们做的优化:会话复用
默认配置下,WebAI2API 每次请求都会新开一个 Gemini 对话。每次都要加载页面、等初始化,其实挺浪费的。
我们改了源码,加了个会话缓存:
// 原始代码:每次都开新会话
await gotoWithCheck(page, 'https://gemini.google.com/app?hl=en');
// 改后:有缓存就复用
if (this._chatUrl) {
await gotoWithCheck(page, this._chatUrl);
} else {
await gotoWithCheck(page, 'https://gemini.google.com/app?hl=en');
}
this._chatUrl = page.url();
逻辑很简单,用一个 Map 按 Worker 名字缓存对话 URL。第一次请求正常开新会话,拿到 conversation URL 后存起来,后续请求直接跳过去。
实测效果
| 场景 | 优化前 | 优化后 |
|---|---|---|
| 第一次请求 | 约20秒 | 约20秒(没区别) |
| 第二次请求 | 约20秒 | 约12秒(跳过初始化) |
| 上下文记忆 | 没有 | 跨请求保持对话 |
开启方法,在 config.yaml 加:
backend:
adapter:
gemini:
reuseChat: true
gemini_text:
reuseChat: true
重启容器生效。每次请求后会话 URL 被缓存,后续自动复用。容器重启后缓存清空,第一次请求会重新开。
适合什么人
有 NAS、想本地跑 AI API、不想折腾官方配额的人。把 Gemini 包装成 OpenAI 格式后,能接入的工具就多了。
不适合追求极低延迟的场景。浏览器自动化的延迟摆在那里,跟直接调 API 没法比。但对个人使用来说,免费加能用,够了。
还能怎么优化
会话复用只是第一步。几个可以继续折腾的方向:
- 多账号轮询:挂多个 Google 账号,分摊负载
- 缓存持久化:把会话 URL 存到文件,容器重启不用重新登录
- 流式响应:目前只支持非流式,加上流式体验会好很多
- 健康检查:定时探测登录状态,过期自动提醒
有想法的欢迎交流。
常见问题
- WebAI2API 和直接调 Gemini API 有什么区别?
WebAI2API 通过浏览器自动化操作 Gemini 网页版,不需要 API Key,用的是你 Google 账号的免费额度。延迟比直接 API 高,但胜在免费。
- 支持哪些模型?
文本:gemini-3.1-flash、gemini-3.1-pro。图片:gemini-3-pro-image-preview。具体看 Gemini 网页版支持什么。
- 能并发多少请求?
取决于你配置的 Worker 数量。每个 Worker 对应一个浏览器标签页,默认两个(一个文本一个图片)。
- Cookie 过期了怎么办?
通过 WebUI 的 VNC 重新登录就行。WebAI2API 有自动续登机制,一般能撑比较久。
部署环境:飞牛OS / Docker / Camoufox / gemini-3.1-flash / gemini-3-pro-image-preview
评论区