前言¶
DeepSeek Harness(DSH)的插件生态旨在通过标准化的工具接入各类能力。在浏览器自动化领域,常见的方案如 Puppeteer 和 Playwright 基于浏览器调试协议(CDP)。虽然功能强大,但这些工具在启动时会发出 Runtime.enable 等命令,容易暴露 navigator.webdriver 特征,且默认使用全新空白 profile,极易触发主流反爬厂商的验证码机制。
dsh-browser 插件旨在解决这一问题。它不依赖 Chrome 调试协议,通过 native messaging 让扩展与 DSH 通信,将页面转换为带编号的文本清单交给模型,并利用 Chrome 的持久 profile 保留登录态与历史记录,从而降低被识别为自动化的风险。
核心功能¶
该插件通过以下方式实现浏览器控制:
* 不使用 CDP:不通过 --remote-debugging-port 启动,而是使用扩展与 native messaging host 通信。
* 持久 Profile:Chrome 使用一个持久的独立 profile,跨会话保留登录态。
* 文本化交互:页面以带编号的文本形式呈现,不需要视觉模型进行截图识别。
* 工具集:提供 browser_status, browser_open, 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, browser_hover, browser_upload, browser_screenshot, browser_evaluate, browser_console 等工具。
安装与启用¶
安装与启用过程包含三个主要步骤:安装插件、配置连接组件、加载扩展并配对。
1. 安装插件¶
在终端执行以下命令安装插件:
dsh plugin --profile desktop add azazo1/dsh-browser
安装完成后重启 DSH。
2. 安装连接组件¶
打开 设置 -> 插件 -> dsh-browser,点击 安装连接组件。这一步会:
1. 将扩展产物复制到 DSH 数据目录。
2. 生成 native messaging 清单,写入扩展 ID。
3. 生成启动包装脚本,写死 node 绝对路径(Chrome 直接 exec 它,不走 shell)。
清单文件写入位置:
* macOS: ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/
* Linux: ~/.config/google-chrome/NativeMessagingHosts/
* Windows: 注册表 HKCU\Software\Google\Chrome\NativeMessagingHosts\
3. 手动加载扩展¶
由于 Chrome 版本限制,必须手动操作:
1. 打开 chrome://extensions,开启开发者模式。
2. 点击“加载已解压的扩展程序”。
3. 选择配置页上显示的扩展目录。
4. 回到配置页,状态应变为绿色。
注意:Chrome 154 之后禁用了命令行
--load-extension参数,且从 33 起只接受商店或企业策略扩展,因此此步骤无法通过命令行完成。使用 unpacked 方式加载的扩展不会自动更新。
4. 配对令牌¶
dsh 与扩展之间通过配对令牌进行鉴权。没有令牌时操作会被拒绝,而非降级放行。
- 在浏览器工具栏点击 dsh Browser 图标。
- 复制面板中的配对令牌。
- 在 DSH 设置 -> 插件 -> dsh-browser 中粘贴令牌并保存。
- 状态应变为“dsh 已接受配对”。
5. (可选) 开启 Allow User Scripts¶
browser_evaluate 工具需要执行 JS 代码,受 CSP 限制。需在扩展详情页手动打开 Allow User Scripts 开关(Chrome 138 之前需开启右上角开发者模式)。若未开启,该工具会报错并建议使用 browser_query。
使用说明¶
安装完成后,Agent 即可调用上述工具。使用时需注意以下规则:
工具分工¶
- browser_snapshot:列出可见可交互元素并编号,用于操作。
- browser_query:按 CSS 选择器返回全部匹配项的文本与属性,用于读数。
- browser_text:仅提取页面正文。
- browser_evaluate:执行 JS 表达式(需开启 Allow User Scripts)。
- browser_screenshot:仅截取当前视口并保存为文件返回路径,不直接传给模型。
操作规则¶
- 绑定标签页:所有操作只作用于被绑定的标签页。必须先调用
browser_select_tab。 - 快照编号失效:页面 DOM 结构变化后,上一次
browser_snapshot生成的编号将失效。若操作过期的编号,工具会报错,需重新获取快照。
配置项¶
在 DSH 的 profile patch 层中配置 dsh-browser:
- id: dsh-browser
config:
# Chrome 可执行文件路径(可选,默认探测稳定版)
chromePath: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
# 持久 profile 目录(可选,默认 <DSH_HOME>/data/dsh-browser/profile)
profileDir: ~/chrome-for-dsh
# 额外启动参数(会拒绝 --remote-debugging-port, --headless 等参数)
extraArgs: []
# 是否在首次使用浏览器时征求用户同意
askOnAcquire: true
# 是否启动独立 profile 的 Chrome
launchStandaloneChromeProfile: false
注意事项¶
- 多会话冲突:浏览器平面是独占的。若两个会话同时尝试驱动,会触发审批流程。
- 权限拒绝:
extraArgs中包含的冲突参数(如--remote-debugging-port)会被拒绝并在启动时报错。 - 令牌管理:配对令牌直接写入数据目录的
pairing-token文件(权限 0600),不参与配置文件同步。
总结¶
dsh-browser 通过绕过 CDP 协议和保留真实 Profile,为 DSH 提供了一种更接近人工操作的浏览器控制方式。它适合需要在有登录态、反爬检测较严的环境下进行网页交互的场景。
- 插件目录: https://www.skillhub.cn/plugins/azazo1/dsh-browser
- GitHub: https://github.com/azazo1/dsh-browser