前言¶
给智能体接一个聊天入口,常见的做法是自建一个 HTTP 服务,再让 agent 轮询或收 webhook。对于微信这种入口封闭、需要常驻登录的环境,自建服务还只是前半段:账号登录、消息收发、会话隔离、限流去重,都要另外想办法。下面介绍一个把「微信入口」和「DSH agent」接起来的插件 dsh-wechat-pad。
它由 QIC-9821 维护,在社区目录里归在「客户端」一类。插件本身不含任何微信协议实现,而是对接一台你自己跑的 iPad 协议端(目前适配 WeChatPadPro 的接口):协议端负责登录和收发,插件负责「谁在说、要不要答、交给哪个会话、怎么回」。
它是什么¶
一句话定位:把个人微信接进 DeepSeek Harness(DSH)的 Host 插件,私聊随手回,群里被 @ 才说话。
它做三件事:
- 从协议端的 webhook 收消息,按规则判断要不要转给 agent。
- 按「一个群一个独立会话」建上下文,私聊和群聊不互相串。
- 把 agent 的回答发回微信,超长切段、超时兜底、限速防刷屏。
它不做协议实现,不提供协议端、账号或绕过风控的手段。项目状态标为 experimental,License 为 MIT,npm 包版本 0.2.1,要求 Node.js >= 22。
核心能力¶
私聊:对方发来就回,可以在配置里关掉。
群聊:只有 @ 到它时才答,回答时带 @对方 前缀;不在白名单的群默认一律不说话。
会话隔离:群里聊的、私聊聊的各自有上下文,换群等于换会话,不会把 A 群的内容带到 B 群。
控制面板:/wechat-pad 页面可以扫码登录、看连接状态、开关群白名单、看统计(收到多少、回了多少、为什么跳过)。
webhook 自动配置:把回调地址填好后,插件启动时自己写回协议端,也可以手动关掉(autoConfigureWebhook: false)。
工作原理¶
微信 ←→ 协议端(WeChatPadPro,跑在你自己的机器/云上)
│ webhook(消息)
▼
dsh-wechat-pad(Host 插件,跑在 DSH 里)
│ session/create · session/prompt · session/event
▼
DSH agent ←→ 你的模型、你的工具、你的记忆
│ 回答
▼
协议端 SendText → 微信
插件在 DSH 进程内运行,直接调宿主的会话服务,不走 HTTP 中转,因此不需要 launch token。面板和 webhook 都挂在 DSH 自己的 webServer 上,不额外开端口。
前置条件¶
装之前先把这几样备齐:
- 一台能跑协议端的机器:Linux(推荐,Docker 也行)或 Windows,能 7×24 在线。协议端掉线等于收不到微信消息。
- 一个你愿意承担后果的微信号,建议用小号。
- 一个固定出口 IP,以及一个能让协议端回调到 DSH 的地址。如果协议端和 DSH 不在同一台机器,需要一个公网地址或隧道(cloudflared / frp / tailscale 均可),且 webhook 路径能直通 DSH。
- DSH 0.2.x(桌面包或
dshCLI 均可)。
安装与启用¶
在 DSH 的 profile 里装,三选一:
# npm(推荐)
dsh plugin add dsh-wechat-pad
# 直接从 GitHub tag 装
dsh plugin add github:QIC-9821/dsh-wechat-pad#v0.1.0
# 从本地目录装(开发时)
dsh plugin add /path/to/dsh-wechat-pad
上述命令来自项目 README。装完在「设置 → 插件」里启用 dsh-wechat-pad,或直接写进 profile 的 bundles。桌面版启用后刷新页面即出现面板;改配置后需要重启 DSH 才生效。启用后打开:
http://127.0.0.1:<DSH 端口>/wechat-pad
配置¶
配置写在插件配置里(cordis.patch.yml 的 config,或设置页表单)。必填只有两项:padUrl 和 token。
| 键 | 默认 | 说明 |
|---|---|---|
padUrl |
— | 协议端地址,如 http://127.0.0.1:8080 |
padToken |
— | 协议端 AuthKey(明文,不推荐长期用) |
padTokenRef |
DSH_WECHAT_PAD_TOKEN |
从凭据库/环境变量取 token 的键名(推荐) |
hookPath |
/wechat-pad/hook |
接收协议端回调的路径 |
webhookSecret |
自动生成 | 回调密钥;不填则启动时生成并存进状态文件 |
autoConfigureWebhook |
true |
启动时把回调地址写回协议端 |
selfWxid |
自动探测 | 机器人自己的 wxid |
botNames |
[] |
别名,用于识别 @小助手 这类写法 |
answerDirectMessages |
true |
私聊是否回 |
defaultTrigger |
mention |
群默认触发方式:mention(被 @)或 all |
groups |
[] |
群白名单,见下 |
allowUnknownGroups |
false |
不在白名单的群是否也回(不建议开) |
timeoutSec |
120 |
等 agent 回答的上限 |
timeoutReply |
我想得有点久,等下再答你 |
超时兜底话术 |
maxReplyChars |
4000 |
单条回答最多多少字 |
chunkChars |
1500 |
超过就分段发 |
chunkDelayMs |
1500 |
分段之间的间隔 |
ratePerMinPerGroup |
5 |
每群每分钟最多回几条 |
ratePerMinGlobal |
10 |
全局每分钟上限 |
queueLimit |
5 |
每群排队上限,超了丢弃并记账 |
dedupeTtlSec |
3600 |
同一条消息多久内不重复处理 |
stateDir |
~/.dsh/wechat-pad |
状态文件目录(会话绑定、去重、白名单) |
workspaceDir |
~/.dsh/wechat-pad/workspace |
会话的工作目录 |
systemHint |
空 | 拼在每条 prompt 前的固定提示 |
群白名单的写法:
groups:
- id: 12345678@chatroom # 群 id(以 @chatroom 结尾)
name: 技术交流群 # 选填,只用于显示
enabled: true
trigger: mention # mention | all
ratePerMin: 3
群 id 从协议端的 webhook 原始载荷里看:面板的「统计」里有最近消息,或打开 logRawPayloads 后看 stateDir/raw/。
token 建议用 padTokenRef 从环境变量或凭据库取,不要把明文 token 写进配置文件提交到 git。
典型用法¶
装好之后按下面几步跑通:
- 打开
http://127.0.0.1:<端口>/wechat-pad,点「扫码登录」,用手机微信扫。 - 等面板显示「在线」。
- 把机器人拉进群,在群里 @ 它才会说话;私聊直接说。
- 想让机器人只对某些群说话,就填
groups白名单。
除了配置文件,DSH 的「设置 → 微信」里还有一页运行时开关,改完保存,下一条消息就按新规则走,不用重启 DSH。这页里实用的几项:
| 设置 | 默认 | 作用 |
|---|---|---|
| 启用自动回复 | 开 | 关掉后照收消息,但不转给模型 |
| 群里怎么说话 | 只回 @ 我的 | 「只回 @」/「每句都回」/「群里不理」 |
| 私聊自动回复 | 开 | 关掉只记录不回复 |
| 自动加入新群 | 关 | 开以后白名单外的群也会回 |
| 连发合并窗口 | 800 ms | 同一个人连发几条合并成一次提问,省上下文 |
| 单条回复上限 | 4000 字 | 超过截断 |
| 超长回复分段长度 | 1500 字 | 超过上限的回复切开分多条发 |
| 等待模型超时 | 120 秒 | 超时回一句兜底话 |
| 每分钟上限(单会话/全局) | 5 / 10 | 防刷屏 |
| 说话风格提示 | 两三句话 | 加在每次提问前,限定语气和长度 |
运行时设置存到 <stateDir>/settings.json,覆盖配置文件里的同名项。面板上还有「立即扫描一次」「重开会话」两个按钮。
适用场景与注意¶
适合已经在 DSH 里跑自己的 agent、想在微信群里用它应答、且愿意自己维护协议端的人。协议端需要 7×24 在线,适合放在云主机或常开的机器上。
几点需要提前知道的:
- 封号风险:非官方协议登录个人微信违反微信软件许可及服务协议,资料里明确写了可能被封号,轻则 1 天,重则永久。首次登录常掉线,按协议端文档重扫、稳设备处理。请只在你自己的号、且愿意承担后果时使用。
- 权限:插件以宿主 owner 身份建会话,agent 能用的工具就是你在 DSH 里给它的工具。如果这个号会对陌生人说话,不要给它开通危险工具。
- 隐私:消息会经过你的协议端 → 你的 DSH → 你的模型服务商。不要把不该给模型看的东西发进来。
- 密钥:用
padTokenRef从环境变量/凭据库取 token。 - 兼容性:目前实测只适配 WeChatPadPro(
/api/login/*、/api/v1/message/*、/v1/webhook/*)。换别的后端需要实现同样的几个端点,或改lib/pad-client.js里的路径表。
安装前建议先检查源码与许可证(MIT)。项目自带 11 个测试覆盖解析、策略、去重、限速、分段、超时和 e2e,e2e 用 test/mock-pad.mjs 这个假协议端跑通「webhook → 会话 → 回复」,不依赖真微信,可以先 npm test 看行为是否符合预期。
结尾¶
dsh-wechat-pad 的价值在于把「微信入口」和「DSH agent」之间的胶水层固化下来:会话隔离、@ 触发、限速去重、分段回复都做好了,需要自己搭的只剩协议端和一台常开的机器。它仍是 experimental,协议端也不是官方接口,用之前想清楚封号风险。
目录页:https://www.skillhub.cn/plugins/QIC-9821/dsh-wechat-pad
GitHub:https://github.com/QIC-9821/dsh-wechat-pad
npm:https://www.npmjs.com/package/dsh-wechat-pad