跳到主要内容

用 Cloudbase 云函数推送企业微信群机器人

一句话定义:用 Cloudbase 云函数通过企业微信群机器人的 Webhook 接口推送消息,支持文本、Markdown、图片等格式,可选配定时触发器做监控告警或数据日报。

预计耗时:15 分钟 | 难度:入门

适用场景

  • 适用:从 Cloudbase 后端向企业微信群推送消息——监控告警、部署通知、数据日报、业务事件提醒
  • 适用:已有企业微信(WeCom)使用权限,能创建群和群机器人
  • 不适用:推送到个人微信(微信没有开放个人消息推送接口)
  • 不适用:需要接收用户回复的双向交互(Webhook 只能发,不能收)

环境要求

依赖版本
@cloudbase/node-sdk3.18.1
@cloudbase/cli3.0.4
Node.js≥ 16.13

前置条件:Cloudbase 云函数默认具有公网访问能力(未配置 VPC 时)。如果你的云函数配置了 VPC 且未设置 NAT 网关,需要先在控制台开启公网访问,否则无法调用企业微信的 Webhook 接口。

第一步:创建企业微信群机器人

  1. 在企业微信里创建一个群(或用已有的群)
  2. 点击群名称 → 群机器人 → 添加群机器人
  3. 给机器人起个名字(比如"Cloudbase 告警")
  4. 创建成功后复制 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:000 0 9 * * * *
每小时整点0 0 * * * * *
工作日 09:000 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}** 笔`;
}

运行验证

  1. tcb fn invoke 发送文本消息 → 群里看到
  2. tcb fn invoke 发送 Markdown 消息 → 群里看到,格式正确
  3. 接口返回 { "errcode": 0, "errmsg": "ok" } 表示成功
  4. 如果配了定时触发,等一次触发后检查群里是否收到日报

企业微信 Webhook 支持的消息格式

完整列表(来源:企业微信官方文档):

msgtype说明
text纯文本,支持 @某人(传 mentioned_list
markdownMarkdown,支持标题、加粗、链接、引用、代码块
markdown_v2增强版 Markdown,额外支持表格等
image图片,传 base64 编码
news图文卡片,标题 + 描述 + 链接 + 封面图
file文件消息
voice语音消息
template_card模板卡片,支持 text_noticenews_notice 两种子类型

本 recipe 的示例代码覆盖了 textmarkdown 两种最常用的格式。其他格式的参数结构见官方文档。

常见错误

现象原因修复
errcode: 93000Webhook URL 不合法,或机器人已被移除出群去企业微信群里检查机器人是否还在;如果被踢了重新添加,拿新 Key
errcode: 45009接口调用超频(每个机器人每分钟最多 20 条消息)合并消息或降低推送频率
函数执行成功但群里没消息云函数没有公网访问权限控制台 → 云函数 → 基础配置 → 确认「公网访问」已开启;如果配了 VPC,需要加 NAT 网关
Markdown 格式没生效msgtype 传了 "text" 而不是 "markdown"检查 invoke 时 event.msgtype 是否正确
定时触发没执行Cron 表达式格式错误Cloudbase 用 7 位 Cron(含秒和年),确认格式正确

相关文档

下一步

  • 云函数冷启动优化:optimize-cloud-function-wechat-miniprogram
  • 认证接入:add-auth-wechat-miniprogram