用 Cloudbase 云函数推送企业微信群机器人
一句话定义:用 Cloudbase 云函数通过企业微信群机器人的 Webhook 接口推送消息,支持文本、Markdown、图片等格式,可选配定时触发器做监控告警或数据日报。
预计耗时:15 分钟 | 难度:入门
适用场景
- 适用:从 Cloudbase 后端向企业微信群推送消息——监控告警、部署通知、数据日报、业务事件提醒
- 适用:已有企业微信(WeCom)使用权限,能创建群和群机器人
- 不适用:推送到个人微信(微信没有开放个人消息推送接口)
- 不适用:需要接收用户回复的双向交互(Webhook 只能发,不能收)
环境要求
| 依赖 | 版本 |
|---|---|
@cloudbase/node-sdk | 3.18.1 |
@cloudbase/cli | 3.0.4 |
| Node.js | ≥ 16.13 |
前置条件:Cloudbase 云函数默认具有公网访问能力(未配置 VPC 时)。如果你的云函数配置了 VPC 且未设置 NAT 网关,需要先在控制台开启公网访问,否则无法调用企业微信的 Webhook 接口。
第一步:创建企业微信群机器人
- 在企业微信里创建一个群(或用已有的群)
- 点击群名称 → 群机器人 → 添加群机器人
- 给机器人起个名字(比如"Cloudbase 告警")
- 创建成功后复制 Webhook 地址,形如:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
把 key= 后面的 UUID 记下来。
第二步:写推送云函数
mkdir -p cloudfunctions/wecomNotify
cd cloudfunctions/wecomNotify
npm init -y
npm install --save @cloudbase/node-sdk@3.18.1
cloudfunctions/wecomNotify/index.js:
const https = require('https');
const WECOM_KEY = process.env.WECOM_WEBHOOK_KEY;
exports.main = async (event, context) => {
const { msgtype, content } = event;
if (!content) {
return { error: 'MISSING_CONTENT', message: 'event.content is required' };
}
let body;
if (msgtype === 'markdown') {
body = {
msgtype: 'markdown',
markdown: { content },
};
} else {
// 默认纯文本
body = {
msgtype: 'text',
text: {
content,
mentioned_list: event.mentioned_list || [],
},
};
}
const result = await postWebhook(body);
return result;
};
function postWebhook(body) {
return new Promise((resolve, reject) => {
const url = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WECOM_KEY}`;
const data = JSON.stringify(body);
const req = https.request(
url,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data),
},
},
(res) => {
let raw = '';
res.on('data', (chunk) => (raw += chunk));
res.on('end', () => {
try {
resolve(JSON.parse(raw));
} catch (err) {
resolve({ raw });
}
});
},
);
req.on('error', reject);
req.write(data);
req.end();
});
}
这里用 Node.js 内置的 https 模块,不需要装额外依赖。对于云函数场景,减少 node_modules 体积有助于降低冷启动延迟(参见 优化冷启动 的"裁依赖"小节)。
第三步:部署并发送测试消息
tcb fn deploy wecomNotify --dir ./cloudfunctions/wecomNotify -e your-env-id
控制台 → 云函数 → wecomNotify → 环境变量,添加:
WECOM_WEBHOOK_KEY= 第一步复制的 UUID
发送测试消息:
# 纯文本
tcb fn invoke wecomNotify \
--data '{"content":"Cloudbase 云函数推送测试,看到这条消息说明对接成功。"}' \
-e your-env-id
# Markdown 格式
tcb fn invoke wecomNotify \
--data '{"msgtype":"markdown","content":"## 部署通知\n\n**getLoginTicket** 函数已更新\n\n> 版本: v1.2.3"}' \
-e your-env-id
去企业微信群里应该能看到机器人发出的消息。
第四步(可选):配定时触发器
如果要做每天早上 9 点的数据日报,在控制 台 → 云函数 → wecomNotify → 触发方式 → 定时触发,配置 Cron 表达式。
Cloudbase 的 Cron 表达式为 7 位格式:秒 分 时 日 月 星期 年。常用示例:
| 需求 | Cron 表达式 |
|---|---|
| 每天 09:00 | 0 0 9 * * * * |
| 每小时整点 | 0 0 * * * * * |
| 工作日 09:00 | 0 0 9 * * MON-FRI * |
定时触发时 event 里没有 content 字段,需要在函数里判断——如果没传 content,自动生成日报内容:
exports.main = async (event, context) => {
let content = event.content;
if (!content) {
// 定时触发:自动生成日报
content = await generateDailyReport();
}
// ... 后续推送逻辑不变
};
async function generateDailyReport() {
const cloudbase = require('@cloudbase/node-sdk');
const app = cloudbase.init({ env: process.env.TCB_ENV });
const db = app.database();
const yesterday = Date.now() - 24 * 60 * 60 * 1000;
const count = await db
.collection('orders')
.where({ createdAt: db.command.gte(yesterday) })
.count();
return `## 数据日报\n\n昨日新增订单:**${count.total}** 笔`;
}
运行验证
tcb fn invoke发送文本消息 → 群里看到tcb fn invoke发送 Markdown 消息 → 群里看到,格式正确- 接口返回
{ "errcode": 0, "errmsg": "ok" }表示成功 - 如果配了定时触发,等一次触发后检查群里是否收到日报
企业微信 Webhook 支持的消息格式
完整列表(来源:企业微信官方文档):
msgtype 值 | 说明 |
|---|---|
text | 纯文本,支持 @某人(传 mentioned_list) |
markdown | Markdown,支持标题、加粗、链接、引用、代码块 |
markdown_v2 | 增强版 Markdown,额外支持表格等 |
image | 图片,传 base64 编码 |
news | 图文卡片,标题 + 描述 + 链接 + 封面图 |
file | 文件消息 |
voice | 语音消息 |
template_card | 模板卡片,支持 text_notice 和 news_notice 两种子类型 |
本 recipe 的示例代码覆盖了 text 和 markdown 两种最常用的格式。其他格式的参数结构见官方文档。
常见错误
| 现象 | 原因 | 修复 |
|---|---|---|
errcode: 93000 | Webhook URL 不合法,或机器人已被移除出群 | 去企业微信群里检查机器人是否还在;如果被踢了重新添加,拿新 Key |
errcode: 45009 | 接口调用超频(每个机器人每分钟最多 20 条消息) | 合并消息或降低推送频率 |
| 函数执行成功但群里没消息 | 云函数没有公网访问权限 | 控制台 → 云函数 → 基础配置 → 确认「公网访问」已开启;如果配了 VPC,需要加 NAT 网关 |
| Markdown 格式没生效 | msgtype 传了 "text" 而不是 "markdown" | 检查 invoke 时 event.msgtype 是否正确 |
| 定时触发没执行 | Cron 表达式格式错误 | Cloudbase 用 7 位 Cron(含秒和年),确认格式正确 |
相关文档
- 企业微信群机器人开发文档 — Webhook 接口规范、完整 msgtype 列表
- Cloudbase 云函数定时触发 — Cron 表达式配置
- Cloudbase 云函数基础配置 — 公网访问、内存、超时等
下一步
- 云函数冷启动优化:
optimize-cloud-function-wechat-miniprogram - 认证接入:
add-auth-wechat-miniprogram