OpenClaw 消息发送完全指南
消息发送是 AI 助理与用户交互的核心能力。OpenClaw 支持多个平台的消息发送,包括飞书、微信、钉钉、Telegram 等。本文详细介绍如何使用 message 工具实现各种消息场景。
一、消息工具概述
支持的平台
- 飞书(Feishu):企业协作、群聊、机器人
- 微信(WeChat):个人消息、公众号
- 钉钉(DingTalk):企业通知、工作流
- Telegram:群组、频道、机器人
- Discord:社区、服务器
- Slack:团队协作
基本用法
javascript
// 发送文本消息
message(
action="send",
target="user:ou_xxx", // 或省略,默认当前会话
message="你好,这是测试消息"
)
// 发送到指定频道
message(
action="send",
channel="telegram",
target="@channel_name",
message="频道通知"
)
// 发送文件
message(
action="send",
media="/path/to/file.pdf",
caption="这是文件说明"
)
// 发送图片
message(
action="send",
media="./screenshot.png",
caption="界面截图"
)二、实战案例 1:每日定时报告
场景说明
每天早晨 8 点自动发送包含天气、日程、新闻摘要的日报到飞书群。
完整实现
javascript
// 1. 获取天气信息
weather_result = exec(
command="curl wttr.in/驻马店?format=3",
capture_output=True
)
// 输出:驻马店:☀️ +15°C
// 2. 获取今日日程
calendar_result = message(
action="send",
channel="feishu",
target="calendar_bot",
message="查询今日日程"
)
// 等待回复...
// 3. 获取新闻摘要
news_summary = web_search(
query="2026-03-19 重要新闻",
count=5
)
// 4. 整合日报内容
daily_report = `
📅 每日早报 - 2026 年 3 月 19 日
🌤️ 天气:${weather_result}
建议:晴朗,适合户外活动
📋 今日日程:
- 10:00 项目评审会议
- 14:00 团队周会
- 16:30 客户演示
📰 新闻摘要:
1. 2026 年人工智能发展报告发布
2. 新能源汽车销量创新高
3. ...
💡 今日提醒:
- 明天是母亲生日,记得准备礼物
- 周五前提交季度报告
祝您今天工作顺利!🟢🐉
`
// 5. 发送到飞书群
message(
action="send",
channel="feishu",
target="chat_xxx123456", // 群聊 ID
message=daily_report
)定时任务配置
javascript
cron(
action="add",
job={
name: "每日早晨报告",
schedule: {
kind: "cron",
expr: "0 8 * * *",
tz: "Asia/Shanghai"
},
payload: {
kind: "agentTurn",
message: "执行每日报告发送流程(如上代码)",
timeoutSeconds: 300
},
sessionTarget: "isolated"
}
)效果展示
📅 每日早报 - 2026 年 3 月 19 日
🌤️ 天气:驻马店:☀️ +15°C
建议:晴朗,适合户外活动
📋 今日日程:
- 10:00 项目评审会议
- 14:00 团队周会
- 16:30 客户演示
📰 新闻摘要:
1. 2026 年人工智能发展报告发布
2. 新能源汽车销量创新高
3. 全国两会召开
💡 今日提醒:
- 明天是母亲生日,记得准备礼物
- 周五前提交季度报告
祝您今天工作顺利!🟢🐉三、实战案例 2:告警通知系统
场景说明
监控系统异常时,立即发送告警消息到相关负责人。
完整实现
javascript
// 告警函数
function send_alert(level, title, details) {
// 根据告警级别选择通知方式
if (level === "CRITICAL") {
// 严重告警:电话 + 短信 + 群消息
send_phone_call("138****1234")
send_sms("138****1234", `[紧急告警]${title}`)
}
// 构建告警消息
alert_message = `
🚨 系统告警 - ${level}
【标题】${title}
【时间】${new Date().toLocaleString('zh-CN')}
【详情】
${details}
【建议操作】
1. 立即检查相关服务
2. 查看日志定位问题
3. 执行应急预案
---
自动告警系统 | 确认请回复"收到"
`
// 发送到工作群
message(
action="send",
channel="feishu",
target="chat_ops_team",
message=alert_message
)
// 记录告警日志
write(
path="/var/log/alerts/alert-${Date.now()}.md",
content=`
# 告警记录
- 级别:${level}
- 标题:${title}
- 时间:${new Date().toISOString()}
- 详情:${details}
- 通知对象:运维团队
`
)
}
// 使用示例
send_alert(
"CRITICAL",
"数据库连接池耗尽",
`
服务:user-service
错误:Cannot get connection from pool
当前连接数:100/100
等待队列:52
影响:用户登录失败率 85%
`
)告警分级策略
| 级别 | 通知方式 | 响应时间 | 示例 |
|---|---|---|---|
| CRITICAL | 电话 + 短信 + 群消息 | 5 分钟 | 服务完全不可用 |
| HIGH | 短信 + 群消息 | 15 分钟 | 核心功能异常 |
| MEDIUM | 群消息 | 1 小时 | 性能下降 |
| LOW | 群消息(静默) | 24 小时 | 轻微异常 |
升级机制
javascript
// 告警升级函数
function escalate_alert(alert_id, timeout_minutes) {
// 设置超时检查
setTimeout(() => {
// 检查是否已确认
const confirmed = check_alert_confirmed(alert_id)
if (!confirmed) {
// 升级告警
send_alert(
"CRITICAL",
`告警升级:${alert_id}`,
"原始告警未在${timeout_minutes}分钟内确认,已升级处理"
)
// 通知上级主管
message(
action="send",
channel="feishu",
target="user:manager_ou_xxx",
message=`[告警升级] 请督促团队处理告警 ${alert_id}`
)
}
}, timeout_minutes * 60000)
}四、实战案例 3:交互式问答机器人
场景说明
在飞书群中部署机器人,回答常见问题、执行查询命令。
完整实现
javascript
// 机器人消息处理
async function handle_bot_message(event) {
const { user_id, content, chat_type } = event
// 忽略非 @ 消息
if (!content.includes("@机器人")) return
// 提取问题
const question = content.replace("@机器人", "").trim()
// 根据问题类型回复
if (question.startsWith("查询")) {
// 数据查询
const result = await query_database(question)
reply = `📊 查询结果:\n\n${result}`
}
else if (question.startsWith("帮助")) {
// 帮助信息
reply = `
🤖 机器人帮助
可用命令:
- 查询 [内容]:查询数据
- 统计 [指标]:数据统计
- 导出 [格式]:导出数据
- 帮助:显示此帮助
示例:
- 查询 今日销售额
- 统计 用户增长
- 导出 PDF
`
}
else if (question.startsWith("统计")) {
// 统计分析
const result = await analyze_data(question)
reply = `📈 统计分析:\n\n${result}`
}
else {
// 通用问答
const answer = await answer_question(question)
reply = `💡 ${answer}`
}
// 回复用户
message(
action="send",
channel="feishu",
target=event.user_id,
message=reply,
replyTo=event.message_id // 引用回复
)
}
// 注册消息监听
on_message("feishu", handle_bot_message)高级功能:投票
javascript
// 创建投票
message(
action="send",
channel="feishu",
target="chat_team",
message="本周团建地点投票",
pollQuestion="选择团建地点",
pollOption: ["海滩", "山区", "城市", "乡村"],
pollMulti: false, // 单选
pollDurationHours: 24
)
// 查看投票结果
vote_result = message(
action="send",
channel="feishu",
target="chat_team",
message="查看投票结果",
pollId="vote_xxx123"
)高级功能:卡片消息
javascript
// 发送交互式卡片(飞书)
message(
action="send",
channel="feishu",
target="user:ou_xxx",
message={
"type": "interactive",
"header": {
"title": {
"tag": "plain_text",
"content": "审批请求"
}
},
"elements": [
{
"tag": "div",
"text": {
"tag": "markdown",
"content": "**申请人**: 张三\n**类型**: 请假\n**时间**: 2026-03-20 至 2026-03-22"
}
},
{
"tag": "action",
"actions": [
{
"tag": "button",
"text": "✅ 批准",
"type": "primary"
},
{
"tag": "button",
"text": "❌ 拒绝",
"type": "danger"
}
]
}
]
}
)五、平台特定功能
飞书(Feishu)
javascript
// 发送富文本消息
message(
action="send",
channel="feishu",
target="chat_xxx",
content={
"type": "post",
"content": {
"zh_cn": {
"title": "项目更新通知",
"content": [
[
{
"tag": "text",
"text": "项目进度已更新:"
},
{
"tag": "a",
"text": "查看详情",
"href": "https://example.com"
}
]
]
}
}
}
)
// @提及用户
message(
action="send",
channel="feishu",
target="chat_xxx",
message="请 @ou_xxx123 审核此文档",
participant="ou_xxx123"
)Telegram
javascript
// 发送带按钮的消息
message(
action="send",
channel="telegram",
target="@channel",
message="选择操作",
// 内联键盘(需要配置)
reply_markup={
"inline_keyboard": [
[
{"text": "✅ 确认", "callback_data": "confirm"},
{"text": "❌ 取消", "callback_data": "cancel"}
]
]
}
)
// 发送语音消息
message(
action="send",
channel="telegram",
target="@user",
media="./voice_message.ogg",
asVoice=true
)Discord
javascript
// 发送到特定频道
message(
action="send",
channel="discord",
target="channel_id_xxx",
message="服务器维护通知",
// 嵌入消息
embed={
"title": "🔧 维护通知",
"description": "服务器将于今晚 23:00 进行维护",
"color": 0x2563eb,
"fields": [
{
"name": "预计时长",
"value": "2 小时",
"inline": true
},
{
"name": "影响范围",
"value": "全部服务",
"inline": true
}
],
"footer": {
"text": "运维团队"
}
}
)
// 添加表情反应
message(
action="send",
channel="discord",
messageId="msg_xxx",
emoji="👍"
)六、最佳实践
1. 消息格式规范
javascript
// ✅ 好的格式
message(
action="send",
message=`
【重要通知】项目评审会议
时间:今天下午 14:00
地点:3 号会议室
参会:全体项目成员
议程:
1. 项目进度汇报
2. 问题讨论
3. 下一步计划
请准时参加。
`
)
// ❌ 差的格式
message(
action="send",
message="下午开会,都来"
)2. 发送频率控制
javascript
// 避免消息轰炸
const last_sent = {}
function send_with_rate_limit(target, message, min_interval=60000) {
const now = Date.now()
const last = last_sent[target] || 0
if (now - last < min_interval) {
// 等待间隔过去
setTimeout(() => send_message(target, message), min_interval - (now - last))
return
}
send_message(target, message)
last_sent[target] = now
}3. 错误处理
javascript
try {
message(action="send", target="user:ou_xxx", message="测试")
} catch (e) {
// 记录失败
write(
path="./logs/message-failures.log",
content=`${new Date().toISOString()} 发送失败:${e.message}\n`
)
// 重试机制
if (retry_count < 3) {
setTimeout(() => send_retry(), 5000)
} else {
// 通知管理员
message(
action="send",
target="admin",
message=`消息发送失败,已重试 3 次:${e.message}`
)
}
}4. 隐私保护
javascript
// 敏感信息脱敏
function sanitize_message(content) {
return content
.replace(/1[3-9]\d{9}/g, "1** **** ***") // 手机号
.replace(/\d{4}-?\d{4}-?\d{4}-?\d{4}/g, "**** **** **** ****") // 卡号
.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, "***@***.***") // 邮箱
}
message(
action="send",
message=sanitize_message(raw_content)
)七、常见问题
Q: 如何获取频道/用户 ID?
A:
- 飞书:从消息事件或管理后台获取
- Telegram:使用 @userinfobot 查询
- Discord:开启开发者模式后右键复制
Q: 消息发送失败怎么办?
A:
- 检查网络连接
- 验证凭证是否有效
- 查看错误日志
- 检查目标用户/频道是否存在
Q: 如何发送长消息?
A:
- 飞书:支持长文本,自动分段
- 微信:限制 2000 字,超过需分段
- Telegram:限制 4096 字
Q: 可以群发消息吗?
A: 可以,但要注意:
- 添加发送间隔,避免被判定为垃圾消息
- 提供退订选项
- 遵守平台规定
八、总结
消息发送是 AI 助理的基础能力,掌握这些技巧可以:
| 场景 | 实现方式 |
|---|---|
| 定时报告 | cron + message |
| 告警通知 | 分级策略 + 升级机制 |
| 交互机器人 | 消息监听 + 智能回复 |
| 文件分享 | media 参数 |
| 投票调查 | poll 相关参数 |
记住:好的消息 = 清晰的内容 + 合适的时机 + 正确的渠道
相关资源: