dsh-napcat-keeper
让 NapCat 这个 QQ 后端跟着 DSH 一起活着:启动时探测 OneBot 11 的 HTTP 端口,连不上就拉起 NapCat,之后每 45 秒复查、清掉重复的进程链、隐藏控制台窗口、可在填写任务名后创建登录计划任务,并提供设置页以及 napcat_status、napcat_restart、napcat_dedupe 三个工具。可选记住 QQ 密码(默认关闭,开启前需确认风险),让失效的快速登录令牌不用扫码也能自己续上。仅 Windows;不建计划任务时,拉起的 QQ 会随 DSH 一起退出。
安装
dsh plugin --profile web add dsh-napcat-keeper
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-napcat-keeper
发现没有能够随着 DSH 打开自动启动 NapCat 的插件,遂使用大肥鱼制作此插件,建议搭配Yuuyuko-uu 的 dsh-qq-link使用~
给 NapCat(QQ 协议端)配一个看门狗:DSH 在,QQ 就在。
端口不通就拉起来,进程重复就杀掉多余的,卡在扫码就重来,扫完码以后又掉线也会自己恢复。
所有需要人填的东西都在 DSH → 设置 → napcat桥 一个页面里,保存即生效,不用重启。
常配套 dsh-qq-link(把 QQ 和 DSH 会话接通):那个负责「说话」,这个负责「别掉线」。
也可以单独用——只要你想让 NapCat 一直活着。
声明:基本纯让我家大肥鱼跑的,内容我只粗略检查了一下,本人也只是个半吊子学生,有隐性bug大概率也看不出来,这GitHub我也第一次用,之前光下别的大佬的好东西了,有大佬愿意的话欢迎随时指点我、提建议等等都行,爱你♥️
吐槽:这傻鱼写的啥readme啊,我得自己改一下。
它到底管什么
情况 · 看门狗怎么做
OneBot 端口不通、也没有 NapCat 进程 · 拉起来(默认 cscript;只有填了计划任务名才走任务)
刚拉起、端口还没通 · 给宽限期(默认 150s),期间不重复拉
拉到一半卡在扫码 · 记一笔 need-scan;超过 scanTimeoutSec 就杀掉重来,重试 maxScanRetries 次后放弃并写日志
有两条 QQ 进程链(客户端互踢的根源) · 按启动时间聚类判重,只杀晚出现的那几条,保留正在服务的那条
进程在、端口不通、也没有任何新信号 · 判为卡死,杀掉重来
一切正常 · 只记心跳(默认 10 分钟一行),并顺手检查 dsh-qq-link 的轮询是否还新鲜
看门狗自己不会把 DSH 启动搞崩:外部调用都有超时、异常都吞掉写日志、跨进程还有一把锁防止两个 DSH 实例同时拉。
前置:先把 NapCat 装好
装 NapCat.Shell(Windows 有一键安装包,会顺带装 QQ)。
装完napcat之后不用自己配置,后面插件会一件懒人配置的
等正式允许要QQ扫码的时候不用再去翻 NapCat 的 cache\qrcode.png:插件自己起了个只监听本机的小页面
(默认 http://127.0.0.1:8899/),设置页顶上那条黄横幅 / 二维码那一行的「打开扫码页」
点进去就是一张会自己刷新的码,扫完它自己变绿。换端口见下面配置表 qrPanelPort。
Requirements
dsh-market 的索引会读这一段(标题必须是英文 Requirements,否则市场校验报 README.md has no Requirements section),内容照旧中文。
项 · 要求 · 清单字段
DSH 宿主 · >= 0.2.1-rc.2(本机实测 0.2.1-rc.3) · engines.dsh
Node.js · >= 20(插件零 npm 依赖,只用 Node 内置模块) · engines.node
操作系统 · Windows(进程探测靠 Get-CimInstance、拉起与计划任务靠 schtasks / cscript) · —
NapCat · NapCat.Shell(Windows 一键包,自带 QQ 内核),装在 D:\tool\napcat 这类目录即可 · 设置页「路径前缀」
可选 · dsh-qq-link(负责把 QQ 与 DSH 会话接通;本插件只管让 NapCat 不掉线) · —
安装
DSH桌面版:设置 → 插件 → 添加插件,「包名或地址」那一栏只填包名 ——
dsh-napcat-keeper
或者填
github:waning-sun/dsh-napcat-keeper
只填包名,别把整条命令粘进去:那一栏是按「包名 / 仓库地址 / 本地目录」解析的,
多一个空格、多一个add、多一个大写字母,就会报无法识别这个包名或地址:not a package name the registry accepts。
顺带一提,桌面版刚装完之后 DSH 目录里并没有 dsh 命令,所以下面那条命令行不是人人都能跑 —— 用不了就走上面这条路。
命令行:
dsh plugin --profile <profile> add dsh-napcat-keeper
装完重启一次 DSH(第一次装载才生效),然后去 设置 → napcat桥。
首次配置:其实就三个空
填什么 · 说明
NapCat Shell 目录 · 用「分盘扫描」找:NapCat 装哪块盘就点哪块,不知道装在哪里了就用扫全部盘(慢),扫到后点「用这个」直接填进去;也能手填,例如 C:/Users/你/NapCat/OneKey/NapCat.Shell
要快登的 QQ 号 · 填了它,插件优先挑「填的这个号」的启动脚本;连脚本都没有时,自动生成一个直接调 NapCatWinBootMain.exe <号> 的脚本
OneBot HTTP 端口 · 跟 NapCat 网络配置里的 httpServers 一致(默认 3000)
点 保存设置 → 存到 ~/.dsh/dsh-napcat-keeper/config.json,立刻热生效。
回「状态」看:在线会显示昵称和 QQ 号;离线就点「拉起 NapCat」。
分盘扫描:装在哪都能找到
从 2.2.2 起插件不再自己猜 NapCat 装在哪,设置页第一组是 分盘扫描,目录由你来选:
- 本机有几块盘就列几个按钮(盘符取自系统
DriveInfo,光驱、移动盘、上锁的卷都会列),点哪个扫哪个;
有「全部盘(慢)」;扫的时候可以点「停止」;插了新盘点「重新读盘」,不用重启 DSH。
- 扫描会跳过
Windows、回收站、System Volume Information、node_modules、Temp这类目录,
深度上限 7 层,单盘最多看 25 万个目录、最多 90 秒(全部盘时每盘 45 秒)。
- 命中判据:目录名带
napcat,或目录里有NapCatWinBootMain.exe,且带有.bat启动脚本。
命中后不再往它下面钻(QQ 目录里几千个文件,钻进去只会变慢)。
- 命中之后再分真假:目录里只要有
versions/、QQ.exe、napcat.mjs里的任意一样,就是真 Shell
(标绿 ✓ 像真 Shell:versions/ · QQ.exe,按钮「用这个」);三样都没有的标黄
⚠ 没看到 versions/QQ.exe/napcat.mjs 时,按钮是「仍要用这个」。
这个判据只是经验,精简版布局有可能三样都不带(我自己重装了一遍 NapCat 就没这仨,不管了 bro),
所以「标黄」不等于「不能用」,点「仍要用这个」照样能填进去。
真 Shell 一律排在前面,不受磁盘遍历顺序影响。
- 为什么会有好几个候选:OneKey 安装器会先把壳模板解到
NapCat\OneKey\bootmain(只有NapCatWinBootMain.exe napcat.quick.bat,没有 QQ 本体),再把真正的版本装成NapCat\<版本>.Shell(有versions/和QQ.exe)。
一次安装可能留下多个目录,只有带 QQ 本体的那个能拉起来。
- 每命中一条就列一行:路径、挑出来的启动脚本、是否含
NapCatWinBootMain.exe、真假判定,右边按钮一键填入。 - 到时间/到数量上限会明确写「结果可能不全」,不会闷头扫一小时。
页面上的按钮
按钮 · 作用
扫 C: / 扫 D: … · 分盘深扫(深度 7 层,跳过系统目录,单盘 90 秒),边扫边报进度,命中就列出来
重新读盘 · 立刻重新问系统要盘符(插了移动盘 / 映射了网络盘之后点,不用重启 DSH)
全部盘(慢) · 把本机每块盘都扫一遍(每盘 45 秒预算),装在冷门位置时用这个
用这个 · 在扫描结果里点:直接把这个目录存成 shellDir,并重新挑启动脚本
重新探活 · 立刻跑一轮 tick(探端口 + 探进程);跟「找 NapCat 目录」无关
拉起 NapCat · 手动下达拉起指令
杀掉重拉 · 干净地杀掉整条链再拉一条(杀不干净就不拉,避免互踢)
去重复链 · 只杀掉晚出现的那几条链,保留最早那条
建计划任务 · 现在就把计划任务建好(用户级,不需要管理员)
收起黑框 · 把已经在跑的控制台窗口藏起来(不用重启 QQ)
全部杀掉 · 只杀,不拉
端口放行
(2.9.1 删掉了这套机制)插件自己全程普通权限,不做任何提权。
桌面上那个黑框
cscript / cmd 直接拉 NapCat,会多出一个控制台窗口挂在桌面上。默认行为是不显示:
计划任务的动作写的是 wscript.exe "<DSH 家目录>\dsh-napcat-keeper\launch.vbs"(绝对路径),这个壳里用
sh.Run cmd, 0, False 把真正的 cmd 以隐藏窗口启动(0 = SW_HIDE)。壳文件用 UTF-16LE 存,中文路径也认。
不想要隐藏就把「拉起时不显示黑框」关掉,任务会退回直接跑 cmd.exe;已经跑起来的那条链想收窗口,
点「收起黑框」(action=hideConsole)即可。
记住密码:默认关,开了要自己认风险
NapCat 的快速登录令牌会失效(实测几小时左右),失效后启动脚本只会停在扫码,QQ 就一直离线,
dsh-qq-link 那边则是刷屏的 ECONNREFUSED 127.0.0.1:3000。想让它自己能爬起来,就得给它密码。
设置页「自动登录(可不填)」里勾 记住密码 时会先弹一段风险提示,要你自己点「我知道风险,仍然开启」才会生效。开启前请确认你接受这几条:
1. 密码以明文存进 ~/.dsh/dsh-napcat-keeper/config.json 和同目录下插件生成的 env.bat,不加密。
2. 任何能读你用户目录的程序都能捡走:同步盘、备份工具、其它软件、远控、临时借电脑的人。
3. QQ 密码往往和 QQ 邮箱、部分游戏、微信登录入口共用一套身份,泄漏面不止一个号。
4. 插件不打印密码,/state 也只回「存没存 + 长度」,但那只是少了一个直接查看的口子,不等于安全。
5. 随时可以点「清除密码」,配置和 bat 里的密码会被删掉。
密码不写成命令行参数(NapCatWinBootMain.exe <号> <密码> 那样会进进程列表和 Windows 事件日志),
而是走环境变量 NAPCAT_QUICK_PASSWORD / NAPCAT_QUICK_PASSWORD_MD5,且只有本机 127.0.0.1:3000 回连时才注入。
拉起方式:默认跟着 DSH 生灭
这个插件的用途就一句话:DSH 起来以后,把 QQ 接上。所以默认用 cscript 直接拉,
QQ 那条进程链挂在本 DSH 实例下面——DSH 开着它就在,DSH 关掉它就跟着走,下次开 DSH 再拉一条新的。
「刚重启 DSH,QQ 就掉了」不是毛病,是这个默认行为:新实例会自己重新拉起,扫不上就自动密码登录。
要是想要「DSH 关了 QQ 还活着」,才去填「计划任务名」那一栏(比如 NapCat-Keeper-Launch;留空 = 走 cscript,跟着 DSH 生灭)+ 勾「自动创建计划任务」,
那时插件改用 schtasks /run 拉,父进程是任务计划服务,DSH 重启牵连不到它。
用哪份 Node:默认借 DSH 自带的
插件要跑一段 JS 时才需要 Node,取的顺序是(找到第一个能用的就停):
1. 设置页里手填的 nodePath;
2. DSH 自带:<DSH NEXT>\resources\runtime\<arch>\primary-runtime\dependencies\node\bin\node.exe(DSH_NODE_PATH / DSH_NODE 环境变量也认);
3. 系统 PATH 里的 node;
4. 常见安装目录(Program Files\nodejs、%LOCALAPPDATA%\Programs\nodejs);
5. NapCat 目录里附带的 node.exe 兜底。
所以正常情况下不用装 Node、也不用管版本,跟着 DSH 走就行。状态条里会直接写着用的是哪一份、什么版本;设置页有「测一下 node」按钮可以当场验一次。
两种 NapCa
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:20,最后更新 2026-11-03