把 QQ 消息接入现有对话,复用历史记忆与人格
31.7/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yifan1037/dsh-qq该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 94 处,展示前 50 条)
- 执行外部命令固定命令packages/dsh-qq-native/lib/dsh-port.mjs:12
const out = execFileSync('netstat', ['-ano', '-p', 'TCP'], { encoding: 'utf8', windowsHide: true, timeout: 5000 }); - 执行外部命令固定命令packages/dsh-qq-native/lib/dsh-port.mjs:26
const out = execFileSync('tasklist', ['/FI', 'IMAGENAME eq DeepSeek Harness.exe', '/FO', 'CSV', '/NH'], { encoding: 'utf8', windowsHide: true, timeout - 发起网络请求packages/dsh-qq-native/lib/dsh-port.mjs:36
const r = await fetch(`http://127.0.0.1:${c.port}/`, { redirect: 'manual' }); - 写入本地文件packages/dsh-qq-native/lib/index.js:10
fs.mkdirSync(path.dirname(LOG_FILE), { recursive: true }); - 写入本地文件packages/dsh-qq-native/lib/index.js:11
fs.appendFileSync(LOG_FILE, new Date().toISOString() + ' ' + String(msg) + '\n', 'utf8'); - 发起网络请求packages/dsh-qq-native/lib/media.mjs:55
const res = await fetch(file, { signal: AbortSignal.timeout(20000) }); - 执行外部命令来自配置/变量packages/dsh-qq-native/lib/screenwatch.mjs:48
execFile(POWERSHELL, ['-NoProfile', '-NonInteractive', '-Command', script], { timeout: timeoutMs }, (error, stdout, stderr) => { - 发起网络请求packages/dsh-qq-native/lib/snowluma.mjs:54
const r = await fetch(`${this.baseUrl}/${action}`, { - 读取本地文件packages/dsh-qq-personal/lib/capabilities.js:67
let raw = fs.readFileSync(CAPABILITY_FILE, 'utf8'); - 写入本地文件packages/dsh-qq-personal/lib/capabilities.js:111
fs.mkdirSync(path.dirname(CAPABILITY_FILE), { recursive: true }); - 写入本地文件packages/dsh-qq-personal/lib/capabilities.js:112
fs.writeFileSync(CAPABILITY_FILE, JSON.stringify(merged, null, 2) + '\n', 'utf8'); - 发起网络请求packages/dsh-qq-personal/lib/client.js:54
fetch('/api/dsh-qq-personal/console-info', { credentials: 'same-origin' }) - 发起网络请求packages/dsh-qq-personal/lib/client.js:114
fetch('/api/dsh-qq-personal/snowluma-status', { credentials: 'same-origin' }) - 发起网络请求packages/dsh-qq-personal/lib/client.js:128
fetch('/api/dsh-qq-personal/snowluma-start', { method: 'POST', credentials: 'same-origin' }) - 读取本地文件packages/dsh-qq-personal/lib/console.cjs:1176
try { return JSON.parse(fsx.readFileSync(pathx.join(HOBBY_DIR, 'hobbies.json'), 'utf8')); } catch { return { items: [] }; } - 读取本地文件packages/dsh-qq-personal/lib/console.cjs:1282
const readJsonFile = (f) => { try { return JSON.parse(fsx.readFileSync(f, 'utf8').replace(/^ FEFF/, '')); } catch { return null; } }; - 读取本地文件packages/dsh-qq-personal/lib/console.cjs:1288
const readLines = (name, limit) => { try { return fsx.readFileSync(pathx.join(dir, name), 'utf8').trim().split(/ ? /).filter(Boolean).slice(-limit). - 读取本地文件packages/dsh-qq-personal/lib/console.cjs:1289
let latestAt = 0; try { latestAt = fsx.statSync(pathx.join(dir, 'latest.png')).mtimeMs; } catch { } - 读取本地文件packages/dsh-qq-personal/lib/console.cjs:1295
const rows = (() => { try { return fsx.readFileSync(pathx.join(dir, 'hobby-log.jsonl'), 'utf8').trim().split(/ ? /).filter(Boolean).map((l) => { try - 写入本地文件packages/dsh-qq-personal/lib/console.cjs:1304
fsx.mkdirSync(dir, { recursive: true }); - 写入本地文件packages/dsh-qq-personal/lib/console.cjs:1305
fsx.writeFileSync(pathx.join(dir, 'hobbies.json'), JSON.stringify(j, null, 2) + '\n', 'utf8'); - 写入本地文件packages/dsh-qq-personal/lib/console.cjs:1315
fsx.writeFileSync(cfgFile, JSON.stringify(cfg, null, 2) + '\n', 'utf8'); - 读取本地文件packages/dsh-qq-personal/lib/console.cjs:1328
const readJsonSafe = (f) => { try { return JSON.parse(fsx.readFileSync(f, 'utf8').replace(/^ FEFF/, '')); } catch { return null; } }; - 写入本地文件packages/dsh-qq-personal/lib/console.cjs:1351
fsx.copyFileSync(src, selfFile); - 写入本地文件packages/dsh-qq-personal/lib/console.cjs:1352
try { fsx.appendFileSync(pathx.join(qqNativeDir, 'state', 'persona-changes.jsonl'), JSON.stringify({ at: new Date().toISOString(), action: 'rollback', - 写入本地文件packages/dsh-qq-personal/lib/console.cjs:1359
try { fsx.mkdirSync(dataDir, { recursive: true }); } catch { } - 读取本地文件packages/dsh-qq-personal/lib/index.js:69
const persona = existsSync(PREFERRED_PERSONA) - 读取本地文件packages/dsh-qq-personal/lib/index.js:166
return JSON.parse(readFileSync(file, 'utf8')); - 写入本地文件packages/dsh-qq-personal/lib/index.js:173
mkdirSync(dirname(file), { recursive: true }); - 写入本地文件packages/dsh-qq-personal/lib/index.js:174
writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`, 'utf8'); - 写入本地文件packages/dsh-qq-personal/lib/index.js:178
mkdirSync(dirname(file), { recursive: true }); - 写入本地文件packages/dsh-qq-personal/lib/index.js:179
writeFileSync(file, text, 'utf8'); - 读取本地文件packages/dsh-qq-personal/lib/index.js:191
const content = readFileSync(file, 'utf8'); - 执行外部命令固定命令packages/dsh-qq-personal/lib/index.js:234
const out = execFileSync('netstat', ['-ano', '-p', 'TCP'], { encoding: 'utf8', windowsHide: true, timeout: 5000 }); - 执行外部命令固定命令packages/dsh-qq-personal/lib/index.js:252
const out = execFileSync('tasklist', ['/FI', 'IMAGENAME eq DeepSeek Harness.exe', '/FO', 'CSV', '/NH'], { - 发起网络请求packages/dsh-qq-personal/lib/index.js:268
const response = await fetch(`http://127.0.0.1:${candidate.port}/`, { redirect: 'manual' }); - 读取本地文件packages/dsh-qq-personal/lib/index.js:291
const text = readFileSync(candidate, 'utf8').trim(); - 读取本地文件packages/dsh-qq-personal/lib/index.js:323
if (!existsSync(configPath)) { - 读取本地文件packages/dsh-qq-personal/lib/index.js:324
if (!existsSync(examplePath)) { log?.warn?.(`qq-bridge 已归档,跳过配置同步(管理台照常运行)`); return; } - 写入本地文件packages/dsh-qq-personal/lib/index.js:461
mkdirSync(stateDir, { recursive: true }); - 写入本地文件packages/dsh-qq-personal/lib/index.js:490
mkdirSync(stateDir, { recursive: true }); - 执行外部命令固定命令packages/dsh-qq-personal/lib/index.js:506
execFileSync('taskkill', ['/PID', String(pid), '/T', '/F'], { windowsHide: true, timeout: 5000 }); - 执行外部命令固定命令packages/dsh-qq-personal/lib/index.js:542
const out = execFileSync('tasklist', ['/FI', `PID eq ${pid}`, '/FO', 'CSV', '/NH'], { - 执行外部命令固定命令packages/dsh-qq-personal/lib/index.js:554
execFileSync('taskkill', ['/PID', String(pid), '/T', '/F'], { windowsHide: true, timeout: 5000 }); - 执行外部命令来自配置/变量packages/dsh-qq-personal/lib/index.js:623
spawnedChild = spawn(nodePath, ['src/bridge.js'], { - 写入本地文件packages/dsh-qq-personal/lib/tasks.js:25
fs.mkdirSync(TASKS_DIR, { recursive: true }); - 写入本地文件packages/dsh-qq-personal/lib/tasks.js:69
fs.writeFileSync(tmp, JSON.stringify(t, null, 2) + '\n', 'utf8'); - 写入本地文件packages/dsh-qq-personal/lib/tasks.js:70
fs.renameSync(tmp, f); - 读取本地文件packages/dsh-qq-personal/lib/tasks.js:76
let raw = fs.readFileSync(fileOf(id), 'utf8'); - 读取本地文件packages/dsh-qq-personal/lib/tasks.js:88
for (const name of fs.readdirSync(TASKS_DIR)) {
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的原生 QQ 智能体插件:插件内部直连 SnowLuma(OneBot v11),不用另起桥接进程。
README
由 DeepSeek 最新模型翻译生成dsh-qq
⚠️ 非官方项目。与 DeepSeek、腾讯、SnowLuma 均无隶属关系。
用个人 QQ 号做自动化可能违反腾讯用户协议,使用者自行承担风险(含账号被限制/封禁)。
给 DeepSeek Harness(DSH)加一条 QQ 通道。
插件内直连 OneBot v11 协议端(SnowLuma / NapCat 等),不需要独立的桥接进程,也不新建一个 bot——她用的还是你原来那条会话。
QQ ⇄ SnowLuma(OneBot v11:HTTP 3010 / WS 3011) ⇅ dsh-qq-native(DSH 插件内) ⇅ DSH 会话(复用已有对话,不换脑子)
主要特色
| 特色 | 说明 |
| 复用旧会话 | 接上你已有的 DSH 对话(哪怕 20 万 token 的历史),不失忆、不重开 |
| 零额外进程 | 没有 bridge 守护进程,少一个故障点、少一套配置 |
| 记忆与会话分离 | 印象 + 记忆库是文件,独立于会话存在 → 换会话也不失忆 |
| 会整理自己的记忆 | 自动去重 / 按类别分组 / 生成 INDEX.md,agent 一读就懂全貌 |
| 像人一样说话 | 连发多条合并成一次回复;回复自动拆 2–3 个气泡;可 [SILENT] 不说话 |
展开完整文档(README 剩余 1 节)
dsh-qq ⚠️ 非官方项目。与 DeepSeek、腾讯、SnowLuma 均无隶属关系。 用个人 QQ 号做自动化可能违反腾讯用户协议,使用者自行承担风险(含账号被限制/封禁)。 给 DeepSeek Harness(DSH)加一条 QQ 通道。 插件内直连 OneBot v11 协议端(SnowLuma / NapCat 等),不需要独立的桥接进程,也不新建一个 bot——她用的还是你原来那条会话。 QQ ⇄ SnowLuma(OneBot v11:HTTP 3010 / WS 3011) ⇅ dsh-qq-native(DSH 插件内) ⇅ DSH 会话(复用已有对话,不换脑子) 主要特色 | 特色 | 说明 | | 复用旧会话 | 接上你已有的 DSH 对话(哪怕 20 万 token 的历史),不失忆、不重开 | | 零额外进程 | 没有 bridge 守护进程,少一个故障点、少一套配置 | | 记忆与会话分离 | 印象 + 记忆库是文件,独立于会话存在 → 换会话也不失忆 | | 会整理自己的记忆 | 自动去重 / 按类别分组 / 生成 INDEX.md,agent 一读就懂全貌 | | 像人一样说话 | 连发多条合并成一次回复;回复自动拆 2–3 个气泡;可 [SILENT] 不说话 | | 有自己的时间 | L5 自主探索、任务续跑、主动找话题、爱好时间(自己写随笔,再反哺聊天) | | 只读屏幕感知 | 定时截图 + 画面变化检测,配独立「眼睛」会话描述屏幕;不做任何输入注入 | | 管理台 | 总览/人设/日志/成本/会话/记忆/权限/探索/任务,十个页面,一处配置 | | 权限分层 | L2 电脑操作 / L3 全盘只读 / L4 探索 / L5 自主探索 / 工作模式 / 紧急停止,默认全关 | 0.2.0 新增(2026-10-29) | 能力 | 说明 | | 群聊 | 白名单 + @/关键词/概率档位 + 冷却 + 每小时上限 | | 收图 | 图片落盘 → prompt 给路径 → read_image 读(仅媒体目录) | | 动作层 | 五层权限 + 审计 + 限流;30 个 mcp-qq-actions 工具覆盖好友/群/文件/公告/申请处理 | | 人设自述层 | 她能自己改(≤4KB/天 1 次),带备份、审计、回滚,底座不动 | | 记忆总库 | 所有记忆操作永久留档,删掉的也能找回(memory_vault) | | 发言决策 | 该不该说、说几条、要不要引用(不再按档位硬触发) | | 管理台 | 自述层 / 群聊配置 / 动作审计 / 记忆总库 四个新页面 | 为什么还要做一个 QQ 机器人? GitHub 上 QQ + LLM 的项目很多,但大多解决的是另一个问题。 | 维度 | 常见 QQ LLM 框架(AstrBot / LangBot / MaiBot / Estrella 等) | dsh-qq | | 形态 | 独立服务,自带 WebUI | DSH 插件,跟随 DSH 生命周期 | | 对话 | 新开一条属于 bot 的对话 | 复用你已有的 DSH 会话(保持上下文连续) | | 记忆 | 自建记忆库 | 和 DSH 记忆库 / 人设同一批文件,由插件整理 | | 工具 | 框架内置 | 直接继承 DSH 的 MCP 工具(文件 / 记忆 / 命令 / 任务 / 联网) | | 群聊 | 主打 | 不做——专注私聊陪伴,把复杂度留给别人 | | 多模态 | 普遍支持 | 暂不支持(图片 / 语音 / 表情) | | 与 dsh-onebot-hub 的关系 | 它的取向是「把 QQ 变成 agent 的工具集」,假设下游有别的 bot | 我们的取向是「她自己就是那个 bot」,自己做回复策略 | 一句话: 别人做的是「QQ 机器人框架」; dsh-qq 做的是「给已有的 DSH 会话开一扇 QQ 的窗」——不换脑子、不失忆、不另起一个 bot。 仓库组成 | 包 | 版本 | 作用 | | packages/dsh-qq-native | 0.1.0 | 核心插件:OneBot 客户端、会话、合并/分条、记忆、调度、屏幕、爱好 | | packages/dsh-qq-personal | 0.2.0 | 管理台:总览/人设/日志/成本/会话/记忆/权限/探索/任务 | | packages/qq-agent-presets | 0.2.1 | 三个 agent preset(聊天 / 二代仿真 / 工作模式)+ 工具白名单守卫 | packages/dsh-qq-native/vendor/ 内含来自 qq-bridge 的 MIT 代码(DSH 客户端 + MCP 服务器),来源与许可见 NOTICE。 前置要求 1. Windows 10/11(核心聊天跨平台;屏幕监控与部分工具是 Windows 专用) 2. Node.js ≥ 22 3. DeepSeek Harness(带插件系统) 4. 自行安装 OneBot v11 协议端:SnowLuma 或 NapCatQQ —— 本仓库不包含,且不得随本仓库再分发 快速开始 1. 把这个仓库放到本地,链接插件进你的 DSH profile cd ~/.dsh/profiles/desktop pnpm add "link:<本仓库>/packages/dsh-qq-native" 2. 在 profile 的 package.json 里把 dsh-qq-native 加进 dsh.profile.bundles 3. 复制配置示例并填两个必填项 mkdir -p ~/.dsh/qq-native cp <本仓库>/packages/dsh-qq-native/examples/config.example.json ~/.dsh/qq-native/config.json snowlumaDir:你的协议端安装目录(自动读 token) ownerQQ:你的 QQ 号(只回复这个号) 4. 重启 DSH,看日志 cat ~/.dsh/qq-native/plugin.log [module] index.js 被加载 [apply] runner 已启动 [ws] 已连接 然后直接在 QQ 里发消息即可——不需要任何前缀。 可选能力(默认关):看屏幕 / 开屏幕监控 / 关屏幕监控 三个 QQ 指令;权限、记忆、任务、成本都在管理台(默认 http://127.0.0.1:3101)。 文档 | 文档 | 内容 | | docs/USAGE.zh-CN.md | 中文使用说明:启动顺序、管理台各页、QQ 指令、权限、常见问题 | | docs/ARCHITECTURE.md | 数据流、模块职责、6 条关键设计取舍 | | docs/CONFIG.md | 每个配置项、权限文件、环境变量 | | docs/SECURITY.md | 威胁模型、五层权限、数据出站、已知风险 | | docs/MIGRATION.md | 从 qq-bridge 迁过来 | | docs/ROADMAP.md | 已完成 / 计划 / 不做的 | | CHANGELOG.md | 版本变更 | 安全与隐私 - 默认所有电脑能力关闭,需要显式打开;管理台有「紧急停止」 - 屏幕监控没有输入注入,只能截图;看到敏感信息只做提示 - 本仓库不含任何人设卡、聊天记录、记忆库、token - 所有私人数据都在 ~/.dsh/qq-native/ 和 ~/.dsh/qq-memory/,不进仓库 - scripts/sanitize.mjs 在 CI 里跑,出现本机路径 / 真实 QQ 号 / 私人内容会让构建失败 License MIT(本仓库原创部分)。vendor/ 下代码来自 qq-bridge(MIT,Copyright (c) 2026 Derpyu520 and qq-bridge / QSH contributors),详见 NOTICE。 SnowLuma / NapCat / DSH 分别遵循各自许可。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yifan1037/dsh-qq
把 QQ 消息接入现有对话,复用历史记忆与人格
相关插件 · 平台集成
智能体工程课walkinglabs/learn-harness-engineering
一门项目制课程,教你搭建环境、管理状态、做验证、加控制机制,让 AI 编程智能体稳定干活。
★ 21,155已汉化DSH
71.7
视频翻译配音liuzhao1225/YouDub-webui
开源视频本地化工作台:导入视频,识别、翻译并逐句克隆原声,生成字幕和配音成片。
★ 5,792已汉化Cordis
71.4
失败经验库Ikalus1988/MisakaNet
📚 零依赖、由 git 支撑的微课程库,让 AI 智能体异步分享并检索经过验证的调试经验。| https://misakanet.org
★ 550已汉化DSH
71.2
桌面智能体工作区freestylefly/wesight
WeSight 是开源桌面控制台,面向本地 AI 智能体。它帮你安装或复用 Claude…
★ 933已汉化MCP
71
IM 机器人接入xmanrui/dsh-im
让 DeepSeek Harness 触手可及 Connecting DeepSeek Harness
★ 3,110已汉化DeepSeek 客户端
70.9
中国平台研究引擎Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30…
★ 2,031已汉化DSH
70.7
这是你的仓库?认领条目