Skip to content

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:

  1. 检查网络连接
  2. 验证凭证是否有效
  3. 查看错误日志
  4. 检查目标用户/频道是否存在

Q: 如何发送长消息?

A:

  • 飞书:支持长文本,自动分段
  • 微信:限制 2000 字,超过需分段
  • Telegram:限制 4096 字

Q: 可以群发消息吗?

A: 可以,但要注意:

  • 添加发送间隔,避免被判定为垃圾消息
  • 提供退订选项
  • 遵守平台规定

八、总结

消息发送是 AI 助理的基础能力,掌握这些技巧可以:

场景实现方式
定时报告cron + message
告警通知分级策略 + 升级机制
交互机器人消息监听 + 智能回复
文件分享media 参数
投票调查poll 相关参数

记住:好的消息 = 清晰的内容 + 合适的时机 + 正确的渠道


相关资源:

Released under the MIT License.