@xnng/browser-relay 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +445 -0
- package/docs/README.zh-CN.md +421 -0
- package/docs/benchmarks/browser-gaps-codex-ax.json +418 -0
- package/docs/benchmarks/browser-gaps-relay-after.json +655 -0
- package/docs/benchmarks/browser-gaps-relay-baseline.json +679 -0
- package/docs/benchmarks/browser-readiness-cost.json +106 -0
- package/docs/benchmarks/browser-runtime-balanced-headed.json +412 -0
- package/docs/benchmarks/browser-runtime-balanced-rtt50.json +412 -0
- package/docs/benchmarks/browser-runtime-balanced.json +412 -0
- package/docs/benchmarks/browser-runtime-rtt50.json +194 -0
- package/docs/benchmarks/browser-runtime.json +254 -0
- package/docs/benchmarks/browser-use-parity.json +54 -0
- package/docs/benchmarks/codex-extension-audit.json +131 -0
- package/docs/benchmarks/codex-native-protocol.md +69 -0
- package/docs/benchmarks/codex-native-replay.js +116 -0
- package/docs/benchmarks/codex-native-status.json +81 -0
- package/docs/benchmarks/codex-native.json +1003 -0
- package/docs/benchmarks/extension-sessions.png +0 -0
- package/docs/benchmarks/extension-tasks.png +0 -0
- package/docs/benchmarks/iframe-routing-regression.json +37 -0
- package/docs/browser-use-comparison.md +331 -0
- package/docs/browser-use-gap-audit.md +141 -0
- package/docs/browser-use-parity.md +105 -0
- package/docs/demo/intranet.html +103 -0
- package/docs/releases/v1.5.0.md +59 -0
- package/docs/releases/v1.5.1.md +16 -0
- package/docs/releases/v1.5.2.md +42 -0
- package/docs/releases/v1.5.3.md +33 -0
- package/docs/releases/v1.5.4.md +42 -0
- package/docs/releases/v1.6.0.md +16 -0
- package/docs/remote-control-hub.md +523 -0
- package/extension/activity.js +328 -0
- package/extension/automation.js +1839 -0
- package/extension/background.js +1854 -0
- package/extension/i18n.js +149 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +47 -0
- package/extension/observations.js +109 -0
- package/extension/options.html +289 -0
- package/extension/options.js +269 -0
- package/extension/popup.html +74 -0
- package/extension/popup.js +105 -0
- package/extension/protocol.js +45 -0
- package/extension/remote-auth.js +18 -0
- package/extension/sessions.js +134 -0
- package/extension/snapshot.js +161 -0
- package/extension/task-groups.js +108 -0
- package/extension/tasks.js +186 -0
- package/extension/wait.js +89 -0
- package/hub/README.md +42 -0
- package/hub/package-lock.json +1544 -0
- package/hub/package.json +13 -0
- package/hub/src/rpc.js +41 -0
- package/hub/src/worker.js +322 -0
- package/hub/wrangler.example.toml +19 -0
- package/package.json +83 -0
- package/server/cdp-bridge.js +200 -0
- package/server/cli.js +1798 -0
- package/server/hub-server.js +258 -0
- package/server/install.js +250 -0
- package/server/mcp-server.js +504 -0
- package/server/npx-runner.js +96 -0
- package/server/relay-server.js +1356 -0
- package/server/remote-protocol.js +76 -0
- package/server/runtime-worker.js +166 -0
- package/server/script-runtime.js +189 -0
- package/server/sdk.js +307 -0
- package/server/service-state.js +103 -0
- package/server/snapshot.js +161 -0
- package/server/uninstall.js +61 -0
- package/server/windows-service-entry.js +58 -0
- package/server/windows-service.js +360 -0
- package/skills/browser-relay/SKILL.md +192 -0
- package/skills/browser-relay/references/legacy-api.md +163 -0
- package/skills/browser-relay/references/runtime.md +240 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
> 本包是 [reliefeai/browser-relay](https://github.com/reliefeai/browser-relay) 的 xnng 维护分支,以 `@xnng/browser-relay` 发布,增加任务分组及收起分组的后台操作修复,保留上游 MIT 许可。
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="../extension/icons/icon128.png" width="96" height="96" alt="Browser Relay logo">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<h1 align="center">Browser Relay</h1>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
让 AI Agent 和你共用同一个 Chrome 浏览器。
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<img src="https://img.shields.io/badge/Agent-Skill%20%2B%20CLI-blue" alt="Agent Skill 与 CLI">
|
|
15
|
+
<img src="https://img.shields.io/badge/远程-多机器控制-7c3aed" alt="远程多机器控制">
|
|
16
|
+
<img src="https://img.shields.io/badge/开源-MIT-green" alt="MIT 开源">
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="../README.md">English</a>
|
|
21
|
+
·
|
|
22
|
+
<a href="#快速开始">快速开始</a>
|
|
23
|
+
·
|
|
24
|
+
<a href="#agent-友好">Agent Skill</a>
|
|
25
|
+
·
|
|
26
|
+
<a href="#cli">CLI</a>
|
|
27
|
+
·
|
|
28
|
+
<a href="#远程控制remote-relay">远程</a>
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
<p align="center">
|
|
32
|
+
<a href="https://github.com/reliefeai/browser-relay/blob/main/docs/assets/browser-relay-mobile-to-office.mp4">
|
|
33
|
+
<img src="https://raw.githubusercontent.com/reliefeai/browser-relay/main/docs/assets/browser-relay-mobile-to-office.gif" width="960" alt="Browser Relay 示意流程:手机上的 Agent 通过 Skill 和 CLI 操作办公室电脑现有 Chrome 中的 mock 内网页面">
|
|
34
|
+
</a>
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<p align="center"><sub>示意流程使用 mock 数据,不含真实凭据。点击动画可查看 MP4 版本。</sub></p>
|
|
38
|
+
|
|
39
|
+
Browser Relay 通过面向 Agent 的 **Skill + CLI**,让 AI Agent 加入你每天正在使用的 Chrome。它不会创建空白的自动化浏览器,不需要反复把另一个浏览器窗口拉到前台,也不用重新登录。你和 Agent 共用同一个日常浏览器——既可以在本机,也可以跨多台机器。
|
|
40
|
+
|
|
41
|
+
它特别适合这些任务:人在外面用手机上的 Agent 操作电脑浏览器;在家里让 Agent 使用公司电脑上已有内网、SSO 和设备信任的 Chrome;或者让一个 Agent 根据登录态和网络环境,在多台机器的浏览器之间工作。
|
|
42
|
+
|
|
43
|
+
## 真实 Chrome,而非临时配置
|
|
44
|
+
|
|
45
|
+
大多数浏览器自动化会开一个全新的空白浏览器配置。这适合测试,但对需要操作你**已登录**的 Web 应用的 Agent 毫无用处 —— SaaS 后台、管理面板、内网工具、文档、私有会话,这些页面在无头浏览器或全新配置里根本没有登录态。
|
|
46
|
+
|
|
47
|
+
Browser Relay 补的就是这一层(也是很多人在找的 OpenClaw Browser Relay 替代方案):
|
|
48
|
+
|
|
49
|
+
- **就是你自己的 Chrome 会话** —— Cookie、localStorage、扩展、登录状态,原样共用。
|
|
50
|
+
- **不弹自动化浏览器** —— 不开额外窗口、不在背后建标签;普通导航复用已附加的标签页。
|
|
51
|
+
- **本地或远程** —— 一个 Agent 可以操作本机或多台远程机器上的浏览器;浏览器通过出站连接接入,不暴露公网浏览器端口。
|
|
52
|
+
- **面向 Agent** —— 安装自带 Skill 后,Claude Code、Codex、Cursor、Windsurf 等 Agent 会知道何时、如何调用可检查的 CLI。
|
|
53
|
+
- **本地优先边界** —— 默认只监听 `127.0.0.1`。
|
|
54
|
+
|
|
55
|
+
## 来源说明
|
|
56
|
+
|
|
57
|
+
源代码整理自 [chengyixu/openclaw-browser-relay](https://github.com/chengyixu/openclaw-browser-relay),自动附加标签页的逻辑参考了 [blakesabatinelli/openclaw-chrome-relay](https://github.com/blakesabatinelli/openclaw-chrome-relay)。移除了 OpenClaw 专属的网关握手、token 鉴权和平台绑定,整理为通用的本地浏览器桥。
|
|
58
|
+
|
|
59
|
+
## 工作方式
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
本地
|
|
63
|
+
AI Agent ──Skill + CLI──▶ Relay 服务器 (Node, 127.0.0.1)
|
|
64
|
+
│ WebSocket
|
|
65
|
+
▼
|
|
66
|
+
Chrome 扩展 ──chrome.debugger / CDP──▶ 你的 Chrome 标签页
|
|
67
|
+
|
|
68
|
+
远程(Remote Relay)
|
|
69
|
+
AI Agent ──HTTPS──▶ 公网 Relay 服务 (relay.linso.ai) ◀──WSS── Chrome 扩展 ──▶ 你的 Chrome 标签页
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**本地模式**是默认:Agent 连本机 `127.0.0.1` 上的 relay 服务器,由它把 Chrome DevTools Protocol 命令转发给扩展。
|
|
73
|
+
|
|
74
|
+
**远程模式**不暴露任何东西。打开 Remote Relay 后,扩展会主动**出站**连到公网 Relay 服务;远程的 CLI 连到同一个服务,由它顺着这条已有连接把每条命令下发到你的浏览器 —— 没有开放端口,网络上也没有本地服务。命令由扩展用 `chrome.debugger` 自己执行,所以远程控制不依赖本地 relay。可以用默认的托管服务,也可以一键部署到 Cloudflare 自建(见下文)。
|
|
75
|
+
|
|
76
|
+
## 快速开始
|
|
77
|
+
|
|
78
|
+
使用分四步。需要桌面版 Chrome 和 Node.js/npm;Chrome 扩展需要从安装目录手动加载。
|
|
79
|
+
|
|
80
|
+
### 1. 安装
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npm install -g @xnng/browser-relay
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
安装程序会尝试注册用户级后台服务。如果当前环境没有可用的服务管理器,下面的验证步骤会给出明确的前台启动命令,而不是抛出堆栈。
|
|
87
|
+
|
|
88
|
+
### 2. 安装 Chrome 扩展
|
|
89
|
+
|
|
90
|
+
先获取扩展目录:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
browser-relay path
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
然后打开 `chrome://extensions`,打开右上角开发者模式,点击 `Load unpacked`,选择 `browser-relay path` 输出的 `extension` 目录。
|
|
97
|
+
|
|
98
|
+
### 3. 验证浏览器连接
|
|
99
|
+
|
|
100
|
+
先运行一次完整的只读诊断,再列出已连接标签页:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
browser-relay doctor
|
|
104
|
+
browser-relay tabs
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`doctor` 应显示 relay 健康且扩展已连接;`tabs` 应至少输出一条标签页 ID、标题和 URL:
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
t_A7k2Pm9QxL Example Domain https://example.com/
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
如果 `doctor` 提示服务管理器不可用,请在另一个终端以前台方式启动并保持运行:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
browser-relay
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
然后重试 `browser-relay doctor`。如果 relay 已健康但仍没有标签页,重新加载 unpacked 扩展,再运行 `browser-relay tabs`。`doctor` 不会安装、重启或改动任何内容;自动化场景可加 `--json`。
|
|
120
|
+
|
|
121
|
+
<details>
|
|
122
|
+
<summary>后台服务、升级与平台说明</summary>
|
|
123
|
+
|
|
124
|
+
全局安装在 macOS 使用 launchd、Linux 使用 systemd-user、Windows 使用当前用户的任务计划程序,登录后自动启动。Windows 任务只复用当前已登录用户的交互令牌并以最低权限运行,不保存密码、不主动提权,也不使用 SYSTEM;公司设备策略仍可能禁止标准用户注册任务。
|
|
125
|
+
|
|
126
|
+
`browser-relay install` 会安全刷新带 Browser Relay 所有权标记的服务定义、启动服务并校验 HTTP 与版本。nvm 升级或 `doctor` 建议时再运行即可;它拒绝覆盖同名但不属于 Browser Relay 的 Windows 任务。若受管环境没有可用服务管理器,仍可用 `browser-relay` 前台运行。
|
|
127
|
+
|
|
128
|
+
升级使用 `browser-relay update`:它会全局安装 `@xnng/browser-relay@latest`、尝试刷新服务并输出状态检查;扩展会在下一次 relay 重连时自动重载(约 30 秒内)。
|
|
129
|
+
|
|
130
|
+
</details>
|
|
131
|
+
|
|
132
|
+
### 4. 安装 Agent Skill 并完成第一个任务
|
|
133
|
+
|
|
134
|
+
Browser Relay 自带 Agent Skill。显式选择目标 Agent,安装过程就不会弹出交互式选择器:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
browser-relay skill install --agent codex
|
|
138
|
+
|
|
139
|
+
# Claude Code,或一次安装给两者:
|
|
140
|
+
browser-relay skill install --agent claude-code
|
|
141
|
+
browser-relay skill install --agent codex claude-code
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
命令会以无交互模式调用标准 `skills` CLI,并逐个读取目标 `SKILL.md` 做内容校验。使用标准 `~/.agents/skills` 目录的 Agent 可传 `--agent universal`;用 `browser-relay skill path` 查看包内 Skill 目录;无参数的 `browser-relay skill` 默认输出安装到所有 Agent 的命令(`--agent "*"`),只打印提示,不执行安装。安装后 Agent 就能操作你自己的浏览器,而不用另开自动化浏览器。
|
|
145
|
+
|
|
146
|
+
第一次先给 Agent 一个只读的小任务:
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
使用 Browser Relay 告诉我当前 Chrome 标签页的标题和 URL,不要导航。
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Agent 能正确回答,就证明整条链路已经打通:Agent Skill → CLI → relay → 扩展 → 你正在使用的 Chrome 标签页。
|
|
153
|
+
|
|
154
|
+
如果 Browser Relay 确实解决了你的工作流,给仓库一个 Star 可以帮助其他 Agent 开发者发现它。
|
|
155
|
+
|
|
156
|
+
## Agent 友好
|
|
157
|
+
|
|
158
|
+
Browser Relay 专门为 Agent 工作流做了设计,不只是给底层脚本用:
|
|
159
|
+
|
|
160
|
+
- 自带 Skill,告诉 Agent 何时用 Browser Relay 以及如何安全交互。
|
|
161
|
+
- 页面快照会标注链接、按钮、输入框等交互元素,方便 Agent 先理解页面再行动。
|
|
162
|
+
- 操作落在已附加的真实标签页上,让浏览器上下文保持可见、可预期。
|
|
163
|
+
- 稳定 CSS 等待让 Agent 等元素进入 DOM 或变为可见,不再依赖猜测性的固定 sleep。
|
|
164
|
+
- Console 和 Network 捕获会记录 `console.*`、页面异常、日志以及请求/响应,便于诊断真实页面行为。
|
|
165
|
+
|
|
166
|
+
## CLI
|
|
167
|
+
|
|
168
|
+
**1.5.0** 新增完整内容读取、标签会话归属与交接;
|
|
169
|
+
详见[发布说明与升级步骤](releases/v1.5.0.md)、[实现与验收记录](browser-use-parity.md)。开发推送不自动发布 npm,发布须手动指定版本与渠道。
|
|
170
|
+
|
|
171
|
+
1.5 还包括持久 JavaScript 会话、可访问性元素引用、差量快照和批量动作。
|
|
172
|
+
先用 `browser-relay observe --tab <id>` 获取页面状态,再用
|
|
173
|
+
`browser-relay actions --tab <id> --file actions.json` 一次执行已确定的步骤。
|
|
174
|
+
动作在插件内连续运行,同一标签页串行,支持查看任务及取消后续动作。
|
|
175
|
+
|
|
176
|
+
`browser-relay exec --file workflow.js` 可运行脚本;MCP 的 `browser_exec`
|
|
177
|
+
会在多次调用间保留变量与标签句柄。MCP 截图直接返回图片。坐标点击、拖拽和悬停
|
|
178
|
+
支持截图坐标映射;需要可见标签页的操作会明确返回 `needs_foreground`。
|
|
179
|
+
插件弹窗提供“取消当前任务”。本地脚本是拥有 Agent 系统权限的可信代码,独立进程
|
|
180
|
+
用于超时与重置,不是安全沙箱;远端浏览器只接收浏览器动作。
|
|
181
|
+
|
|
182
|
+
参阅 [运行时与 SDK](../skills/browser-relay/references/runtime.md)、
|
|
183
|
+
[Codex 能力对比和实测](browser-use-comparison.md)。
|
|
184
|
+
|
|
185
|
+
CLI 是首选接口。能执行 shell 的 Agent 用它比手写 `curl` JSON 更快、更少转义:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
browser-relay tabs
|
|
189
|
+
browser-relay console --tab t_A7k2Pm9QxL --limit 50
|
|
190
|
+
browser-relay network --tab t_A7k2Pm9QxL --type response --status 500
|
|
191
|
+
browser-relay snapshot --tab t_A7k2Pm9QxL --max-length 20000
|
|
192
|
+
browser-relay wait 'button[type=submit]' --state visible --timeout 10000 --tab t_A7k2Pm9QxL
|
|
193
|
+
browser-relay click 'button[type=submit]' --tab t_A7k2Pm9QxL
|
|
194
|
+
browser-relay type 'hello world' --selector 'input[name=q]' --clear --submit
|
|
195
|
+
browser-relay key Control+L
|
|
196
|
+
browser-relay scroll down --amount 1000
|
|
197
|
+
browser-relay screenshot /tmp/page.png --full-page
|
|
198
|
+
browser-relay eval 'document.title'
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
长文本或多行 JavaScript 从 stdin 读取,避免 shell 转义:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
printf 'hello\nworld' | browser-relay type --selector textarea --stdin
|
|
205
|
+
browser-relay eval --stdin < script.js
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
所有浏览器命令都支持 `--json`(输出原始 API 响应)和 `--tab <id>`(指定标签页)。用 `--json` 时失败命令会输出结构化错误 JSON 并以非 0 退出。
|
|
209
|
+
|
|
210
|
+
### 远程控制(Remote Relay)
|
|
211
|
+
|
|
212
|
+
要从**另一台机器**(CI、远程 agent、不同网络)控制这个浏览器,在扩展 Options 页面打开 **Remote Relay**。浏览器会主动连到公网 Relay 服务(默认是托管的 `relay.linso.ai`)——不开放任何公网端口,也不暴露本地服务。
|
|
213
|
+
|
|
214
|
+
打开后会生成一个保密的 **Device ID**——请像密码一样保管,在任何地方传给同样的 CLI 命令即可:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
browser-relay tabs --remote-device-id br-xxxx
|
|
218
|
+
browser-relay eval "location.href" --remote-device-id br-xxxx
|
|
219
|
+
|
|
220
|
+
# 存个别名,以后不用重复贴长 id(remote ls / rm 管理):
|
|
221
|
+
browser-relay remote add mymac br-xxxx
|
|
222
|
+
browser-relay tabs --remote mymac
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
保存的远程 Device ID 属于凭据。POSIX 系统会将其写入
|
|
226
|
+
`~/.browser-relay/remotes.json`,并强制目录为 `0700`、文件为 `0600`;旧版本创建的宽权限也会在再次写入时自动收紧。
|
|
227
|
+
`browser-relay remote ls`(包括 `--json`)只返回 `(redacted)`,不会输出保存的 capability 或其中任何字符。
|
|
228
|
+
|
|
229
|
+
**自建你自己的 Relay 服务** —— 一键把 `hub/` 里的 Worker 部署到你自己的 Cloudflare 账号:
|
|
230
|
+
|
|
231
|
+
[](https://deploy.workers.cloudflare.com/?url=https://github.com/reliefeai/browser-relay/tree/main/hub)
|
|
232
|
+
|
|
233
|
+
按钮第一次会让你把 Cloudflare 连上 GitHub(Workers Builds)。想用命令行?`git clone` 后 `cd hub && npx wrangler deploy`。两种方式都会给你一个 `…workers.dev` 地址,填到 Options 页面的 *公网 Relay 服务* 字段即可。
|
|
234
|
+
|
|
235
|
+
`remote-device-id` 是一个 capability —— Remote Relay 开着时,拿到它的人就能控制这个浏览器。设计见 `docs/remote-control-hub.md`。
|
|
236
|
+
|
|
237
|
+
### CLI 参考
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
browser-relay # 前台运行 relay server
|
|
241
|
+
browser-relay start # 启动后台服务
|
|
242
|
+
browser-relay stop # 停止后台服务
|
|
243
|
+
browser-relay restart # 重启后台服务
|
|
244
|
+
browser-relay fix # 重启并清理失效会话(标签页连不上时用)
|
|
245
|
+
browser-relay update # 更新全局 npm 包并刷新后台服务
|
|
246
|
+
browser-relay status # 查看服务状态和 HTTP 健康检查
|
|
247
|
+
browser-relay doctor # 执行完整的只读安装诊断
|
|
248
|
+
browser-relay logs # 持续查看当前平台的服务日志
|
|
249
|
+
browser-relay path # 输出 Chrome 扩展目录
|
|
250
|
+
browser-relay skill install --agent codex # 安装/更新并校验 Agent Skill
|
|
251
|
+
browser-relay skill path # 输出包内 Skill 目录
|
|
252
|
+
browser-relay install # 注册后台服务
|
|
253
|
+
browser-relay uninstall # 卸载后台服务
|
|
254
|
+
|
|
255
|
+
browser-relay tabs # 列出已附加标签页
|
|
256
|
+
browser-relay console # 输出 console 和页面错误记录
|
|
257
|
+
browser-relay network # 输出网络请求、响应和失败事件
|
|
258
|
+
browser-relay snapshot # 输出页面结构化文本
|
|
259
|
+
browser-relay wait # 等待 CSS 元素进入 DOM 或变为可见
|
|
260
|
+
browser-relay click # 按 CSS selector 点击元素
|
|
261
|
+
browser-relay type # 输入文本
|
|
262
|
+
browser-relay key # 按键或快捷键
|
|
263
|
+
browser-relay scroll # 滚动页面
|
|
264
|
+
browser-relay screenshot # 保存 PNG 截图
|
|
265
|
+
browser-relay eval # 在页面内执行 JavaScript
|
|
266
|
+
browser-relay download # 输出元素 src/href
|
|
267
|
+
browser-relay download-start # 启动 Chrome 下载
|
|
268
|
+
browser-relay downloads # 列出 Chrome 下载和事件
|
|
269
|
+
browser-relay remote # 管理远程别名(add / ls / rm)
|
|
270
|
+
browser-relay api-help # 查看浏览器操作命令示例
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## MCP
|
|
274
|
+
|
|
275
|
+
安装 npm 包后直接用 `browser-relay-mcp`:
|
|
276
|
+
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"mcpServers": {
|
|
280
|
+
"browser": {
|
|
281
|
+
"command": "browser-relay-mcp",
|
|
282
|
+
"env": {
|
|
283
|
+
"BROWSER_RELAY_URL": "http://127.0.0.1:18795"
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
MCP server 提供 `browser_tabs`、`browser_snapshot`、`browser_wait`、`browser_click`、`browser_type`、`browser_key`、`browser_screenshot` 等高层工具。
|
|
291
|
+
|
|
292
|
+
## HTTP API
|
|
293
|
+
|
|
294
|
+
HTTP API 是给代码和自定义工具集成用的稳定接口。交互式 Agent 操作优先用上面的 CLI。
|
|
295
|
+
|
|
296
|
+
HTTP、CLI `--json` 和 MCP 工具错误都使用结构化错误格式:
|
|
297
|
+
|
|
298
|
+
```json
|
|
299
|
+
{ "ok": false, "code": "invalid_request", "error": "url is required", "message": "url is required", "status": 400, "retryable": false }
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
curl http://127.0.0.1:18795/api/tabs
|
|
304
|
+
curl "http://127.0.0.1:18795/api/snapshot?tabId=t_A7k2Pm9QxL"
|
|
305
|
+
|
|
306
|
+
curl -X POST http://127.0.0.1:18795/api/wait \
|
|
307
|
+
-H "Content-Type: application/json" \
|
|
308
|
+
-d '{"tabId":"t_A7k2Pm9QxL","selector":"button.submit","state":"visible","timeoutMs":10000}'
|
|
309
|
+
|
|
310
|
+
curl "http://127.0.0.1:18795/api/console?tabId=t_A7k2Pm9QxL&limit=50"
|
|
311
|
+
curl "http://127.0.0.1:18795/api/network?tabId=t_A7k2Pm9QxL&type=response&status=500"
|
|
312
|
+
|
|
313
|
+
curl -X POST http://127.0.0.1:18795/api/click \
|
|
314
|
+
-H "Content-Type: application/json" \
|
|
315
|
+
-d '{"tabId":"t_A7k2Pm9QxL","selector":"button.submit"}'
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
| Endpoint | Method | 说明 |
|
|
319
|
+
| --- | --- | --- |
|
|
320
|
+
| `/` | GET/HEAD | 健康检查 |
|
|
321
|
+
| `/api/debug` | GET | 服务状态和诊断信息 |
|
|
322
|
+
| `/api/tabs` | GET | 列出已附加标签页 |
|
|
323
|
+
| `/api/console` | GET | 读取 console 和页面错误记录 |
|
|
324
|
+
| `/api/console/clear` | POST | 清理 console 记录 |
|
|
325
|
+
| `/api/network` | GET | 读取已捕获的 Network 请求、响应和失败事件(敏感 header 已脱敏) |
|
|
326
|
+
| `/api/network/clear` | POST | 清理已捕获的网络事件 |
|
|
327
|
+
| `/api/navigate` | POST | 导航已附加标签页 |
|
|
328
|
+
| `/api/snapshot` | GET | 获取页面文本快照或 HTML |
|
|
329
|
+
| `/api/wait` | POST | 等待 CSS 元素进入 DOM 或变为可见 |
|
|
330
|
+
| `/api/click` | POST | 按 CSS selector 点击元素 |
|
|
331
|
+
| `/api/type` | POST | 输入文本 |
|
|
332
|
+
| `/api/key` | POST | 按键或键盘快捷键 |
|
|
333
|
+
| `/api/scroll` | POST | 滚动页面 |
|
|
334
|
+
| `/api/screenshot` | GET/POST | 获取 PNG 截图;full-page 会返回截图策略和尺寸元数据 |
|
|
335
|
+
| `/api/eval` | POST | 执行页面内 JavaScript |
|
|
336
|
+
| `/api/download` | POST | 获取元素 URL |
|
|
337
|
+
| `/api/download/start` | POST | 从 URL 启动真实 Chrome 下载 |
|
|
338
|
+
| `/api/downloads` | GET | 列出 Chrome 下载和最近下载事件 |
|
|
339
|
+
| `/api/downloads/clear` | POST | 清理已捕获的下载事件 |
|
|
340
|
+
|
|
341
|
+
真实 Chrome 下载需要扩展的 `downloads` 权限。从旧版本升级后,需在 `chrome://extensions` 里重新加载 unpacked 扩展。
|
|
342
|
+
|
|
343
|
+
这些接口远程同样可用:带 `--remote-device-id` 的 CLI 会把它们经公网 Relay 服务发到浏览器。
|
|
344
|
+
|
|
345
|
+
## 配置
|
|
346
|
+
|
|
347
|
+
| 环境变量 | 默认值 | 说明 |
|
|
348
|
+
| --- | --- | --- |
|
|
349
|
+
| `BROWSER_RELAY_URL` | `http://127.0.0.1:18795` | CLI 浏览器命令和 MCP 使用的 relay 地址 |
|
|
350
|
+
| `BROWSER_RELAY_HOST` | `127.0.0.1` | HTTP 和 WebSocket 监听地址 |
|
|
351
|
+
| `BROWSER_RELAY_PORT` | `18795` | HTTP 和 WebSocket 端口 |
|
|
352
|
+
| `BROWSER_RELAY_REMOTE_DEVICE_ID` | — | 未传 `--remote-device-id` 时使用的远程 Device ID(或别名) |
|
|
353
|
+
| `BROWSER_RELAY_REMOTE_HOST` | `https://relay.linso.ai` | 远程命令使用的公网 Relay 服务地址 |
|
|
354
|
+
|
|
355
|
+
Chrome 扩展端口可以在扩展 Options 页面修改。
|
|
356
|
+
|
|
357
|
+
后台服务与日志位置:
|
|
358
|
+
|
|
359
|
+
```text
|
|
360
|
+
macOS 服务: ~/Library/LaunchAgents/org.browser-relay.service.plist
|
|
361
|
+
Linux 服务: ~/.config/systemd/user/browser-relay.service
|
|
362
|
+
Windows 任务: BrowserRelay
|
|
363
|
+
Windows 定义: %LOCALAPPDATA%\BrowserRelay\task.xml
|
|
364
|
+
|
|
365
|
+
macOS 日志: /tmp/browser-relay.log, /tmp/browser-relay.error.log
|
|
366
|
+
Linux 日志: journalctl --user -u browser-relay
|
|
367
|
+
Windows 日志: %LOCALAPPDATA%\BrowserRelay\logs\browser-relay.log
|
|
368
|
+
%LOCALAPPDATA%\BrowserRelay\logs\browser-relay.error.log
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Windows 上,`uninstall` 只移除 Browser Relay 任务及生成的 XML 定义,诊断日志会保留;它也绝不会为了释放 `18795` 端口而结束不属于 Browser Relay 的进程。
|
|
372
|
+
|
|
373
|
+
### 隐藏「已开始调试此浏览器」顶部提示
|
|
374
|
+
|
|
375
|
+
只要扩展附加了 debugger,Chrome 就会在页面顶部强制显示一条
|
|
376
|
+
`"Browser Relay" 已开始调试此浏览器` 的提示条。任何扩展 API 都无法去掉它 ——
|
|
377
|
+
这是 Chrome 内置的防滥用安全提示。
|
|
378
|
+
|
|
379
|
+
两种处理方式:
|
|
380
|
+
|
|
381
|
+
- **自动(默认):** 扩展会在标签页闲置 10 分钟后 soft-detach,提示条在你不用时
|
|
382
|
+
自动消失,下一次命令再自动 re-attach。无需配置。
|
|
383
|
+
- **彻底去掉:** 用 `--silent-debugger-extension-api` 参数启动 Chrome,它会抑制
|
|
384
|
+
debugger 扩展 API 的这条提示。必须先完全退出 Chrome(`open --args` 只在冷启动时
|
|
385
|
+
才会传入参数):
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
# macOS
|
|
389
|
+
osascript -e 'quit app "Google Chrome"'
|
|
390
|
+
open -a "Google Chrome" --args --silent-debugger-extension-api
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
想长期生效,就始终这样启动 Chrome(比如做个 shell 别名或 `.command` 启动器)——
|
|
394
|
+
直接点 Dock 图标不会带上这个参数。
|
|
395
|
+
|
|
396
|
+
代价:这会削弱一层安全防护 —— 之后**任何**拥有 `debugger` 权限的扩展都能静默
|
|
397
|
+
附加而不再提示。个人自用、清楚它关掉了什么的前提下可以接受。
|
|
398
|
+
|
|
399
|
+
## 本地开发
|
|
400
|
+
|
|
401
|
+
发布配置与手动触发方式见 [npm OIDC 发布流程](publishing.md)。
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
npm install
|
|
405
|
+
npm start
|
|
406
|
+
npm run mcp
|
|
407
|
+
npm test
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
开发时在 `chrome://extensions` 中选择仓库里的 `extension/` 目录作为 unpacked extension。
|
|
411
|
+
|
|
412
|
+
## 安全说明
|
|
413
|
+
|
|
414
|
+
- Chrome 扩展使用 `debugger` 权限,只安装你信任的版本。
|
|
415
|
+
- 默认只监听 `127.0.0.1`,不要把 relay server 暴露到公网。
|
|
416
|
+
- Remote Relay 从不开放端口:浏览器主动出站连公网 Relay 服务,它只在内存里保存 Device ID 的哈希。Device ID 请像密码一样保管;Remote Relay 开着时,拿到它的人就能控制浏览器。
|
|
417
|
+
- Browser Relay 会让 Agent 访问你的真实浏览器状态,因此启用的 Agent 应被视为可信本地软件。
|
|
418
|
+
|
|
419
|
+
## License
|
|
420
|
+
|
|
421
|
+
MIT
|