使用手册项目概览
v2.9.8 GitHub
 v2.9.8 OpenAI 兼容 本地部署 · 免费开源

把任意 AI 聊天网页
变成 OpenAI 标准接口

Universal Web-to-API 驱动你浏览器中已经登录的 ChatGPT、Gemini、DeepSeek 等对话网页,将其包装为兼容 OpenAI 格式的本地 API,供 SillyTavern、各类客户端与自动化工作流直接调用。

01导览

项目概览

本项目的核心思路:不再依赖官方 API,而是自动化你本地的浏览器——让脚本在你已登录的 AI 网站上输入问题、等待回复、提取结果,再按 OpenAI 的数据格式返回给任何客户端。

OpenAI / Anthropic 双协议兼容 多站点 · 多标签页并发 流式输出 图片 / 音频 / 视频回传 自动化恢复命令 函数调用转译

典型用途:统一本地接入方式;按站点或标签页组织不同工作流;在长文本场景下通过文件粘贴承载上下文;在调试时观察页面侧与请求侧的执行流程。

系统架构

请求从客户端进入后,会依次穿过路由层、调度层与驱动层,再由解析层把网页里的回复翻译回标准格式。理解这条链路,后面的配置章节会好读很多。

USER
客户端 / 调用方
SillyTavern / Chatbox / 代码集成 / 自动化脚本
OpenAI / Anthropic / Codex 请求
L1
接口与路由层
app/api
解析外部请求,提供标准兼容路由与流式流控
会话分发 / 并发调度
解析函数调用
L2
标签页池与生命周期
app/core/tab_pool
标签页保活、检测、重连,维护跨请求的会话重用
L5
函数调用兼容层
app/services/tool_calling
将 tool_calls 转译为提示词,网页端分步执行后合并返回
网页驱动与交互操控
L3
网页自动化执行引擎
app/core/workflow
基于 DrissionPage 操控,内置指纹逃逸与低熵仿真操作
注入与响应拦截
拦截指令钩子
L4
流式监控与响应解析
app/core/parsers
监听网络事件与 DOM 变化,增量解析并实时流式推送
L6
指令引擎与拦截钩子
app/services/command_engine
内置指令拦截(附件验证、截屏),防注入与校验
底层核心支撑模块
L7
配置与预设中心
app/services/config
维护 sites.json 站点规则、环境状态检测,支持热重载
L8
平台工具箱
app/utils · app/models
日志存储与脱敏、多模态解析支持、全局数据模型
执行引擎 → 依赖 → 配置中心 指令引擎 → 读写 → 配置中心 流式监控 → 工具包 → 平台工具箱
02导览 · 必读

来自作者:使用预期

这七条是作者的维护说明,动手前先扫一遍,遇到问题时能省不少排查时间。

1 · 站点突然不能用了?优先检查选择器

网站改版后最易失效的是选择器(告诉脚本输入框、发送按钮、结果容器在哪的 CSS 规则)。大多数故障检查选择器即可,而非解析器。标准修法:

  1. 在受控浏览器里对目标元素右键 →「检查」。
  2. 把元素树截图或复制出来发给 AI,让它写出新的选择器。
  3. 回控制台粘贴替换,重新测试。

如果不是选择器问题,才轮到提取器 / 解析器——那需要拦截网络请求、分析响应结构,难度高得多。

2 · 各站点的维护覆盖范围

Gemini、DeepSeek 是作者日常使用最多、维护最及时的站点。其它站点不保证第一时间跟进,遇到问题更推荐加 QQ 群反馈,通常比 Issue 更快。

3 · Function Calling 尚不稳定

它比较依赖模型本身的理解能力,可能存在一定问题。详见「函数调用」章节的预期管理。

4 · 遇到问题,优先让 AI 帮你分析

选择器失效、配置写错、工作流顺序不对——把现象、日志截图、元素树交给 AI,通常比等人工回复快得多。

5 · 反馈 Bug 的正确姿势

说清做了什么、期望什么、实际看到什么,附上 DEBUG 级别日志。表述不清时,先让 AI 帮你整理一版再发。

6 · 修好了欢迎分享回来

不管是更新的选择器还是补好的配置文件,分享给作者或群友都能让整个社区少走弯路。

7 · 项目的核心场景

本项目围绕酒馆 / RP(角色扮演)场景设计打磨。其它场景能用,但维护上偏向"能用就用,不保证持续深耕"。

03上手指南

快速开始

欢迎使用 Universal Web-to-API

本项目仅用于体验不同模型的效果,请合理控制使用频率,不要给目标网站带来额外负担。

先区分受控浏览器和普通浏览器

双击运行 start.bat 后,脚本会自动启动一个受控浏览器。打开 Windows 任务栏,你应该能看到它已经运行;接下来的登录和站点配置都要在这个浏览器里完成。

受控浏览器

由脚本启动并执行网页操作。请在这里打开 AI 站点、登录账号;API 请求执行期间,你可以正常操作或切换标签页查看内容。

普通浏览器

你日常使用、正在查看本教程的浏览器,不受脚本控制,也不能代替受控浏览器执行任务。

首次启动检查清单

第一次运行时按“进程 → 端口 → 浏览器 → 站点 → API”的顺序确认,任何一步失败都先停在当前层排查,不要直接反复点击发送。

  1. 启动脚本没有立即退出。start.bat 窗口应保持打开;若窗口闪退,在项目目录打开 PowerShell 执行 python start.py,保留完整错误信息。
  2. 端口可访问。在普通浏览器打开 http://127.0.0.1:8199/health。返回 JSON 且 HTTP 状态为 200 表示服务和浏览器均已就绪;若为 503,服务还在但受控浏览器未连接。
  3. 远程调试端口已监听。打开 http://127.0.0.1:9222/json/version;能看到 Browser 与 webSocketDebuggerUrl 才表示自动化连接正常。不要把该端口暴露到公网。
  4. 标签页池有可用页面。控制面板 → 标签页池中至少有一个目标站点,状态为“空闲”;新标签页加载完成后等待 2–3 秒再刷新列表。
  5. 先做最小请求。使用 /v1/models 检查路由,再发送一句短文本;确认成功后再启用流式、多模态或函数调用。
端口检查失败时的快速判断

8199 无响应通常是服务未启动或端口被占用;/health 返回 503 通常是 Chrome 尚未连上;9222/json/version 无响应则是浏览器启动参数、路径或端口冲突。先看启动窗口中的第一条 [ERROR],再到「控制台 → 日志」按 RequestID 追踪。

选择一个已适配的站点

受控浏览器的基础引导会列出若干已经适配的站点。列表中存在的网站代表已经完成适配,你可以任选一个使用;本教程以 Gemini 为例。点击下方卡片复制网址,再粘贴到受控浏览器的地址栏中打开。

想适配新的站点?不需要等待项目更新

你可以自行添加新站点,步骤并不复杂。请查看「新增站点 · AI 识别」,其中介绍了自动识别与手动配置两种方法。

以 Gemini 为例完成首次配置

  1. 访问 Gemini。在受控浏览器中打开 https://gemini.google.com/,等待页面完整加载。
  2. 登录个人账号。完成登录并进入真正可以发送消息的对话页面。
  3. 整理页面状态。将页面语言设置为中文,并确保左侧聊天侧边栏处于展开状态;这是脚本稳定识别和操作页面的必要条件。
  4. 确认标签页已被接管。打开「控制面板 → 标签页池」,此时应当能看到刚才打开的 Gemini 页面已经处于标签页池的控制之中。

连接你的客户端

标签页进入控制后,选择合适的路由地址,填入任意支持 OpenAI 兼容接口的前端即可使用,例如 Chatbox、SillyTavern、Cherry Studio 等。

不想重新收藏网页或逐个登录?

你可以关闭浏览器后,复制一份自己现有的 Chrome 用户配置到项目专用的浏览器配置目录中,以复用书签、历史记录和登录状态。请不要直接使用正在运行的系统默认配置目录,也不要分享包含 Cookie 的配置副本。完整操作步骤与目录示例见「浏览器登录态复用」。

