dsh-tool-browser:在 DSH 里打开网页、按页面需要等待、抽正文、截图

前言

在 DeepSeek Harness(DSH)里做智能体或工作流时,经常需要读网页:查文档、跟链接、把页面内容交给模型。常见做法是直接 HTTP 抓 HTML,或在本机装浏览器自动化。前者不执行 JavaScript,动态页往往拿到的是壳;后者能渲染,但「等加载完」有多种含义,选错会把加载动画当正文。更麻烦的是静默退回:浏览器失败后悄悄用静态抓取,调用方会以为拿到的是渲染后的内容。

下面介绍社区插件 dsh-tool-browser(维护者 yuehancn,GitHub:yuehancn/dsh-tool-browser)。它在 DSH 里提供四个浏览器相关工具:先说明当前有没有真浏览器,再取 HTML、抽可读正文或截 PNG;装了 Playwright 用真浏览器,没装则退回静态抓取,并在返回里用 engine 和 engineNote 明确说明,避免把「JavaScript 从没跑过」的页面当成空页或完整页。

这是什么

dsh-tool-browser 是面向 DeepSeek Harness 的浏览器工具插件,npm 包名 @yuehancn/dsh-tool-browser,当前版本 1.0.0,MIT 许可证。在 SkillHub 目录中归类为「模型推理」,简介为 DeepSeek Harness plugin。

插件解决的是「打开页面 → 按页面真正需要的方式等待 → 抽出正文 → 必要时截图」这一整条链路,而不是只提供一个裸 fetch。

四个工具

README 中列出的能力如下:

工具 作用
browser_status 说明是否有真浏览器、默认引擎、四种等待策略、输出目录与默认值;不发起请求、不启动浏览器
browser_fetch 获取页面 HTML,可选存盘
browser_extract 只取可读正文,纯文本或 Markdown
browser_screenshot 用真浏览器截 PNG;无 Playwright 时明确报错,不提供静态兜底

Playwright 为可选依赖。未安装时,browser_fetch 与 browser_extract 仍可用(静态引擎);browser_screenshot 会失败而不是返回无渲染意义的空图。

每次调用都会在结果里带上 engine 与 engineNote,例如浏览器超时退回静态时,会说明下方内容是「未执行 JavaScript 时服务器返回的内容」。

等待策略与正文抽取

四种「等加载完」

插件支持四种等待策略,含义不同:

策略 等的是什么
domcontentloaded DOM 树建好
load 所有资源(图片、样式等)到齐
networkidle 网络安静(500ms 无请求)
selector 某一 CSS 元素出现

使用 selector 时,导航会用 domcontentloaded,再用 waitForSelector 等待目标元素,避免与 networkidle 组合时在带轮询请求的页面上永远等不到「网络安静」。

正文怎么选

抽取器不按「谁文字最多」选节点(那样几乎总是 <body>),而是对候选子树按正文密度打分:正文比例(非链接文字)、分段程度、标点密度等。打分前会先去掉 <nav>、<footer>、<aside>、<script>、<style> 等;类名匹配支持常见复数形式(如 comments)。浏览器引擎与静态引擎对同一份文档应抽出相同正文,README 中测试对此有专门断言。

HTML 转 Markdown 时处理了反引号围栏宽度、代码与强调的嵌套顺序、链接内强调保留、空链接写成 [](url) 等细节。

安装与配置

安装插件(命令来自 README):

dsh plugin add dsh-tool-browser

需要真浏览器时,再安装 Playwright:

npm install playwright
npx playwright install chromium

建议先调用 browser_status 确认当前环境。可在 cordis.patch.yml 中配置插件,例如:

# cordis.patch.yml
plugins:
  dsh-tool-browser:
    workDir: "."
    outputDir: "browser-output"
    waitStrategy: domcontentloaded

插件要求 DSH >=0.2.0-rc.2,peer 依赖 @deepseek-ai/cordis 与 @deepseek-ai/dsh-tools。

典型用法

先看状态

调用 browser_status,确认 Playwright 是否可用、默认等待策略与 outputDir,再决定用 mode=auto 还是强制 browser / static。

取 HTML:browser_fetch

参数 说明
url 必填,绝对 http(s) URL
mode auto(默认,浏览器优先、失败可退回)/ browser(必须真浏览器)/ static(仅静态)
waitStrategy 四种策略之一
waitForSelector CSS 选择器,隐含 waitStrategy=selector
saveAs 存到 outputDir 下的文件名
maxChars 返回 HTML 截断长度

mode 是承诺而非偏好:browser 模式下没有真浏览器会报错,不会静默退回。配置项 requireBrowser 可让 auto 也不允许退回。若指定 saveAs,磁盘写入的是完整页面,即使返回体被 maxChars 截断。

只要正文:browser_extract

参数 说明
url 必填
format text(默认)或 markdown
keepLinks Markdown 是否保留链接语法,默认 true
includeLinks 是否附带整页链接表,默认 false
maxChars 正文截断长度

返回中包含 selector(选中的子树)与 score(密度得分),便于诊断抽取结果是否异常。

截图:browser_screenshot

参数 说明
url 必填
filename 存到 outputDir,默认带时间戳
fullPage 整页或视口,默认 false
width / height 视口尺寸

文件名只取最后一段路径,防止通过绝对路径或 ../ 写到 outputDir 之外。

适用场景与注意

适合谁: 需要在 DSH 智能体或脚本里稳定读网页、抽文章正文、在具备 Playwright 的环境里截图的开发者;希望区分「静态 HTML」与「浏览器渲染结果」的场景。

权限与安全: 插件以当前 DSH 进程的权限运行,会访问你传入的 URL 并可能写入 outputDir。安装前请阅读 GitHub 仓库 源码与 MIT 许可证,确认来源与行为符合你的环境策略。社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系,DSH 生态理念是「一切皆插件」,目录为独立社区站点。

依赖: 不装 Playwright 仍可使用 fetch 与 extract;动态渲染、截图依赖 Playwright。网络超时或浏览器失败时,请关注返回中的 engine / engineNote,不要假设一定是渲染后的 DOM。

结尾

dsh-tool-browser 把「状态说明、抓取、正文抽取、截图」拆成四个工具,并在引擎切换时写清楚;等待策略与密度抽取针对真实网页里的常见坑做了显式处理。若你在 DSH 里需要可核对来源的网页能力,可从目录页或 GitHub 安装并按 README 配置 Playwright 与 cordis.patch.yml。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye