dsh-notify
baka-world
DeepSeek Harness desktop notification plugin (notify-send / D-Bus)
zxz9988/dsh-wechat-bridge
DSH 微信桥接插件 | DeepSeek Harness WeChat bridge plugin:把手机微信(腾讯官方 iLink/ClawBot 协议)接入 DSH AI 助手——流式回复、扫码登录、会话持久化、定时任务、网页抓取(MCP)。Connect WeChat to DeepSeek Harness AI via Tencent's official iLink/ClawBot protocol: streaming replies, QR login, cron jobs, web fetch (MCP).
PROJECT TOPICS
PROJECT README
把手机微信接到 DeepSeek Harness (DSH):你在微信里给机器人发消息,DSH 的 AI 助手处理后把回复流式发回微信。功能定位与 CC-Connect 的"微信消息中转"类似,但本插件为完全独立的原创实现,与 CC-Connect 无任何代码、配置或商标关联(详见下方合规说明)。
English — A DeepSeek Harness (DSH) plugin that connects your phone's WeChat to a DSH AI agent through Tencent's official iLink / ClawBot protocol: streaming replies, QR-code login, per-contact sessions with persistence, cron jobs, and an optional self-hosted web-fetch MCP server. MIT licensed, fully original implementation.
手机微信 ──▶ 腾讯 iLink Bot API(ilinkai.weixin.qq.com,官方开放协议)
│ 长轮询收消息 / sendmessage 回传
▼
dsh-wechat-bridge(本插件,DSH 内运行)
│ ctx.agents.create + followup + 会话日志流
▼
DeepSeek Harness AI Agent(DSH 官方 Agent 接口)
ilinkai.weixin.qq.com),受腾讯《微信 ClawBot 功能使用条款》约束,不是逆向 iPad 协议,也不是 PC 客户端 Hook。wechat-ilink-client(MIT 许可,零运行时依赖),其实现参考腾讯官方开源包 @tencent-weixin/openclaw-weixin。MIT 归属声明见 THIRD_PARTY_NOTICES.md。/new 清空上下文重开mcp/fetch-server/),AI 仅在用户明确要求时抓取公开网页(内置内网地址拦截、20 秒超时、3 MB 上限),无需桌面端审批wechat-outbox/<联系人>/ 即自动发送到你微信;更有专属工具 wechat_send_file(直接写内容交付)与 wechat_send_local_file(发工作目录内已有文件)——你问 AI 要文件时它直接生成文件发过来,而不是贴代码allowFrom 控制谁能聊;admins 控制谁能执行 /new /stop /status;支持 override.json 热调整/help /new /stop /status~/.dsh/wechat-bridge/override.json(可选,修改后约 5 秒生效、删除自动回退):
{
"allowFrom": ["<你的 iLink 用户 ID>"],
"admins": ["<你的 iLink 用户 ID>"],
"jobs": [
{ "id": "morning-news", "cron": "0 7 * * *", "prompt": "收集今天 AI 行业头条并总结要点", "to": "<你的 iLink 用户 ID>" }
]
}
jobs[].cron:5 段 cron(分 时 日 月 星期,星期 0=周日),支持 */n、列表、区间jobs[].to:任务目标联系人,必须是管理员(防篡改骚扰他人)DSH 插件装在 profile 里(默认 ~/.dsh/profiles/web/)。
⚠️ 代码更新提示(重要):DSH 的插件加载器会缓存已导入的模块,修改插件源码后必须重启 DSH 才会加载新代码(配置项改动则热加载,无需重启)。首次安装也建议装完即重启一次,确保运行的就是最新代码。开发迭代建议用
link:方式安装(见方式 B)。
# 在 DSH 之外打开 PowerShell,执行:
dsh plugin --profile web add "<插件仓库路径>"
dsh plugin是 DSH 自带的插件管理命令(本质是把参数转发给 pnpm 并同步 bundle 列表)。 装完后重启 DSH 使 bundle 生效。
link: 链接,推荐开发迭代用)cd "$env:USERPROFILE\.dsh\profiles\web"
pnpm add "link:<插件仓库路径>"
用
link:(而不是file:)安装:node_modules 里是符号链接,改完源码重启 DSH 即生效,无需重装。
⚠️ 运行时 peer 依赖解析:插件目录在 DSH 应用安装树之外,Node ESM 解析够不到主机自带的
@deepseek-ai/*包(会报ERR_MODULE_NOT_FOUND: Cannot find package '@deepseek-ai/schemastery')。 因此本仓库通过postinstall(scripts/ensure-host-junction.mjs)自动把 peer 包以 junction 链接到主机安装目录的 node_modules——在插件仓库里跑过npm install即自动建立。 若曾用--legacy-peer-deps跳过,可手动执行node scripts/ensure-host-junction.mjs补链。
- insert:
- id: wechat-bridge
name: '@zxz9988/dsh-wechat-bridge'
dsh plugin --profile web add @zxz9988/dsh-wechat-bridge
# 或手动:
cd "$env:USERPROFILE\.dsh\profiles\web"
pnpm add @zxz9988/dsh-wechat-bridge
npm 上另有他人发布的同名非 scoped 包(
dsh-wechat-bridge,作者 gtaifu),与本项目无关; 本项目的官方包名是@zxz9988/dsh-wechat-bridge,请勿混淆。
enabled: true,装好后没有凭证会自动进入扫码流程:
自动弹出浏览器页面(~/.dsh/wechat-bridge/login.html)显示二维码。~/.dsh/wechat-bridge/state.json),开始收发。config: { enabled: false }。- insert:
- id: wechat-bridge
name: '@zxz9988/dsh-wechat-bridge'
config:
enabled: false
让微信里的 AI 真正能读网页内容(回答"帮我看下这篇新闻讲了什么"这类请求)。自研约 150 行极简实现,只依赖官方 @modelcontextprotocol/sdk(MIT)与 zod(MIT),不引入任何第三方 fetch 服务器。
cd mcp/fetch-server
npm install
然后在 profile 的 cordis.patch.yml 里挂载(dsh-mcp-client 由 DSH 自带,工具名固定为 mcp__fetch__fetch;failOnStartupError: true 让启动失败可见而不是静默):
- insert:
- id: mcp-fetch
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: fetch
transport: stdio
command: 'C:\Program Files\nodejs\node.exe' # 换成你机器上 node.exe 的绝对路径
args:
- '<仓库路径>\mcp\fetch-server\server.mjs'
cwd: '<仓库路径>\mcp\fetch-server'
toolCallTimeoutMs: 60000
failOnStartupError: true
安全设计:仅 GET 公开 http/https 地址;拒绝 localhost/*.local/私网与环回 IPv4/IPv6(SSRF 防护);20 秒超时、3 MB 下载上限、单次最多返回 10 万字符并支持 startIndex 分页续读;不执行任何抓取到的脚本。该工具无需桌面端审批即可被微信侧智能体调用,但只有用户明确要求抓取时 AI 才会调用(安全铁律第 4 条)。
可在 DSH 设置界面(插件配置)或 cordis.patch.yml 的 config 中调整:
| 配置 | 默认 | 说明 |
|---|---|---|
enabled |
true |
是否启用桥接 |
token / accountId |
空 | 已有 iLink 凭证(留空走扫码登录,推荐) |
baseUrl |
https://ilinkai.weixin.qq.com |
iLink 服务地址 |
allowFrom |
["*"] |
白名单(iLink 用户 ID);建议用 override.json 收紧成你自己的 ID |
admins |
[] |
管理员列表:可执行 /new /stop /status;为空则所有人可执行 |
workDir |
空 | AI 工作目录;留空用 DSH 当前工作区 |
blockLinks |
true |
拦截纯链接消息(安全铁律) |
streaming |
true |
流式分段发送 |
idleTimeoutMins |
60 |
空闲多久自动结束会话(0=永不) |
maxReplyChars |
1500 |
单条回复最大字符数(自动分段) |
loginCooldownSecs |
30 |
登录失败重试间隔 |
wechatMarkdown |
true |
把回复里的 Markdown(加粗/表格/引用/列表/链接)转成微信友好的纯文本 |
groups |
true |
处理群聊消息(开启后仅响应 @机器人 的消息) |
groupRequireMention |
true |
群聊仅当消息 @机器人 时才响应(关闭则响应群内所有文字消息) |
pollWatchdogSecs |
90 |
长轮询静默超过该秒数判定假死,自动重启监听(0=关闭) |
插件自带三套测试(单元测试可在任何环境/CI 运行;集成测试用真实 DSH 服务树 + 真实 DeepSeek 模型 + 模拟微信客户端):
cd <插件仓库路径>
npm install # 首次
npm run test # 全量集成测试(默认 2 轮;--rounds=N 可调)
npm run test:smoke # iLink 官方接口冒烟测试(获取二维码,不登录)
node test/unit.mjs # 纯单元测试(CI 亦运行此套)
集成测试覆盖 43 项断言:真实模型问答回传、流式分段防切词(按句读边界切割)、/status /help /new 命令、
白名单、/new 竞态、多联系人会话隔离、消息排队顺序、/stop 中断、凭证过期自动重登、
重启恢复(凭证持久化)、非流式整段发送、图片接收、定时任务、正在输入提示、outbox 文件回传、空闲回收、优雅关闭。
测试环境自动隔离在
test/.home(复制你的凭证与模型配置),不污染真实 DSH 数据。
| 铁律 | 本插件行为 |
|---|---|
| 1. 网页命令先确认再执行 | 插件不执行任何来自微信的命令行指令 |
| 2. 外部内容入库前先过目 | 微信消息只进 AI 会话,插件不直接写 Obsidian/知识库 |
| 3. 高危操作强制中断 | AI 侧高危操作由 DSH 本身的权限确认机制把关;插件不代答确认 |
| 4. 微信机器人只做消息转发 | ✅ 插件只做消息中转;纯链接默认拦截,不自动处理微信中的链接;可选网页抓取仅在用户明确要求时进行 |
| 5. AI 提方案,人拍板 | 微信端适合问答与产出,涉系统级操作建议回到 DSH 桌面端确认 |
建议:allowFrom 只保留你自己的微信 ID(登录日志会打印),陌生消息一律不进 AI。
~/.dsh/wechat-bridge/bridge.log(登录状态、扫码状态、每条消息处理都记录)~/.dsh/wechat-bridge/state.json 后重启 DSH(或重载插件)开始接收微信消息… 是否出现lib/index.js 误判为威胁(实测出现 Trojan:Script/ObfusScript.A!ml 误报并隔离文件,导致插件无法加载)。本插件为纯 Node.js 源码、无任何混淆,误报率极低但非零。处理:① 在安全软件中对该文件/目录(<仓库路径>\lib)添加排除或"允许";② 从隔离区还原后重启 DSH;③ 可对照 GitHub 上的文件哈希核实未被篡改(git status 无改动即为原始文件)。/stop 或稍后重发(错误会以页脚形式回传)maxReplyChars 分段(默认 1500 字);超长内容会拆成多条依次发送CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。