04上手指南

连接 API

本项目提供兼容 OpenAI 格式 的接口,绝大多数支持"自定义 OpenAI 端点"的客户端都能直接使用。

选择路由并填写连接信息

服务提供商 Provider

选择 OpenAI / OpenAI 兼容 / 自定义。不同客户端叫法不同,选那个能填写自定义地址的即可。

API 密钥

未启用认证(AUTH_ENABLED=false)时填占位值如 sk-local 即可。启用后必须与 .env 的 AUTH_TOKEN 一致;控制面板密钥 DASHBOARD_AUTH_TOKEN 是另一套,不要提供给 API 使用者。

Base URL 形态地址适用场景
默认 · 自动分配http://127.0.0.1:8199/v1不关心具体站点或标签页时使用
指定站点域名http://127.0.0.1:8199/url/gemini.google.com/v1自动匹配该站点的标签页
指定标签页http://127.0.0.1:8199/tab/1/v1编号见「标签页池」,适合绑定过预设的标签页
指定完整 URLhttp://127.0.0.1:8199/tab-url/{token}/v1token 从「标签页池」复制,严格匹配当前 URL
站点 + 预设路径http://127.0.0.1:8199/url/gemini.google.com/pro/v1同一站点拆多种用途时最推荐,直接作为 Base URL
完整路径补全在末尾补上 /chat/completions部分客户端要求填写完整接口路径

模型名称 (Model):建议填写便于客户端保存配置的占位名(如 web-api、gemini-web)。实际响应来源由当前打开的站点与预设决定。

测试步骤

把地址、密钥、模型名填好后,直接发一句正常对话进行测试。不建议点客户端里的"测试 API"按钮——酒馆(SillyTavern)的测试按钮发送的请求过短,部分站点不会正常响应。

单次请求指定预设的三种方式

聊天接口支持直接指定 preset_name,只对当前这一次请求生效,不改变站点默认预设。

bash
# 方式 A:直接写进路径(最推荐,适合作为 Base URL)
curl "http://127.0.0.1:8199/url/gemini.google.com/pro/v1/chat/completions" ^
  -H "Content-Type: application/json" ^
  -d "{\"model\":\"any\",\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}]}"

# 方式 B:放到 URL 查询参数
curl "http://127.0.0.1:8199/url/gemini.google.com/v1/chat/completions?preset_name=pro" -d "..."

# 方式 C:放到请求体
{"model":"any","messages":[...],"stream":false,"preset_name":"pro"}
优先级规则

三处都传了预设时,按 路径里的预设 > URL 查询参数 > 请求体 的顺序生效。

查询参数与调度

参数示例作用
selector?selector=round_robinfirst_idle 优先空闲(默认)/ round_robin 轮询 / random 随机
tab_index?tab_index=2在域名路由下进一步锁定某个固定标签页
preset_name?preset_name=pro本次请求临时覆盖预设

完整调用示例

bash
# 1. 模型列表(连通性检查)
curl http://127.0.0.1:8199/v1/models

# 2. 默认聊天(自动分配标签页)
curl http://127.0.0.1:8199/v1/chat/completions ^
  -H "Content-Type: application/json" ^
  -d "{\"model\":\"any\",\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}],\"stream\":false}"

# 3. 按域名路由 + 轮询调度
curl "http://127.0.0.1:8199/url/gemini.google.com/v1/chat/completions?selector=round_robin" -d "..."

# 4. 按域名路由 + 固定标签页
curl "http://127.0.0.1:8199/url/gemini.google.com/v1/chat/completions?tab_index=2" -d "..."

# 5. 域名 + 预设路径
curl http://127.0.0.1:8199/url/gemini.google.com/pro/v1/chat/completions -d "..."

# 6. 精确 URL 路由(token 从标签页池复制)
curl http://127.0.0.1:8199/tab-url/abc123def456/v1/chat/completions -d "..."

# 7. 精确 URL 路由 + 预设路径
curl http://127.0.0.1:8199/tab-url/abc123def456/pro/v1/chat/completions -d "..."

API 端点速查

下面是日常集成会用到的公开端点。除 /health 外,服务端点是否要求认证取决于「系统设置」中的开关;启用后统一使用 Authorization: Bearer <AUTH_TOKEN>,Anthropic 客户端也可使用 x-api-key。

方法路径用途 / 关键字段认证
GET/health服务与受控浏览器健康检查;浏览器未连接时返回 503免认证
GET/v1/models列出当前可路由模型与站点;适合作为连通性探针服务认证
POST/v1/chat/completionsOpenAI Chat Completions;支持 messages、stream、tools服务认证
POST/v1/responsesOpenAI Responses / Codex 兼容;支持 input、instructions、previous_response_id服务认证
POST/v1/messagesAnthropic Messages / Claude Code 兼容;支持 system、messages、max_tokens服务认证
POST/v1/messages/count_tokens返回 Anthropic 客户端所需的最小 token 估算结果服务认证
GET/v1/provider/capabilities机器可读能力清单、协议开关、模型列表与就绪度服务认证
GET/v1/provider/status运行时快照:浏览器、标签页池、请求计数;不返回 Cookie 或令牌服务认证
GET/docsFastAPI 交互式 OpenAPI 文档;仅在调试模式开启时提供按部署配置
bash
# 健康检查(无需令牌)
curl -i http://127.0.0.1:8199/health

# 开启认证后查询能力清单
curl http://127.0.0.1:8199/v1/provider/capabilities ^
  -H "Authorization: Bearer YOUR_AUTH_TOKEN"

# Anthropic 客户端也可使用 x-api-key
curl http://127.0.0.1:8199/v1/messages/count_tokens ^
  -H "x-api-key: YOUR_AUTH_TOKEN" -H "Content-Type: application/json" ^
  -d "{\"model\":\"web-api\",\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}]}"

响应头诊断

路由类接口会返回诊断响应头,方便确认后端实际采用了哪种分配策略。

响应头含义
X-Tab-Selection-Mode实际选择模式:first_idle / round_robin / random / tab_index / exact_url
X-Requested-Route-Domain域名路由请求的目标域名;动态路由尚未选定标签页时也会返回
X-Resolved-Tab-Index已明确解析到固定标签页时返回的编号
X-Resolved-Route-Domain已解析标签页当前所属域名
X-Resolved-Exact-Url精确 URL 路由最终命中的完整 URL
X-Resolved-Preset-Name路径或参数最终命中的预设名称
动态域名路由说明

调用 /url/{domain}/... 且未传 tab_index 时,真正的标签页在工作流开始执行时才确定,因此这类响应只会带 X-Requested-Route-Domain 与 X-Tab-Selection-Mode,不会提前伪装成已解析到某个标签页。

登录状态与上下文上限

  • 推荐登录:登录你自己的账号,本地接口才能继承当前会话的站点能力与历史上下文。
  • 免登录亦可:若网站在未登录状态下允许对话,无需登录也能直接通过 API 调用。
上下文长度限制

受网站输入框单次可容纳字符上限约束,上下文不能太长,否则请求直接失败。长文本场景请开启「文件粘贴」。已测试单次最大发送长度:ChatGPT 约 200k 字符;Gemini 无会员约 30k,Pro 会员目前无明确上限;Arena AI 约 120k。

开发者协议兼容(实验性)

Claude Code 连通性支持

内置 Anthropic 风格协议的初步支持:兼容 /v1/messages、/v1/messages/count_tokens、/v1/models;除 Authorization 外亦解析 x-api-key,响应补充 request-id 诊断头。自 2026-05-28 起已完全适配。

Codex / Responses API(VSCode)

暴露实验性 /v1/responses 端点,自动转换并复用 /v1/chat/completions 调度逻辑(支持 input、instructions、tools 载荷);流式模式生成 Codex 规范 SSE 事件,解决工具输出中断问题。

以上协议由于缺乏大规模工具用例覆盖,实际稳定性请按需测试。

05上手指南

控制台与请求监控

控制台默认运行在 http://127.0.0.1:8199/。请求队列、运行日志和站点配置都在这里查看与管理。

