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

QQ 接入面板 Applepinea/dsh-qq-access

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

托管 NapCat 接入 QQ 私聊群聊与空间留言,可视化管人设权限

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · platform
装得上吗
实装验证未通过(node_version),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成

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

验证判据与等级说明 →
⚠︎ 实装验证未通过(node_version · 2026/10/29) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 66 处,展示前 62 条)
  • 发起网络请求
    lib/client.js:69
    const res = await fetch(API + "/state", { credentials: "same-origin" });
  • 发起网络请求
    lib/client.js:123
    const res = await fetch(API + "/config", {
  • 发起网络请求
    lib/client.js:139
    const res = await fetch(API + "/napcat/open", { method: "POST", credentials: "same-origin" });
  • 发起网络请求
    lib/client.js:311
    try { fetch(API + "/ping?stage=apply&slot=" + encodeURIComponent("boot")); } catch (e) {}
  • 读取本地文件
    cli.mjs:21
    try { await access(configPath); throw new Error(`配置已存在:${configPath}。请直接编辑,setup 不会覆盖。`); }
  • 写入本地文件
    cli.mjs:43
    await mkdir(dirname(configPath), { recursive: true, mode: 0o700 });
  • 写入本地文件
    cli.mjs:44
    await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', { flag: 'wx', mode: 0o600 });
  • 读取本地文件
    cli.mjs:98
    const raw = JSON.parse(await readFile(configPath, 'utf8'));
  • 读取本地文件
    cli.mjs:102
    await writeFile(configPath + `.before-managed-${Date.now()}.json`, await readFile(configPath), { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    cli.mjs:102
    await writeFile(configPath + `.before-managed-${Date.now()}.json`, await readFile(configPath), { flag: 'wx', mode: 0o600 });
  • 写入本地文件
    cli.mjs:103
    await writeFile(configPath, JSON.stringify(raw, null, 2) + '\n', { mode: 0o600 });
  • 读取密钥环境变量
    lib/config.mjs:16
    const token = process.env.NAPCAT_TOKEN || raw.onebot?.token || '';
  • 读取密钥环境变量
    lib/config.mjs:17
    const eventSecret = process.env.NAPCAT_EVENT_SECRET || raw.events?.secret || '';
  • 读取本地文件
    lib/config.mjs:113
    try { raw = JSON.parse(await readFile(path, 'utf8')); }
  • 读取本地文件
    lib/runtime.mjs:195
    try { return await readFileBytes(source.file); } catch { }
  • 读取本地文件
    lib/runtime.mjs:206
    try { return await readFileBytes(location); } catch { return null; }
  • 发起网络请求
    lib/runtime.mjs:209
    const response = await fetch(location, { signal: combinedSignal(signal, 15_000) });
  • 写入本地文件
    lib/runtime.mjs:242
    try { appendFileSync('C:/Users/csa/.dsh-qq-access/debug.log', new Date().toISOString() + ' image ' + stage + ' ' + extra + '\n'); } catch {}
  • 写入本地文件
    lib/runtime.mjs:417
    await mkdir(join(this.config.dataDir, 'agent-workspaces', `${message.kind}-${message.peerId}`), { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/runtime.mjs:567
    const bytes = await readFileBytes(path);
  • 写入本地文件
    lib/napcat.mjs:18
    await mkdir(directory, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/napcat.mjs:20
    try { return JSON.parse(await readFile(join(directory, name), 'utf8')); }
  • 写入本地文件
    lib/napcat.mjs:34
    await writeFile(join(directory, name), JSON.stringify({ ...previous, network: { ...network, httpServers: servers, httpClients: clients } }, null, 2),
  • 写入本地文件
    lib/napcat.mjs:35
    await writeFile(join(directory, 'webui.json'), JSON.stringify({
  • 写入本地文件
    lib/napcat.mjs:125
    await mkdir(logDirectory, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/napcat.mjs:127
    try { if ((await stat(this.logPath)).size > 10 * 1024 * 1024) await rename(this.logPath, join(logDirectory, 'console.previous.log')); }
  • 读取本地文件
    lib/napcat.mjs:127
    try { if ((await stat(this.logPath)).size > 10 * 1024 * 1024) await rename(this.logPath, join(logDirectory, 'console.previous.log')); }
  • 写入本地文件
    lib/napcat.mjs:140
    this.log = createWriteStream(this.logPath, { flags: 'a', mode: 0o600 });
  • 写入本地文件
    lib/util.mjs:108
    appendFileSync(join(dir, 'debug.log'), `${new Date().toISOString()} ${label} (${kind}) ${String(error?.stack ?? error?.message ?? error).slice(0, 4000
  • 读取本地文件
    lib/ui.mjs:100
    const loadRaw = async () => JSON.parse(await readFile(configPath, 'utf8'));
  • 写入本地文件
    lib/ui.mjs:134
    await writeFile(configPath, JSON.stringify(persisted, null, 2) + '\n');
  • 写入本地文件
    lib/ui.mjs:201
    await appendFile('C:/Users/csa/.dsh-qq-access/debug.log', new Date().toISOString() + ' client ' + JSON.stringify(Object.fromEntries(url.searchParams))
  • 写入本地文件
    lib/qzone.mjs:60
    await mkdir(this.config.profileDir, { recursive: true, mode: 0o700 });
  • 发起网络请求
    lib/qzone.mjs:263
    return isQzoneUrl(url.href) && response.request().method() === 'POST' && /add_msgb|msgb_add|msgbadd|msgb.*add|add.*msgb/i.test(url.pathname);
  • 读取本地文件
    lib/napcat-install.mjs:12
    const { name: PKG_NAME, version: PKG_VERSION } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
  • 读取本地文件
    lib/napcat-install.mjs:29
    for await (const bytes of createReadStream(path, { signal })) hash.update(bytes);
  • 读取本地文件
    lib/napcat-install.mjs:35
    assert((await stat(path)).size === spec.bytes, 'NapCat 下载大小不符,文件可能不完整');
  • 写入本地文件
    lib/napcat-install.mjs:65
    await pipeline(Readable.fromWeb(response.body), counter, createWriteStream(path, { flags: 'wx', mode: 0o600 }), { signal: timeout });
  • 删除本地文件
    lib/napcat-install.mjs:67
    } catch (error) { await rm(path, { force: true }); throw error; }
  • 写入本地文件
    lib/napcat-install.mjs:81
    await mkdir(destination, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/napcat-install.mjs:105
    if (entry.fileName.endsWith('/')) { await mkdir(output, { recursive: true, mode: 0o700 }); return; }
  • 写入本地文件
    lib/napcat-install.mjs:106
    await mkdir(dirname(output), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/napcat-install.mjs:108
    await pipeline(stream, createWriteStream(output, { flags: 'wx', mode: 0o600 }), { signal });
  • 读取本地文件
    lib/napcat-install.mjs:121
    const marker = JSON.parse(await readFile(join(directory, '.dsh-qq-install.json'), 'utf8'));
  • 读取本地文件
    lib/napcat-install.mjs:123
    for (const file of requiredFiles) assert((await stat(join(directory, file))).isFile(), 'NapCat 安装缺少运行文件');
  • 写入本地文件
    lib/napcat-install.mjs:140
    await mkdir(downloads, { recursive: true, mode: 0o700 });
  • 删除本地文件
    lib/napcat-install.mjs:147
    catch (error) { checkSignal(signal); if (error.code !== 'ENOENT') await rm(source, { force: true }); }
  • 读取本地文件
    lib/napcat-install.mjs:158
    for (const file of requiredFiles) assert((await stat(join(stage, file))).isFile(), `NapCat 运行包缺少 ${file}`);
  • 删除本地文件递归
    lib/napcat-install.mjs:165
    if (stage) await rm(stage, { recursive: true, force: true });
  • 写入本地文件
    lib/store.mjs:13
    await mkdir(dataDir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/store.mjs:21
    try { owner = JSON.parse(await readFile(path, 'utf8')); } catch {}
  • 删除本地文件
    lib/store.mjs:23
    await rm(path, { force: true });
  • 读取本地文件
    lib/store.mjs:35
    const current = JSON.parse(await readFile(path, 'utf8'));
  • 删除本地文件
    lib/store.mjs:36
    if (current.token === token) await rm(path);
  • 写入本地文件
    lib/store.mjs:46
    try { await rename(temp, path); }
  • 删除本地文件
    lib/store.mjs:47
    finally { await rm(temp, { force: true }); }
  • 写入本地文件
    lib/store.mjs:71
    await mkdir(this.dir, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/store.mjs:93
    await appendFile(join(this.dir, `${date}.jsonl`), JSON.stringify(entry) + '\n', { mode: 0o600 });
  • 读取本地文件
    lib/store.mjs:101
    for (const name of await readdir(this.dir)) {
  • 删除本地文件
    lib/store.mjs:102
    if (/^ {4}- {2}- {2} jsonl$/.test(name) && Date.parse(name.slice(0, 10)) + 86_400_000 < cutoff) await rm(join(this.dir, name));
  • 读取本地文件
    lib/store.mjs:108
    const names = (await readdir(this.dir)).filter(n => /^\d{4}-\d{2}-\d{2}\.jsonl$/.test(n)).sort().reverse();
  • 读取本地文件
    lib/store.mjs:141
    const entries = JSON.parse(await readFile(this.path, 'utf8'));
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-llm
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 接入个人 QQ插件,集成 NapCat 托管、私聊与群聊 AI 回复、QQ 空间读取和留言功能。带有左侧栏面板,可进行可视化人设与权限管理

README

由 DeepSeek 最新模型翻译生成
dsh-qq-access · NapCat 托管 + 管理面板 为 DeepSeek Harness 接入个人 QQ 私聊、群聊和 QQ 空间留言板。Windows x64 已加入 NapCat 的安装、配置与进程管理:首次下载官方运行包,之后随 Harness 启动,连接配置自动写好,扫码页就绪后自动打开。 此包包含源码与可安装的 .tgz。NapCat 官方运行包在目标电脑下载,保留原始文件与许可证,以插件管理的独立子进程运行。你不需要另外安装、手工启动或填写 NapCat 网络配置。 功能 | 功能 | 行为 | | 安装 | 固定官方 v4.18.41 Windows Node 运行包,校验大小与 SHA256 后解压 | | 配置 | 自动生成 API token、事件签名、本机 API 和上报连接 | | 登录 | 自动打开本机 NapCat WebUI,用户本人扫码;等待期间 Harness 正常打开 | | 维护 | 可查看启动/待扫码/在线状态,崩溃后最多重启 2 次,退出时停止自有进程树 | | QQ 聊天 | 接收可上报的全部入站消息,默认私聊自动回复、群聊被 @ 时回复 | | 历史 | 本地归档、搜索,或调用 QQ 历史接口分页查询 |
展开完整文档(README 剩余 1 节)
dsh-qq-access · NapCat 托管 + 管理面板

为 DeepSeek Harness 接入个人 QQ 私聊、群聊和 QQ 空间留言板。Windows x64 已加入 NapCat 的安装、配置与进程管理:首次下载官方运行包,之后随 Harness 启动,连接配置自动写好,扫码页就绪后自动打开。

此包包含源码与可安装的 .tgz。NapCat 官方运行包在目标电脑下载,保留原始文件与许可证,以插件管理的独立子进程运行。你不需要另外安装、手工启动或填写 NapCat 网络配置。

功能

| 功能 | 行为 |
| 安装 | 固定官方 v4.18.41 Windows Node 运行包,校验大小与 SHA256 后解压 |
| 配置 | 自动生成 API token、事件签名、本机 API 和上报连接 |
| 登录 | 自动打开本机 NapCat WebUI,用户本人扫码;等待期间 Harness 正常打开 |
| 维护 | 可查看启动/待扫码/在线状态,崩溃后最多重启 2 次,退出时停止自有进程树 |
| QQ 聊天 | 接收可上报的全部入站消息,默认私聊自动回复、群聊被 @ 时回复 |
| 历史 | 本地归档、搜索,或调用 QQ 历史接口分页查询 |
| 图片 | 私聊/群聊里的图片转成模型可见的 image content(PNG / JPEG / GIF / WEBP,单条最多 4 张,可关) |
| 空间 | 独立浏览器登录,读取可见文字,在留言板发表纯文本留言 |
| 面板 | 左侧栏「QQ 接入」:自动回复开关、批量窗口与轮询、回复范围白名单、NapCat 托管、人格编辑、在线状态 |

访问范围限登录账号的权限和 QQ 接口可提供的数据,不保证补全安装前全部历史。图片会转成模型可见的内容(reply.vision 可关);语音等其它媒体仍是类型占位文字。空间不含说说评论、发说说、相册导出和权限绕过。

Windows x64 新安装

准备 Node.js 22.14+(建议 24 LTS)、提供当前 Agent/工具接口的 Harness(参考 0.2.1-rc.4),以及 QQ 空间使用的 Edge 浏览器。

1. 解压后进入 dsh-qq-access,用 PowerShell 执行:

npm ci
node cli.mjs setup

输入接入的 QQ 号。管理员 QQ 号可留空,留空时只在电脑上的 Harness 管理。若填写,应使用另一个 QQ 号,登录号自身的出站消息不会触发自动回复。

Windows x64 的 setup 自动启用托管模式、生成密钥并下载运行包。压缩包约 118.3 MiB,首次需要联网,之后复用本机安装。下载失败可运行 node cli.mjs napcat-install 重试。默认配置在 %USERPROFILE%\.dsh-qq-access\config.json,不会覆盖已有文件。

2. 从 Releases 下载最新的 dsh-qq-access.tgz,在 Harness 桌面版插件管理中选中它(填完整路径)。或在 CLI / Web profile 执行:

dsh plugin --profile web add C:/Plugins/dsh-qq-access.tgz
dsh web

如果桌面版本没有本地包入口,请升级或使用 Web profile;profile 必须与实际启动环境一致。

插件自动启动 NapCat,扫码页就绪后打开浏览器。用步骤 1 的 QQ 号扫码后自动接通。无需手填 NapCat 的 API 地址、token 或上报设置。未弹出扫码页时可执行:

node cli.mjs napcat-login

如果 Harness 已运行 NapCat,此命令只打开现有登录页;否则启动临时登录进程,扫码成功后关闭,再由 Harness 启动正式实例。默认等待 10 分钟,超时后重载插件重新尝试。

3. QQ 空间仍需独立登录:

node cli.mjs qzone-login

在独立 Edge 窗口中登录同一个 QQ 号,回终端按回车。空间登录状态与 NapCat 分开;关闭登录窗口后再调用空间工具。空间页面结构、权限和验证码需要在目标机器验证,结果不明确时返回 uncertain,应先查看真实页面,不要直接重发。

从 0.1.0 升级

解压新源码、执行 npm ci,然后运行:

node cli.mjs napcat-enable

此命令备份原配置,保留 QQ 号、访问范围、人设和消息密钥,再启用托管并准备运行包。随后在 Harness 安装新 .tgz 替换旧包并重载。

旧配置不会被静默切换:没有 napcat 段时仍为 external 模式。若旧的手动 NapCat 已运行且账号、密钥一致,插件复用它,不修改或停止这个外部进程;要完全切换为托管,先退出旧实例再重载插件。Linux、macOS、Windows ARM 当前使用外部模式。

离线准备

从官方固定版本 Release 下载 NapCat.Shell.Windows.Node.zip,在已启用托管的配置下执行:

node cli.mjs napcat-install --archive C:/Downloads/NapCat.Shell.Windows.Node.zip

文件必须与固定版本及 SHA256 对应,不能用 Framework、普通 Shell 或 OneKey 包代替。本版不自动升级未来版本。

使用与设置

在 Harness 中可以说“查看 QQ 接入状态”“列出我的群”“读取好友 234567890 最近 30 条消息”“给 QQ 234567890 发:今晚八点见”或“在 QQ 234567890 的空间留言板留言:周末快乐”。

发送和留言使用唯一 request_id,重试相同操作必须复用标识。只有 status: sent 表示成功,pending 或 uncertain 需要先核对实际结果。
| 配置项 | 默认与用途 |
| napcat.mode | 新 Windows x64 配置为 managed;外部接入为 external |
| napcat.autoInstall | true,缺少运行包时自动安装 |
| napcat.autoOpenLogin | true,自动打开本机登录页 |
| napcat.webuiPort | 6099,不得与 API、事件接收端口重复 |
| napcat.maxRestarts | 2,每次加载插件期间的重启预算 |
| reply.private | true,私聊自动回复 |
| reply.group | mention,可改为 off 仅归档或 all 每条回复 |
| access.privateMode / access.groupMode | all,可改 allowlist 或 disabled |
| access.privateIds / access.groupIds | 对应白名单,QQ 号/群号使用字符串 |
| ownerIds | 管理员私聊账号列表,默认空 |
| ownerHarnessTools | false,进一步开放管理员的宿主其他工具权限 |
| persona | 自定义称呼、性格、语气、回复习惯 |
| retentionDays | 30,本插件消息归档保留天数 |

修改后重载插件。普通联系人只允许本会话聊天和历史查询,不能操作文件、终端、其他私聊或空间。管理员权限只认传输层确认的私聊账号,在群内按普通群成员处理。

聊天内容在用于回复或主动查询时会进入 Harness 配置的模型服务。归档保留期不会删除 Harness 自己保存的会话、模型服务记录、QQ 或空间登录状态。

排查与验证

node cli.mjs doctor 只读检查安装与连接,不发送消息。尚未启动 Harness 或尚未扫码时,API 离线不代表安装失败。qq_status.napcat.state 可查看启动、待扫码、在线状态;状态工具不返回 API 或 WebUI 密钥。

API、上报接收和登录页只绑定本机。端口冲突时退出冲突程序或修改配置后重载。控制台日志位于配置对应的 data/napcat/logs/console.log,可能含二维码或登录页密钥,仅用于本机排查。异常退出留下锁文件时,先确认对应进程已退出,再删除提示的锁文件。

本版已在 Linux 做本地测试,并实际下载、校验、解压固定的官方运行包;未在 Windows 运行 QQ 原生组件、未登录真实 QQ,也未完成真实 QQ 空间验收。详见 验证说明。

npm run check # 清单字段、文件完整性、语法、客户端 bundle 自检
npm test # 冒烟测试:导出形状、补丁条目、配置校验,不需要宿主
npm run release # 自检 + 测试 + 升 patch + 打包到 dist/dsh-qq-access.tgz

check 会校验 dsh.bundle.patch 指向的补丁、exports 与 files 里的每个路径是否真实存在,以及客户端 bundle 里 require() 的宿主模块是否都写进了 dsh.client.external。宿主接口契约测试(tools.guard、agents.create 等)需要真实 DSH 包,不在本仓库内。

发版只需一条命令,文档里不写版本号,版本只在 package.json 维护:

npm run release # 0.5.0 → 0.5.1
npm run release minor # 0.5.0 → 0.6.0

产物固定叫 dist/dsh-qq-access.tgz,上传到 Release 时不用改名。

本项目自写代码按 MIT 发布;NapCat 与官方运行包各组成部分遵循上游许可,本插件的 MIT 许可不代替它们的许可。接口和运行包依据见 来源说明。
预览分享卡片长什么样 ↓Applepinea/dsh-qq-access
分享 · DeepSeek Harness Hub
Applepinea/dsh-qq-access

托管 NapCat 接入 QQ 私聊群聊与空间留言,可视化管人设权限

回到顶部