dsh-weixin
Verifieddsh-weixin · v0.2.1 · MIT
微信 ClawBot (iLink) 通道插件:把微信消息接入 DeepSeek Harness 会话,按用户隔离、原生注入与回发。
Install
dsh plugin add dsh-weixin Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-weixin
微信 ClawBot(iLink)通道插件:把微信消息接入 DeepSeek Harness 会话。
它是一个标准的 Cordis 组合包(bundle),在 Harness 进程内运行,无需独立桥接进程:
手机微信 ClawBot ←→ 腾讯 iLink ←→ 【本插件(Harness 进程内)】
├─ getupdates 长轮询收消息
├─ agent.followup() 原生注入会话
└─ session/event → sendmessage 回发
- 每用户一个会话:微信用户 id → Harness 会话的映射持久化,会话有独立上下文。
- 原生注入:消息通过
agent.followup()进入会话,参与历史、标题、持久化。 - 网页面板:
/weixin提供连接状态、扫码登录、会话映射、日志。 - 主动推送:
ctx.weixin服务 +/weixin/send路由,可供其它插件/脚本主动推消息。
快速开始
前提:已安装 DeepSeek Harness,
dsh命令可用。
1. 安装(装到 web profile,插件依赖它提供的 webServer/agents):
dsh plugin --profile web add github:caoyilearnai/dsh-weixin
2. 启动(与平时启动 Harness 一致,插件随 web 组合自动加载):
dsh web --port 3080
3. 扫码登录:
手机微信先开通 ClawBot(「设置 → 插件 → ClawBot」,iOS ≥ 8.0.70),然后打开
http://127.0.0.1:3080/weixin → 点「扫码登录」→ 手机微信扫码(若提示数字验证码,照输即可)。
4. 开始对话:微信里给机器人发消息即可,每个微信用户自动对应一个独立会话。
登录凭据会写入状态目录,重启后免扫码。
卸载:
dsh plugin --profile web remove dsh-weixin
其它安装方式
# 本地目录
dsh plugin --profile web add /path/to/dsh-weixin
# npm(发布后)
dsh plugin --profile web add dsh-weixin
# 锁定 commit(更稳)
dsh plugin --profile web add github:caoyilearnai/dsh-weixin#<sha>
命令行扫码登录(可选)
不用面板也可以用 CLI 登录:
dsh-weixin-login
# 或:node node_modules/dsh-weixin/bin/login.mjs
主动推送
除「微信来消息 → 回复」外,插件暴露两种主动推送方式(无需入站 context_token):
1. Cordis 服务(其它插件调用):inject: ['weixin'] 后通过 ctx.weixin 使用:
export const inject = ['weixin']
export function apply(ctx) {
ctx.weixin.push('[email protected]', '你好') // 推给单个微信用户
ctx.weixin.sendAll('全员通知') // 广播给所有已建会话用户
ctx.weixin.status() // 连接状态快照
ctx.weixin.sessions() // 用户 id → sessionId 映射
}
2. HTTP 路由(脚本 / 调度器调用):
curl -X POST http://127.0.0.1:3080/weixin/send \
-H 'content-type: application/json' \
-d '{"to":"[email protected]","text":"你好"}'
# 广播:{"to":"all", "text":"..."}
目标用户 id 可在 /weixin/status 的 sessionMap 里查到。
配置
通过 Cordis 配置覆盖默认值。在用户 profile 的 cordis.patch.yml(或 --patch overlay)重述本行,仅写要改的键(未写的键由 schema 填充默认值):
- insert:
- id: weixin
name: dsh-weixin
config:
replyMode: last # full | last
maxChunk: 1200
| 键 | 默认 | 说明 |
|---|---|---|
cwd |
stateDir/workspace(空则自动,可显式覆盖) |
新会话工作目录 / 会话持久化命名空间(绝对路径) |
stateDir |
$DSH_HOME/dsh-weixin(无则 ~/.dsh/dsh-weixin) |
凭证/会话映射/游标的目录 |
replyMode |
full |
full 整轮文本 / last 只回最后一条 |
replyTimeoutMs |
900000 |
单轮回复超时(毫秒) |
maxChunk |
1500 |
单条消息最大字符数(超出切分) |
sendIntervalMs |
2000 |
两次发送最小间隔(规避 iLink 限流) |
若在 bundle 层已经写了
config,覆盖时必须重述整行(后层会替换整行config值,不与前层深度合并)。
状态目录
stateDir/
├── credentials.json # bot_token / baseurl / ilink_bot_id / ilink_user_id / loggedInAt
├── session-map.json # 微信用户 id → Harness 会话 id
└── updates-buf.json # getupdates 长轮询游标
会话本身由 Harness 的 sessionPersistence 持久化,与插件状态目录无关;删除 session-map.json 只会让下次消息新建会话。
开发
pnpm install
pnpm test # node --test(核心关联/切分逻辑)
包结构遵循官方「打包与安装插件」规范:
dsh-weixin/
├── package.json # dsh.bundle manifest + exports + files
├── cordis.patch.yml # 按包名引用插件(非路径)
├── index.mjs # 组合包入口(re-export name/inject/Config/apply)
├── src/ # index / ilink / creds / panel
├── bin/login.mjs # CLI 扫码登录
└── test/ # node:test 单元测试
安全注意事项
/weixin 面板(/status、/login、/verifycode、/logout、/send)目前 没有鉴权:任何能访问该地址的人都可以登出机器人、以机器人身份向任意/全体用户发消息、查看会话映射与日志。
- 仅在可信环境使用:只在本机或可信内网运行
dsh web,不要把webServer绑定到0.0.0.0、不要做公网端口转发、不要部署到公网服务器。 - 若确需远程管理,请自建反向代理 + 鉴权层(或 VPN)后再暴露,不要直接裸奔公网。
- 为
/weixin/*写操作加鉴权是本项目的 TODO,欢迎贡献。
消息类型支持
| 类型 | 状态 |
|---|---|
| 文字 | ✅ 完整支持 |
| 语音 | ✅ 已支持:腾讯服务端先转写成文字(voice_item.text),直接以文字注入会话,无需本地 ASR |
| 图片 | ⚠️ 能接收(CDN 下载 → AES 解密 → 存附件),但当前 DeepSeek V4 是纯文本模型,看不了图:会回复「不支持看图」,且不污染会话历史(后续文字不受影响)。接入视觉模型后自动看图 |
| 文件 / 视频 / 其它 | ❌ 暂不支持,回复「暂不支持」 |
已知限制
- 仅单聊:群聊未适配(回包始终发给发消息的个人)。
- 扫码登录 5 分钟超时:二维码 5 分钟内有效,过期最多自动刷新 3 次,仍超时需重新发起登录。
- 单轮串行:一条微信消息会阻塞整个通道直到该轮结束,多用户场景后面的消息会排队等待(单用户无感)。
- 无内置"清空上下文"入口:如需重开会话,删除状态目录下的
session-map.json(见「状态目录」),下次消息会新建会话。 - iLink 限流(
ret=-2)已内置指数退避重试;连发仍可能被腾讯节流。 - ClawBot 处于灰度测试阶段,腾讯保留调整权利。
License
MIT