127.0.0.1:8199
5 站点Active Sites
4 / 8Tabs Idle
99.4%Success Rate
[ROUTE] POST /url/gemini.google.com/v1/chat/completions
[POOL] tab#3 acquired · routing groups match
[STREAM] response finished · 6.8s (DOM Fallback)
[NetworkMonitor] First response timeout 300s reached, falling back to StreamMonitor

控制台界面结构示意

中控侧边栏

显示全局健康度与受控浏览器的连接状态(默认端口 9222),并可切换到首页、站点配置、标签页池、请求监控、命令、日志与设置。

请求监控 (Request Monitor)

显示受控浏览器与后端的内存占用、累计请求量,以及历史请求明细与执行链追踪;点击单条记录可查看详情。

动态管理

为不同站点、不同标签页指派预设,配置工作流与拦截规则,或临时覆盖系统参数。

请求异常调试与排查步骤

请求出问题时,按下面的顺序排查:

  1. 查看请求监控列表:点击失败记录,检查该请求是在哪个阶段失败的——是排队获取标签页时超时(acquire_timeout,默认 60s),还是网络监听等首包响应时超时(first_response_timeout,默认 300s)。
  2. 联合日志追踪:在日志页面中,通过请求的唯一 RequestID 或短追踪哈希,把 [ROUTE](路由)、[POOL](标签分配)、[INPUT](输入)、[STREAM](输出捕获)与 [NetworkMonitor] 各阶段的日志串起来看,定位卡在哪一步。
  3. 隔离问题标签页:如果某个标签页频繁卡死或变慢,到「标签页池」查看它的锁定状态,用取消按钮中断,或调用调试接口释放。
系统自愈与调试 API 接口
  • GET /api/system/request-history?limit=200 — 读取近期请求审计记录(含报错日志摘要)
  • GET /api/system/request-history/{request_id} — 读取单条请求详情(前端详情弹窗同款)
  • POST /api/debug/cancel-current — 取消当前正在处理的阻塞请求,支持指定 tab_id
  • POST /api/debug/force-release — 强制清空所有请求锁和标签页锁,重置池状态(最后手段)
06核心配置

选择器配置 Selectors

每个站点的每个预设都需要定义一组 CSS 选择器,告诉程序去哪里输入、点哪里发送、从哪里读回复。配置完全在控制台的可视化表单中回填,不需要修改任何 JSON 文件。这是所有配置里最关键、也最容易因网站改版而失效的部分。

先认识 3 个核心字段(在选择器配置面板顶部输入)

输入框选择器 (input_box)

指定聊天输入框(如 textarea)在页面中的位置。必填

发送按钮选择器 (send_btn)

网页上用于发送的按钮。必填

AI 回复容器 (result_container)

AI 回复文本渲染所在的外层大容器。必填 · 最易出错

各字段的常用填写示例:

界面配置输入框常用填入示例(CSS选择器)定位技巧说明
输入框选择器 (input_box)textarea[id='prompt'] 或 textarea优先寻找含有 id 或专属 class 的 textarea 标签。
发送按钮选择器 (send_btn)button.send-btn 或 button[aria-label="发送消息"]选择含有发送小飞机图标或带有 Send 文本的 button 元素。
AI 回复容器 (result_container).markdown-body 或 div.message-content务必选择包裹整条 AI 回复文本的外层容器。如果选小了,会漏抓格式或发生字符截断。
新建对话按钮 (new_chat_btn)button.new-chat 或 a[href="/"]页面左上角或侧栏的新建对话按钮,按需补充。
怎么找得更稳
  • 在网页中右键点击目标元素(例如输入框) → 检查,查看其 HTML 属性。
  • 优先使用 id、data-testid、aria-label 这类具有明确语义的属性定位;如果 Class 名字是一长串无规则的随机字母数字(动态混淆 Class),先别用它,否则网站一刷新或改版就会失效。
  • 每一项输入完成后,点击右侧的【测试】按钮,确认能命中。

填写顺序建议

  1. 在受控浏览器中打开目标网站,右键输入框选择“检查元素”,把定位器填入 input_box。
  2. 再找到发送按钮,把其定位器填入 send_btn。
  3. 在对话框中发一条消息,等 AI 回复完毕后,找到包裹回复内容的最外层大 DIV,填入 result_container。
  4. 每填一项就点一次该字段右侧的「测试」,确认能命中——切忌全部填完再一起排查。
  5. 前三项稳定后,再考虑补充 new_chat_btn 或其他附件上传的选择器。
选择器测试工作台

控制台里的测试按钮已升级为「选择器测试工作台」:点击后不仅能得出是否命中,还会以树形图返回命中 DOM 详情、系统推荐候选选择器、潜在定位风险,并支持点击推荐的候选一键回填到配置框中。

07核心配置

工作流与可视化交互调优

工作流定义了一轮 API 交互在受控浏览器中的执行动作顺序(如清除历史、输入提示词、点击发送以及等待流式完成)。最新的工作流支持在控制台进行完全可视化的拖拽与编辑,无需编写 JSON 代码。

可视化节点编辑器

在站点配置的【请求工作流】区域,所有动作按执行顺序排成一条节点链:

  • 添加步骤:点击“新增步骤”在链末追加动作卡片;也可以套用内置模板,一键生成最短可用工作流。
  • 调整顺序:按住卡片左侧拖动即可。
  • 删除步骤:点击卡片右上角的“垃圾桶”图标。
  • 标记必需 / 可选:每张卡片底部有一个“必需步骤”勾选框——默认勾选表示必需(找不到目标元素就报错);取消勾选即变为可选,找不到元素时会自动跳过该步骤。
界面动作节点表单可配置属性策略含义说明与调优推荐
CLICK
点击元素
目标选择器 (Target)
验证点击结果 (Verify)
失败后自动重试
点击指定按钮(如 new_chat_btn)。勾选“验证点击”后会在点击后二次校验,没生效就自动重试,新建会话时很有用。
FILL_INPUT
填充输入
目标输入框选择器 (Target)
启用稳定等待
把提示词粘贴或键入目标输入框。建议勾选“输入框稳定等待”,避免页面没加载完导致粘贴粘连或失焦。
WAIT
延时等待
等待秒数 (Value) 暂停指定秒数(如 0.5),用于等待过渡动画或异步请求。
KEY_PRESS
按键
按键键值 (Target)
内置常用组合下拉
模拟键盘按键。发送按钮不可靠或不存在时,可以追加一个 Enter 动作触发发送;支持 Ctrl+Enter、Shift+Enter 等组合键。
SELECT_MODEL
选择请求模型
模型选择器 (Target) 在支持切换模型的站点上,按请求携带的模型名去页面上点选对应模型项,实现"同站点按模型分流"。
PAGE_FETCH
页面直发
发送方式(页面直发配置) 使用当前预设的"页面直发"配置直接提交已构造好的 Prompt(绕过逐步点选)。若直发失败且回退模式设为工作流,会继续执行后面的填入 / 按键 / 等待步骤兜底。
COORD_CLICK
坐标点击
X / Y(viewport 坐标)
随机半径
按 viewport CSS 坐标(非屏幕坐标)点击某个位置,可设随机半径抖动。适用于没有稳定选择器、只能靠位置点击的按钮。
COORD_SCROLL
模拟滑动
起点 / 终点坐标 在指定起终点之间模拟滚动。普通模式直接派发滚轮事件,低熵模式会按站点 stealth 配置走人类化轨迹。
JS_EXEC
执行 JavaScript
JavaScript 代码 在当前页面上下文执行一段自定义 JS,用于处理特殊弹窗、预处理页面状态等常规节点覆盖不到的场景。
READONLY_HINT
只读提示
标题 / 正文 / 语气 纯说明卡片,执行时不会点击、输入或等待页面,仅用于在工作流里给自己或他人留下备注。
STREAM_WAIT
等待输出捕获
结果容器选择器 (Target) 等待 AI 的流式响应输出结束,并捕获内容。常规 UI 工作流必须以它作为最终收尾步骤(改用 PAGE_FETCH 页面直发的链路除外)。

