企业微信智能机器人(aibot) 主动发消息
把任意消息经企业微信「智能机器人」主动推送到会话。适用于:定时通知、天气播报、告警提醒、业务播报等"机器人主动发消息"的场景。
关键约束(务必先读)
企业微信「智能机器人」(aibot) 不是传统群机器人 webhook,它走 WebSocket 长连接 + bot_id/secret 鉴权:
- 主动推送必须指定目标会话 ID:群聊用
chatid,单聊用对方userid。无法凭空推送。 - 凭证(
bot_id/secret)只通过环境变量传入,绝不写进脚本或配置文件。 - 默认网关
wss://openws.work.weixin.qq.com,SDK 建连后自动aibot_subscribe鉴权,成功触发authenticated事件。
因此本 skill 提供两种模式:
| 模式 | 脚本 | 何时用 |
|---|---|---|
| 已知会话 ID 直接发 | scripts/send.js |
你已经知道 chatid 或 userid |
| 监听捕获会话 ID | scripts/capture.js |
不知道会话 ID,先在目标会话触发一次事件来捕获 |
环境变量
| 变量 | 必填 | 说明 |
|---|---|---|
WECOM_BOT_ID |
✅ | 智能机器人 Bot ID |
WECOM_BOT_SECRET |
✅ | 智能机器人 Secret |
WECOM_CHAT_ID |
仅 send.js | 目标会话:群聊填 chatid,单聊填对方 userid |
WECOM_MSG |
否 | 消息正文(markdown/text),与 WECOM_MSG_FILE、命令行参数三者取其一 |
WECOM_MSG_FILE |
否 | 消息正文文件路径(优先级高于 WECOM_MSG) |
WECOM_MSG_TYPE |
否 | markdown(默认)或 text |
WECOM_CAPTURE_TIMEOUT |
否 | 监听超时秒数(仅 capture.js,默认 60) |
WECOM_DISABLE_ECHO |
否 | 设为 1 关闭 capture.js 的「捕获后自动回推」,仅打印 chatid 不发送(默认会主动回推捕获结果以验证推送通道) |
WECOM_VERBOSE |
否 | 设为 1 显示 SDK 调试日志;默认隐藏 DEBUG 噪声,只保留关键状态与捕获结果 |
消息来源优先级:命令行参数 argv[2] > WECOM_MSG_FILE > WECOM_MSG。
运行方式
SDK 已随 skill 打包在 node_modules/,脚本通过相对路径加载,无需设置 NODE_PATH。用受管 Node 运行即可(注意替换为实际路径):
/Users/jiangli/.workbuddy/binaries/node/versions/22.22.2/bin/node \
<skill_dir>/scripts/send.js
变量通过命令前缀传入。例如(不要硬编码 secret,按用户当场给的值填):
模式一:已知会话 ID,直接推送
cd <skill_dir>
WECOM_BOT_ID="<用户给的BotID>" \
WECOM_BOT_SECRET="<用户给的Secret>" \
WECOM_CHAT_ID="<群chatid 或 单聊userid>" \
WECOM_MSG="你好,这是一条来自智能机器人的消息" \
/Users/jiangli/.workbuddy/binaries/node/versions/22.22.2/bin/node scripts/send.js
也可把长消息写入文件后用 WECOM_MSG_FILE=./msg.txt。
成功会打印 ✅ 消息已成功推送到会话 <chatid>。
模式二:不知道会话 ID —— 监听自动捕获
- 先启动监听(推荐后台运行,因为要等用户在群里触发):
cd <skill_dir>
WECOM_BOT_ID="<BotID>" \
WECOM_BOT_SECRET="<Secret>" \
WECOM_MSG="捕获到会话后自动发的消息(可选)" \
/Users/jiangli/.workbuddy/binaries/node/versions/22.22.2/bin/node scripts/capture.js
-
在目标会话里做任意一件触发事件:
- 群聊:发一条消息并@一下机器人(或直接发消息给机器人)
- 单聊:进入与该机器人的会话并发一条消息 -
脚本捕获到
chatid/userid后,实时返回、不落盘(无论前台还是后台运行,结果都只打印到控制台,绝不写入任何本地文件或记忆):
- 打印一个清晰分块:🎯 已捕获目标会话(实时返回 · 不落盘),含会话类型、会话 ID、触发人 userid、触发消息;
- 同时打印机器可解析标记CAPTURED_CHAT_ID=<chatid>与WECOM_CHAT_ID=<chatid>,便于后台运行时从输出可靠读取并告知用户;
- (默认)捕获后会主动把「捕获到的会话信息」作为一条 markdown 消息回推到该会话,用来验证智能机器人主动推送通道是否正常——你若在微信里收到这条回推,即说明推送 OK;
- 若带了WECOM_MSG,则改为推送你指定的消息(不发送默认回推);
- 若设了WECOM_DISABLE_ECHO=1,则只打印会话 ID 后退出、不回推,记下这个值,之后用模式一直接发。 -
监听有 60 秒超时(可用
WECOM_CAPTURE_TIMEOUT调整),未触发会自动退出;重试只需重新运行。
> 💡 捕获到的会话信息属于运行期输出,不要把它写进文件、记忆或任何持久化存储——需要复用时由用户在当场对话中记录。
常见坑
errcode非 0 / 收不到消息:多半是WECOM_CHAT_ID填错类型(群聊应填群 chatid,不是群名;单聊填对方 userid,不是机器人自己)。先用 capture.js 拿到准确的 ID。- 鉴权失败:检查
WECOM_BOT_ID/WECOM_BOT_SECRET是否复制完整、有无多余空格。 authenticated一直没触发(超时):检查网络能否连通wss://openws.work.weixin.qq.com(需出网)。
安全须知
bot_id/secret属于敏感凭证,仅通过命令前缀的环境变量传入,不要写入任何文件、也不要回显到聊天里。- 脚本不会把凭证写盘;如本 skill 升级,凭证也不会被保存。
- 捕获到的会话信息(chatid / userid / 触发内容)只在运行时实时打印到控制台,永不写盘、不写记忆、不落日志文件。 这是本 skill 的硬约束:会话 ID 同样是敏感信息,复用交给用户当场记录。