dsh-browser
不依赖 Chrome 调试协议驱动用户自己的 Google Chrome: 通过 native messaging 让扩展与 dsh 通信, 页面以带编号的文本交给模型, 保留真实 profile 与登录态. 适合需要智能体在保留真实登录态和配置下操作用户本地 Chrome 的任务。
같은 패키지 이름의 다른 저장소
설치
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:azazo1/dsh-browser2. 在配置页装连接组件
打开 设置 -> 插件 -> dsh-browser, 点 安装连接组件. 这一步做三件事:
- 把扩展产物复制到 dsh 的数据目录;
- 生成 native messaging 清单, 写上与本扩展公钥相符的扩展 id;
- 生成一个启动包装脚本, 里面写死 node 的绝对路径 (Chrome 直接 exec 它, 不经过 shell, 走不到 PATH).
清单写入用户目录, 不需要 root:
| 平台 | 位置 |
|---|---|
| macOS | ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/ |
| Linux | ~/.config/google-chrome/NativeMessagingHosts/ |
| Windows | 注册表 HKCU\Software\Google\Chrome\NativeMessagingHosts\ |
使用
装好之后, Agent 就有了这些工具:
| 工具 | 作用 |
|---|---|
browser_status | 查询整条链路的状态与待办 |
browser_open | 启动 (或复用) 持久 Chrome, 可顺带打开一个地址 |
browser_tabs | 列出标签页 |
browser_select_tab | 绑定一个标签页作为操作目标 |
browser_close_tab | 关闭一个标签页 (自动清掉绑定; 拒绝关闭窗口里的最后一个) |
browser_snapshot | 取页面结构: 元素编号清单 + 正文 |
browser_text | 只取正文, 更省上下文 |
browser_click / browser_fill | 按快照编号点击 / 填入 |
browser_press_key | 发送按键 |
browser_scroll | 滚动 (会报告是否到底) |
browser_navigate | 跳转地址 |
browser_wait | 等待页面出现指定文本 |
browser_query | 按 CSS 选择器批量取数据 (文本 + 属性), 含隐藏元素 |
browser_hover | 悬停到编号元素, 触发下拉菜单一类只认鼠标移入的界面 |
browser_upload | 把本机文件装进 input[type=file], 按选择器定位 (文件输入框通常是隐藏的) |
browser_screenshot | 截当前视口存成图片文件并返回路径 |
browser_evaluate | 在页面里执行 JS 表达式取回结果 (需要额外开关, 见下) |
browser_console | 按需抓取绑定标签页的 console 输出与未捕获异常 (start / read / stop 三段式) |
工具之间的分工值得说清楚, 因为它们看起来有重叠:
browser_snapshot只列可见的可交互元素并给编号, 目的是操作;browser_query返回全部 匹配项的文本与属性, 目的是读数. 两者不共用过滤条件.browser_text读整页正文;browser_query取局部结构;browser_evaluate算东西或读页面 JS 变量.browser_screenshot只截当前视口, 而且不把图片发给模型: 它落成文件并返回路径. 能看图的 模型接着用read_image读这个路径; 不能看图的模型把路径交给用户. 这样图片的限额, 缩放与 模型能力判断都由 harness 已有的read_image负责, 插件不重复实现一遍.browser_console是唯一走chrome.debugger的工具: 只在 start 与 stop 之间 attach, 期间浏览器 顶部会出现"已开始调试此浏览器"提示条 (页面脚本检测不到, 但用户可见, 也可以点掉它强制中断). 它只收集开始之后的输出, 不含历史.
两个使用上的要点:
- 页面操作只作用于被绑定的那个标签页. 必须先
browser_select_tab. 这是有意的: 没有"跟随用户当前标签"这种隐式行为, 免得你在别的标签页上看东西时被改到. - 快照编号会失效. 页面一变, 上一次
browser_snapshot的编号就不能用了, 工具会明确报错让你重新取, 而不是点到一个已经变了的元素上.
配置
在 profile 的 patch 层里按条目 id dsh-browser 覆盖:
- id: dsh-browser
config:
# Chrome 可执行文件; 省略时按平台探测稳定版安装位置.
chromePath: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
# 持久 profile 目录; 省略时用 /data/dsh-browser/profile.
profileDir: ~/chrome-for-dsh
# 额外启动参数, 每项一个完整参数. 会破坏本插件前提的参数会被拒绝.
extraArgs: []
# 会话第一次使用浏览器前是否征求用户同意 (即"申请"). 默认开启.
askOnAcquire: true
# 是否启动 dsh 自己那份独立 profile 的 Chrome. 默认关闭.
# 关闭时插件永远不会自行打开 Chrome, 只用扩展已经连上的那个浏览器.
# 打开后不再复用日常那个 Chrome, 始终启动独立 profile.
launchStandaloneChromeProfile: false
# 与浏览器扩展配对的令牌; 正常流程不需要在这里填, 配置页的令牌输入框会直接把令牌
# 写进数据目录. 这个字段只为兼容保留: 遗留值会被插件自动搬走并清空.
pairingToken: ''
# 是否自动同步连接组件与扩展产物到数据目录. 默认关闭; 也可在插件配置页用
# "自动同步连接组件" 开关拨动.
installHostAutomatically: false
extraArgs 会拒绝 --remote-debugging-port, --headless, --disable-extensions, --user-data-dir 等参数并在启动时报错: 它们与本插件的前提直接冲突, 静默接受会让"为什么又弹验证了"变得无从排查.