下拉里的动作以控制面板实际选项为准;本表覆盖当前可选的全部节点类型。

防风控与开头注入

在防爬严格的站点(如 GPT、Gemini、Arena)上,频繁发送模式相似的 Prompt 容易触发限频。可在控制面板开启两种扰动手段:

  • 开头追加随机占位片段:发送时在 Prompt 前自动加一段无意义前缀(如 测试号,无实际意义: [随机混淆码]),“开头片段数”与“说明文本”都可自定义,让每条请求内容不完全一致。
  • 提示词内随机字符插入:从自定义字符集(如 abc123※☆)中随机取一个字符,插入提示词的随机位置。

输入框稳定与自愈等待

部分网站点击新建对话后会重建输入框节点,导致粘贴时失焦或失败。可在站点配置的【高级功能】中调整:

  • 输入框稳定等待:执行 FILL_INPUT 前,先确认输入框节点连续多次检测保持稳定。
  • 自愈选项:可勾选“仅在刚点击 new_chat_btn 后启用”或“新建对话后等待 URL 切换”,配合“最长等待秒数”(如 1.5 秒)与“URL 匹配正则”,等页面就绪再填入。
  • 发送内容确认与自愈:点击 send_btn 后二次确认输入框已清空或明显变短;发现没发出去,就自动重试当前工作流。
08核心配置

响应检测与自愈重试

系统需要判定 AI 什么时候开始输出、什么时候算说完,并从中捕获流式文本。有两种检测模式,支持自动回退。

检测模式流式输出工作方式
DOM 模式 通用推荐✅监听网页 DOM 节点的字符变化,不需要了解站点接口,兼容性极高。
网络拦截模式✅(需适配)直接挂载 CDP 网络监听事件,阻断并获取 XHR/Fetch 数据包,还原代码和公式更精确。若首次响应超时,会自动向 DOM 模式回退。

网络监听超时自动回退

网络拦截模式更精准,但网页改版或解析器报错时可能捕获失败,让请求一直挂着。对应的保护机制:

  • 首次响应超时自动回退:发送后开始计时(first_response_timeout,默认 300s,在流式配置的 network 项下)。超时仍没有流量命中 listen_pattern 规则,就自动回退到 DOM 模式(StreamMonitor)继续从页面抓取文本,请求不会因此挂起。

发送确认与重试

部分站点点击发送后偶发无响应,可在【发送确认与重试】中配置:

  • 自动再点一次:点击 send_btn 后,若观察窗口内(如 1.8 秒)没有出现输入框清空、网络活动或生成状态,就再点一次发送。
  • 重试频次:最大支持重试 2 次,两次重试间隔支持定制(如 0.6 秒)。
  • 防中断保护:一旦判定 AI 已开始生成(或发送按钮变成了停止/中断状态),会立即停止重试,避免二次点击切断正在生成的回复。

DOM 模式结束判定公式

稳定判定条件
生成结束判定 = (连续稳定次数 ≥ 稳定判定次数) AND (静默时间 > 静默超时阈值)

DOM 检查时,内容没有再变化,稳定计数增加,静默时间累加。两个阈值同时达到时,判定本轮回复完成。全局硬超时(DOM 模式默认 600 秒,即浏览器常量里的「最大超时」;网络拦截模式则另有各自的首包与硬超时)是本轮监听的物理保底,无论如何都会在到点后强制收尾。

09核心配置

多预设管理系统

预设允许你为同一个站点创建多套独立的配置方案,并分配给不同标签页。每个预设包含独立的选择器、工作流、流式配置、多模态提取、文件粘贴等全套配置,互不影响。

标签页编号绑定的预设名称实际配置差异与工作场景
标签页 #1主预设 (默认)常规工作流(新建会话)、开启大文本文件粘贴。适用于大段长文本翻译。
标签页 #2快速识图简化工作流(不重置会话)、开启多模态图片提取、设置较短的响应超时。适用于识图。
标签页 #3网络拦截调试开启网络拦截模式、绑定专用解析器。适用于代码块与公式的精确截获。

预设操作

都在【站点配置】面板里完成:

  1. 切换与新建:在页面顶部的“当前预设”下拉框选择要修改的预设,或点击【+ 新建预设】输入新名字。新预设会复制当前预设的全部参数,之后各自独立调整。
  2. 管理与设为默认:点击下拉框旁的“管理预设”可以改名或删除。点击【⭐ 设为默认】后,该预设作为 API 请求的保底配置。
  3. 绑定到标签页:切换到【标签页】选项卡,每一行代表一个正在运行的标签页,在“预设”列的下拉菜单里选中预设名即可绑定。
  4. 单次请求临时覆盖:不想改绑定时,在请求 URL 上加参数(如 /v1/chat/completions?preset_name=快速识图),只对这一次请求生效。
自动持久化

面板上的新建、修改、删除都会自动保存到 config/sites.json,不需要手动编辑 JSON。

对话复用与新建会话控制

  • 对话复用窗口(秒):大于 0 时,同一标签页在窗口期内收到的后续请求会直接复用当前会话续聊;设为 0(默认)表示关闭复用,每次请求都可能触发工作流开头的"新建会话"逻辑。
  • 强制新建对话:开启后即使配置了大窗口也忽略复用,每次都强制新开会话——特别适合测试无历史干扰的独立 Prompt 流程。
删除不可撤销

删除预设无法恢复,且每个站点至少需要保留一个预设——只剩一个时删除按钮会被禁用。

10核心配置

标签页池与会话隔离

标签页池(Tab Pool)负责把并行的 API 请求排队、分发到合适的标签页,实现单浏览器多会话并行。

核心生命周期与超时参数

配置参数默认值说明
max_tabs5允许开启的最大标签页数量上限。超出限制后,新请求必须排队等待。
min_tabs1保留在内存中的最小标签页数量,防止频繁开启/关闭页面。
idle_timeout300 秒标签页空闲超时阈值。超过该时间没有任何 API 请求时,标签页会自动关闭释放内存。
acquire_timeout60 秒API 请求排队获取空闲标签页的最长等待时间。超时则返回 429 或 504 错误。
stuck_timeout180 秒页面交互卡死超时时间。由于 DOM 监听死锁或站点假死超过该时间,强制回收标签页。

独立 Cookie 标签页

对 arena.ai 这类需要隔离 Cookie 的站点(避免多标签页共用同一登录会话),【高级功能】中提供:

  • 独立 Cookie 标签页:开启后,该预设创建的标签页在独立的匿名会话容器中运行,各标签页的 Cookie、Local Storage 彼此隔离。
  • 自动接管手动新标签页:人工新建或弹出的标签页会被脚本接管,关闭原页面并转为独立的受控窗口。

域名路由分组 (Route Groups)

用于多账号、多业务线的隔离。可以为不同请求定义专属的标签页路由组(在配置文件或标签面板管理):

  • 工作逻辑:为指定域名(如 chat.deepseek.com)绑定一组专用标签页,或按传入的 URL token 指定独立会话。不同路由组互不干扰,可实现多账号轮询分流。
  • 分配策略 (allocation_mode):支持 first_idle(最先空闲)、round_robin(同组轮询分摊)与 random(随机选择,防轨迹侦测)三种分发逻辑。
  • 错误标签页保留 (preserve_error_tabs):勾选后,标签页发生严重错误或被风控拦截时不会被关闭,控制台亮起报警,方便进入受控浏览器人工处理。

常用路由方式一览

方式接口 URL 格式工作说明
自动分发/v1/chat/completions系统根据全局分配模式挑空闲页面。
域名指定/url/gemini.google.com/v1/chat/completions只分发到 gemini.google.com 的可用标签页。
标签指定/tab/3/v1/chat/completions只通过编号 #3 的标签页发送请求。
URL 短哈希/tab-url/{token}/v1/chat/completions路由到该 token 对应会话 URL 的标签页,严格匹配。
11高级能力

多模态提取与媒体配置

【多模态提取】面板管理如何从网页中提取图片、音频、视频,并转换成客户端可直接使用的本地链接或 Markdown 图片标签。全部在面板里配置,不需要改 JSON。

