WebAI2API 是一个基于 Camoufox (Playwright) 的网页版 AI 服务转通用 API 的工具。通过模拟人类操作与 LMArena、Gemini 等网站交互,提供兼容 OpenAI 格式 的接口服务,同时支持 多窗口并发 与 多账号管理(浏览器实例数据隔离)。
| 网站名称 | 文本支持 | 图片支持 | 官方网址 |
|---|---|---|---|
| LMArena | ✅ | ✅ | lmarena.ai |
| Gemini Enterprise Business | ✅ | ✅ | business.gemini.google |
| Nano Banana Free | ❌ | ✅ | nanobananafree.ai |
| zAI | ❌ | ✅ | zai.is |
| Google Gemini | ❌ | ✅ | gemini.google.com |
- 🤖 拟人交互:模拟人类打字与鼠标轨迹,通过特征伪装规避自动化检测。
- 🔄 接口兼容:提供标准 OpenAI 格式接口,支持流式响应与心跳保活。
- 🚀 并发隔离:支持多窗口并发执行,可配置独立代理,实现多账号浏览器实例级数据隔离。
- 🖼️ 多个后端:支持 LMArena、Gemini 等多平台,单次请求可处理多张参考图片。
- 🛡️ 稳定防护:内置任务队列、负载均衡、故障转移、错误重试等基础功能。
本项目支持 源码直接运行(推荐) 和 Docker 容器化部署 两种方式。
因开发者自用时是直接源码运行,Docker未经测试可能更新滞后且可能有问题,如有相关建议可提出,帮助项目完善 Docker 的运行方式
- Node.js: v20.0.0+ (ABI 115+)
- 操作系统: Windows / Linux / macOS
- 核心依赖: Camoufox (安装过程中自动获取)
-
安装与配置
# 1. 复制配置文件 cp config.example.yaml config.yaml # 2. 安装依赖与初始化环境 pnpm install npm run init # ⚠️ 需确保网络能连接 GitHub
-
启动服务
npm start -- -login # 首次运行(进入首个Worker的登录模式) npm start -- -login=workerName # 首次运行(进入指定Worker的登录模式) npm start # 标准运行
⚠️ 特别说明:首次运行需设置LOGIN_MODE=true(true可以改为workerName),并通过 VNC 客户端连接localhost:5900完成网页登录验证。
Docker CLI
docker run -d --name lmarena-automator \
-p 3000:3000 -p 5900:5900 \
-v "$(pwd)/data:/app/data" \
-e LOGIN_MODE=true \
--shm-size=2gb \
foxhui/lmarena-imagen-automator:latestDocker Compose
# 确保 docker-compose.yml 中 LOGIN_MODE=true
docker-compose up -d- 启动登录模式:
npm start -- -login # 启动第一个 Worker 进行登录 npm start -- -login=workerName # 启动指定 Worker 进行登录
- Linux 用户使用
npm start -- -xvfb -vnc进入登录模式且创建虚拟显示器到 VNC。
- Linux 用户使用
- 完成初始化:
- 手动登录账号。
- 在输入框发送任意消息,触发并完成 CloudFlare/reCAPTCHA 验证及服务条款同意。
- 运行建议:初始化完成后可切换回标准模式,但为降低风控,强烈建议长期保持非无头模式运行。
项目使用 config.yaml 进行配置,核心结构如下:
backend:
pool:
strategy: least_busy # 调度策略
instances: # 浏览器实例列表
- name: "browser_01" # 实例 ID
userDataMark: "01" # 数据目录标识
proxy: # 实例级代理
enable: true
type: socks5
host: 127.0.0.1
port: 1080
workers: # 该实例下的 Worker
- name: "lmarena_01"
type: lmarena
- name: "zai_01"
type: zai_is
- name: "merge"
type: merge # 单标签聚合模式
mergeTypes: [zai_is, lmarena]
mergeMonitor: zai_is # 空闲时挂机监控的后端 (可选,留空则不启用)说明:
- 每个
instance代表一个独立的浏览器进程 - 同一
instance下的workers共享浏览器数据和登录状态 - 使用 Google OAuth 等统一登录时,只需登录一次即可用于所有 Worker
详细配置请参考 config.example.yaml。
Warning
并发限制与流式保活建议 本项目通过模拟真实浏览器操作实现,处理过程根据实际情况时间可能有所变化,当积压的任务超过设置的数量时会直接拒绝非流式模式的请求。
💡 强烈建议开启流式模式:服务器将发送保活心跳包,可无限排队避免超时。
请求端点
POST http://127.0.0.1:3000/v1/chat/completions
📄 查看API请求示例
请求示例(非流式)
curl -X POST http://127.0.0.1:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{
"model": "gemini-3-pro-image-preview",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "generate a cat"
}
]
}
]
}'响应格式(非流式)
{
"id": "chatcmpl-1732374740123",
"object": "chat.completion",
"created": 1732374740,
"model": "gemini-3-pro-image-preview",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": ""
},
"finish_reason": "stop"
}]
}请求示例(流式 - 推荐)
curl -X POST http://127.0.0.1:3000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-secret-key" \
-d '{
"model": "gemini-3-pro-image-preview",
"stream": true,
"messages": [
{
"role": "user",
"content": "generate a cat"
}
]
}'响应格式(流式)
data: {"id":"chatcmpl-1732374740123","object":"chat.completion.chunk","created":1732374740,"model":"gemini-3-pro-image-preview","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
: keep-alive
: keep-alive
data: {"id":"chatcmpl-1732374740123","object":"chat.completion.chunk","created":1732374740,"model":"gemini-3-pro-image-preview","choices":[{"index":0,"delta":{"content":""},"finish_reason":"stop"}]}
data: [DONE]
| 参数 | 说明 |
|---|---|
| model | 必填。指定使用的模型名称(如 gemini-3-pro-image-preview)。可通过 /v1/models 接口获取支持的模型列表。 |
| stream | 推荐开启。流式响应包含心跳保活机制,防止生成耗时过长导致连接超时。 |
💡 关于流式保活(Heartbeat)
为防止长连接超时,系统提供两种保活模式(可在配置中切换):
- Comment 模式(默认/推荐):发送
:keepalive注释。符合 SSE 标准,兼容性最好。- Content 模式:发送空内容的 data 包。仅用于必须收到 JSON 数据才重置超时的特殊客户端。
请求端点
GET http://127.0.0.1:3000/v1/models
📄 查看API请求示例
请求示例
curl -X GET http://127.0.0.1:3000/v1/models \
-H "Authorization: Bearer your-secret-key"响应格式
{
"object": "list",
"data": [
{
"id": "seedream-4-high-res-fal",
"object": "model",
"created": 1732456789,
"owned_by": "internal_server"
},
{
"id": "lmarena/seedream-4-high-res-fal",
"object": "model",
"created": 1732456789,
"owned_by": "lmarena"
},
{
"id": "gemini-3-pro-image-preview",
"object": "model",
"created": 1732456789,
"owned_by": "internal_server"
}
]
}功能说明:可利用本项目的自动续登功能获取最新 Cookie 给其他工具使用。
请求端点
支持使用 name 参数指定浏览器实例名称,domain 参数指定域名。
GET http://127.0.0.1:3000/v1/cookies (?name=browser_default&domain=lmarena.ai)
📄 查看API请求示例
请求示例
curl -X GET http://127.0.0.1:3000/v1/cookies \
-H "Authorization: Bearer your-secret-key"响应格式
{
"instance": "browser_default",
"cookies": [
{
"name": "_GRECAPTCHA",
"value": "09ADxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"domain": "www.google.com",
"path": "/recaptcha",
"expires": 1780000000,
"httpOnly": true,
"secure": true,
"sameSite": "None"
},
{
"name": "OTZ",
"value": "8888888_24_24__24_",
"domain": "accounts.google.com",
"path": "/",
"expires": 1760000000,
"httpOnly": false,
"secure": true,
"sameSite": "None"
}
.......... more
]
}功能说明:支持在消息中附带图片进行对话或生成。
| 限制项 | 说明 |
|---|---|
| 支持格式 | PNG, JPEG, GIF, WebP |
| 数量限制 | 最大为10,但根据不同网站有不同出入 |
| 数据格式 | 必须使用 Base64 Data URL 格式 (如 data:image/jpeg;base64,...) |
| 自动转换 | 为保证兼容性与传输速度,服务器会自动将所有图片转换为 JPG 格式 |
📄 查看API请求示例
请求示例
{
"model": "gemini-3-pro-image-preview",
"messages": [{
"role": "user",
"content": [
{
"type": "text",
"text": "make it more colorful"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAA..."
}
}
]
}]
}❌ 请求被拒绝 (429 Too Many Requests)
问题: 并发请求过多
解决方案:
- 该问题仅存在未开启流式保活时出现
- 队列限制:1 个并发 + 2 个排队 (总计 3 个)
- 修改
config.yaml中的queue.maxQueueSize(不建议) - 等待当前任务完成后再提交新任务
❌ reCAPTCHA 验证失败
问题: 返回 recaptcha validation failed
解决方案:
- 这是 LMArena 的人机验证机制
- 建议:
- 降低请求频率
- 首次使用时手动完成一次验证 (关闭 headless 模式)
- 使用稳定和纯净的 IP 地址 (可使用 ping0.cc 查询IP地址纯净度)
❌ 图像生成超时
问题: 任务超过 120 秒未完成
解决方案:
- 启用流式保活确保客户端不会主动断开连接
- 检查网络连接是否稳定
- 某些复杂提示词可能需要更长时间
🐧 【Linux 环境下非无头模式运行】
问题: 需要在 Linux 服务器上显示浏览器界面(如手动过验证码)
解决方案:
方法一:X11 转发
- 推荐使用 WindTerm 等终端工具,开启 X-Server 功能
- 在 SSH 会话设置中启用 X11 转发 (Forward X11)
方法二:Xvfb + X11VNC (推荐) 使用虚拟显示器运行程序,并通过 VNC 远程查看。
-
使用内置命令启动 (简便)
npm start -- -xvfb -vnc
-
手动配置 如果内置命令无法满足需求,可手动分步执行:
a. 启动虚拟显示器并运行程序 (屏幕号 99 可按需修改):
xvfb-run --server-num=99 --server-args="-ac -screen 0 1920x1080x24" npm startb. 将虚拟显示器映射至 VNC:
x11vnc -display :99 -localhost -nopw -once -noxdamage -ncache 10 -forever
-
建立 SSH 隧道连接 VNC (安全推荐):
# 在本地终端运行,将服务器 5900 端口映射到本地 ssh -L 5900:127.0.0.1:5900 root@服务器IP随后使用 VNC 客户端连接
127.0.0.1:5900即可。
| 资源 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 1 核 | 2 核及以上 |
| 内存 | 1 GB | 2 GB 及以上 |
实测环境表现 (均为单浏览器实例):
- Oracle 免费机 (1C1G, Debian 12):资源紧张,比较卡顿,仅供尝鲜或轻度使用。
- 阿里云轻量云 (2C2G, Debian 11):运行流畅稳定,为本项目开发测试基准环境。
本项目采用 MIT License 开源。
免责声明: 本项目仅供学习交流使用。如果因使用该项目造成的任何后果 (包括但不仅限于账号被禁用),作者和该项目均不承担任何责任。请遵守相关网站和服务的使用条款 (ToS),以及相关数据的备份工作。
查看完整的版本历史和更新内容,请访问 CHANGELOG.md。
本项目已从 Puppeteer 迁移至 Camoufox,以应对日益复杂的反机器人检测机制。基于 Puppeteer 的旧版本代码已归档至 puppeteer-edition 分支,仅作留存,不再提供更新与维护。
感谢 LMArena 、Gemini 等网站提供AI服务! 🎉