用本机 Edge 浏览器绕过网络限制抓取网页内容
30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Chuzhj/dsh-edge-search该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · search
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 12 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 5 处,展示前 5 条)
- 读取本地文件lib/cdp.js:34
if (existsSync(c)) return c - 发起网络请求lib/cdp.js:48
const res = await fetch(`http://127.0.0.1:${port}/json/version`, { - 读取本地文件lib/cdp.js:74
if (edgePath && !existsSync(edgePath)) { - 写入本地文件lib/cdp.js:87
mkdirSync(dir, { recursive: true }) - 执行外部命令来自配置/变量lib/cdp.js:89
const child = spawn(
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
插件,作为deepseek api在非公网环境下无法调用web_fetch时的补救措施,能在非公网的环境下让dsh访问到网页
README
由 DeepSeek 最新模型翻译生成dsh-edge-search
一个 DeepSeek Harness(DSH)的 Host 插件,通过 CDP 驱动 你本机真实的 Edge 浏览器,给智能体补上 edge_search / edge_read 两个工具。
不要 API Key,不接第三方服务,不花一分钱。
它的主业是给内置 web 工具兜底——尤其是你在开 VPN 的时候。
为什么需要它
DSH 自带的 web_fetch 有一层 SSRF 防护:域名解析一次,只要解析出的地址里有一个不是公网单播,整批结果直接拒绝,连请求都不发。
而 Clash / Mihomo 系 VPN 的 fake-ip 模式(默认池 198.18.0.0/15,RFC 2544 保留段)会把每一个域名都解析成 198.18.x.x。两边一撞,web_fetch 在所有站点上都报:
URL hostname "..." resolves to a non-public IP address
这不是某个网站的问题,也不是你网络坏了——curl、浏览器、Invoke-WebRequest 都好好的,只是 web_fetch 在发包之前就把自己拦住了。
本插件绕开这层检查:浏览器自己解析域名、自己开 socket,系统把流量送进 VPN 隧道,插件只负责把渲染好的页面读回来。
展开完整文档(README 剩余 1 节)
dsh-edge-search
一个 DeepSeek Harness(DSH)的 Host 插件,通过 CDP 驱动 你本机真实的 Edge 浏览器,给智能体补上 edge_search / edge_read 两个工具。
不要 API Key,不接第三方服务,不花一分钱。
它的主业是给内置 web 工具兜底——尤其是你在开 VPN 的时候。
为什么需要它
DSH 自带的 web_fetch 有一层 SSRF 防护:域名解析一次,只要解析出的地址里有一个不是公网单播,整批结果直接拒绝,连请求都不发。
而 Clash / Mihomo 系 VPN 的 fake-ip 模式(默认池 198.18.0.0/15,RFC 2544 保留段)会把每一个域名都解析成 198.18.x.x。两边一撞,web_fetch 在所有站点上都报:
URL hostname "..." resolves to a non-public IP address
这不是某个网站的问题,也不是你网络坏了——curl、浏览器、Invoke-WebRequest 都好好的,只是 web_fetch 在发包之前就把自己拦住了。
本插件绕开这层检查:浏览器自己解析域名、自己开 socket,系统把流量送进 VPN 隧道,插件只负责把渲染好的页面读回来。
十秒自测(Windows):Resolve-DnsName www.baidu.com。返回 198.18.x.x 就说明 fake-ip 开着,web_fetch 对所有域名都废了。
两个工具
| 工具 | 作用 |
| edge_search | 后台标签页打开搜索结果页,提取 标题 / URL / 摘要,然后关掉标签页。引擎支持 bing(默认)/ baidu / google / duckduckgo |
| edge_read | 后台标签页打开指定 URL,用文本密度策略提取正文(站点改版也不怕),然后关掉标签页 |
两个工具都只返回纯文本、无状态,不会碰你已打开的标签页,也不需要登录。
它们是兜底通道,不是默认通道:比 web_fetch 慢一个数量级,只在内置工具失败或你不想花按次计费的搜索费时才用。
环境要求
- 装好 DSH(桌面版或命令行都行)
- Windows + Microsoft Edge。用别的 Chromium 内核浏览器可以通过 edgePath 指定
- 运行时没有 npm 依赖,也不需要任何 Key
- 想在 DSH 之外跑离线自测,需要 Node.js 22 或更高:插件用到了全局 WebSocket, Node 20 及以下会报 WebSocket is not defined(DSH 自带运行时不需要你操心)
安装
有两种方式。新手直接用方式一 —— 一条命令都不用敲。
方式一:把整个文件夹交给 DSH,让它自己装(最方便)
不用开终端、不用手改 JSON,让 DSH 的智能体自己动手。
1. 把 dsh-edge-search 整个文件夹拖进 DSH 对话框(或者直接把完整路径发给它)。
注意是整个文件夹,不是其中某个文件 —— 它要能看到 package.json 和 index.js。
2. 附上一句话(直接复制):
帮我安装这个 DSH Host 插件:先把它复制到 D:\tools\dsh-edge-search (固定位置,不要放临时目录),再登记到配置档的 dependencies 和 dsh.profile.bundles 里,包名是 @local/dsh-edge-search。
顺便把仓库里的 skills/web-fallback 整个文件夹复制到 %DSH_HOME%\skills\ 下(这是一个配套技能,装上它智能体才更容易想起用这两个工具)。
装完告诉我需要重启。
3. DSH 会自己执行 dsh plugin --profile desktop add、把包名写进 bundles 配置,并把配套技能复制到 %DSH_HOME%\skills\。
4. 最后由你手动完全退出 DSH,再重新打开。 Host 插件只在启动时加载,而这一步它自己做不到 —— 它没法重启自己。
少了这一步,工具不会出现,看起来像「装失败了」。
装完验证一下:
dsh plugin --profile desktop list
出现 @local/dsh-edge-search@file:... 就成了。也可以在对话里让它随便读个网页试试。
如果智能体说自己没有终端权限、或者报 dsh: command not found,退回方式二手敲。
方式二:手动安装(可控,方便排查)
1. 把插件放到一个固定位置
clone 或解压到一个你以后不会挪的目录,比如 D:\tools\dsh-edge-search。
目录根下必须有 package.json 和 index.js。
2. 装进你的 DSH 配置档
用命令行的话,把 desktop 换成你自己的配置档名
dsh plugin --profile desktop add D:\tools\dsh-edge-search
这一步把它登记成 file: 依赖并安装到配置档里。
包名 @local/dsh-edge-search 里的 @local 是刻意的:它不发布到 npm,只从本地路径安装。package.json 里的 "private": true 也是同一目的——防止误发。
3. 注册成 bundle —— 这步别跳过
光装依赖不够。DSH 只加载 dsh.profile.bundles 里列出的插件,不在这里面的只会躺在 node_modules 里,永远不加载。
打开 %DSH_HOME%\profiles\desktop\package.json (%DSH_HOME% 一般是 C:\Users\<你的用户名>\.dsh),把包名加进 bundles 数组:
{
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"@local/dsh-edge-search"
]
}
}
}
4. 重启 DSH
Host 插件在启动时加载,必须完全退出再打开,不是刷新窗口。
5. 验证
dsh plugin --profile desktop list
应该能看到 @local/dsh-edge-search@file:<你的路径>。
然后在 DSH 对话里让智能体读个网页,它手里就该有 edge_read 了。也可以不经过 DSH,直接跑离线自测:
node selftest.mjs probe # 只看调试端口通不通
node selftest.mjs read "https://example.com" 400
node selftest.mjs search "你好" bing 3
node selftest.mjs js "https://example.com" "document.title" # 在页面里跑任意 JS,探查用
第一次调用时会弹出一个 Edge 窗口。 那是插件的专用调试实例(独立配置档,不含你的书签、密码、Cookie),不是你的日常浏览器窗口。让它开着——关掉的话下次调用会重新拉起,多花 5–10 秒。
配置项
写在配置档的 cordis.patch.yml 里:
- id: dsh-edge-search
name: "@local/dsh-edge-search"
config:
port: 9222
edgePath: "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"
profileDir: "..."
| 键 | 默认 | 说明 |
| port | 9222 | CDP 端口,必须没被占用 |
| edgePath | 自动探测 | msedge.exe 的路径。Edge 装在非标准位置时填;指向的文件不存在会直接报错,不会静默回退到自动探测 |
| profileDir | %LOCALAPPDATA%\dsh-edge-search\edge-profile | 自动化专用的独立浏览器配置档,闲置时随便删 |
原理 / 一条必须知道的硬约束
flowchart LR
A["agent 调用 edge_read"] --> B["插件"]
B --> C["启动 / 复用独立 profile 的 Edge"]
C --> D["新建后台标签页"]
D --> E["浏览器自己解析 DNS自己开 socket"]
E --> F["系统路由 → VPN 隧道"]
F --> G["页面渲染完成"]
G --> H["页面内 JS按文本密度提取正文"]
H --> I["关闭标签页"]
I --> J["返回纯文本给 agent"]
style B fill:#185FA5,color:#fff
style E fill:#378ADD,color:#fff
关键在于:DNS 解析和 socket 都在浏览器里完成,不经过 DSH 那层 IP 校验。
这就是它能绕过 fake-ip 拦截的全部原因。
Chromium 136 起,浏览器用默认数据目录时会静默忽略 --remote-debugging-port。
所以本插件永远带一个专用的 --user-data-dir 启动 Edge,而不是去接管你日常那个窗口。
别想着「优化」掉这个参数——去掉之后调试端口根本不会监听,而且没有任何报错。
每次调用都是新建一个后台标签页、干完活、关掉。你自己的窗口一律不碰。
安全说明
- CDP 端口只监听 127.0.0.1,不接受外部连接。但本机上的任何进程都能连上它——在共享电脑或不可信环境里需要留意。不用时直接关掉那个 Edge 窗口即可。
- 调试配置档是独立的,位于 %LOCALAPPDATA%\dsh-edge-search\edge-profile,不含你的书签、密码、Cookie 和登录态。这也是「读不到需要登录的页面」的原因——是设计,不是缺陷。
- 插件不向任何第三方服务发送数据,没有遥测、没有统计上报、没有 API Key。
所有请求都是你的浏览器直接发往目标站点。
出问题怎么办
| 现象 | 原因 | 处理 |
| unknown tool "edge_read" | 插件没加载 | 用方式一装的,先确认有没有手动重启 DSH;还是不行就检查方式二的第 3 步(bundles) |
| 配置项 edgePath 指向的可执行文件不存在 | 路径写错 | 检查路径,或删掉该项让插件自动探测 |
| Edge did not expose a debugger on port 9222 | 端口被占,或找不到 Edge | Get-NetTCPConnection -LocalPort 9222;改 port / edgePath |
| 第一次调用要 5–10 秒 | 正在拉起 Edge | 正常。调试窗口别关,后续调用会复用它 |
| extracted no readable text | 纯 JS 应用 / 登录墙 / 空页面 | 不是 bug,确实没正文可提 |
| 要登录才看得到的内容 | 专用配置档里没有你的 cookie | 设计如此,这种内容请用你自己的浏览器 |
耗时参考:edge_read 约 2–10 秒,edge_search 约 3 秒,首次调用额外多 3–8 秒。
更新与停止
更新到新版本:
cd D:\tools\dsh-edge-search
git pull
然后完全退出并重启 DSH
关掉那个调试用的 Edge 窗口:直接关窗口就行,插件下次调用会自动重新拉起。
想彻底重置(比如 profile 被搞乱了、端口状态不对):
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\dsh-edge-search\edge-profile"
手工安装(dsh plugin add 用不了时)
直接改 %DSH_HOME%\profiles\<profile>\package.json,两处都要加——依赖和 bundle:
{
"dependencies": {
"@local/dsh-edge-search": "file:D:/tools/dsh-edge-search"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@local/dsh-edge-search"
]
}
}
}
然后让 profile 重新解析依赖,再重启 DSH:
dsh plugin --profile desktop install
⚠️ 只改 dependencies 不跑 install,pnpm 的 lockfile 会继续指向旧路径。这时候插件加载会失败,而且通常没有任何报错,只表现为「工具不存在」。
卸载
1. 从 profile 清单的 dsh.profile.bundles 里删掉 "@local/dsh-edge-search"
2. dsh plugin --profile desktop remove @local/dsh-edge-search
3. 重启 DSH
配套技能(可选,但强烈建议装)
skills/web-fallback/SKILL.md 是给智能体看的判断规则:什么时候该换用这两个工具。
不装也能用——插件装了,工具就在。但智能体未必会在 web_fetch 失败时想起去试 edge_read;装上这份技能,它遇到 WEB_BLOCKED_URL / resolves to a non-public IP address 时会主动切过来。
装法一:让 DSH 自己装
用「方式一」装插件时,那句指令里已经带了这一步(skills/web-fallback 复制到 %DSH_HOME%\skills\)。如果你已经装完了插件、只补技能,直接说:
把 dsh-edge-search\skills\web-fallback 整个文件夹复制到 %DSH_HOME%\skills\ 下。
装法二:手动复制
%DSH_HOME% 一般是 C:\Users\<你的用户名>\.dsh。技能放在它下面的 skills\ 里, 一个技能一个文件夹,文件夹里必须有 SKILL.md:
把 D:\tools\dsh-edge-search 换成你实际放插件的位置 $src = "D:\tools\dsh-edge-search\skills\web-fallback" $dst = "$env:USERPROFILE\.dsh\skills\web-fallback" New-Item -ItemType Directory -Force -Path $dst | Out-Null Copy-Item "$src\SKILL.md" $dst -Force
验证
装完的目录结构应该是这样:
C:\Users\<你的用户名>\.dsh\skills\
└── web-fallback\
└── SKILL.md
然后开一个新会话(技能在会话启动时加载,老会话看不到),问一句「你现在有哪些技能?」,能看到 web-fallback 就成了。
⚠️ 别装成两份
如果你以前装过同功能、但名字不同的技能(比如 web-fetch-fallback), 先删掉旧的再装这份。两者的触发条件几乎完全一样,同时存在会互相抢,行为变得难以预测。
先看看现在有哪些 Get-ChildItem "$env:USERPROFILE\.dsh\skills" -Directory | Select-Object Name
确认是旧的再删(下面只是举例,按实际名字改) Remove-Item -Recurse -Force "$env:USERPROFILE\.dsh\skills\web-fetch-fallback"
卸载
直接删文件夹即可:
Remove-Item -Recurse -Force "$env:USERPROFILE\.dsh\skills\web-fallback"
变更记录
见 CHANGELOG.md。从 v0.3.0 起开始记录。
许可
MIT,见 LICENSE。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Chuzhj/dsh-edge-search
用本机 Edge 浏览器绕过网络限制抓取网页内容
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,032已汉化DSH
72.1
智能体记忆系统MemTensor/MemOS
MemOS 2.0 Stardust星尘
★ 12,195已汉化DSH
71.2
跨代理记忆库zilliztech/memsearch
跨平台语义记忆,专为 AI 编程智能体打造。
★ 2,799已汉化DSH
70.9
技能语料库EverMind-AI/SkillCorpus
SkillCorpus 能给你什么
★ 694已汉化DSH
69.7
代码图谱记忆syncable-dev/memtrace-public
你的智能体值得拥有结构化记忆。
★ 509已汉化MCP
67.9
AnySearch 搜索插件anysearch-team/anysearch-dsh
AnySearch 网页搜索服务商,为 DeepSeek Harness(DSH)提供高级搜索工具
★ 457已汉化DSH
66.6