1. 基础开关与提取范围

  • 启用多模态提取(开关):全局总开关。勾选后,系统才会在对话完成时去扫描网页里的图片/视频。
  • 提取策略模式(下拉框):
    • 提取所有 (all) — 网页上生成的全部图片或媒体文件一并打包返回。
    • 仅首个 (first) — 仅提取网页回答中出现的第一张图片,适合标准的单图输出场景。
  • 媒体文件大小限制(数字输入框):单位为 MB(默认 10)。超过此大小的媒体文件将被忽略,防止超大视频/无用底图占满服务器带宽。
  • 下载二进制资源 (Download Blobs):开启后,自动下载网页里的二进制 Blob 媒体并转换为持久本地链接,防止因浏览器页面关闭导致临时链接失效。

2. 子模态参数配置(图片 / 音频 / 视频卡片)

可分别为每种媒体开启提取,并配置对应的运行策略与等待时长:

界面配置项可用运行策略(下拉菜单)策略含义说明与推荐场景
启用状态 (Enabled)
勾选框
无 控制是否启用当前类别(图片/音频/视频)的提取。
运行策略 (Run Policy)
下拉框
① 仅普通扫描
(generic_only)
② 按信号等待 推荐
(on_signal)
③ 有朗读按钮才探测
(probe_if_trigger_found)
④ 始终等待
(always_probe)
  • generic_only:只快速扫一眼现有 DOM,不触发任何长等待或录音(如 Gemini 直连返回)。
  • on_signal:当检测到正在生成的占位提示或正在上传的文件信号时才进行长等待,效率最高。
  • probe_if_trigger_found:【音频专用】先侦测页面是否有可点的朗读/听书按钮,有才进入捕获流程。
  • always_probe:强制每次对话完都硬等媒体加载,仅在确定每轮必出媒体时开启。
快速探测时间 (秒)
数字框 (默认 1.0)
无 发送完消息后,先用很短的时间(如 1 秒)扫描有没有媒体生成信号;没有就直接结束,避免白等。
最终等待时间 (秒)
数字框
无 确认有生成信号后,给媒体加载与下载预留的最长时间(图片可填 45,视频可填 90)。超时仍没加载完则报错返回。

3. 提取源定位(DOM 选择器配置)

【元素选择器】用来告诉脚本媒体在页面的哪个位置,避免误抓广告或头像:

  • 媒体选择器 (Selector):指示媒体标签。例如图片填 img,视频填 video, video source。
  • 容器选择器 (Container Selector):非常重要,用来圈定提取范围(如 .result-content)。系统只抓取该容器内的媒体,从而避开顶栏、侧边栏的无关图片。

4. 页面朗读音频捕获(TTS 语音录制)

除了抓取网页里已有的 audio 节点外,如果想录制 AI 的“在线朗读”发音,可以展开并配置【朗读捕获】表单:

  • 启用朗读录制 (audio_capture_enabled):勾选后,系统会在文本输出完成后,去寻找并自动点击网页中的“朗读”或“发声”按钮来捕获音频。
  • 朗读按钮选择器 (audio_trigger_selector):填入发音按钮的精确定位器。
  • 按钮文本兜底 (audio_trigger_labels):当选择器不稳定时,可通过文字(如 "朗读", "发音", "收听")匹配按钮。
  • 网络音频直抓 (url_patterns):设置过滤关键词(如 tts、voice)后,播放时若有匹配的网络音频流,会优先直抓合成,失败时降级为页面内录音兜底。
返回格式

图片以 Markdown 标签 ![image](/download_images/xxx.png) 返回;音频、视频以链接 [audio_0](/download_images/xxx.mp3) 返回,SillyTavern 等客户端可以直接显示和播放。

12高级能力

文件与附件发送判定

当 Prompt 超过网站输入框的长度限制时,系统会自动把它写入临时文件,通过网页的附件上传通道发给 AI,以此承载超长上下文。

文件粘贴配置

在站点配置的【文件粘贴模式】板块配置:

界面配置表单项建议值/示例作用说明与推荐场景
启用状态开关 开启 / 关闭 控制是否启用大文本自动转化为文件上传的拦截机制。
阈值 (字符数) 40000 当输入的消息字符数超过该值时,自动拦截普通文本发送,转化为附件上传通道。建议设为目标网站输入框物理字数上限的 70% 左右。
临时文件类型
下拉菜单
① TXT
② PDF
③ ERROR
  • TXT:生成临时 .txt 纯文本文件并上传。最常用、速度快。
  • PDF:生成临时 .pdf 文档并上传。在某些对 PDF 拥有深度阅读优化或只支持文档上传的 AI 平台上(如 Claude、Gemini 等),选择 PDF 格式常能获得更好的段落级格式保持。
  • ERROR:不做转换上传,直接向 API 调用方抛出错误响应。适合需要对长提示词强制限额的场景。
引导文本 上传的文件内容即为上下文,请据此回复 文件上传成功后,系统在聊天输入框里自动灌入并发送的指令文本,用来引导 AI 优先去阅读和分析刚刚上传的附件。
上传信号超时 (秒) 2.5 秒 触发附件上传动作后,等待网页端成功弹出“上传中”或“挂载就绪”预览芯片的最长侦测等待时间。
上传后稳定等待 (秒) 0 秒 识别到附件就绪后,额外静止等待多少秒再点击发送(针对网络卡顿或需要文件二次解析的网站)。
上传完成后重新定位输入框 勾选 部分网站(如 Claude)在上传完文件后,原输入框会强制失焦。勾选后系统会在发送前自动重新定位并聚焦输入框,防止发送失败。
上传后专用输入框 selector .composer textarea 配合重新定位功能,指定上传完毕后重新聚焦哪一个输入框元素定位器(选填)。

附件发送判定

发送带附件的消息时(文件粘贴或图片粘贴),系统会观察预览就绪、发送按钮置灰、进入生成态等信号,确认附件真的发出去了:

界面配置项设置推荐作用说明
敏感度 (Sensitivity) 高 / 中 / 低 敏感度越高,对附件预览挂载/消失的检测越严格,判断上传状态也越早。
最大重试次数 2 次 检测到发送失败或附件未挂上时的最大自动重发次数。
重试间隔 0.6 秒 发生重试发送动作时的两次点击间隔时间。
最小冷却窗 1.5 秒 点击发送按钮到允许下一次发送的物理保护时间窗口,防止过度高频点击将页面判定卡死。
重试前短探测 0.12 秒 重试点击前,先做一次快速 DOM 探测的等待时间。
自动重试动作 点击发送按钮 / 按键发送 重发时的驱动模式:支持点击网页 Send 按钮或模拟发送按键。
重试按键 (retry_key) Enter / 自定义组合 按键重试时的物理按键组合(支持 Enter、Ctrl+Enter 或 Shift+Enter)。

高级附件规则

【高级附件规则】里还有几个开关:

  • 发送前必须看到附件已挂上页面:上传预览渲染出来后才允许点发送,避免文件没挂上就把消息发出去。
  • 没有观察到上传启动前,不允许判定 ready:防止网络卡顿造成脚本还未来得及触发上传就直接判为就绪发送。
  • 发送未确认时允许自动重试:在点击发送后若检测到输入框残留,自动执行再次点击或再次按键。
  • 发送按钮变 stop 时禁止重试 与 页面进入生成态时禁止重试:两个防打断选项,一旦判定 AI 已经开始生成响应,无论输入框有无残留,均自动封禁重试,避免将已产出的回复打断。
  • 安全上传限制:临时文件异常、后缀敏感(如 .exe、.bat)或体积超出站点限制时,自动报错拦截。
13高级能力

函数调用 Tool Calling

本反代兼容 OpenAI 标准的 tools 格式:把函数定义转译成结构化的 XML 调用块(<adapter_calls> / <call> / <arg>)注入网页端,再把 AI 的输出解析回标准格式。

底层工作逻辑

