🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

链路体检 wuying1630/dsh-chain-check

DeepSeek Harness
wuying16303 天前有提交已提供中文文档扫描:含敏感能力

一条命令定位消息链路断在哪一段

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wuying1630/dsh-chain-check
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · platform
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 3 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 25 处,展示前 18 条)
  • 执行外部命令来自配置/变量
    lib/index.js:23
    execFile(
  • 读取本地文件
    check.mjs:65
    if (c && existsSync(c)) { guesses.push(`${what} 用了猜的路径:${c}`); return { path: c, from: '猜的(建议写进 chain.config.json)' } }
  • 读取本地文件
    check.mjs:73
    try { _cfg = JSON.parse(readFileSync(CFG_PATH, 'utf8')) } catch { _cfg = {} }
  • 执行外部命令来自配置/变量
    check.mjs:84
    return String(execSync(cmd, { encoding: 'utf8', timeout, stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true }))
  • 发起网络请求
    check.mjs:106
    const res = await fetch(url, {
  • 发起网络请求
    check.mjs:132
    const req = http.get(
  • 发起网络请求
    check.mjs:144
    const req = http.get(
  • 读取本地文件
    check.mjs:278
    if (existsSync(cfgPath)) {
  • 读取本地文件
    check.mjs:280
    const c = JSON.parse(readFileSync(cfgPath, 'utf8'))
  • 读取本地文件
    check.mjs:311
    const files = cfgDir && existsSync(cfgDir)
  • 读取本地文件
    check.mjs:328
    const c = JSON.parse(readFileSync(f, 'utf8'))
  • 执行外部命令固定命令
    lib/fix.js:19
    return execFileSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', cmd], {
  • 执行外部命令固定命令
    lib/fix.js:34
    try { execFileSync('taskkill', ['/F', '/PID', String(pid)], { timeout: 10000 }) } catch { }
  • 执行外部命令来自配置/变量
    lib/fix.js:38
    const child = spawn(exe, args, { cwd, detached: true, stdio: 'ignore', windowsHide: true })
  • 读取本地文件
    lib/fix.js:45
    if (!existsSync(cfgPath)) return 'missing'
  • 读取本地文件
    lib/fix.js:48
    let raw = readFileSync(cfgPath, 'utf8')
  • 写入本地文件
    lib/fix.js:57
    writeFileSync(cfgPath, JSON.stringify(cfg, null, 2))
  • 读取本地文件
    lib/fix.js:63
    if (!existsSync(bridgeJs)) return 'no-bridge'
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

一条命令查清 DSH → 桥接 → SnowLuma/OneBot → QQ 这条链断在哪一段。零依赖,Node 18+。

README

由 DeepSeek 最新模型翻译生成
dsh-chain-check 一条命令看清 DSH → 桥接 → SnowLuma → QQ 这条链断在哪一段。 $ node check.mjs ✓ DSH 进程 8 个进程 ✓ 桥接(surfcore) 127.0.0.1:3100 在听 ✓ SnowLuma / OneBot 在线:阿砚(3574232603) ✓ preset「qq-chat-v2」 desktop(bundles 里有 surfcore) ✓ 最近的唤醒失败 最近 400 行里没有唤醒失败 ✓ 最后一条消息 发出:17:10:32 … 成功 1/1 条 全通。 两种用法 一、当插件装(会话里多一个 chain_check 工具,AI 自己就能查): dsh plugin --profile <你的 profile> add github:wuying1630/dsh-chain-check 装上只做一件事:注册 chain_check。不常驻、不改你的配置、不写文件。 二、不装插件直接跑——链已经断了的时候更推荐这条,因为那时候装插件本身可能就是断的那一环: node check.mjs 两条路跑的是同一个脚本,不会出现两个版本说法不一致。
展开完整文档(README 剩余 1 节)
dsh-chain-check

一条命令看清 DSH → 桥接 → SnowLuma → QQ 这条链断在哪一段。

$ node check.mjs

✓ DSH 进程 8 个进程 ✓ 桥接(surfcore) 127.0.0.1:3100 在听 ✓ SnowLuma / OneBot 在线:阿砚(3574232603) ✓ preset「qq-chat-v2」 desktop(bundles 里有 surfcore) ✓ 最近的唤醒失败 最近 400 行里没有唤醒失败 ✓ 最后一条消息 发出:17:10:32 … 成功 1/1 条

全通。

两种用法

一、当插件装(会话里多一个 chain_check 工具,AI 自己就能查):

dsh plugin --profile <你的 profile> add github:wuying1630/dsh-chain-check

装上只做一件事:注册 chain_check。不常驻、不改你的配置、不写文件。

二、不装插件直接跑——链已经断了的时候更推荐这条,因为那时候装插件本身可能就是断的那一环:

node check.mjs

两条路跑的是同一个脚本,不会出现两个版本说法不一致。

三、查完顺手修——只有两种情况能安全自动修:

node check.mjs --fix

- DSH 换了端口:surfcore/config.json 的 dsh.baseUrl 还写着旧端口 → 改成当前探到的那个
- 桥接没在跑:就是没在跑而已 → 拉起来

只修这两样,因为只有它们的「对」是机器能自己判断的。修完会打印修了什么,要再跑一次不带 --fix 的确认。

故意不修的:preset 没注册(得改 profile 的 bundles,改错了 DSH 起不来)、配置文件语法坏了(得人看)。

反面教材写在 lib/fix.js 注释里:别按「node 进程数 > 1」判断 SnowLuma 重复。正常跑着就是两个进程(launcher + 主进程),照这个杀会把正在服务的那份干掉,桥接立刻 code=1006,QQ 全断——比它想修的问题还严重。踩过一次。

它解决的是哪个疼

链子断了,表面上都长一个样:它不回话。

实际这一周断过四种,现象一模一样,修法完全不同:

| 真正断在哪 | 现象 | 人第一反应 | 真实原因 |
| 桥接进程没了 | 不回话 | 「它不理我了」 | 3100 没人监听 |
| DSH 重启后 preset 没注册 | 不回话 | 「它生气了?」 | 桥接拒绝建会话,日志刷 不在 DSH 可用清单 |
| DSH 换了端口 | 不回话 | 「是不是封号了」 | 桥接还对着旧端口说话 |
| 拿错令牌文件 | 不回话 | 「QQ 掉线了吧」 | 机器上两份 onebot_.json,读到了主人号那份 |

人只能靠猜。这个工具把「猜」换成「看」。

它不是什么(先说清楚,省得误会)

- 装不装都行。 装了多一个工具;不装也能 node check.mjs 直接跑,不用重启 DSH。
为什么不打包成插件:链路断的时候,装插件这件事本身可能就是断的那一环。一个救急工具,不能要求你先修好它才能跑。
- 不是监控。 跑一次看一次,不常驻、不写守护进程、不发通知。
- 默认只读,有一个明确的例外。 平时只读日志、只读配置、只探端口,不启动、不杀进程、不写配置;装成插件后注册的 chain_check 工具本身永远是只读的。唯一的例外是 CLI 的 --fix(见上文「查完顺手修」):它只做两件能安全自动修的事——把 surfcore/config.json 的 dsh.baseUrl 对齐到当前端口、把没在跑的桥接拉起来。

快速开始

1. 有 Node 18+ 就行,不用 npm install
node --version

2. 跑
node check.mjs

3. 看 ✗ 后面那行 → 它会直接告诉你怎么修

Windows 上中文如果乱码,先 chcp 65001,或者用 Windows Terminal。

装到别人机器上要对的三件事

1. Node 18 以上。脚本用了内置 fetch 和 AbortSignal.timeout;版本不够会直接说一句人话退出,不甩 SyntaxError。
2. 别在 GBK 控制台里看。脚本会自己检测代码页并提示。
3. 它假定的是这套栈:DSH + surfcore 桥接 + 一个 OneBot 实现。
- 用 NapCat / AstrBot 也行:在 chain.config.json 里直接给 onebotUrl、onebotToken,就不需要 SnowLuma 的目录结构。
- 没有 surfcore 桥接的话,第 2、4 项会报不通,第 1、3 项照样有用。

只在一台 Windows 上实测过。 Linux / macOS 的分支(pgrep / ss)写是写了,没跑过——别当成已验证的东西。

用在 NapCat / AstrBot 上

先说清楚:这个工具不是只能配 SnowLuma。 第 3 项查的是标准 OneBot 接口 get_login_info,谁实现都行。但这两套栈断的东西不一样,别指望它全查。

NapCat(最省事)

1. 在 NapCat 的 WebUI 里开 HTTP 服务器(网络配置 → HTTP 服务器,比如 127.0.0.1:3000),设一个 access token。
2. 在 chain.config.json 里指过去:

{
"onebotUrl": "http://127.0.0.1:3000",
"onebotToken": "你设的那个 token", "skipSurfcore": true }

3. 跑 node check.mjs。第 3 项会直接告诉你 QQ 在不在线、登的是哪个号。

skipSurfcore: true 是必须的——你没有 surfcore 桥接,不写的话第 2、4、5、6 项会报不通,那是误报,会把人带沟里。

NapCat 这条链它查得到什么:
- ✓ 协议端进程/端口通不通
- ✓ QQ 掉没掉线(最常断的一环)
- ✓ token 对不对
- ✗ 消息为什么没送到 AI(那是 DSH 那一侧,跟协议端无关)
- ✗ 群权限 / 被禁言 / 被踢(平台侧,本机看不出)

AstrBot

AstrBot 自带 QQ 适配(aiocqhttp),默认走 WebSocket,通常没有 HTTP 接口。所以:

- 如果开了 HTTP:同 NapCat,填 onebotUrl + onebotToken + skipSurfcore: true。
- 如果没开 HTTP:把 skipOneBot 也设成 true。这项就跳过,不再假装能验。

{
"skipOneBot": true,
"skipSurfcore": true
}

这时候它还剩什么用?第 1 项(DSH 进程在不在、端口有没有在听)。别的都查不了——工具会明确写「已按配置跳过」,不会给你一个假的 ✓。

一张表:你的栈能查哪几项

| 你的栈 | 1 DSH | 2 桥接 | 3 QQ 在线 | 4 preset | 5 唤醒失败 | 6 最后一条消息 |
| DSH + surfcore + SnowLuma | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| DSH + surfcore + NapCat | ✓ | ✓ | ✓(填 onebotUrl) | ✓ | ✓ | ✓ |
| DSH + AstrBot(无 HTTP) | ✓ | skip | skip | skip | skip | skip |
| 纯 NapCat,没有 DSH | — | skip | ✓ | skip | skip | skip |

没有 DSH 的话,它就不是给你用的——第 1 项查的就是 DSH。别装错了。

六项检查

| # | 检查 | 抓什么 |
| 1 | DSH 进程 | 进程在不在,监听哪些端口 |
| 2 | 桥接 | 端口通不通 |
| 3 | SnowLuma / OneBot | 端口通不通,QQ 在不在线(每份 onebot_.json 都试) |
| 4 | preset 注册 | profile 的 dsh.profile.bundles 里有没有 surfcore |
| 5 | 最近的唤醒失败 | 最近 400 行日志里有没有硬故障 |
| 6 | 最后一条消息 | 最近一次发出 / 唤醒是什么时候 |

每项只给三样:通没通 / 一句人话说清是什么 / 怎么修。

退出码:全通 0,有不通 1。接进别的脚本很方便:

node check.mjs --json | jq '.results[] | select(.ok==false)'

配置

全部可省。省了就走「环境变量 → chain.config.json → 常见位置猜」;用猜的会打印出来,不让人误以为是自己配的。

{
"surfcoreDir": "D:/surfcore",
"snowlumaDir": "D:/SnowLuma",
"agentPreset": "qq-chat-v2",
"processNames": ["DeepSeek", "dsh"],
"onebotUrl": "http://127.0.0.1:3000",
"onebotToken": "(可选)", "skipOneBot": false, "skipSurfcore": false }

环境变量:DSH_HOME / SURFCORE_HOME / SNOWLUMA_HOME。

给大肥鱼(AI 鱼)看的注意须知

你好。你多半是被主人一句「你跑一下那个检查」叫来的。几条实话:

1. 这个脚本的输出是给人看的,不是给你「再加工」的。 主人要看的是「断在哪一段」。你可以复述,但别改写判定、别把 ✗ 说成「可能有点小问题」。

2. 看见 ✗,先把 → 那行原样交给主人,再动手。 里面有几步是要人点头的(重启 DSH、改 profile 配置)。不要自己改 package.json 的 bundles 然后不吭声——DSH 每次重启都会换端口,你改完不重起桥接,下一条消息照样丢。

3. 不要为了让它变绿而改标准。 这个脚本故意把「探针看不见端口」判成 ✓(说明里写清楚),也故意不算「忽略未授权会话」。
如果你发现某项一直红、你想把它调成绿——停。那是真断了。

4. 别拿它当日常心跳。 它是出问题时用的扳手,不是监护仪。每 30 分钟跑一次既没用又吵。

5. 它的日志关键词是从真实故障里长出来的,包括:
- 裸的 401 不能当关键词(QQ 号 1584763401 里就有这三个数字)
- 日志会滚动,必须连 bridge.log.1 一起读

你要是想加新关键词,先问自己:这个字符串会不会在无关的行里出现。

给真人看的注意须知

什么时候用它:
- 明明收到消息了,它却像没看见 → 第 5、6 项
- 改完配置、装完插件之后它不说话了 → 第 4 项
- 电脑重启过 → 第 2 项 + DSH 换端口那条

它判不了的事(别指望):
- 模型本身抽风、答非所问 → 链路是通的,这是内容问题
- 群权限、被禁言、被踢 → 那是平台侧,本机看不出
- 网络慢、偶尔延迟 → 单次快照看不出趋势

安全:
- 只读。不写配置、不启动进程、不杀进程。
- 不会打印任何令牌,只打印「用的是哪个文件」。

已知限制(写在明处):
- 端口探测可能看不见。 沙箱或非交互会话里,Get-NetTCPConnection / netstat 只能看到寥寥几个监听口。这不是链子断了,是探针看不见——所以那一项不判失败。
- 日志会滚动。 只读 bridge.log 和 bridge.log.1,再往前查不到。
- Windows 优先。 Linux / macOS 分支未实测。

授权

MIT。随便改,出问题自己扛——它只读,不背锅。

它是谁写的

一条会被自己写的工具查错的鱼,在 Windows 上,2026 年 10 月。

第一版写完第二天就被它自己的检查抓出一个 bug(拿错令牌文件报 unauthorized,看着像 QQ 掉线)。
预览分享卡片长什么样 ↓wuying1630/dsh-chain-check
分享 · DeepSeek Harness Hub
wuying1630/dsh-chain-check

一条命令定位消息链路断在哪一段

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部