项目概览
本项目的核心思路:不再依赖官方 API,而是自动化你本地的浏览器——让脚本在你已登录的 AI 网站上输入问题、等待回复、提取结果,再按 OpenAI 的数据格式返回给任何客户端。
典型用途:统一本地接入方式;按站点或标签页组织不同工作流;在长文本场景下通过文件粘贴承载上下文;在调试时观察页面侧与请求侧的执行流程。
系统架构
请求从客户端进入后,会依次穿过路由层、调度层与驱动层,再由解析层把网页里的回复翻译回标准格式。理解这条链路,后面的配置章节会好读很多。
来自作者:使用预期
这七条是作者的维护说明,动手前先扫一遍,遇到问题时能省不少排查时间。
网站改版后最易失效的是选择器(告诉脚本输入框、发送按钮、结果容器在哪的 CSS 规则)。大多数故障检查选择器即可,而非解析器。标准修法:
- 在受控浏览器里对目标元素右键 →「检查」。
- 把元素树截图或复制出来发给 AI,让它写出新的选择器。
- 回控制台粘贴替换,重新测试。
如果不是选择器问题,才轮到提取器 / 解析器——那需要拦截网络请求、分析响应结构,难度高得多。
2 · 各站点的维护覆盖范围
Gemini、DeepSeek 是作者日常使用最多、维护最及时的站点。其它站点不保证第一时间跟进,遇到问题更推荐加 QQ 群反馈,通常比 Issue 更快。
3 · Function Calling 尚不稳定
它比较依赖模型本身的理解能力,可能存在一定问题。详见「函数调用」章节的预期管理。
4 · 遇到问题,优先让 AI 帮你分析
选择器失效、配置写错、工作流顺序不对——把现象、日志截图、元素树交给 AI,通常比等人工回复快得多。
5 · 反馈 Bug 的正确姿势
说清做了什么、期望什么、实际看到什么,附上 DEBUG 级别日志。表述不清时,先让 AI 帮你整理一版再发。
6 · 修好了欢迎分享回来
不管是更新的选择器还是补好的配置文件,分享给作者或群友都能让整个社区少走弯路。
7 · 项目的核心场景
本项目围绕酒馆 / RP(角色扮演)场景设计打磨。其它场景能用,但维护上偏向"能用就用,不保证持续深耕"。
快速开始
本项目仅用于体验不同模型的效果,请合理控制使用频率,不要给目标网站带来额外负担。
先区分受控浏览器和普通浏览器
双击运行 start.bat 后,脚本会自动启动一个受控浏览器。打开 Windows 任务栏,你应该能看到它已经运行;接下来的登录和站点配置都要在这个浏览器里完成。
由脚本启动并执行网页操作。请在这里打开 AI 站点、登录账号;API 请求执行期间,你可以正常操作或切换标签页查看内容。
你日常使用、正在查看本教程的浏览器,不受脚本控制,也不能代替受控浏览器执行任务。
首次启动检查清单
第一次运行时按“进程 → 端口 → 浏览器 → 站点 → API”的顺序确认,任何一步失败都先停在当前层排查,不要直接反复点击发送。
- 启动脚本没有立即退出。
start.bat窗口应保持打开;若窗口闪退,在项目目录打开 PowerShell 执行python start.py,保留完整错误信息。 - 端口可访问。在普通浏览器打开
http://127.0.0.1:8199/health。返回 JSON 且 HTTP 状态为200表示服务和浏览器均已就绪;若为503,服务还在但受控浏览器未连接。 - 远程调试端口已监听。打开
http://127.0.0.1:9222/json/version;能看到Browser与webSocketDebuggerUrl才表示自动化连接正常。不要把该端口暴露到公网。 - 标签页池有可用页面。控制面板 → 标签页池中至少有一个目标站点,状态为“空闲”;新标签页加载完成后等待 2–3 秒再刷新列表。
- 先做最小请求。使用
/v1/models检查路由,再发送一句短文本;确认成功后再启用流式、多模态或函数调用。
8199 无响应通常是服务未启动或端口被占用;/health 返回 503 通常是 Chrome 尚未连上;9222/json/version 无响应则是浏览器启动参数、路径或端口冲突。先看启动窗口中的第一条 [ERROR],再到「控制台 → 日志」按 RequestID 追踪。
选择一个已适配的站点
受控浏览器的基础引导会列出若干已经适配的站点。列表中存在的网站代表已经完成适配,你可以任选一个使用;本教程以 Gemini 为例。点击下方卡片复制网址,再粘贴到受控浏览器的地址栏中打开。
你可以自行添加新站点,步骤并不复杂。请查看「新增站点 · AI 识别」,其中介绍了自动识别与手动配置两种方法。
以 Gemini 为例完成首次配置
- 访问 Gemini。在受控浏览器中打开
https://gemini.google.com/,等待页面完整加载。 - 登录个人账号。完成登录并进入真正可以发送消息的对话页面。
- 整理页面状态。将页面语言设置为中文,并确保左侧聊天侧边栏处于展开状态;这是脚本稳定识别和操作页面的必要条件。
- 确认标签页已被接管。打开「控制面板 → 标签页池」,此时应当能看到刚才打开的 Gemini 页面已经处于标签页池的控制之中。
连接你的客户端
标签页进入控制后,选择合适的路由地址,填入任意支持 OpenAI 兼容接口的前端即可使用,例如 Chatbox、SillyTavern、Cherry Studio 等。
你可以关闭浏览器后,复制一份自己现有的 Chrome 用户配置到项目专用的浏览器配置目录中,以复用书签、历史记录和登录状态。请不要直接使用正在运行的系统默认配置目录,也不要分享包含 Cookie 的配置副本。完整操作步骤与目录示例见「浏览器登录态复用」。
连接 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 | 编号见「标签页池」,适合绑定过预设的标签页 |
| 指定完整 URL | http://127.0.0.1:8199/tab-url/{token}/v1 | token 从「标签页池」复制,严格匹配当前 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,只对当前这一次请求生效,不改变站点默认预设。
# 方式 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_robin | first_idle 优先空闲(默认)/ round_robin 轮询 / random 随机 |
tab_index | ?tab_index=2 | 在域名路由下进一步锁定某个固定标签页 |
preset_name | ?preset_name=pro | 本次请求临时覆盖预设 |
完整调用示例
# 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/completions | OpenAI Chat Completions;支持 messages、stream、tools | 服务认证 |
POST | /v1/responses | OpenAI Responses / Codex 兼容;支持 input、instructions、previous_response_id | 服务认证 |
POST | /v1/messages | Anthropic Messages / Claude Code 兼容;支持 system、messages、max_tokens | 服务认证 |
POST | /v1/messages/count_tokens | 返回 Anthropic 客户端所需的最小 token 估算结果 | 服务认证 |
GET | /v1/provider/capabilities | 机器可读能力清单、协议开关、模型列表与就绪度 | 服务认证 |
GET | /v1/provider/status | 运行时快照:浏览器、标签页池、请求计数;不返回 Cookie 或令牌 | 服务认证 |
GET | /docs | FastAPI 交互式 OpenAPI 文档;仅在调试模式开启时提供 | 按部署配置 |
# 健康检查(无需令牌)
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 事件,解决工具输出中断问题。
以上协议由于缺乏大规模工具用例覆盖,实际稳定性请按需测试。
控制台与请求监控
控制台默认运行在 http://127.0.0.1:8199/。请求队列、运行日志和站点配置都在这里查看与管理。
[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)
显示受控浏览器与后端的内存占用、累计请求量,以及历史请求明细与执行链追踪;点击单条记录可查看详情。
动态管理
为不同站点、不同标签页指派预设,配置工作流与拦截规则,或临时覆盖系统参数。
请求异常调试与排查步骤
请求出问题时,按下面的顺序排查:
- 查看请求监控列表:点击失败记录,检查该请求是在哪个阶段失败的——是排队获取标签页时超时(
acquire_timeout,默认 60s),还是网络监听等首包响应时超时(first_response_timeout,默认 300s)。 - 联合日志追踪:在日志页面中,通过请求的唯一
RequestID或短追踪哈希,把[ROUTE](路由)、[POOL](标签分配)、[INPUT](输入)、[STREAM](输出捕获)与[NetworkMonitor]各阶段的日志串起来看,定位卡在哪一步。 - 隔离问题标签页:如果某个标签页频繁卡死或变慢,到「标签页池」查看它的锁定状态,用取消按钮中断,或调用调试接口释放。
GET /api/system/request-history?limit=200— 读取近期请求审计记录(含报错日志摘要)GET /api/system/request-history/{request_id}— 读取单条请求详情(前端详情弹窗同款)POST /api/debug/cancel-current— 取消当前正在处理的阻塞请求,支持指定tab_idPOST /api/debug/force-release— 强制清空所有请求锁和标签页锁,重置池状态(最后手段)
选择器配置 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),先别用它,否则网站一刷新或改版就会失效。 - 每一项输入完成后,点击右侧的【测试】按钮,确认能命中。
填写顺序建议
- 在受控浏览器中打开目标网站,右键输入框选择“检查元素”,把定位器填入
input_box。 - 再找到发送按钮,把其定位器填入
send_btn。 - 在对话框中发一条消息,等 AI 回复完毕后,找到包裹回复内容的最外层大 DIV,填入
result_container。 - 每填一项就点一次该字段右侧的「测试」,确认能命中——切忌全部填完再一起排查。
- 前三项稳定后,再考虑补充
new_chat_btn或其他附件上传的选择器。
控制台里的测试按钮已升级为「选择器测试工作台」:点击后不仅能得出是否命中,还会以树形图返回命中 DOM 详情、系统推荐候选选择器、潜在定位风险,并支持点击推荐的候选一键回填到配置框中。
工作流与可视化交互调优
工作流定义了一轮 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后二次确认输入框已清空或明显变短;发现没发出去,就自动重试当前工作流。
响应检测与自愈重试
系统需要判定 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 秒,即浏览器常量里的「最大超时」;网络拦截模式则另有各自的首包与硬超时)是本轮监听的物理保底,无论如何都会在到点后强制收尾。
多预设管理系统
预设允许你为同一个站点创建多套独立的配置方案,并分配给不同标签页。每个预设包含独立的选择器、工作流、流式配置、多模态提取、文件粘贴等全套配置,互不影响。
| 标签页编号 | 绑定的预设名称 | 实际配置差异与工作场景 |
|---|---|---|
| 标签页 #1 | 主预设 (默认) | 常规工作流(新建会话)、开启大文本文件粘贴。适用于大段长文本翻译。 |
| 标签页 #2 | 快速识图 | 简化工作流(不重置会话)、开启多模态图片提取、设置较短的响应超时。适用于识图。 |
| 标签页 #3 | 网络拦截调试 | 开启网络拦截模式、绑定专用解析器。适用于代码块与公式的精确截获。 |
预设操作
都在【站点配置】面板里完成:
- 切换与新建:在页面顶部的“当前预设”下拉框选择要修改的预设,或点击【+ 新建预设】输入新名字。新预设会复制当前预设的全部参数,之后各自独立调整。
- 管理与设为默认:点击下拉框旁的“管理预设”可以改名或删除。点击【⭐ 设为默认】后,该预设作为 API 请求的保底配置。
- 绑定到标签页:切换到【标签页】选项卡,每一行代表一个正在运行的标签页,在“预设”列的下拉菜单里选中预设名即可绑定。
- 单次请求临时覆盖:不想改绑定时,在请求 URL 上加参数(如
/v1/chat/completions?preset_name=快速识图),只对这一次请求生效。
面板上的新建、修改、删除都会自动保存到 config/sites.json,不需要手动编辑 JSON。
对话复用与新建会话控制
- 对话复用窗口(秒):大于
0时,同一标签页在窗口期内收到的后续请求会直接复用当前会话续聊;设为0(默认)表示关闭复用,每次请求都可能触发工作流开头的"新建会话"逻辑。 - 强制新建对话:开启后即使配置了大窗口也忽略复用,每次都强制新开会话——特别适合测试无历史干扰的独立 Prompt 流程。
删除预设无法恢复,且每个站点至少需要保留一个预设——只剩一个时删除按钮会被禁用。
标签页池与会话隔离
标签页池(Tab Pool)负责把并行的 API 请求排队、分发到合适的标签页,实现单浏览器多会话并行。
核心生命周期与超时参数
| 配置参数 | 默认值 | 说明 |
|---|---|---|
max_tabs | 5 | 允许开启的最大标签页数量上限。超出限制后,新请求必须排队等待。 |
min_tabs | 1 | 保留在内存中的最小标签页数量,防止频繁开启/关闭页面。 |
idle_timeout | 300 秒 | 标签页空闲超时阈值。超过该时间没有任何 API 请求时,标签页会自动关闭释放内存。 |
acquire_timeout | 60 秒 | API 请求排队获取空闲标签页的最长等待时间。超时则返回 429 或 504 错误。 |
stuck_timeout | 180 秒 | 页面交互卡死超时时间。由于 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 的标签页,严格匹配。 |
多模态提取与媒体配置
【多模态提取】面板管理如何从网页中提取图片、音频、视频,并转换成客户端可直接使用的本地链接或 Markdown 图片标签。全部在面板里配置,不需要改 JSON。
1. 基础开关与提取范围
- 启用多模态提取(开关):全局总开关。勾选后,系统才会在对话完成时去扫描网页里的图片/视频。
- 提取策略模式(下拉框):
提取所有 (all)— 网页上生成的全部图片或媒体文件一并打包返回。仅首个 (first)— 仅提取网页回答中出现的第一张图片,适合标准的单图输出场景。
- 媒体文件大小限制(数字输入框):单位为 MB(默认
10)。超过此大小的媒体文件将被忽略,防止超大视频/无用底图占满服务器带宽。 - 下载二进制资源 (Download Blobs):开启后,自动下载网页里的二进制 Blob 媒体并转换为持久本地链接,防止因浏览器页面关闭导致临时链接失效。
2. 子模态参数配置(图片 / 音频 / 视频卡片)
可分别为每种媒体开启提取,并配置对应的运行策略与等待时长:
| 界面配置项 | 可用运行策略(下拉菜单) | 策略含义说明与推荐场景 |
|---|---|---|
| 启用状态 (Enabled) 勾选框 |
无 | 控制是否启用当前类别(图片/音频/视频)的提取。 |
| 运行策略 (Run Policy) 下拉框 |
① 仅普通扫描(generic_only)② 按信号等待 推荐 (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 标签  返回;音频、视频以链接 [audio_0](/download_images/xxx.mp3) 返回,SillyTavern 等客户端可以直接显示和播放。
文件与附件发送判定
当 Prompt 超过网站输入框的长度限制时,系统会自动把它写入临时文件,通过网页的附件上传通道发给 AI,以此承载超长上下文。
文件粘贴配置
在站点配置的【文件粘贴模式】板块配置:
| 界面配置表单项 | 建议值/示例 | 作用说明与推荐场景 |
|---|---|---|
| 启用状态开关 | 开启 / 关闭 | 控制是否启用大文本自动转化为文件上传的拦截机制。 |
| 阈值 (字符数) | 40000 |
当输入的消息字符数超过该值时,自动拦截普通文本发送,转化为附件上传通道。建议设为目标网站输入框物理字数上限的 70% 左右。 |
| 临时文件类型 下拉菜单 |
① TXT② PDF③ ERROR
|
|
| 引导文本 | 上传的文件内容即为上下文,请据此回复 |
文件上传成功后,系统在聊天输入框里自动灌入并发送的指令文本,用来引导 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)或体积超出站点限制时,自动报错拦截。
函数调用 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 | 仅发送“本次哪个字段或类型错了”及最小相关上下文,模型改动更精准。 |
| 完整上下文 | 复杂多重参数,模型多次报错依然修不对 | 将原对话与全量报错轨迹一并发回,信息更全,但可能分散小模型的注意力。 |
低熵模式(低干扰操作)
低熵模式把点击、移动、滚动和输入节奏做得更接近人工操作,用于改善某些站点上的界面兼容性和执行稳定性——不再是"瞬移 + 立即点击"的激进轨迹。
| 操作 | 普通模式 | 低熵模式 |
|---|---|---|
| 点击 | 直接 CDP 命令 | 模拟按压 → 微移 → 释放 |
| 移动 | 瞬间跳转 | 人类化曲线移动 |
| 空闲 | 无动作 | 随机微漂移(模拟手抖) |
| 滚动 | 直接调用 | 滚轮事件驱动 |
| 操作间隔 | 最小延迟 | 随机 0.1–0.3 秒 |
- 建议开启:页面对瞬时点击、直接粘贴或坐标跳变敏感的站点;普通模式下容易丢焦点、误判未发送、元素定位不稳定时。
- 可以不开:普通模式已经长期稳定的站点。
控制面板 → 选择站点 → 页面顶部勾选「低熵模式」。该设置按预设独立保存。
DrissionPage 补丁(必看)
为了减少额外连接带来的兼容性问题,项目会给 DrissionPage 打一个小补丁,让网络监听尽量复用浏览器主连接,而不是额外新建连接。
- 自动执行:运行
start.bat后自动安装依赖并执行补丁。 - 手动执行:
python patch_drissionpage.py - 恢复原文件:
python patch_drissionpage.py --restore
每次升级 DrissionPage 后都需要重新执行补丁。补丁支持重复执行,不用担心重复打坏。
即便开启低熵模式并关闭网络监听,半小时内连续对话约 10 条仍容易触发 Cloudflare 验证。该站点本身不适合长时间连续测试,低熵模式也不能保证稳定通过——更稳妥的做法仍然是降低频率。
自动化命令与异常恢复
自动化命令引擎按“触发条件 (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。被限频后几秒内即可自动恢复重试。
新增站点配置流程
接入一个未适配的 AI 聊天网站,有两条路线:AI 自动分析生成,或纯手动配置。
路线 A:辅助 AI 自动分析 推荐
让辅助 AI 分析目标网页的 HTML,自动生成一套可用的初始选择器:
- 在受控浏览器里,新开标签页打开你想接入的 AI 聊天主页,并确保已经登录完成、停在对话输入页面。
- 对该站点发起第一次真实 API 请求(例如请求路由为:
/url/example-ai.com/v1/chat/completions)。 - 后端发现这是个未配置的新域名,会自动捕获页面 DOM,调用设置中配置好的辅助 AI 接口分析。
- 分析通过后,自动为该域名生成初始主预设,写入识别到的选择器与最短工作流。
自动分析只有在对未知域名发起第一次真实 API 请求时才会触发。仅仅在控制面板上点击“新增站点”或者是只在浏览器里打开网页但不发 API 请求,辅助 AI 是不会启动扫描的。
- 在【日志】页面中,会亮起
[AI分析]日志字样,最终显示“分析完成,配置已自动写入 sites.json”。 - 刷新控制台,左侧站点导航列表中会多出这个新增的域名。
- 进入该站点的配置面板检查各选择器字段。务必人工核对
result_container(AI 回复容器)——页面嵌套过深时,这是辅助 AI 最容易认偏的字段。
路线 B:手动在控制面板配置调试
没有配置辅助 AI 密钥,或页面 JS 混淆严重时,直接手动配置:
- 点击控制台左侧侧边栏下方的【新增站点】按钮,在弹出的窗口里输入目标站点的域名(如
chat.example.com)。 - 在左侧列表点击新域名,系统会初始化一个“空白主预设”。
- 去目标站点右键检查元素,将核心三项(
input_box、send_btn、result_container)填入选择器表单中。 - 在【工作流】节点链中拼出最短可用步骤(见下)。
- 依次点击核心字段右侧的“测试”,调试无误后保存。
最短可用工作流
能驱动绝大多数聊天网站的最简节点顺序如下,点【+ 增加步骤】依次拼入:
CLICK节点:目标填入new_chat_btn,取消勾选“必需步骤”(即标记为可选),以防首次打开本就处于新对话时点击失败。WAIT节点:时值设为0.5秒,给页面重置预留少许过渡时间。FILL_INPUT节点:目标填入input_box。这是将用户提示词灌入输入框的必需步骤。CLICK节点:目标填入send_btn,用于点击发送按钮。KEY_PRESS节点:目标填入Enter,取消勾选“必需步骤”(标记为可选),可在部分回车也能发送的网站上作为备用指令。STREAM_WAIT节点:目标填入result_container。用于捕获流式输出。必须以此步骤作为整条工作流的最终结尾。
调试顺序:按输入框 → 发送按钮 → 回复容器的顺序逐项测试选择器,三项都通过后再跑工作流;基本对话跑通后,最后再调文件粘贴阈值与多模态参数。
系统设置与配置管理
环境配置在控制面板 → 设置 → 环境配置中修改,主要放端口、认证、代理、辅助 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 或日志目录提交到仓库。
# 仅本机监听;不要改成 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.1 | 0.0.0.0 允许外部访问,127.0.0.1 仅本地 |
| 监听端口 | 8199 | HTTP 服务端口 | |
| 调试模式 | false | APP_DEBUG=true 才开启 /docs、/redoc 与详细错误信息;生产环境建议保持关闭 | |
| 日志级别 | INFO | DEBUG / 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/v1 | API 基础 URL(默认回指反代自身的 Gemini 路由,可改为任意 OpenAI 兼容端点) | |
| 模型名称 | gemini-3.0-pro | 使用的模型 | |
| HTML 最大字符数 | 120000 | 超过会截断以节省 Token | |
| 浏览器 | Chrome 调试端口 | 9222 | 浏览器远程调试端口 |
| 文件 | 站点配置文件路径 | sites.json | 站点配置存放位置 |
浏览器登录态复用(高级)
希望脚本启动后直接继承你平时浏览器里的登录状态、Cookie 和扩展?请使用独立复制出来的用户数据目录,不要直接把脚本指向日常正在使用的系统默认目录。
- Chrome 136+ 安全调整:默认 Chrome 数据目录不再接受
--remote-debugging-port。把BROWSER_PROFILE_DIR直接写成系统默认User Data,浏览器会被打开但调试端口起不来,脚本无法接管。见 Chrome 官方说明。 - 会话数据风险:浏览器用户目录可能包含登录态、Cookie、本地缓存和扩展数据。只建议复制你自己的本机目录副本用于本机调试;不要打包分享、提交仓库或发给别人。
- 确认原配置位置。在日常 Chrome 地址栏打开
chrome://version,记下「个人资料路径」;它通常类似...\Google\Chrome\User Data\Default。 - 完全退出浏览器和脚本。关闭所有 Chrome 窗口,并确认任务栏中没有仍在运行的 Chrome;复制使用中的配置容易得到不完整文件。
- 复制必要内容。从原始
...\Google\Chrome\User Data根目录复制Local State,再复制刚才确认的配置子目录(如Default、Profile 1)。 - 放入项目专用目录。把上一步的内容粘贴到项目根目录的
chrome_profile/中。完成后应能看到chrome_profile\Local State和chrome_profile\Default(或对应的Profile N)。 - 选择对应配置并重启。在
.env中保持BROWSER_PROFILE_DIR为空,并把BROWSER_PROFILE_NAME写成复制过来的子目录名称;然后重新运行start.bat。
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 列示,若你在面板中改过值,应以面板显示的实际值为准;首次启动时缺少配置文件则会回退到代码内置默认值。
| 分组 | 配置项 | 默认值 | 说明 |
|---|---|---|---|
| 连接 | 调试端口 | 9222 | Chrome 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_*/。只保留登录态和个人配置时保持默认勾选即可;要保留自己改过的代码时再勾对应目录。
一旦保存无法快捷复原,请务必谨慎修改;重要改动前先导出备份。
常见问题
酒馆显示「连接失败」怎么办?
酒馆的「测试 API」按钮发送的请求通常太短,部分站点(尤其 AI Studio)不会正常响应而误报失败。不要点测试按钮,直接发送一句真实对话来测试。
返回 401 / 403,认证令牌应该怎么填?
- 确认
AUTH_ENABLED=true时,AUTH_TOKEN已设置为非空随机字符串;修改环境变量后必须重启服务。 - OpenAI 兼容客户端发送
Authorization: Bearer YOUR_TOKEN或X-API-Key: YOUR_TOKEN;Anthropic 客户端也可发送x-api-key: YOUR_TOKEN。 DASHBOARD_AUTH_TOKEN只用于控制面板和管理接口,不要把它填进客户端 API 配置;两套令牌建议完全不同。/health用于基础连通性检查,免认证;它返回 200 不代表带令牌的业务请求一定通过,仍要检查请求头和令牌对应的开关。
请求频繁失败,怎么排查?
- 脚本运行时操作了受控浏览器:工作流执行中不要点击、切换或操作受控浏览器,最多只能看着。
- 缩小窗口或折叠页面元素:可以最小化,但不要缩小窗口边框或折叠脚本要操作的区域。
- 保留了无关标签页:只留目标 AI 网站;出现异常重启脚本即可。
- 网站状态异常:看受控浏览器是否触发人机验证、被内容风控拦截,或单次输入太长被拒。
- 网络波动 / 代理切换 IP:表现为后台显示发送成功但浏览器没真正发出。可等约 5 分钟或直接重启脚本。
- 站点配置过期:前面都排除后,可能是站点改版导致选择器失效——提 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 方案。
代理切换命令不生效怎么办?
- 确认 Clash 正在运行且启用了 External Controller。
- 确认 API 地址正确(默认
http://127.0.0.1:9090,有些客户端用别的端口)。 - 确认代理组名称拼写:访问
http://127.0.0.1:9090/proxies查看实际名称。 - Clash 配了
secret的话,命令配置里也要一起填。 - 在控制台「日志」搜索
[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:日常交流与快速反馈。
如果你修好了某个站点的配置,欢迎把改动分享给作者或群友;你的每一次反馈,都在让这个工具变得更好用。