这不是官方 API 原生的函数调用。后端会将工具 schema 翻译成高可读性的 Prompt 注入会话首尾,在捕获到 XML 片段后,解析参数并回调本地执行。若返回格式错误,后端会自动发起单步聚焦修复或完整上下文修复重试。

环境变量参数(设置 → 环境配置 → 函数调用)

两个可调参数:

  • 最大返回结果字符限制 (TOOL_CALLING_MAX_TOOL_RESULT_CHARS):默认 300,000 字符,防止工具返回过大内容撑爆网页端的上下文窗口。
  • 零宽字符噪声注入 (TOOL_CALLING_PROMPT_PADDING_ENABLED 与 TOOL_CALLING_PROMPT_PADDING_OBFUSCATE):注入工具提示词时随机混入零宽字符(\u200b、\u200c、\u200d),降低被站点自动过滤识别的概率。

两种内部修复策略

自愈策略适合场景工作特征
聚焦修复 默认推荐大多数常规 Tool Calling仅发送“本次哪个字段或类型错了”及最小相关上下文,模型改动更精准。
完整上下文复杂多重参数,模型多次报错依然修不对将原对话与全量报错轨迹一并发回,信息更全,但可能分散小模型的注意力。
14高级能力

低熵模式(低干扰操作)

低熵模式把点击、移动、滚动和输入节奏做得更接近人工操作,用于改善某些站点上的界面兼容性和执行稳定性——不再是"瞬移 + 立即点击"的激进轨迹。

操作普通模式低熵模式
点击直接 CDP 命令模拟按压 → 微移 → 释放
移动瞬间跳转人类化曲线移动
空闲无动作随机微漂移(模拟手抖)
滚动直接调用滚轮事件驱动
操作间隔最小延迟随机 0.1–0.3 秒
  • 建议开启:页面对瞬时点击、直接粘贴或坐标跳变敏感的站点;普通模式下容易丢焦点、误判未发送、元素定位不稳定时。
  • 可以不开:普通模式已经长期稳定的站点。
配置方式

控制面板 → 选择站点 → 页面顶部勾选「低熵模式」。该设置按预设独立保存。

DrissionPage 补丁(必看)

为了减少额外连接带来的兼容性问题,项目会给 DrissionPage 打一个小补丁,让网络监听尽量复用浏览器主连接,而不是额外新建连接。

  • 自动执行:运行 start.bat 后自动安装依赖并执行补丁。
  • 手动执行:python patch_drissionpage.py
  • 恢复原文件:python patch_drissionpage.py --restore
重要

每次升级 DrissionPage 后都需要重新执行补丁。补丁支持重复执行,不用担心重复打坏。

Arena.ai 特别说明

即便开启低熵模式并关闭网络监听,半小时内连续对话约 10 条仍容易触发 Cloudflare 验证。该站点本身不适合长时间连续测试,低熵模式也不能保证稳定通过——更稳妥的做法仍然是降低频率。

15自动化与系统

自动化命令与异常恢复

自动化命令引擎按“触发条件 (Trigger) + 动作链 (Action Chain)”模式运行。配置位置:控制面板 → 命令。

简单触发动作链

直接选择触发条件,并可视化配置动作步骤,如:检测到 429 报错时,自动清空 Cookie 刷新并重置。

高级脚本模式

直接编写 JavaScript 或 Python 后端脚本,适合复杂的动态判定、状态探测与外部系统联动。

内置动作

动作名称功能描述核心参数
clear_cookies清空受控浏览器当前标签页的缓存与 Cookie无
refresh_page刷新当前标签页无
new_chat重置/新建对话绑定预设对应的 new_chat_btn
run_js / run_js_file在页面沙箱中执行 JS 代码段或读取本地 JS 文件运行JS 字符串/文件路径
wait显式延迟等待(防操作粘连)秒数(如 1.5)
execute_preset为该标签页切换并绑定新的站点预设预设 ID
execute_workflow手动触发当前预设的某个工作流工作流 ID
navigate导航控制跳转至新的 URL目标 URL
switch_proxy切换 Clash 代理组节点,更换出口 IP 以应对限频。Clash API 端口与新节点名称
send_webhook向外部服务器发送 Webhook 通知告警(如企业微信/钉钉/TG/Server酱)URL、Payload、Header
send_napcat联动 NapCat 机器人发送 QQ 消息提醒。NapCat 接口地址与目标 QQ/群号
click_captcha_challenge检测到 Cloudflare Turnstile 等人机验证时,自动寻找并点击验证按钮。验证码选择器
click_element / click_coordinates按选择器点击页面元素,或按 viewport 坐标点击指定位置。元素选择器 / X、Y 坐标
write_element / read_element在受控页面直接读取或写入指定 DOM 元素 / 本地存储。元素选择器、写入数据/变量名
http_request直接在当前受控网页的 Fetch 域中发起自定义网络请求。URL、Method、Payload
append_file将命令输出结果或报错数据追加写入到本地文件归档。本地文件绝对/相对路径
execute_command_group调用并执行另一组已定义的命令组,便于复用与串联多条自愈链。目标命令组名称 / ID
abort_task / release_tab_lock强制中断当前 API 任务,或强制释放标签页锁中断理由
典型组合:封禁自动恢复

创建 network_request_error 触发器(过滤 429 或 403),动作链依次配置 clear_cookies → switch_proxy(换出口 IP)→ refresh_page → new_chat。被限频后几秒内即可自动恢复重试。

16上手指南

新增站点配置流程

接入一个未适配的 AI 聊天网站,有两条路线:AI 自动分析生成,或纯手动配置。

路线 A:辅助 AI 自动分析 推荐

让辅助 AI 分析目标网页的 HTML,自动生成一套可用的初始选择器:

  1. 在受控浏览器里,新开标签页打开你想接入的 AI 聊天主页,并确保已经登录完成、停在对话输入页面。
  2. 对该站点发起第一次真实 API 请求(例如请求路由为:/url/example-ai.com/v1/chat/completions)。
  3. 后端发现这是个未配置的新域名,会自动捕获页面 DOM,调用设置中配置好的辅助 AI 接口分析。
  4. 分析通过后,自动为该域名生成初始主预设,写入识别到的选择器与最短工作流。
重要细节

自动分析只有在对未知域名发起第一次真实 API 请求时才会触发。仅仅在控制面板上点击“新增站点”或者是只在浏览器里打开网页但不发 API 请求,辅助 AI 是不会启动扫描的。

如何确认识别成功
  • 在【日志】页面中,会亮起 [AI分析] 日志字样,最终显示“分析完成,配置已自动写入 sites.json”。
  • 刷新控制台,左侧站点导航列表中会多出这个新增的域名。
  • 进入该站点的配置面板检查各选择器字段。务必人工核对 result_container(AI 回复容器)——页面嵌套过深时,这是辅助 AI 最容易认偏的字段。

路线 B:手动在控制面板配置调试

没有配置辅助 AI 密钥,或页面 JS 混淆严重时,直接手动配置:

  1. 点击控制台左侧侧边栏下方的【新增站点】按钮,在弹出的窗口里输入目标站点的域名(如 chat.example.com)。
  2. 在左侧列表点击新域名,系统会初始化一个“空白主预设”。
  3. 去目标站点右键检查元素,将核心三项(input_box、send_btn、result_container)填入选择器表单中。
  4. 在【工作流】节点链中拼出最短可用步骤(见下)。
  5. 依次点击核心字段右侧的“测试”,调试无误后保存。

最短可用工作流

能驱动绝大多数聊天网站的最简节点顺序如下,点【+ 增加步骤】依次拼入:

  1. CLICK 节点:目标填入 new_chat_btn,取消勾选“必需步骤”(即标记为可选),以防首次打开本就处于新对话时点击失败。
  2. WAIT 节点:时值设为 0.5 秒,给页面重置预留少许过渡时间。
  3. FILL_INPUT 节点:目标填入 input_box。这是将用户提示词灌入输入框的必需步骤。
  4. CLICK 节点:目标填入 send_btn,用于点击发送按钮。
  5. KEY_PRESS 节点:目标填入 Enter,取消勾选“必需步骤”(标记为可选),可在部分回车也能发送的网站上作为备用指令。
  6. STREAM_WAIT 节点:目标填入 result_container。用于捕获流式输出。必须以此步骤作为整条工作流的最终结尾。

