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

QQ 机器人控制台 prophetcrab/dsh-qqbot

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

DeepSeek Harness 的 仅支持 macOS 的 QQ 机器人控制中心。

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 64 处,展示前 51 条)
  • 发起网络请求
    client.js:2181
    const response = await fetch(path, init)
  • 读取本地文件
    host/platform/mac/paths.js:26
    return fsExistsSync(expandHome(path))
  • 执行外部命令来自配置/变量
    host/platform/mac/process.js:24
    child = execFile(
  • 执行外部命令固定命令
    host/platform/mac/process.js:79
    output = execFileSync('/bin/ps', ['-axo', 'pid=,command='], { encoding: 'utf8', timeout: 4000, maxBuffer: 4 * 1024 * 1024 })
  • 发起网络请求
    host/platform/mac/http.js:22
    const response = await fetch(url, {
  • 执行外部命令固定命令
    host/platform/mac/capabilities.js:120
    version = execFileSync('/usr/bin/sw_vers', ['-productVersion'], { encoding: 'utf8', timeout: 3000 }).trim()
  • 读取本地文件
    host/platform/mac/capabilities.js:152
    : firstExisting([expandHome(NAPCAT_INSTALL_DIR)], (path) => fsExistsSync(path))
  • 读取本地文件
    host/platform/mac/capabilities.js:153
    const configDir = firstExisting(NAPCAT_CONFIG_DIRS.map(expandHome), (path) => fsExistsSync(path)) ?? (installDir === null ? null : join(installDir, 'c
  • 读取本地文件
    host/platform/mac/capabilities.js:179
    packageJson = JSON.parse(readFileSync(packagePath, 'utf8'))
  • 读取本地文件
    host/platform/mac/capabilities.js:206
    const meta = JSON.parse(readFileSync(join(installDir, 'package.json'), 'utf8'))
  • 读取本地文件
    host/platform/mac/capabilities.js:217
    const plist = readFileSync(join(appPath, 'Contents', 'Info.plist'), 'utf8')
  • 读取本地文件
    host/platform/mac/capabilities.js:230
    names = readdirSync(configDir)
  • 读取本地文件
    host/platform/mac/data-paths.js:72
    if (!fsExistsSync(legacy)) continue
  • 读取本地文件
    host/platform/mac/data-paths.js:73
    if (fsExistsSync(target)) {
  • 读取本地文件
    host/platform/mac/data-paths.js:85
    if (!fsExistsSync(legacy)) continue
  • 读取本地文件
    host/platform/mac/data-paths.js:86
    if (fsExistsSync(target)) {
  • 读取本地文件
    host/services/setup/index.js:74
    templateAvailable: fsExistsSync(join(this.templateDir, 'package.json')),
  • 读取本地文件
    host/services/setup/index.js:75
    projectExists: fsExistsSync(this.projectDir),
  • 读取本地文件
    host/services/setup/index.js:76
    hasPackageJson: fsExistsSync(packagePath),
  • 读取本地文件
    host/services/setup/index.js:77
    hasNodeModules: fsExistsSync(join(this.projectDir, 'node_modules')),
  • 读取本地文件
    host/services/setup/index.js:78
    hasKoishiYml: fsExistsSync(join(this.projectDir, 'koishi.yml')),
  • 读取本地文件
    host/services/setup/index.js:89
    bundleAvailable: fsExistsSync(this.bundlePath()),
  • 写入本地文件
    host/services/setup/index.js:105
    await mkdir(join(this.projectDir, 'runtime'), { recursive: true })
  • 写入本地文件
    host/services/setup/index.js:124
    await mkdir(dirname(this.projectDir), { recursive: true })
  • 写入本地文件
    host/services/setup/index.js:129
    await mkdir(join(this.projectDir, 'runtime'), { recursive: true })
  • 写入本地文件
    host/services/setup/index.js:246
    await writeFile(file, lines.join('\n'), 'utf8')
  • 写入本地文件
    host/services/setup/index.js:285
    await mkdir(dirname(target), { recursive: true })
  • 写入本地文件
    host/services/setup/index.js:286
    await copyFile(seed, target)
  • 读取本地文件
    host/services/koishi/index.js:112
    if (existsSync(bin)) {
  • 读取本地文件
    host/plugins/napcat/routes.js:30
    const buffer = await readFile(file)
  • 读取本地文件
    host/services/persona/index.js:81
    const raw = await readFile(path, 'utf8')
  • 写入本地文件
    host/services/persona/index.js:93
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    host/services/persona/index.js:94
    await writeFile(path, `${JSON.stringify(saved, null, 2)}\n`, 'utf8')
  • 读取本地文件
    host/services/persona/presets.js:42
    const parsed = JSON.parse(await readFile(path, 'utf8'))
  • 写入本地文件
    host/services/persona/presets.js:61
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    host/services/persona/presets.js:62
    await writeFile(path, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 删除本地文件
    host/plugins/persona/routes.js:88
    await rm(persona.path, { force: true })
  • 读取本地文件
    host/services/profiles/index.js:72
    const parsed = JSON.parse(await readFile(path, 'utf8'))
  • 写入本地文件
    host/services/profiles/index.js:93
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    host/services/profiles/index.js:94
    await writeFile(path, `${JSON.stringify(payload, null, 2)}\n`, 'utf8')
  • 读取本地文件
    host/services/ai/settings.js:54
    const parsed = JSON.parse(await readFile(path, 'utf8'))
  • 写入本地文件
    host/services/ai/settings.js:64
    await mkdir(dirname(path), { recursive: true })
  • 写入本地文件
    host/services/ai/settings.js:65
    await writeFile(path, `${JSON.stringify(normalized, null, 2)}\n`, 'utf8')
  • 写入本地文件
    host/services/group-loop/store.js:25
    async ensure() { await mkdir(this.root, { recursive: true }) }
  • 读取本地文件
    host/services/group-loop/store.js:28
    try { return JSON.parse(await readFile(path, 'utf8')) } catch { return fallback }
  • 写入本地文件
    host/services/group-loop/store.js:53
    await writeFile(this.characterPath, `${JSON.stringify(next, null, 2)}\n`, 'utf8')
  • 写入本地文件
    host/services/group-loop/store.js:64
    await writeFile(this.groupsPath, `${JSON.stringify({ ...groups, updatedAt: new Date().toISOString() }, null, 2)}\n`, 'utf8')
  • 读取本地文件
    host/services/group-loop/store.js:69
    const text = await readFile(this.memoryPath, 'utf8')
  • 写入本地文件
    host/services/group-loop/store.js:90
    await appendFile(this.memoryPath, `${JSON.stringify(memory)}\n`, 'utf8')
  • 发起网络请求
    host/services/koishi/helpers.js:203
    const response = await manager.fetch(url, {
  • 读取本地文件
    host/services/napcat/offline.js:130
    createReadStream(path)
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 的 QQ 机器人控制中心:一键配置 NapCat/Koishi,消息监控、权限管理,还有带人设和记忆的 AI 聊天。

README

由 DeepSeek 最新模型翻译生成
dsh-qqbot DeepSeek Harness 的 仅支持 macOS 的 QQ 机器人控制中心。 当前分支:dshbot-mac。项目已按基于插件的架构重写: QQ ↔ NapCat ↔ OneBot 11 ↔ Koishi ↔ DSH Host ↔ 面板 / LLM 三端职责 | 端 | 职责 | 不负责 | | NapCat | QQ 登录、协议、收发消息、OneBot 实现、WebUI | 权限、AI、业务、面板 | | Koishi | Session、权限、触发、上下文、指令/插件、发送 | QQ 协议、QQ 注入、模型调用 | | DSH | 安装/启停、配置控制面、AI 网关、人设/画像、面板 | QQ 协议、消息循环、权限执行 | dsh-qqbot 属于 DSH 端;NapCat/Koishi 是外部运行时,由 DSH 管理。
展开完整文档(README 剩余 1 节)
dsh-qqbot

DeepSeek Harness 的 仅支持 macOS 的 QQ 机器人控制中心。

当前分支:dshbot-mac。项目已按基于插件的架构重写:

QQ ↔ NapCat ↔ OneBot 11 ↔ Koishi ↔ DSH Host ↔ 面板 / LLM

三端职责

| 端 | 职责 | 不负责 |
| NapCat | QQ 登录、协议、收发消息、OneBot 实现、WebUI | 权限、AI、业务、面板 |
| Koishi | Session、权限、触发、上下文、指令/插件、发送 | QQ 协议、QQ 注入、模型调用 |
| DSH | 安装/启停、配置控制面、AI 网关、人设/画像、面板 | QQ 协议、消息循环、权限执行 |

dsh-qqbot 属于 DSH 端;NapCat/Koishi 是外部运行时,由 DSH 管理。

架构

dsh-qqbot/
├── index.js # 仅组装 ├── host/ │ ├── kernel/ # 插件注册、贡献点、路由/工具/Feature/Tab │ ├── contracts/ # AI/status/config/panel/plugin-manifest schema │ ├── platform/mac/ # 路径、进程、端口、能力 │ ├── services/ # napcat / koishi / setup / ai / persona / profiles / access │ └── plugins/ # lifecycle / napcat / koishi / install / ai / persona / │ # access / messages / features / tools ├── client/ │ ├── index.js # 仅注册 Client 插件 │ ├── runtime/ # api / store / styles / locale │ ├── components/ │ └── plugins/ # overview / ai / messages / access / plugins / features / logs ├── template/ # Koishi 运行时模板(从 qq-bot 同步) ├── vendor/napcat/ # NapCat 离线 payload └── scripts/ # 构建、校验、冒烟、安装

DSH Host 插件模型

每个能力都是一个 host plugin,统一贡献:

registerRoute
registerTool
registerFeature
registerStatusProvider
registerClientTab
provide(service)

index.js 只列内置插件;关掉一个插件,它的路由/工具/Feature/Tab 一起消失。

Client 插件模型

client.js 是构建产物,源码在 client/:

npm run build:client # client/ -> client.js
node scripts/build-client.mjs --check

每个 Tab 都是一个 Client 插件,不再改一个 4000 行单文件。

Koishi 插件模型

template/plugins/ 是 Koishi 侧源码:

core / access-control / health / welcome / echo
ai/
├── gateway.ts # DSH HTTP 契约 ├── trigger.ts # 概率/@/回复/跟进 ├── context.ts # 背景/图片 ├── media.ts ├── message.ts ├── delivery.ts ├── config.ts └── index.ts # 编排

插件之间通过 ctx.qqbot. 服务通信,不 deep import 内部实现。

两个外部依赖

NapCat(macOS)

| 项 | 值 |
| QQ.app | /Applications/QQ.app |
| QQ 容器 | ~/Library/Containers/com.tencent.qq/Data |
| NapCat 目录 | .../Documents/napcat |
| 配置目录 | .../Library/Application Support/QQ/NapCat/config 或 .../Documents/napcat/config |
| WebUI | 127.0.0.1:6099 |
| 反向 WS | ws://127.0.0.1:5140/onebot |
| 离线包 | vendor/napcat/payload/NapCat.Shell-4.18.42.zip |

配置:

napcatPort 6099
napcatToken 空 qqPath 空 napcatDir 空 offlineVendorDir 空 offlineNapcatVersion 空

NapCat 只从内置离线包安装,校验 size + SHA-256,不下载。

Koishi

| 项 | 值 |
| 版本 | 4.18.11 |
| 项目 | ~/project/qq-bot |
| 端口 | 5140 |
| 反向 WS | /onebot |
| 本地 CLI | node_modules/koishi/bin.js |
| 离线依赖 | template/runtime-bundles/node_modules-darwin-arm64.tar.gz |

配置:

projectDir ~/project/qq-bot
koishiPort 5140
reversePath /onebot
napcatToken 空 autoRestartKoishi true autoInstallDeps true autoSyncSelfId true logLines 200

安装 bash
cd ~/project/dsh-qqbot
node scripts/install-profile.mjs --profile desktop --install

首次加载会:

1. 从 template/ 创建 ~/project/qq-bot
2. 解压内置 Koishi darwin-arm64 依赖
3. 从 vendor/napcat 离线安装 NapCat
4. 写 OneBot 反向 WS 配置
5. 启动后扫码登录

运行时数据 text ~/project/qq-bot/data/ ├── config/ │ ├── access.json │ ├── ai-settings.json │ └── persona.json ├── state/ │ ├── ai.json │ ├── ai-chat-state.json │ ├── koishi.db │ └── napcat-login-qr.png ├── assets/ │ ├── persona-presets.json │ └── profiles.json └── logs/

DSH 写配置、人设、画像;Koishi 执行权限、触发和发送。旧版平铺的 data/.json 可用 node scripts/migrate-data.mjs ~/project/qq-bot --database 一次性迁移(迁移前停止 Koishi)。

开发 bash
npm test # 198 tests
npm run build:client
npm run smoke:host # 41 routes / 6 tools / 5 features
npm run smoke:client
npm run check:architecture
npm run check:template
npm run offline:verify
npm run check # 全部

架构规则:

- index.js / 插件入口 ≤80 行
- 普通源码 ≤500 行
- 无跨层/跨插件 deep import
- 无循环依赖
- process.platform 仅限 host/platform/
- client 源码与生成物同步
- 旧路由、testid、数据格式保持兼容

详细文档:

- 模块盘点
- 重构计划
- 文件架构

安全

- NapCat token 不落日志、不返回明文
- 外部命令使用 argv 数组,不拼 shell
- 离线包 size/SHA-256 校验失败即拒绝
- 权限策略由 Koishi access-control 执行
- 当前分支只支持 macOS / Apple Silicon

- 事件运行时架构计划
- 运行时内核 v1 详细设计
- 小核心人格 + 记忆驱动 + 情绪微调
- 群消息监听与反馈闭环
- 群聊监听状态机 HTML 图
预览分享卡片长什么样 ↓prophetcrab/dsh-qqbot
分享 · DeepSeek Harness Hub
prophetcrab/dsh-qqbot

DeepSeek Harness 的 仅支持 macOS 的 QQ 机器人控制中心。

这是你的仓库?认领条目

回到顶部