npx skills add https://github.com/xueheng-li/openclaw-wechat --skill wecom-notifyCLI を使用してこのスキルをインストールし、ワークスペースで SKILL.md ワークフローの使用を開始します。
⭐ 如果觉得有用,请点击右上角的 Star 支持一下!
openclaw-wechat 是一个 OpenClaw(原 ClawdBot/Moltbot)的
企业微信渠道插件,让你的 AI 智能体通过企业微信自建应用与用户对话。接入企业微信后,
个人微信用户也可以直接对话——只需在企业微信管理后台「我的企业 → 微信插件」中扫码关联即可。
🍴 本项目 fork 自 dingxiang-me/OpenClaw-Wechat(v0.1.0,作者:勾勾的数字生命),并进行了大量功能扩展以兼容新版 OpenClaw。
修复了 OpenClaw 2026.3+ 中企业微信“能发不能收”的典型故障,核心兼容点包括:
status 运行态信息,避免 health-monitor 持续误判渠道已停止gateway.startAccount 改为常驻直到 abortSignal,不再反复 auto-restartregisterHttpRoute() 显式增加 auth: "plugin" 和 match: "exact"/wecom/callback 不再被 Control UI 的 SPA fallback 覆盖,健康检查稳定返回 wecom webhook okAgentId 也会导致“能发不能收”,现在 README 已加入对齐检查解决了企业微信渠道"失忆"问题:之前每条消息都是独立对话,AI 无法记住上下文。
现在使用 OpenClaw SDK 的 recordPendingHistoryEntry + buildPendingHistoryContextFromMap 实现对话历史管理,与官方 Telegram/Discord 渠道完全一致:
/clear 命令同时清除 session 和内存历史/status 显示当前历史消息数量| 特性 | 上游 (OpenClaw-Wechat v0.1.0) | 本 Fork (v0.3.7) |
|---|---|---|
| 🎯 平台兼容 | ClawdBot | OpenClaw(同时保留 ClawdBot 兼容) |
| 📄 插件描述文件 | clawdbot.plugin.json |
openclaw.plugin.json + clawdbot.plugin.json |
| ⚙️ 配置文件 | ~/.clawdbot/clawdbot.json |
~/.openclaw/openclaw.json |
| 📨 消息类型 | 文本、图片、语音 | 文本、图片、语音、视频、文件、链接 |
| 📤 发送类型 | 仅文本 | 文本、图片、视频、文件(自动类型识别) |
| 🎙️ 语音识别 | 仅企业微信自带 | 企业微信自带 + 远程 Qwen3-ASR / 本地 FunASR(自动降级) |
| 🧠 对话历史 | 无 | SDK 级对话记忆(与官方 Telegram 一致) |
| 🖥️ Chat UI | 无 | 消息同步到 Transcript + 实时广播 |
| 🌐 代理支持 | 无 | WECOM_PROXY 环境变量 |
| 📝 消息分段 | 按字符 | 按字节(UTF-8),二分查找分割 |
/help、/status、/clear)WECOM_<ACCOUNT>_* 格式)WECOM_PROXY)OpenClaw 2026.3+ 对渠道插件的要求比旧版本更严格。企业微信插件如果只保留旧版写法,常见症状是:
/wecom/callback 返回的是 Control UI HTML,而不是 wecom webhook okhealth-monitor 日志里反复出现 restarting (reason: stopped)wecom inbound 日志本插件从 v0.3.7 起已补齐以下兼容点:
status:提供运行态摘要、账户快照、探测结果gateway.startAccount:保持常驻直到 abortSignalapi.registerHttpRoute():显式使用 auth: "plugin" 和 match: "exact"如果你升级到 OpenClaw 2026.3.x 或更高版本,建议至少验证这三项:
openclaw channels status --probe
curl https://你的域名/wecom/callback
openclaw logs -f | grep wecom
期望结果:
runningwecom webhook okwecom inbound:、session registered、sent AI reply| 类型 | 接收 | 发送 | 说明 |
|---|---|---|---|
| 📝 文本 | ✅ | ✅ | 完全支持,超长消息自动按字节分段 |
| 🖼️ 图片 | ✅ | ✅ | 支持 AI Vision 识别,下载后保存到临时文件 |
| 🎙️ 语音 | ✅ | ❌ | 企业微信自带识别 + 远程 Qwen3-ASR / 本地 FunASR 降级(AMR→WAV→文本) |
| 📹 视频 | ✅ | ✅ | 自动下载保存,支持发送视频消息 |
| 📎 文件 | ✅ | ✅ | 自动下载,可读类型自动交给 AI 分析 |
openclaw doctor 通过)asr_server.py,详见 asr_api_README.mdopenclaw plugin install --path /path/to/openclaw-wechat
git clone https://github.com/Xueheng-Li/openclaw-wechat.git
cd openclaw-wechat
npm install
~/.openclaw/openclaw.json 中注册插件:{
"plugins": {
"load": {
"paths": [
"/path/to/openclaw-wechat"
]
},
"entries": {
"wecom": {
"enabled": true
}
}
}
}
💡 注意:插件 ID 为
wecom(与渠道名一致)。
https://你的域名/wecom/callback⚠️ 务必记住这组配置与具体应用绑定:
AgentId、Secret、Token、EncodingAESKey是针对某一个企业微信自建应用的,不能和另一套应用参数混用。混用时常见现象是“OpenClaw 可以发消息,但收不到你从企业微信发回来的消息”。
在 ~/.openclaw/openclaw.json 中添加环境变量:
{
"env": {
"vars": {
"WECOM_CORP_ID": "你的企业ID",
"WECOM_CORP_SECRET": "你的应用Secret",
"WECOM_AGENT_ID": "你的应用AgentId",
"WECOM_CALLBACK_TOKEN": "你设置的Token",
"WECOM_CALLBACK_AES_KEY": "你生成的EncodingAESKey",
"WECOM_WEBHOOK_PATH": "/wecom/callback",
"WECOM_PROXY": ""
}
}
}
支持配置多个企业微信账户,使用 WECOM_<ACCOUNT>_* 格式:
{
"env": {
"vars": {
"WECOM_CORP_ID": "默认账户企业ID",
"WECOM_CORP_SECRET": "默认账户Secret",
"WECOM_AGENT_ID": "默认账户AgentId",
"WECOM_CALLBACK_TOKEN": "默认账户Token",
"WECOM_CALLBACK_AES_KEY": "默认账户AESKey",
"WECOM_SALES_CORP_ID": "销售账户企业ID",
"WECOM_SALES_CORP_SECRET": "销售账户Secret",
"WECOM_SALES_AGENT_ID": "销售账户AgentId",
"WECOM_SALES_CALLBACK_TOKEN": "销售账户Token",
"WECOM_SALES_CALLBACK_AES_KEY": "销售账户AESKey"
}
}
}
企业微信需要能够访问你的回调 URL。推荐使用 Cloudflare Tunnel:
# 安装 cloudflared
brew install cloudflared # macOS
# 或 apt install cloudflared # Linux
# 创建隧道
cloudflared tunnel create openclaw
# 配置隧道路由
cloudflared tunnel route dns openclaw 你的域名
# 启动隧道(将流量转发到本地 Gateway 端口)
cloudflared tunnel --url http://localhost:18789 run openclaw
其他方案:SSH 隧道、Tailscale、Nginx 反向代理 + 端口转发等。
企业微信要求调用 API(发送消息、获取 token 等)的服务器 IP 在白名单中。
curl -s https://ifconfig.me
⚠️ 注意:这里需要的是你服务器发出请求时的 IP(出口 IP),不是 Cloudflare Tunnel 的 IP。Cloudflare Tunnel 只处理入站流量,服务器调用企业微信 API 时仍然走自己的公网出口。
登录 企业微信管理后台
进入 应用管理 → 选择你创建的自建应用
滚动到页面底部,找到 企业可信 IP,点击 配置:

添加上一步查到的 IP 地址
⚠️ IP 白名单是按应用隔离的:每个自建应用(AgentId)有独立的「企业可信 IP」列表。为应用 A 添加的 IP 不会自动对应用 B 生效。创建新应用后,必须单独为该应用添加可信 IP,否则会报
60020错误。💡 如果调用 API 报错
60020(not allow to access from your ip),检查日志中提示的 IP 并添加到当前应用的白名单即可。
动态 IP 场景(家用宽带 / 无固定公网 IP 的服务器):
如果你的服务器没有固定公网 IP,推荐通过一台有固定 IP 的 VPS 做正向代理:
sudo apt-get install -y tinyproxy
/etc/tinyproxy/tinyproxy.conf,设置监听地址和访问控制(建议只允许内网访问)WECOM_PROXY 环境变量指向代理:// ~/.openclaw/openclaw.json
{
"env": {
"vars": {
"WECOM_PROXY": "http://你的VPS内网IP:8888"
}
}
}
插件内置了
wecomFetch()函数,会自动通过WECOM_PROXY代理所有发往qyapi.weixin.qq.com的请求。如果使用 ZeroTier / Tailscale 等虚拟内网连接 VPS,代理地址填内网 IP 即可。
openclaw gateway restart
openclaw plugin list
curl https://你的域名/wecom/callback
# 应返回 "wecom webhook ok"
这一步非常关键,尤其是你创建过多个自建应用时。
必须逐项一致:
AgentIdWECOM_AGENT_ID / channels.wecom.agentIdSecretTokenEncodingAESKey推荐这样核对:
openclaw config get channels.wecom
curl https://你的域名/wecom/callback
如果你遇到下面这种情况,优先怀疑绑错了应用:
wecom inbound一个真实案例是:本机误绑到 agentId=1000002,而企业微信后台实际配置的是 agentId=1000003。切回正确应用后,入站和回复立即恢复。
如果希望个人微信也能直接与 AI 对话,需在企业微信管理后台开启微信插件:
在企业微信管理后台「我的企业 → 微信插件」中,用个人微信扫码即可关联
stt.py 支持两种语音识别模式,自动选择最优方案:
| 模式 | 模型 | 运行位置 | 配置 |
|---|---|---|---|
| 🌐 远程 ASR(推荐) | Qwen3-ASR-0.6B | GPU 服务器 | 设置 WECOM_STT_URL |
| 💻 本地 ASR(降级) | FunASR SenseVoice-Small | 本地 CPU/MPS/CUDA | 设置 WECOM_STT_PYTHON |
优先级: 企业微信自带识别 → 远程 Qwen3-ASR → 本地 FunASR
工作流程:
stt.py:优先 POST 到远程 ASR 服务,失败时降级到本地 FunASR方式一:远程 ASR(推荐)
在 openclaw.json 中配置远程 ASR 服务地址:
"env": {
"vars": {
"WECOM_STT_URL": "http://your-gpu-server:8990/transcribe"
}
}
远程 ASR 服务部署详情参见 asr_api_README.md。快速搭建:
# GPU 服务器上
python3 -m venv ~/qwen-asr-env && source ~/qwen-asr-env/bin/activate
pip install qwen-asr fastapi uvicorn python-multipart
# 下载模型(首次需联网)
python3 -c "from modelscope import snapshot_download; snapshot_download('Qwen/Qwen3-ASR-0.6B')"
# 启动服务
TRANSFORMERS_OFFLINE=1 python3 asr_server.py
# 监听 0.0.0.0:8990,POST /transcribe 接收音频,GET /health 健康检查
生产部署建议使用 systemd 服务(Restart=always),详见 asr_api_README.md。
性能参考(RTX 4090D): 模型加载 ~3.7s,显存占用 ~3.7GB,短语音 ~2-4s 推理,支持 52 种语言 + 22 种中国方言。
方式二:本地 FunASR(无 GPU 服务器时)
# FFmpeg(音频格式转换)
brew install ffmpeg # macOS
# 或 apt install ffmpeg # Linux
# Python 依赖
pip install funasr modelscope torch torchaudio torchcodec
🍎 Apple Silicon (M1/M2/M3/M4) 支持:
stt.py会自动检测并使用 MPS (Metal Performance Shaders) 加速推理。首次运行时模型会从 ModelScope 自动下载(约 1GB)。⚠️ macOS launchd 部署注意: 如果 OpenClaw 以 launchd 服务运行,默认
python3可能找不到 ML 依赖。需在 plist 中设置环境变量WECOM_STT_PYTHON指向正确的 Python 路径(如 conda 环境的 python3)。
独立使用:
# 远程模式
WECOM_STT_URL=http://gpu-server:8990/transcribe python3 stt.py /path/to/audio.wav
# 本地模式
python3 stt.py /path/to/audio.wav
💡 如果企业微信已开启语音识别(Recognition 字段),会优先使用企业微信的结果;仅在无 Recognition 字段时才会调用本地 STT。
🤖 AI Agent 自动部署: 详细的多环境(CUDA / MPS / CPU)安装部署指南见
docs/stt-deploy-guide.md,可供 Claude Code 等 AI 编程助手直接参照执行自动化安装。
配置完成后,在企业微信或个人微信中找到你的应用,直接发送消息即可:
个人微信接入: 在企业微信管理后台「我的企业 → 微信插件」中,用个人微信扫码关联即可。
| 命令 | 说明 |
|---|---|
/help |
📋 显示帮助信息 |
/status |
📊 查看系统状态(含账户信息) |
/clear |
🗑️ 清除会话历史,开始新对话 |
| 变量名 | 必填 | 默认值 | 说明 |
|---|---|---|---|
WECOM_CORP_ID |
✅ | — | 企业微信企业 ID |
WECOM_CORP_SECRET |
✅ | — | 自建应用的 Secret |
WECOM_AGENT_ID |
✅ | — | 自建应用的 AgentId |
WECOM_CALLBACK_TOKEN |
✅ | — | 回调配置的 Token |
WECOM_CALLBACK_AES_KEY |
✅ | — | 回调配置的 EncodingAESKey(43 字符 Base64) |
WECOM_WEBHOOK_PATH |
❌ | /wecom/callback |
Webhook 路径 |
WECOM_PROXY |
❌ | — | 出站 WeCom API 的 HTTP 代理地址(如 http://10.x.x.x:8888) |
curl https://你的域名/wecom/callback
# 应返回 "wecom webhook ok"
检查环境变量是否正确配置(Token 和 AESKey 必须与企业微信后台一致)
查看 OpenClaw 日志:
openclaw logs -f | grep wecom
wecom inbound 记录agents.defaults.model)如果完全没有 wecom inbound 记录,再重点排查这 4 项是否来自同一个自建应用:
AgentIdSecretTokenEncodingAESKey很多“能发不能收”不是模型问题,而是本机绑定到了错误的企业微信应用。
/wecom/callback 返回 Control UI 页面这是新版 Gateway 兼容问题的典型症状。请确认:
0.3.7openclaw channels status --probe 中 WeCom 账户状态为 runningcurl https://你的域名/wecom/callback 返回 wecom webhook okhealth-monitor: restarting (reason: stopped)如果第 3 项返回的是 HTML 页面,通常说明 webhook 路由没有正确命中插件处理器。
WECOM_CORP_ID 和 WECOM_CORP_SECRET 正确qyapi.weixin.qq.com(如有代理需设置 WECOM_PROXY)60020 (not allow to access from your ip)企业微信 API 拒绝了你服务器的出口 IP。解决方法:
OpenClaw 要求插件同时提供 sendText 和 sendMedia 两个出站方法。如果缺少任一方法,createPluginHandler() 会返回 null,导致此错误。确认插件版本包含完整的出站配置。
ffmpeg -versionWECOM_STT_URL 是否可达(curl $WECOM_STT_URL),检查 GPU 服务器上 qwen3-asr.service 是否运行python3 -c "from funasr import AutoModel"stt.py 会自动检测设备:CUDA GPU → Apple MPS → CPU(按优先级依次降级)RawBody 为空字符串 "" 时会短路 ?? 运算符的回退链,导致 AI 收到空消息。确认插件版本中 RawBody 设置为 content || messageText || ""(而非 content || "")。
macOS 通过 launchd 启动 OpenClaw 时,PATH 不包含 conda 环境。解决方法:
openclaw.json 的 env.vars 中设置 WECOM_STT_PYTHON 指向 conda 环境中的 Python:{
"env": {
"vars": {
"WECOM_STT_PYTHON": "/path/to/anaconda3/envs/sci/bin/python3"
}
}
}
PYTORCH_ENABLE_MPS_FALLBACK=1torchcodec:pip install torchcodec图片会保存到本地磁盘并通过工具指令告知 AI 读取,而非以 base64 多模态方式传入。AI 需要主动调用 Read 工具才能看到图片内容,这取决于模型是否正确使用了工具。
OpenClaw 核心层通过 mediaLocalRoots 限制可发送的本地文件路径,仅允许以下目录:
tmpdir(系统临时目录)~/.openclaw/media~/.openclaw/agents~/.openclaw/workspace~/.openclaw/sandboxes目录外的文件会被 assertLocalMediaAllowed() 静默拦截。解决方法:先将文件复制到 ~/.openclaw/workspace/ 再发送。
fetch() 不走代理Node.js 原生 fetch() 不支持 HTTPS_PROXY 环境变量。插件使用 undici.ProxyAgent 配合 dispatcher 参数实现代理,仅需设置 WECOM_PROXY 环境变量即可,无需额外配置系统代理。
┌──────────────┐ ┌──────────────────┐ ┌───────────────┐
│ 企业微信 │ ──XML──▶│ OpenClaw Gateway │ ──────▶ │ AI Agent │
│ / 个人微信 │ │ (port 18789) │ │ (LLM) │
│ │ ◀──API──│ │ ◀────── │ │
└──────────────┘ └──────┬───────────┘ └───────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────────┐ ┌────────┐ ┌──────────┐
│ 消息加解密 │ │ STT │ │ Chat UI │
│ AES-256 │ │ FunASR │ │ Broadcast│
└──────────┘ └────────┘ └──────────┘
消息流程:
openclaw-wechat/
├── index.js # 入口文件(重导出)
├── src/
│ └── index.js # 插件主逻辑(1400+ 行)
├── stt.py # 🎙️ 语音识别(远程 Qwen3-ASR + 本地 FunASR 降级)
├── asr_server.py # 🖥️ 远程 ASR 服务(FastAPI + Qwen3-ASR,部署到 GPU 服务器)
├── openclaw.plugin.json # OpenClaw 插件描述文件(新格式)
├── clawdbot.plugin.json # ClawdBot 插件描述文件(兼容旧版)
├── package.json # npm 包配置 (v0.3.7)
├── .env.example # 环境变量示例
├── skills/
│ └── wecom-notify/ # 📨 Claude Code WeCom 通知技能
│ ├── SKILL.md
│ └── scripts/
│ └── send_wecom.py
├── docs/
│ └── channels/
│ └── wecom.md # 渠道文档
├── CHANGELOG.md # 版本变更日志
└── LICENSE # MIT 许可证
本仓库还包含一个独立的 Claude Code 技能(wecom-notify),可以在 Claude Code 中直接发送企业微信消息。这是一个独立工具,不依赖 OpenClaw 插件,直接调用企业微信 API。
将 skills/wecom-notify/ 目录复制到 ~/.claude/skills/ 即可:
cp -r skills/wecom-notify ~/.claude/skills/
在 Claude Code 中可以直接使用 /wecom-notify 命令,或让 AI 自动调用:
# 发送文本消息
python3 skills/wecom-notify/scripts/send_wecom.py "你好,这是一条测试消息"
# 指定接收人
python3 skills/wecom-notify/scripts/send_wecom.py "消息内容" --to UserName
# 发送图片
python3 skills/wecom-notify/scripts/send_wecom.py --image /path/to/photo.png
# 发送文件
python3 skills/wecom-notify/scripts/send_wecom.py --file /path/to/report.pdf
urllib.request、json),无需 pip install~/.openclaw/openclaw.json 读取 WeCom 配置(复用 OpenClaw 的环境变量)WECOM_PROXY 代理查看 CHANGELOG.md 了解完整版本历史。
欢迎提交 Issue 和 Pull Request!