调试顺序:按输入框 → 发送按钮 → 回复容器的顺序逐项测试选择器,三项都通过后再跑工作流;基本对话跑通后,最后再调文件粘贴阈值与多模态参数。

17自动化与系统

系统设置与配置管理

环境配置在控制面板 → 设置 → 环境配置中修改,主要放端口、认证、代理、辅助 AI 等全局设置——改完通常需要重启服务才能生效。

安全边界与部署建议

本项目默认面向单机、本地回环场景。它会代替你操作已登录的网页,并在日志、请求历史和浏览器配置中接触敏感内容;请把 API、控制面板和调试端口视为同一台机器上的高权限本地服务。

不要直接暴露到局域网或公网
  • APP_HOST=127.0.0.1 是默认且推荐值;改成 0.0.0.0 后,任何能访问该端口的设备都可能调用你的登录态网页。
  • 对外提供服务时必须同时开启 AUTH_ENABLED=true 与高强度随机 AUTH_TOKEN;控制面板使用独立的 DASHBOARD_AUTH_TOKEN,不要混用或分享。
  • 仅靠 CORS 不能保护 API。CORS 只约束浏览器跨域读取,脚本、命令行和同网段客户端仍可直接发请求;安全控制应依赖监听地址、防火墙和令牌。
  • 远程调试端口 BROWSER_PORT=9222 不具备应用层认证。务必仅监听本机,不要做端口转发,也不要把 chrome_profile/、Cookie 或日志目录提交到仓库。
.env(本机推荐)
# 仅本机监听;不要改成 0.0.0.0 再依赖 CORS 兜底
APP_HOST=127.0.0.1
APP_PORT=8199
BROWSER_PORT=9222

# 即使只在本机,也建议给脚本客户端设置令牌
AUTH_ENABLED=true
AUTH_TOKEN=请替换为至少32位的随机字符串

# 控制面板使用独立令牌;留空时才会沿用 AUTH_TOKEN
DASHBOARD_AUTH_ENABLED=true
DASHBOARD_AUTH_TOKEN=请替换为另一枚随机字符串

# 不需要跨域时关闭;需要时填写明确来源,不要长期使用 *
CORS_ENABLED=false
CORS_ORIGINS=http://127.0.0.1:8199
日志与备份也属于敏感数据

请求历史可能包含提示词、模型输出、站点域名和错误摘要。共享日志前先删除 Authorization、Cookie、完整 URL、图片 Data URI 与个人信息;导出配置或提交 Issue 前同样检查 config/、logs/、chrome_profile/。

环境配置速查

分组配置项当前值说明
服务监听地址127.0.0.10.0.0.0 允许外部访问,127.0.0.1 仅本地
监听端口8199HTTP 服务端口
调试模式falseAPP_DEBUG=true 才开启 /docs、/redoc 与详细错误信息;生产环境建议保持关闭
日志级别INFODEBUG / INFO / WARNING / ERROR
认证启用认证关闭是否要求 API 调用提供 Bearer Token
Bearer Token空启用认证时必须设置;用法 curl -H "Authorization: Bearer YOUR_TOKEN" …
CORS启用 CORS开启是否允许跨域请求
允许的跨域源*多个用逗号分隔,* 表示全部允许
代理启用代理关闭开启后浏览器经代理服务器访问网络
代理地址socks5://127.0.0.1:1080支持 socks5:// 或 http://
绕过代理localhost,127.0.0.1不走代理的地址,逗号分隔
AI 分析API Key空辅助 AI 的 API 密钥
API 地址http://127.0.0.1:8199/url/gemini.google.com/v1API 基础 URL(默认回指反代自身的 Gemini 路由,可改为任意 OpenAI 兼容端点)
模型名称gemini-3.0-pro使用的模型
HTML 最大字符数120000超过会截断以节省 Token
浏览器Chrome 调试端口9222浏览器远程调试端口
文件站点配置文件路径sites.json站点配置存放位置

浏览器登录态复用(高级)

希望脚本启动后直接继承你平时浏览器里的登录状态、Cookie 和扩展?请使用独立复制出来的用户数据目录,不要直接把脚本指向日常正在使用的系统默认目录。

两个必须知道的坑
  1. Chrome 136+ 安全调整:默认 Chrome 数据目录不再接受 --remote-debugging-port。把 BROWSER_PROFILE_DIR 直接写成系统默认 User Data,浏览器会被打开但调试端口起不来,脚本无法接管。见 Chrome 官方说明。
  2. 会话数据风险:浏览器用户目录可能包含登录态、Cookie、本地缓存和扩展数据。只建议复制你自己的本机目录副本用于本机调试;不要打包分享、提交仓库或发给别人。
  1. 确认原配置位置。在日常 Chrome 地址栏打开 chrome://version,记下「个人资料路径」;它通常类似 ...\Google\Chrome\User Data\Default。
  2. 完全退出浏览器和脚本。关闭所有 Chrome 窗口,并确认任务栏中没有仍在运行的 Chrome;复制使用中的配置容易得到不完整文件。
  3. 复制必要内容。从原始 ...\Google\Chrome\User Data 根目录复制 Local State,再复制刚才确认的配置子目录(如 Default、Profile 1)。
  4. 放入项目专用目录。把上一步的内容粘贴到项目根目录的 chrome_profile/ 中。完成后应能看到 chrome_profile\Local State 和 chrome_profile\Default(或对应的 Profile N)。
  5. 选择对应配置并重启。在 .env 中保持 BROWSER_PROFILE_DIR 为空,并把 BROWSER_PROFILE_NAME 写成复制过来的子目录名称;然后重新运行 start.bat。
.env
BROWSER_PATH=C:\Program Files\Google\Chrome\Application\chrome.exe
# 留空时使用项目根目录的 chrome_profile/
BROWSER_PROFILE_DIR=
# 必须与复制进 chrome_profile/ 的子目录名一致
BROWSER_PROFILE_NAME=Default
也可以把副本放在项目外

如果不想占用项目目录,可新建 C:\Users\你的用户名\AppData\Local\UniversalWebApiProfile,放入相同的 Local State 与配置子目录,再将 BROWSER_PROFILE_DIR 指向这个根目录。不要把它写到 ...\Default 这一层。

容易写错的地方

BROWSER_PROFILE_DIR 不要写成 ...\User Data\Default——它应该指向 User Data 这一层的"根目录";具体用哪个子配置文件夹,写在 BROWSER_PROFILE_NAME(常见值 Default、Profile 1、Profile 2)。

不在乎沿用登录态?

最省心:留空 BROWSER_PROFILE_DIR,让项目继续使用根目录的 chrome_profile/。隔离最彻底,也最不容易和日常 Chrome 互相影响——对大多数用户这是默认推荐方案。

浏览器常量(即时生效,无需重启)

控制面板 → 设置 → 浏览器常量。这里更适合放"运行时调优"参数:响应检测、操作延迟、标签页池回收等。下表按仓库当前 config/browser_config.json 列示,若你在面板中改过值,应以面板显示的实际值为准;首次启动时缺少配置文件则会回退到代码内置默认值。

