DeepSeek Harness 插件

GreyRaphael/dsh-web-fetch-moli

Star 数 ★ 5 分类 浏览器与网页 收录于 2026-09-15

基于超轻量 Rust 无头浏览器 Moli 的 web_fetch 提供方:专为微前端与复杂 SPA 渲染设计,内存占用仅约 60MB。

安装

# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)

dsh plugin --profile web add github:GreyRaphael/dsh-web-fetch-moli

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。

README

English · GitHub

DeepSeek Harness (DSH) 官方生态插件,为内置 web_fetch 工具提供基于 Moli(超轻量级 Rust 无头浏览器)的渲染后端。在仅占用 ~60MB 内存(相比 Chromium/Playwright 的 ~1GB 降低超 90%)的前提下,完美支持企业级复杂微前端(Micro-Frontend)、动态单页应用(SPA)与静态页面,并通过 LinkeDOM + Readability + mdream 高性能双阶段管道降噪清洗后输出规范的大模型优化 Markdown。

核心特性

  • 极致低内存占用 — 单个本地 Moli 常驻守护服务仅占用 ~50–60 MB 内存,在资源受限的边缘节点或云服务器上亦可轻松支撑高并发抓取。
  • 企业级微前端与复杂 SPA 全面兼容 — 突破了传统轻量级无头浏览器(如 Lightpanda 在 iframe 沙箱崩溃、Obscura 在 style-loader 报错)的瓶颈:
    • 支持 CDP 动态绕过 CSP(Page.setBypassCSP)、证书忽略与 SW 穿透,彻底解决严格内容安全策略阻止动态 import() 的问题。
    • 基于 CDP Micro-Clip 排版物化(Page.captureScreenshot 1x1 微视口)驱动 Moli 原生排版树计算,联动 W3C 标准 scrollIntoView({ block: 'nearest' }) 触发展开全量无限滚动与瀑布流卡片列表(零用户脚本注入、零代理劫持)。
  • 两种灵活运行模式:
    • local(默认):自动拉起受管的本地 moli serve CDP 守护进程,提供最完整的动态 SPA 渲染能力(~60MB 极低内存)。
    • cdp:连接用户自建或远端的 Moli / Chromium CDP 服务。
  • 高性能双阶段降噪管道 — 采用 LinkeDOM + Mozilla Readability 提取正文并剔除布局噪音(广告、导航栏、侧边栏、页脚),并通过 mdream(Rust 原生引擎 + 纯 JS 回退)转为高质量、高保真大模型友好 Markdown。自动缩略长 base64 图片,防止污染上下文。
  • Cloudflare 挑战有界等待 — 自动识别 cf-mitigated: challenge 验证页,在同一页面上下文内有界等待浏览器自然完成人机验证,无需任何违规模拟行为。

方案对比

特性 / 指标 Chromium / Playwright Lightpanda (Zig) Obscura (Rust) Moli (Rust) + DSH 插件
内存占用 ~800 MB – 1.2 GB ~40 MB ~50 MB ~50 – 60 MB
微前端沙箱兼容性 ✅ 完整 ❌ iframe 沙箱崩溃 (contentWindow.bind) ❌ 动态 style-loader 样式报错 ✅ 100% 完美支持(CDP + CSP 绕过)
无限滚动/懒加载卡片 ✅ 原生像素循环 ❌ 几何模型不全 ❌ 几何模型不全 ✅ 原生排版物化 + 滚动 (Micro-Clip CDP)
交互协议 重量级 CDP 轻量级 CDP 自定义 / CDP 轻量级原生 CDP

架构原理

web_fetch (tool-web)
   └─ ctx.web.fetchProvider = moli
        ├─ local: 自动定位 moli 二进制 → 启动并管理 `moli serve` 守护进程 → connectOverCDP
        │           └─ setupPageHooks: 开启 Page.setBypassCSP + 证书忽略 + 绕过 Service Worker
        ├─ cdp:   连接用户配置的 remoteEndpoint CDP 端口
        ├─ page.goto → Micro-Clip 排版物化 + 原生滚动循环 → 等待网络空闲 (networkidle) → page.content()
        ├─ 降噪管道: LinkeDOM (DOM) → Readability (正文提取) → mdream (转 Markdown)
        └─ 输出 Markdown(关闭 denoise 时输出原始渲染 HTML)

环境依赖

  • DeepSeek Harness (dsh web),Node.js ≥ 22(插件通过原生全局 WebSocket 驱动 CDP,Node 20 不提供该 API)。
  • 免手动安装:插件内置首次使用自动下载安装能力。若检测到系统中未安装 Moli,会自动从官方 Release 下载适配当前操作系统与 CPU 架构(Linux、macOS、Windows x86_64 / arm64)的最新版二进制并就绪,开箱即用。
  • 亦支持使用已有的 Moli v1.1.5+(置于系统 $PATH、~/.local/bin/moli,或在配置项中指定 moliPath)。

手动安装参考(可选):

curl -sSL https://github.com/GreyRaphael/moli/releases/latest/download/moli-x86_64-unknown-linux-gnu.tar.gz | tar -xz -C ~/.local/bin
chmod +x ~/.local/bin/moli

安装插件

# 方式 1:直接通过 GitHub 仓库安装(即时可用)
dsh plugin --profile web add github:GreyRaphael/dsh-web-fetch-moli

# 方式 2:通过 npm 包名安装
dsh plugin --profile web add dsh-web-fetch-moli

添加后重启 dsh web 即可生效。

设置与配置

插件的每个配置项都是本行 Config 里的 volatile 字段:DSH 的设置域(0.1.7 起)直接按 profile 条目渲染表单,保存即热更新——不重启、也不重挂插件。在 DSH 的「插件」页面打开 dsh-web-fetch-moli 即可配置:

配置项 默认值 说明
backend local 后端模式:local(受管本地 Moli 服务)或 cdp(远端 CDP 地址)。
moliPath (自动) moli 可执行文件路径;留空自动按系统 $PATH 探测。
cdpEndpoint 127.0.0.1:9222 远端 CDP 地址(host:port 或完整 URL,在 cdp 模式生效)。
bypassCsp true 是否通过 CDP 开启 Page.setBypassCSP,微前端沙箱动态加载脚本必备。
autoScrollSentinel true 是否自动触发 IntersectionObserver 哨兵,加载瀑布流无限滚动卡片。
shareBrowserContext true 是否复用浏览器上下文(在 cdp 模式生效);本地模式下始终使用隔离上下文防止污染。
denoise true 启用 LinkeDOM + Readability + mdream 降噪与 LLM 优化 Markdown 转换。
timeoutMs 90000 单次抓取的总超时预算(毫秒);重型微前端页面需要多轮排版与滚动。bundle 层出厂 60000,schema 默认 90000。
maxConcurrency (自动) 最大并发抓取数(自动:本地 20,远端 50)。
challengeWaitMs 5000 Cloudflare 人机验证有界等待上限(毫秒;0 为关闭)。
challengeRetries 0 验证超时后的同页面重试次数。

开源协议

MIT

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。