feat: 将项目迁移到Playwright+Camoufox方案

This commit is contained in:
foxhui
2025-12-06 23:37:36 +08:00
parent 5c758a7288
commit e88d4941c9
23 changed files with 2900 additions and 2313 deletions
+94 -185
View File
@@ -2,22 +2,24 @@
## 📝 项目简介
LMArenaImagenAutomator 是一个基于 Puppeteer 的自动化图像生成工具,通过模拟人类操作与 LMArena、Gemini Enterprise 网站交互提供图像生成服务。(未来可能支持更多支持免费生图的网站)
LMArenaImagenAutomator 是一个基于 Playwright + Camoufox 的自动化图像生成工具,通过模拟人类操作与 LMArena、Gemini 网站交互提供图像生成服务到OpenAI格式的接口。(未来可能支持更多支持免费生图的网站)
项目支持两种运行模式
- **OpenAI 兼容模式**:提供标准的 OpenAI API 接口,便于集成到现有应用
- **Queue 队列模式**:使用 Server-Sent Events (SSE) 实时推送生成状态
当前支持的网站
- LMArena
- Gemini Enterprise Business
- Nano Banana Free
### ✨ 主要特性
- 💁‍♂️ **拟人操作**:模拟人类鼠标移动轨迹和抖动
- 💁‍♂️ **拟人操作**:模拟人类鼠标移动轨迹和抖动行为
- 🤖 **智能输入**:模拟人类打字速度和错误纠正行为
- 🖼️ **多图支持**:最多支持同时上传 10 张参考图片
- 📊 **队列管理**智能任务队列,防止请求过载
- 📊 **队列管理**支持任务队列,防止请求过载或超时
- 🌐 **代理支持**:支持 HTTP 和 SOCKS5 代理配置
- 🎭 **特征伪装**:尽量伪装成真人操作的浏览器
- 🎭 **特征伪装**:尽量伪装成非自动程序控制的浏览器
- 🔗 **流式保活**:复用标准接口的流式模式发送心跳包
![Demo](https://github.com/user-attachments/assets/cc1b72f9-fbca-4784-820e-6b0a79e62cd5)
![Image](https://github.com/user-attachments/assets/81170a77-e377-4b47-a2a4-009878142a28)
---
@@ -25,35 +27,47 @@ LMArenaImagenAutomator 是一个基于 Puppeteer 的自动化图像生成工具
### 系统要求
- **Node.js**: 16.0 或更高版本
- **操作系统**: Windows、Linux 或 macOS
- **浏览器**: Google Chrome (**推荐**) 或 Chromium
- **Node.js**: 20.0.0 或更高版本 (ABI 115+)
- **操作系统**: Windows、Linux 或 MacOS
- **浏览器**: Camoufox (经过反检测处理的FireFox浏览器)
> **开发环境参考**
> - Node.js v22.20.0 ( Windows 10 )
> - Node.js v20.19.0 ( Debian 12 )
### 安装步骤
1. **克隆项目** 或下载解压项目文件
2. **安装依赖**
```bash
pnpm install
```
3. **生成配置文件**
首次运行会自动生成配置文件,也可以手动复制模板
2. **配置文件**
复制配置文件模板进行配置文件的修改
```
cp config.example.yaml config.yaml
```
3. **安装依赖**
```bash
# 安装 NPM 基本依赖
pnpm install
# 安装所需额外依赖
# 自动下载安装所需的浏览器和NPM预编译文件
# 若网络无法连接 GitHub,请提前在配置文件中设置可用代理
npm run init
```
4. **启动程序**
```bash
# 标准模式
npm start
# 登录模式 (用于手动登录,该模式会自动禁用自动程序和无头模式)
# 如 Google 账号登录时出现浏览器不安全的提示可切换该模式登录后再使用默认模式启动
# 登录模式 (用于手动登录,该模式会自动禁用自动和无头模式)
npm start -- -login
```
# 测试模式
npm test (-- -login)
5. **测试程序 (可选)**
用于快速测试服务器接口
```bash
npm test
```
---
@@ -63,7 +77,7 @@ LMArenaImagenAutomator 是一个基于 Puppeteer 的自动化图像生成工具
#### 1. 启动与登录
- **关闭无头模式**:首次启动务必关闭无头模式。推荐使用 **登录模式**。(Linux 命令行用户请参阅文档结尾)
- **手动登录**:网页加载完毕后,请手动完成账号登录,避免后续流程中断
- **手动登录**:网页加载完毕后,请手动完成账号登录。
#### 2. 验证流程
- **触发验证**:在输入框输入任意内容并发送,触发服务条款及 CloudFlare Turnstile 验证。
@@ -71,15 +85,15 @@ LMArenaImagenAutomator 是一个基于 Puppeteer 的自动化图像生成工具
#### 3. 运行建议
- **模式选择**:完成上述初始化后,可切换至无头模式运行。
- **最佳实践**:为降低风控概率,**强烈建议**保持非无头模式(有界面)运行。
- **最佳实践**:为降低风控概率,**强烈建议**保持非无头模式运行。
### 接口使用说明
#### 1. OpenAI 兼容模式
#### 1. OpenAI 兼容接口
> [!WARNING]
> 由于模拟真实浏览器操作,每次只能处理一个任务,其余任务将进入队列等待。为避免客户端超时影响体验,若当前任务数已达3个,后续请求将直接返回错误。因此,强烈推荐使用队列模式(`queue`,该模式下服务器会向客户端发送心跳包以确保连接持续活跃。
> 由于模拟真实浏览器操作,每次只能处理一个任务,其余任务将进入队列等待。为避免客户端超时影响体验,若当前任务数已达3个,后续请求将直接返回错误。因此,强烈推荐开启流式保活,该模式下服务器会向客户端发送保活注释或者心跳包以确保连接持续活跃。
**请求端点**
```
@@ -89,7 +103,7 @@ POST http://127.0.0.1:3000/v1/chat/completions
<details>
<summary>📄 查看API请求示例</summary>
**请求示例**
**请求示例(非流式)**
```bash
curl -X POST http://127.0.0.1:3000/v1/chat/completions \
-H "Content-Type: application/json" \
@@ -98,20 +112,25 @@ curl -X POST http://127.0.0.1:3000/v1/chat/completions \
"model": "gemini-3-pro-image-preview",
"messages": [
{
"type": "text",
"text": "generate a cat"
"role": "user",
"content": [
{
"type": "text",
"text": "generate a cat"
}
]
}
]
}'
```
**响应格式**
**响应格式(非流式)**
```json
{
"id": "chatcmpl-1732374740123",
"object": "chat.completion",
"created": 1732374740,
"model": "lmarena-image",
"model": "gemini-3-pro-image-preview",
"choices": [{
"index": 0,
"message": {
@@ -122,77 +141,50 @@ curl -X POST http://127.0.0.1:3000/v1/chat/completions \
}]
}
```
**请求示例(流式 - 推荐)**
```bash
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":"![generated](data:image/jpeg;base64,/9j/4AAQ...)"},"finish_reason":"stop"}]}
data: [DONE]
```
</details>
> **关于 `model` 参数**
> - **必填**:必须填写支持的模型名称,否则将使用 LMArena 网页默认模型
> - **必填**:必须填写支持的模型名称,否则将使用目标网站的默认模型
> - **查看可用模型**
> - 方式 1:访问 `/v1/models` 接口查询
> - 方式 2:直接查看 `lib/backend/models.js` 文件
> - **示例模型**`gemini-3-pro-image-preview`、`seedream-4-high-res-fal`、`dall-e-3` 等
#### 2. Queue 队列模式 (SSE) (推荐)
> **关于流式保活的心跳模式**:
> - 主要分为两种方式,可自行在配置文档中根据所需切换
> - comment模式: 发送 :keepalive 注释。不污染数据,绝大多数 SDK 支持,不会影响接口标准
> - content模式: 在 choices[0].delta.content = "" 中发送空字符串(仅当你使用的客户端非常特殊,必须收到 data JSON 包才重置超时时使用)
**请求端点**
```
POST http://127.0.0.1:3000/v1/queue/join
```
**SSE 事件类型**
| 事件类型 | 数据格式 | 说明 |
|---------|---------|------|
| `status` | `{status: "queued", position: 1}` | 任务已入队 |
| `status` | `{status: "processing"}` | 开始处理 |
| `result` | `{status: "completed", image: "base64..."}` | 生成成功 |
| `result` | `{status: "error", msg: "错误信息"}` | 生成失败 |
| `heartbeat` | 时间戳 | 保持连接 |
| `done` | `"[DONE]"` | 流结束 |
<details>
<summary>📄 查看 Node.js 示例代码</summary>
```javascript
import http from 'http';
const options = {
hostname: '127.0.0.1',
port: 3000,
path: '/v1/queue/join',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-secret-key'
}
};
const req = http.request(options, (res) => {
res.on('data', (chunk) => {
const lines = chunk.toString().split('\n');
for (const line of lines) {
if (line.startsWith('event: ')) {
const event = line.substring(7).trim();
console.log('事件类型:', event);
} else if (line.startsWith('data: ')) {
const data = JSON.parse(line.substring(6));
console.log('数据:', data);
}
}
});
});
req.write(JSON.stringify({
model: "gemini-3-pro-image-preview",
messages: [{ role: "user", content: "a cute cat" }]
}));
req.end();
```
</details>
> **提示**Queue 模式同样支持 `model` 参数,用法与 OpenAI 兼容模式一致。
#### 3. 获取可用模型列表
#### 2. 获取可用模型列表
**请求端点**
```
@@ -231,12 +223,7 @@ curl -X GET http://127.0.0.1:3000/v1/models \
</details>
> **说明**
> - 此接口在 **OpenAI 兼容模式** 和 **Queue 队列模式** 下均可用
> - `created` 字段为当前请求时的时间戳
> - 完整模型列表可在 `lib/backend/models.js` 文件中查看
#### 4. 带图片的请求说明
#### 3. 带图片的请求说明
**支持格式**PNG、JPEG、GIF、WebP
**最大数量**5 张图片
@@ -273,38 +260,13 @@ curl -X GET http://127.0.0.1:3000/v1/models \
## 🔧 常见问题
<details>
<summary>❌ 浏览器启动失败</summary>
**问题**: `Error: Failed to launch the browser process`
**解决方案**:
- 确保已安装 Chrome 或 Chromium
- 大陆地区设备可能因网络原因 Puppeteer 自动安装失败
- 可尝试手动安装后填写 `chrome.path` (Linux 可使用 `which` 指令检索路径)
- 检查 `config.yaml` 中的 `chrome.path` 是否正确
- 尝试删除 `data` 目录后重新运行
</details>
<details>
<summary>❌ GPU 相关错误</summary>
**问题**: 无显卡服务器运行时出现 GPU 错误
**解决方案**:
- 该报错并不会影响程序运行,但是强烈建议在无显卡的设备上关闭GPU加速
- 修改 `config.yaml` 中的`chrome.gpu`为false
</details>
<details>
<summary>❌ 请求被拒绝 (429 Too Many Requests)</summary>
**问题**: 并发请求过多
**解决方案**:
- 该问题仅存在于OpenAI兼容模式
- 该问题仅存在未开启流式保活时出现
- 队列限制:1 个并发 + 2 个排队 (总计 3 个)
- 修改 `config.yaml` 中的`queue.maxQueueSize` (不建议)
- 等待当前任务完成后再提交新任务
@@ -331,6 +293,7 @@ curl -X GET http://127.0.0.1:3000/v1/models \
**问题**: 任务超过 120 秒未完成
**解决方案**:
- 启用流式保活确保客户端不会主动断开连接
- 检查网络连接是否稳定
- 某些复杂提示词可能需要更长时间
@@ -352,7 +315,7 @@ curl -X GET http://127.0.0.1:3000/v1/models \
1. **启动虚拟显示器并运行程序** (屏幕号 99 可按需修改):
```bash
xvfb-run --server-num=99 --server-args="-ac -screen 0 1280x720x24" npm start
xvfb-run --server-num=99 --server-args="-ac -screen 0 1920x1080x24" npm start
```
2. **将虚拟显示器映射至 VNC**:
@@ -369,62 +332,6 @@ curl -X GET http://127.0.0.1:3000/v1/models \
</details>
<details>
<summary>🎭 【浏览器特征伪装】</summary>
**问题**: 如何优化浏览器特征伪装,减少验证码弹出频率?
> **欢迎了解相关内容的前辈基于改进建议**
**浏览器指纹伪装状态**:
- **Windows 10 (官方 Chrome)**:
- 针对 Windows 10 原生 Chrome 环境优化指纹,已在 [antibot](https://bot.sannysoft.com/) 和 [CreepJS](https://abrahamjuliot.github.io/creepjs/) 测试中无红色高危警告
- **Linux 环境**:
- ⚠️ 未完全通过 CreepJS 测试,但实际使用中影响较小,检测严格程度可能低于测试工具。
**进一步优化建议**:
完成后,可有效缓解验证码的弹出频率。
**1. 使用官方 Chrome(推荐)**
不推荐使用 Chromium,因为它缺少 MP4/H.264 解码器等插件,且被大量爬虫使用,会成为明显特征。
```bash
# 从 Google 官方下载 Chrome DEB安装包
# 大陆服务器可手动下载安装包 https://www.google.com/chrome/?platform=linux
curl -LO https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt install ./google-chrome-stable_current_amd64.deb -y
```
**配置方式**:
修改 `config.yaml`,可使用`which google-chrome`指令查询路径
```yaml
chrome:
path: "/usr/bin/google-chrome"
```
使用环境变量可跳过 Puppeteer 自动下载 Chromium
```bash
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"
```
**2. 优化字体指纹**
Linux 服务器通常只安装了极少量字体(甚至没有中文),这会增加指纹特征。
**安装常用字体**:
```bash
# 安装中文字体(必备,否则中文提示词将显示方框)
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei
# 安装微软核心字体(减少字体指纹差异)
sudo apt install ttf-mscorefonts-installer
```
</details>
---
## 📊 设备配置
@@ -433,9 +340,9 @@ sudo apt install ttf-mscorefonts-installer
| CPU | 1核 | 2核及以上 |
| 内存 | 1GB | 2GB 及以上 |
经测试,本项目可在以下环境中稳定运行:
- Oracle 免费机:1C1G 配置,基于 Debian 12 系统。
- 阿里云轻量应用服务器:2C2G 配置,基于 Debian 11 系统。
经测试,本项目可在以下环境中运行:
- Oracle 免费机(有些卡顿,勉强能用)1C1G 配置,基于 Debian 12 系统。
- 阿里云轻量应用服务器(开发测试所用)2C2G 配置,基于 Debian 11 系统。
## 📄 许可证和免责声明
@@ -450,6 +357,8 @@ sudo apt install ttf-mscorefonts-installer
查看完整的版本历史和更新内容,请访问 [CHANGELOG.md](CHANGELOG.md)。
迁移前的 Puppeteer 版本已在分支中保留,但不影响使用的情况下不会再进行更新和修复!
---
**感谢 LMArena 提供图像生成服务!** 🎉
**感谢 LMArena 、Gemini 等网站提供图像生成服务!** 🎉