dsh-notify
baka-world
DeepSeek Harness desktop notification plugin (notify-send / D-Bus)
PROJECT TOPICS
PROJECT README
把本机 DSH(DeepSeek Harness) 变成你微信里的一只「龙虾」🦞: 微信发消息 → DSH 干活 → 回复回微信。不需要 OpenClaw、不需要公网服务器、不需要网关。
手机微信 ──► 腾讯 iLink 官方通道 (ilinkai.weixin.qq.com) ──► weixin-bot.mjs ──► 本机 DSH
▲ │
└────────────────────────── 回复 ──────────────────────────────┘
解决什么问题? 把微信变成 DSH 的移动终端:人在外面用手机微信发一条消息,家里/办公室电脑上的 DSH 就替你查资料、写代码、跑脚本、处理文件,结果直接回微信。任何能跑 dsh web 的机器都能挂上。
适合谁? 已经会装 DSH 的开发者与重度用户;想要一个「随时在微信里」的私有 AI 助理、又不想搭公网服务器的人。
怎么做? 直接实现腾讯官方 iLink Bot 协议(微信 ClawBot/「龙虾」的同款官方通道)——扫码配对 → 长轮询收消息 → 调用本机 DSH → 发回微信。官方 OpenClaw 插件本身也只是这套协议的客户端,AI 后端(OpenClaw/DeepSeek/…/DSH)完全自选,腾讯只是"管道"。本仓库 weixin-bot.mjs 即完整实现(协议依据腾讯官方开源 SDK @tencent-weixin/openclaw-weixin,对照版本 2.4.6,详见 RESEARCH.md)。
特性一览:
-14 自动重扫码);/send 发电脑文件到微信;微信发来的图片/文件/视频自动下载解密落盘;| 依赖 | 支持/已验证 | 最后验证日期 |
|---|---|---|
| Node.js | >= 18 |
2026-08-14 |
| DSH | dsh@0.1.0-rc.6(npm) |
2026-08-14 |
| 腾讯 iLink | 对照官方 SDK 2.4.6 |
2026-08-14 |
| 操作系统 | Windows / macOS / Linux(核心为纯 Node) | 2026-08-14 |
dsh headless 子命令),但升级 DSH 或官方 SDK 后,请先跑一遍 Quick start 里的「本地闭环测试」再连真实微信。dsh-wechat-bridge 使用作者自有命名空间(未占用任何第三方 org 或保留命名空间)。probe)npm install -g --prefix <dir> github:gtaifu/dsh-wechat-bridge#main → added 1 package、0 运行时依赖;产物为 files 白名单 6 项(lib/、bridge.mjs、weixin-bot.mjs、dsh-weixin.cmd、LICENSE、README.md)+ npm 自动附带的 package.json(npm pack --dry-run 复核:lib/ 展开后共 11 个文件),无 test/、data/、研究笔记dsh-weixin --help 正常;真实 DSH 任务:node bridge.mjs test → 回复「收到」、exit 0npm install -g dsh-wechat-bridge → 同款三连(install → bin 冒烟 → bridge.mjs test),作为纯 npm 包名的消费端闭环证据data/media/<hash>/ 并告知路径;语音存为官方原始 .silk 格式(未转码),图片/视频/文件按原格式保存。--reply-max-chars 会截断(完整结果在 DSH 工作目录/终端)。-14 自动重连,见「工作原理」)。方式 A(npm 全局安装,npm 发布后可用):
npm install -g dsh-wechat-bridge
方式 B(Git 源码安装,当前即可用,零依赖秒装):
git clone https://github.com/gtaifu/dsh-wechat-bridge.git
cd dsh-wechat-bridge
npm install -g . # 把 dsh-weixin 命令注册到全局
Windows 下也可以不安装:双击/运行仓库里的 dsh-weixin.cmd,或直接 node weixin-bot.mjs <子命令>。
npm update -g dsh-wechat-bridge # 方式 A
cd dsh-wechat-bridge; git pull; npm install -g . # 方式 B
dsh-weixin run 的终端按 Ctrl+C(不再启动即禁用);dsh-weixin logout;login 恢复。npm uninstall -g dsh-wechat-bridge # 移除命令(方式 B 同样按包名卸载)
Remove-Item -Recurse -Force .\data # 删除凭证/记忆/工作目录/媒体(默认 <仓库>/data)
DSH 自身的运行轨迹在
~/.dsh/sessions/(由 DSH 管理,与本插件独立),如需一并清除请自行处理。
环境:Node 18+;DSH 已安装且 dsh web 能跑;零 npm 依赖。
dsh-weixin login # 1) 扫码登录(凭证有效期由腾讯决定,本地自动续连)
dsh-weixin run # 2) 开始监听(保持终端开着)
常用内置指令:
| 指令 | 作用 |
|---|---|
/help |
指令列表 |
/status |
连接剩余时间 + 当前会话与记忆条数 |
/time |
本次连接剩余时间 |
/sessions |
列出你的会话(记忆轮数 + 当前标记) |
/new <名字> |
新建命名会话并切换过去 |
/switch <名字> |
切换会话(main 为默认会话) |
/clear [名字] |
清除当前(或指定)会话的对话记忆(工作目录文件保留) |
/reconnect |
手动重新连接 |
/send <文件路径> [说明] |
把电脑上的文件发给你(绝对路径直接用;相对路径按当前会话的工作目录算;图片/视频按媒体发送,其余按文件发送) |
每个微信联系人(
from_user_id)有独立的 DSH 对话记忆与工作目录(data/workspaces/), 跨轮次的文件操作结果持续保留;记忆按条数/字符双上限滚动裁剪。 想让某个会话的工作目录指向别处(如代码仓库根目录)?见 Configuration 的「指定会话的工作目录」。每个联系人还可拥有多个命名会话:默认会话
main(chatId =wx:<ID>,与旧版完全兼容)。/new <名字>新建并切换、/switch <名字>切换、/sessions列出;每个会话有独立的记忆流与工作目录, "当前会话"指针存于data/sessions-registry/<hash>.json(缺失或损坏时自动回落main)。
# 终端 A:mock iLink 服务器
node test-mock-ilink.mjs --port 8899
# 终端 B:完整流程(DSH 层回显,不消耗模型)
$env:DSH_BRIDGE_MOCK_DSH="1"
node weixin-bot.mjs login --base-url http://127.0.0.1:8899 --data-dir .\test-data
$env:DSH_WXBOT_MAX_MSGS="2"
node weixin-bot.mjs run --base-url http://127.0.0.1:8899 --data-dir .\test-data
# 检查 mock 捕获的收发记录与协议头
Invoke-RestMethod http://127.0.0.1:8899/__captured
Invoke-RestMethod http://127.0.0.1:8899/__headers
# 对腾讯真实端点冒烟(取真实二维码,不登录)
node weixin-bot.mjs probe
所有选项为命令行参数,均有 DSH_WXBOT_* / DSH_BRIDGE_* 环境变量等价项:
| 选项 | 默认 | 说明 |
|---|---|---|
--base-url |
https://ilinkai.weixin.qq.com |
iLink 端点(测试时可指向 mock) |
--channel-version |
2.4.6 |
base_info.channel_version |
--bot-agent |
dsh-wechat-bridge/… |
base_info.bot_agent(仅观测用途) |
--data-dir |
./data |
凭证/记忆/工作目录根 |
--auth-file |
<data-dir>/weixin-auth.json |
🔒 登录凭证(含 bot token,勿外传) |
--allow-from |
全部 | 🔒 只响应指定用户 ID(逗号分隔,强烈建议设置) |
--reply-max-chars |
3800 |
单条回复截断上限 |
--no-typing |
关 | 不发"正在输入"状态 |
--session-ms / --relogin-before-ms |
24h / 2h | 本地会话计时 / 计时到期前提醒提前量(实际有效性由腾讯服务器决定) |
--dsh-bin |
自动解析 | DSH 可执行文件路径(找不到 dsh 时用) |
--timeout-ms / --max-turns / --max-history-chars |
同 bridge | DSH 调用超时 / 记忆条数上限 / 记忆字符上限 |
环境变量等价项:DSH_WXBOT_BASE_URL、DSH_WXBOT_AUTH_FILE、DSH_WXBOT_ALLOW_FROM、
DSH_WXBOT_REPLY_MAX、DSH_WXBOT_NO_TYPING、DSH_BRIDGE_*(DSH 层)。
默认每个会话的 DSH 工作目录是 data/workspaces/<hash>/。想让某个会话直接跑在别的目录
(例如某个代码仓库根目录),在数据目录下放一个 workspace-overrides.json(值可以是
纯字符串路径,也可以带权限的 { dir, permission } 对象):
{
"0bf36b275c23e653": {
"dir": "D:\\path\\to\\your\\workspace",
"permission": "danger-full-access"
}
}
<hash> 即该会话默认工作目录名(safeKey(chatId) 前 16 位,可用 node weixin-bot.mjs chats 的「键」列查看,或直接看 data/workspaces/ 下的目录名);permission 可选:read-only / workspace-write / danger-full-access。不设则跟随
DSH 全局设置;danger-full-access(即 full access)表示不限制文件读写、不弹审批。
桥接会以 DSH_PERMISSION_MODE 环境变量传给该会话的 DSH 进程;dsh-weixin run 生效:该会话后续的 DSH 任务以覆盖路径为工作目录、
以覆盖权限运行,/send 的相对路径也按它计算,sessions//status 显示的就是覆盖后的
目录与权限;DSH_BRIDGE_WORKSPACES(JSON 对象,临时覆盖)或代码内
buildConfig({ workspaces: {...} }) 传入;优先级:代码内 > 环境变量 > 配置文件;data/ 下(已 gitignore),属本机配置,不会进入版本库。通用桥接 bridge.mjs 另有 serve 子命令(HTTP 壳,端口默认 8317、绑定 127.0.0.1、可选 --token 🔒 鉴权),供 OpenClaw exec 工具、wechaty 等外部程序调用,详见 node bridge.mjs 帮助。
本插件在本机运行,不涉及云服务。它访问/写入以下内容:
| 类别 | 内容 |
|---|---|
| 网络 | 仅 HTTPS 访问 ilinkai.weixin.qq.com(登录/收发)与腾讯 CDN(媒体上传下载);闭环测试时指向本地 mock。不访问其他任何公网地址。 |
| 文件(读写) | data/(默认,含凭证、历史、会话注册表、工作目录、媒体);test-data/(测试)。 |
| 文件(只读) | ~/.dsh/sessions/(sessions 命令读取 DSH 运行轨迹)。 |
| 凭据 | weixin-auth.json 含 bot token——即"以你的微信身份收发消息"的凭据,🔒 切勿提交版本控制或外传(.gitignore 已覆盖)。 |
| 用户数据 | 所有往来消息原文 + 时间戳存于 data/history/(本地明文 JSON);媒体文件解密后存于 data/media/。数据只在你机器与腾讯通道之间流动,不发给任何第三方。 |
| 执行权限 | 任何能给你微信发消息的人都能触发本机 DSH 执行任务(等于你本机账号的操作权)→ 务必用 --allow-from 只放行自己的微信号,并维持 DSH 自身的沙箱/审批配置。 |
| 现象 | 原因与处理 |
|---|---|
回复 errcode -14 / 提示 token 失效 |
凭证过期:实现会自动重新扫码续连;也可手动 dsh-weixin login |
| 二维码过期 / 扫了没反应 | 重新 dsh-weixin login,并确认手机微信打开的是最新打印的链接 |
| 收不到消息 | 确认 run 进程在跑;/status 看连接剩余时间;看终端有无 [bridge …] 报错 |
dsh: command not found |
安装 DSH,或用 --dsh-bin 指定可执行文件路径 |
媒体下载/上传失败(如 x-encrypted-param 缺失) |
腾讯协议变更或端点被代理改写:升级本仓库、确认 --base-url 为官方地址 |
bridge.mjs serve 端口被占用 |
--port 换端口 |
查看 DSH 轨迹提示 zstd 不存在 |
安装 zstd,或改用 DSH WebUI 查看对应 session |
| 扫码成功后无法配对(节点跳转) | 网络环境问题:换网络重试;实现已覆盖节点跳转分支 |
weixin-bot.mjs run 的终端输出(stderr,[bridge …] 行,含收发/耗时/错误);data/history/<hash>.json;~/.dsh/sessions/--<工作目录编码>--/session-*/session.jsonl.zstd。三层均可命令直达:
node weixin-bot.mjs chats # 所有微信对话(联系人/轮数/DSH 会话数)
node weixin-bot.mjs history --chat <ID> --last 20 # 微信消息与 DSH 回复的对话原文
node weixin-bot.mjs sessions --chat <ID> # 每条消息对应的 DSH 完整运行轨迹清单
<chat>可用完整 chatId(如wx:o9cq80…@im.wechat)、用户 ID 或chats显示的 hash 键。 查看某次 DSH 完整轨迹:zstd -d -c "<轨迹目录>\session.jsonl.zstd" | more每个联系人的工作目录默认是data/workspaces/<hash>/(配置了覆盖时为其指定目录)。
cd dsh-wechat-bridge; git checkout <上一个稳定 tag>; npm install -g . # 源码安装
npm install -g dsh-wechat-bridge@<旧版本> # npm 安装
回滚不影响 data/ 下的历史与工作目录;重大操作前建议先备份 data/。
构建:无需构建、零依赖,改完即跑(node weixin-bot.mjs …)。
测试:
npm test # 单元测试:WS 帧编解码 6 项断言(node test-ws.mjs)
npm run test:loop # 起 mock iLink 服务器(配合 Quick start 的本地闭环)
程序化入口:package.json main 指向 lib/core.mjs(导出 buildConfig / runChat / loadHistory / clearHistory / safeKey 等,供嵌入调用);CLI 入口为 bin: dsh-weixin → weixin-bot.mjs。
贡献:fork → 新分支 → 跑通 npm test 与本地闭环 → 提交 PR。提交前确认不包含 data/、weixin-auth.json 或任何研究笔记(.gitignore 已覆盖);仓库保持 dsh-plugin topic 以便雷达收录。
https://ilinkai.weixin.qq.com/ilink/bot/...),与官方 SDK 2.4.6 行为一致:AuthorizationType: ilink_bot_token、随机 X-WECHAT-UIN、iLink-App-Id: bot、iLink-App-ClientVersion: 132102、Authorization: Bearer <token>get_bot_qrcode(POST)→ get_qrcode_status(长轮询,支持配对码/二维码刷新/节点跳转)getupdates 长轮询 35s,get_updates_buf 游标持久化到磁盘(重启不丢)getconfig(取 typing_ticket,缓存 24h)→ sendtyping(1) → sendmessage(必须原样带回该消息的 context_token)→ sendtyping(2)getuploadurl(filekey/md5/AES 密钥/加密后大小)→ CDN 上传 AES-128-ECB 密文(响应头 x-encrypted-param)→ sendmessage 携带 file_item/image_item/video_itemmedia.encrypt_query_param → CDN 下载 → AES-128-ECB 解密 → 落盘 data/media/<hash>/errcode/ret === -14 视为 token 失效,自动重新扫码续连lib/core.mjs——headless 一次性会话 + 历史注入 + 独立工作目录(与 bridge.mjs 同款记忆机制)。--session-ms 可调,提前 2h 提醒),到点主动向服务器"体检"——此时微信通道通常仍存活,续连二维码可直接发到微信;但实际有效性由腾讯服务器决定(官方 SDK 以 errcode -14 判定失效,社区实测约 24h~30h+,官方无承诺时长)。本实现双保险:
① 本地计时到期主动体检(服务器说仍有效 → 沿用 token 并刷新计时,说需重绑 → 发二维码);② 任何时候收到 -14 都自动重新扫码续连,无缝换 token。| 文件 | 说明 |
|---|---|
weixin-bot.mjs |
龙虾直连版:iLink 客户端 + DSH 后端(login/run/status/logout/probe/chats/history/sessions) |
bridge.mjs |
通用桥接(CLI/HTTP),供 OpenClaw exec 工具、wechaty 等调用 |
lib/core.mjs |
共享核心:DSH headless 调用、对话记忆、工作目录 |
lib/ilink.mjs |
iLink 协议客户端(对照官方 SDK 2.4.6 实现,含 getuploadurl/通用 sendMessageItems) |
lib/ilink-media.mjs |
媒体通道:CDN 上传(AES-128-ECB)+ 下载解密落盘 + MIME/密钥工具 |
lib/sessions.mjs |
多会话管理:每联系人命名会话(/new /switch /sessions)、当前会话指针注册表 |
lib/ws.mjs |
零依赖 WebSocket 服务端(备用:未来 ClawChat 小程序直连网关用) |
test-mock-ilink.mjs |
mock iLink 服务器(闭环测试) |
test-ws.mjs |
ws 帧编解码单元测试 |
dsh-weixin.cmd |
Windows 启动器(任意目录运行 dsh-weixin login/run/…) |
RESEARCH.md |
协议调研笔记(来源清单、实现备忘) |
LICENSE / package.json / SECURITY.md |
MIT 许可证 / 包信息 / 安全策略 |
zongrongjin/weixin-ilink(Python SDK)、jeffkit/ilink-hub、openilink/openilink-hub(Go + 多语言 SDK)、liiiiwh/weixin-clawbot-skill、minibear2021/wechat_clawbot_sdk[SECURITY] 前缀 issue),详见 SECURITY.md;不要在公开 issue 贴 token 或复现细节。weixin-auth.json 含 bot token,不要提交到版本控制或外传(.gitignore 已覆盖;npm 发布包不含 data/)。--allow-from 只放行自己的微信号;bot 指令也仅在你自己的对话生效。CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。