dsh-wechat-pad:把个人微信接进 DeepSeek Harness 的客户端插件

前言

给智能体接一个聊天入口,常见的做法是自建一个 HTTP 服务,再让 agent 轮询或收 webhook。对于微信这种入口封闭、需要常驻登录的环境,自建服务还只是前半段:账号登录、消息收发、会话隔离、限流去重,都要另外想办法。下面介绍一个把「微信入口」和「DSH agent」接起来的插件 dsh-wechat-pad。

它由 QIC-9821 维护,在社区目录里归在「客户端」一类。插件本身不含任何微信协议实现,而是对接一台你自己跑的 iPad 协议端(目前适配 WeChatPadPro 的接口):协议端负责登录和收发,插件负责「谁在说、要不要答、交给哪个会话、怎么回」。

它是什么

一句话定位:把个人微信接进 DeepSeek Harness(DSH)的 Host 插件,私聊随手回,群里被 @ 才说话。

它做三件事:

  1. 从协议端的 webhook 收消息,按规则判断要不要转给 agent。
  2. 按「一个群一个独立会话」建上下文,私聊和群聊不互相串。
  3. 把 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 上,不额外开端口。

前置条件

装之前先把这几样备齐:

  1. 一台能跑协议端的机器:Linux(推荐,Docker 也行)或 Windows,能 7×24 在线。协议端掉线等于收不到微信消息。
  2. 一个你愿意承担后果的微信号,建议用小号。
  3. 一个固定出口 IP,以及一个能让协议端回调到 DSH 的地址。如果协议端和 DSH 不在同一台机器,需要一个公网地址或隧道(cloudflared / frp / tailscale 均可),且 webhook 路径能直通 DSH。
  4. DSH 0.2.x(桌面包或 dsh CLI 均可)。

安装与启用

在 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。

典型用法

装好之后按下面几步跑通:

  1. 打开 http://127.0.0.1:<端口>/wechat-pad,点「扫码登录」,用手机微信扫。
  2. 等面板显示「在线」。
  3. 把机器人拉进群,在群里 @ 它才会说话;私聊直接说。
  4. 想让机器人只对某些群说话,就填 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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