DeepSeek Harness 的核心设计是插件化,但插件本身通常运行在本地或特定网络环境。当需要在移动端或远离电脑的环境下操作 Harness 时,直接交互变得困难。dsh-wechat-channel 解决了这个问题,它允许通过微信公众号发送指令操控 Harness,并将执行结果通过客服消息接口推回微信。
核心功能¶
该插件主要提供以下能力:
- 微信指令控制:在微信内发送消息即可控制 Harness。
- 结果推送:执行结果经客服消息接口推回微信。
- 安全校验:包含回调签名校验以及
openid白名单机制。 - 零运行时依赖:不依赖额外的运行环境。
- 独立路由:使用独立前缀
/wechat-mp,避免与同名第三方插件冲突。
安装与启用¶
推荐从 npm 安装。安装完成后需要重启 dsh web 进程才能加载新插件。
从 npm 安装(推荐)
dsh plugin --profile web add dsh-wechat-channel
从本地目录安装(开发用)
dsh plugin --profile web add link:<本目录绝对路径>
安装后,DSH Desktop 会自动将插件注册到 dsh.profile.bundles 中。
配置¶
在 profile 的用户补丁层 <DSH_HOME>/profiles/web/cordis.patch.yml 中添加配置。以下是标准配置示例:
- id: wechat
config:
# Token 是你自己编的,不是微信给你的。需与公众号后台「服务器配置」一致
token: 你的自定义Token
# 测试号页面的 appID / appsecret(异步回复必需)
appId: wx********
appSecret: ********
# 回调路径,默认 /wechat-mp。此路径需与公网 URL 后缀一致
path: /wechat-mp
# 允许下指令的 openid 白名单(首次使用需留空获取 openid 后填写)
allowFrom: []
# 是否开启白名单验证
requireWhitelist: true
# Agent 预设配置
agentPreset: standard
# 会话超时时间
turnTimeoutMs: 600000
# 开启诊断日志
diagnostics: true
注意:本插件命名 dsh-wechat-channel 是为了避免与 npm 上另一个同名插件 dsh-wechat(走 iLink 协议)冲突。该同名插件注册了 /wechat/status 路由,与 DSH 的 webserver 路由冲突会导致本插件静默失败。因此本插件使用 /wechat-mp 前缀。
网络与公网要求¶
微信的消息回调是腾讯服务器主动发起的,因此必须满足以下条件:
- 回调地址必须公网可达。
- 必须是 HTTPS 协议且拥有有效证书。
- 局域网内手机和电脑处于同一 WiFi 无法满足要求,腾讯服务器无法访问内网地址。
局域网替代方案:如果需要在局域网内使用手机操作 DSH,请使用 @linxin666/dsh-remote-web-ui 插件(手机浏览器扫码配对方案),本插件不覆盖该场景。
隧道配置¶
为了实现公网访问,通常需要使用隧道工具。本项目自带 cloudflared 二进制。
国内网络注意事项:国内网络下 QUIC (UDP) 协议常被阻断,会导致隧道注册成功但立刻返回 502/530 错误。建议使用 http2 协议:
bin/cloudflared.exe tunnel --url http://127.0.0.1:<dsh web 端口> --no-autoupdate --protocol http2
公众号后台配置:
1. 将获取到的临时地址(如 https://xxxx.trycloudflare.com)作为 URL。
2. 路径后缀必须加上插件的 path 配置,即 /wechat-mp。
3. 填入与配置文件中 token 一致的值。
注意:trycloudflare.com 地址是临时的,重启会变化。正式环境请使用固定域名。
首次使用与白名单¶
1. 配置白名单:
allowFrom 默认为空,此时所有人都会被拒绝。首次使用时:
- 在公众号后台提交服务器配置(URL 和 Token),确保显示「配置成功」。
- 关注测试号,发送任意消息。
- 插件会通过客服消息返回你的 openid。
- 将返回的
openid填入配置文件的allowFrom列表中。
2. 重启服务:
修改配置后,必须重启 dsh web 进程。
安全模型¶
- 配对即控制:一旦 openid 加入白名单,该设备即拥有完全控制 Harness 的凭据(可执行命令、读写文件)。
- 签名校验:回调入口包含 SHA1 签名校验,错误签名直接 403。
- 状态端点:
GET <path>/status?key=<token>可用于排查,但绝不回显 token。
源码与目录¶
该插件采用分层结构设计(lib/protocol.js, lib/server.js, lib/wechat-api.js, lib/bridge.js, lib/index.js),各层相互独立,便于测试与维护。