分组配置项默认值说明
连接调试端口9222Chrome DevTools 远程调试端口
连接超时10 秒浏览器连接超时时间
操作延迟低熵延迟下限 / 上限0.03 / 0.1 秒低熵操作的随机延迟范围
动作延迟下限 / 上限0.06 / 0.14 秒点击 / 输入等动作的随机延迟,防止被识别为机器人
默认 / 备用等待3 / 1 秒查找元素的超时与首次失败重试超时
缓存有效期5 秒元素位置缓存时间
响应检测 🔑检查间隔(下 / 默认 / 上)0.3 / 0.5 / 1.0 秒轮询检测频率范围;默认间隔会在上下限之间动态调整
静默超时阈值5.0 秒🔑 内容不再变化多久后判定完成(备用阈值 6.0 秒)
稳定判定次数6 次🔑 连续多少次检查不变判定完成
最大超时600 秒单次请求绝对超时上限
高级首段响应初始等待180 秒发送后等待页面开始出现回复的最长时间
内容收缩阈值3 字符允许正文回缩的最大字符数,超过才视为异常回退——思考模型折叠思维链时可见文本会短暂缩短,此参数用作容差防误判
元素丢失上限10 次响应节点连续丢失达到上限后退出本轮监听;这是代码内置保护,不在面板中单独调节
输入验证消息最大长度1000000 字符单条消息本地最大字符数;目标站点或模型可能有更小的真实上限
消息最大数量1000 条单次请求本地最大消息数;目标站点或模型可能有更小的上下文上限
标签页池最大 / 最小保留标签页数12 / 1池容量上限与维持下限
空闲超时300 秒空闲多久后允许回收或重置
占用等待超时60 秒获取标签页会话的最大等待
卡死强制释放超时600 秒🔑 日志出现 stuck for ... force release 时调的就是它
上传历史对话图片关闭历史消息里的图片是否一起上传;当前配置关闭时只上传本次用户消息里的图片
日志显示INFO / DEBUG 日志可爱化开启 / 开启把常见日志润色成更易扫读的中文文案;仅阅读体验开关,不改真实执行,前端保留原始日志对照
Dashboard开启 · static/index.html是否开启 Web 控制面板及入口文件位置
最关键的两个参数

静默超时阈值决定"内容停多久算结束";稳定判定次数决定"要连续多少次都没变化才算结束"。真正的结束条件:(稳定次数 ≥ 稳定判定次数) AND (静默时间 > 静默超时阈值)。

配置管理与更新白名单

  • 保存:控制面板修改后点「保存」立即写入配置文件;大部分配置热重载即刻生效(环境配置除外)。
  • 导入 / 导出:支持导出全量配置或单个站点配置为 JSON,也可导入。预设随站点配置一并导出。
  • 备份:建议定期备份 config/ 目录。

更新白名单(控制面板 → 设置 → 更新白名单,保存后写入 config/update_settings.json,下次自动更新时生效)控制的是"更新时是否保留不变",不是运行时开关:

  • 勾选 config/、app/、static/ 这类目录项时保留整个目录。
  • config/sites.json 与 config/commands.json 未勾选时默认按更新器规则合并(保留本地站点、命令与状态,补入新版内容);勾选则整份保持本地版本不动。
  • config/update_settings.json 会被自动保留,无需手动勾选。
当前默认保留项

config/sites.local.json(站点默认预设覆盖)、config/commands.local.json(命令启用状态与分组覆盖)、chrome_profile/(登录态,仅本机自用)、venv/、logs/、image/、updater.py、.git/、__pycache__/、*.pyc、backup_*/。只保留登录态和个人配置时保持默认勾选即可;要保留自己改过的代码时再勾对应目录。

警告:可视化编辑器没有撤销功能

一旦保存无法快捷复原,请务必谨慎修改;重要改动前先导出备份。

18自动化与系统 · 附录

常见问题

酒馆显示「连接失败」怎么办?

酒馆的「测试 API」按钮发送的请求通常太短,部分站点(尤其 AI Studio)不会正常响应而误报失败。不要点测试按钮,直接发送一句真实对话来测试。

返回 401 / 403,认证令牌应该怎么填?
  1. 确认 AUTH_ENABLED=true 时,AUTH_TOKEN 已设置为非空随机字符串;修改环境变量后必须重启服务。
  2. OpenAI 兼容客户端发送 Authorization: Bearer YOUR_TOKEN 或 X-API-Key: YOUR_TOKEN;Anthropic 客户端也可发送 x-api-key: YOUR_TOKEN。
  3. DASHBOARD_AUTH_TOKEN 只用于控制面板和管理接口,不要把它填进客户端 API 配置;两套令牌建议完全不同。
  4. /health 用于基础连通性检查,免认证;它返回 200 不代表带令牌的业务请求一定通过,仍要检查请求头和令牌对应的开关。
请求频繁失败,怎么排查?
  1. 脚本运行时操作了受控浏览器:工作流执行中不要点击、切换或操作受控浏览器,最多只能看着。
  2. 缩小窗口或折叠页面元素:可以最小化,但不要缩小窗口边框或折叠脚本要操作的区域。
  3. 保留了无关标签页:只留目标 AI 网站;出现异常重启脚本即可。
  4. 网站状态异常:看受控浏览器是否触发人机验证、被内容风控拦截,或单次输入太长被拒。
  5. 网络波动 / 代理切换 IP:表现为后台显示发送成功但浏览器没真正发出。可等约 5 分钟或直接重启脚本。
  6. 站点配置过期:前面都排除后,可能是站点改版导致选择器失效——提 Issue、加群反馈,或手动更新选择器。
同时打开多个标签页,脚本怎么处理?
  • 默认路由 /v1/chat/completions:自动挑空闲标签页。
  • 指定站点 /url/gemini.google.com/v1/chat/completions:只发到对应站点。
  • 指定标签页 /tab/1/v1/chat/completions:精确使用编号 1。
  • 可以给不同标签页配不同预设(一个聊天、一个识图);多个请求到来时空闲标签页依次分配,全忙时排队。
标签页池里看不到新打开的标签页?
  • 确认页面已加载完成;chrome://newtab 这类空白页不会被识别。
  • 等 2–3 秒后点击控制台的「立即刷新」。
  • 还是不出现,直接重启脚本。
控制面板里的参数需要手动调整吗?

大多数时候不需要。默认值已覆盖最常见场景,遇到具体问题时再针对性调整即可。

目前有哪些已知问题?
  • VSCode 的 Codex 插件及 Claude Code 均已完全适配(自 2026-05-28 起),连接方法见「连接 API」。
  • DrissionPage 每次升级后都需要重新执行对应补丁。
  • "独立 Cookie 标签页"仍是高级实验功能——强行追求"同一受控窗口内的独立 Cookie" 在浏览器原生菜单等场景可能不稳,当前建议优先使用共享 Cookie 方案。
代理切换命令不生效怎么办?
  1. 确认 Clash 正在运行且启用了 External Controller。
  2. 确认 API 地址正确(默认 http://127.0.0.1:9090,有些客户端用别的端口)。
  3. 确认代理组名称拼写:访问 http://127.0.0.1:9090/proxies 查看实际名称。
  4. Clash 配了 secret 的话,命令配置里也要一起填。
  5. 在控制台「日志」搜索 [CMD] 开头的条目,看具体报错或切换结果。
复用自己的 Chrome 登录态,为什么配了不生效?
  • 直接指向了系统默认 User Data:Chrome 136+ 上远程调试端口会起不来——先复制一份独立目录,再让脚本使用副本。
  • BROWSER_PROFILE_DIR 层级写错:应指向 User Data 这一层,而不是 ...\User Data\Default;子配置文件夹写在 BROWSER_PROFILE_NAME。
  • 改完没重启:浏览器启动相关配置只有重新运行 start.bat 才生效。

具体步骤回看「系统设置 → 浏览器登录态复用」。

浏览器能正常输入和点击发送,但提取出来的回复始终为空?

这通常是因为受控浏览器的 Chrome 内核版本过低导致的。以 ChatGPT 网页版为例,旧版 Chrome 内核会触发服务端的安全风控策略,使其在返回完会话初始元数据后瞬间发送 DONE 信号切断数据流(网络流仅 900+ 字节且完全不包含 AI 文本数据)。

解决方法:请升级运行脚本环境中的 Google Chrome 浏览器到当前稳定版,并以启动日志或 DrissionPage 要求的最低版本为准;更新后完全重启受控浏览器,再重新测试即可。

反馈渠道在哪里?
  • GitHub Issues:提交 Bug 或功能建议。
  • QQ 群 1073037753:日常交流与快速反馈。
结语

如果你修好了某个站点的配置,欢迎把改动分享给作者或群友;你的每一次反馈,都在让这个工具变得更好用。

已复制