侧边栏壁纸
  • 累计撰写 27 篇文章
  • 累计创建 63 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

在飞牛OS上部署WebAI2API:把Gemini网页版变成你的私有OpenAI兼容API

羲 阳
2026-05-05 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

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 架构:从应用到 Gemini 的数据流示意图

为什么选它而不是别的

翻了一圈同类项目,最后选了 WebAI2API,原因很直接:

  1. 自带无头浏览器(Camoufox),登录和 Token 刷新全自动
  2. 文本和图片生成都支持,一个服务搞定
  3. 自带 Web 管理界面,改配置不用碰代码
  4. 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 存到文件,容器重启不用重新登录
  • 流式响应:目前只支持非流式,加上流式体验会好很多
  • 健康检查:定时探测登录状态,过期自动提醒

有想法的欢迎交流。

常见问题

  1. WebAI2API 和直接调 Gemini API 有什么区别?

WebAI2API 通过浏览器自动化操作 Gemini 网页版,不需要 API Key,用的是你 Google 账号的免费额度。延迟比直接 API 高,但胜在免费。

  1. 支持哪些模型?

文本:gemini-3.1-flash、gemini-3.1-pro。图片:gemini-3-pro-image-preview。具体看 Gemini 网页版支持什么。

  1. 能并发多少请求?

取决于你配置的 Worker 数量。每个 Worker 对应一个浏览器标签页,默认两个(一个文本一个图片)。

  1. Cookie 过期了怎么办?

通过 WebUI 的 VNC 重新登录就行。WebAI2API 有自动续登机制,一般能撑比较久。


部署环境:飞牛OS / Docker / Camoufox / gemini-3.1-flash / gemini-3-pro-image-preview

项目地址:https://github.com/foxhui/WebAI2API

0

评论区