🎯 学习目标:学会配置定时任务、事件触发和条件判断
⏱️ 阅读时间:约 12 分钟
💡 前置要求:无
⏰ 定时任务
⚠️ 重要:OpenClaw 本身不直接支持 Cron 表达式,但可以通过以下方式实现定时任务:
方式 1:系统 Cron + OpenClaw CLI(推荐)
# 在系统 crontab 中添加(Linux/Mac)crontab -e# 每天早上 9 点发送日报0 9 * * * openclaw ask "发送每日早报" >> /var/log/openclaw-daily.log# 每周五下午 5 点生成周报0 17 * * 5 openclaw ask "生成周报" >> /var/log/openclaw-weekly.log# 每 30 分钟检查一次*/30 * * * * openclaw ask "检查新邮件" >> /var/log/openclaw-check.log方式 2:Node.js 定时任务(在技能中实现)
// skills/scheduler/index.jsconst cron = require('node-cron');module.exports = {name: 'scheduler',asyncinit() {// 每天早上 9 点 cron.schedule('0 9 * * *', async () => {awaitsessions_send({sessionKey: 'main',message: '发送每日早报' }); });// 每周五下午 5 点 cron.schedule('0 17 * * 5', async () => {awaitsessions_send({sessionKey: 'main',message: '生成周报' }); });return'✅ 定时任务已设置'; }};方式 3:外部调度服务
GitHub Actions:适合定时触发 GitHub 相关任务 阿里云函数计算:适合云端定时任务 AWS Lambda:适合 AWS 生态定时任务
🔔 事件触发
💡 说明:OpenClaw 通过消息通道自动接收事件,无需手动订阅。当用户发送消息时,Agent 自动响应。
消息自动处理
OpenClaw 收到消息后自动触发 Agent 响应:
// 当用户发送消息时,Agent 自动响应// 在技能的 execute 函数中处理消息module.exports = {name: 'message-handler',asyncexecute({ message }) {const text = message.content?.text?.toLowerCase() || '';// 关键词回复if (text.includes('你好') || text.includes('hello')) {return'你好!有什么可以帮你的吗?😊'; }if (text.includes('谢谢')) {return'不客气!有其他问题随时问我~'; }// 其他消息交给 AI 处理returnawaithandleWithAI(message); }};飞书事件订阅配置
如果需要在飞书开放平台配置事件订阅:
订阅事件: im.message.receive_v1(接收消息)请求地址: https://your-domain.com/feishu/event在 OpenClaw 配置中设置:
{ "channels": { "feishu": { "verification_token": "your_verification_token" } }}🔀 条件判断
根据消息内容判断
module.exports = {name: 'smart-router',asyncexecute({ message }) {const text = message.content?.text || '';const sender = message.sender_id;// 紧急消息 → 立即通知管理员if (text.includes('紧急') || text.includes('urgent')) {awaitnotifyAdmin(message);return'⚠️ 已通知管理员处理'; }// 技术问题 → 转给技术专家 Agentif (text.includes('bug') || text.includes('错误') || text.includes('error')) {returnawaithandleByTechExpert(message); }// 产品咨询 → 转给产品专家 Agentif (text.includes('功能') || text.includes('需求')) {returnawaithandleByProductExpert(message); }// 默认处理returnawaithandleDefault(message); }};根据发送者判断
module.exports = {name: 'priority-handler',asyncexecute({ message }) {const sender = message.sender_id;// 获取发送者信息const userInfo = awaitfeishu_get_user({ user_id: sender });// 管理层消息 → 优先处理if (userInfo.department.includes('管理层')) {returnawaithandleWithHighPriority(message); }// 普通消息 → 正常处理returnawaithandleNormal(message); }};根据时间判断
module.exports = {name: 'time-based-handler',asyncexecute({ message }) {const hour = newDate().getHours();// 工作时间(9-18 点)if (hour >= 9 && hour < 18) {returnawaithandleDuringWorkHours(message); }// 非工作时间 → 记录并明天提醒if (hour < 9 || hour >= 18) {awaitscheduleReminder(message, 'tomorrow 9:00');return'📝 已记录,明天工作时间处理'; } }};📧 邮件事件
新邮件提醒
module.exports = {name: 'email-notify',asyncinit() {try {// 每 5 分钟检查新邮件awaitcreateCronJob({cron: '*/5 * * * *',task: async () => {const emails = awaitcheckNewEmails();if (emails.length > 0) {const summary = emails.map(email =>`📧 ${email.subject}\n发件人:${email.from}\n时间:${email.date}` ).join('\n\n');awaitsendToFeishu({chatId: getEmailChannelId(),content: `新邮件提醒(${emails.length}封)\n\n${summary}` }); } } });return'✅ 邮件提醒已启用'; } catch (error) {console.error('邮件提醒初始化失败:', error);throw error; } }};📱 跨平台通知
钉钉/企业微信集成
module.exports = {name: 'cross-platform-notify',asyncexecute({ platform, message }) {if (platform === 'dingtalk') {returnawaitsendToDingtalk({webhook: process.env.DINGTALK_WEBHOOK,content: message }); }if (platform === 'wecom') {returnawaitsendToWeCom({webhook: process.env.WECOM_WEBHOOK,content: message }); }thrownewError(`不支持的平台:${platform}`); }};🛠️ 实战案例
案例 1:每日早报自动发送
module.exports = {name: 'daily-briefing',asyncinit() {try {// 每天早上 9 点awaitcreateCronJob({cron: '0 9 * * *',task: async () => {// 获取天气const weather = awaitgetWeather('北京');// 获取新闻const news = awaitgetTopNews(5);// 获取日程const schedule = awaitgetTodaySchedule();// 生成早报const briefing = `📰 **每日早报** ${formatDate(newDate())}🌤️ **天气**${weather}📋 **今日日程**${schedule.map(item => `- ${item.time}${item.title}`).join('\n')}📰 **热点新闻**${news.map((n, i) => `${i+1}. ${n.title}`).join('\n')}祝大家工作顺利!☀️ `.trim();// 发送到飞书群awaitsendToFeishu({chatId: getTeamChatId(),content: briefing }); } });return'✅ 每日早报已启用'; } catch (error) {console.error('早报初始化失败:', error);throw error; } }};案例 2:周报自动生成
module.exports = {name: 'weekly-report',asyncinit() {try {// 每周五下午 5 点awaitcreateCronJob({cron: '0 17 * * 5',task: async () => {// 收集本周工作const tasks = awaitgetCompletedTasksThisWeek();const commits = awaitgetGitCommitsThisWeek();const meetings = awaitgetMeetingsThisWeek();// 生成周报const report = `📊 **周报** ${formatWeekRange(newDate())}✅ **完成任务**${tasks.map(t => `- ${t.title}`).join('\n')}💻 **代码提交**${commits.length} 次提交📅 **会议**${meetings.length} 场会议祝大家周末愉快!🎉 `.trim();// 创建文档const doc = awaitfeishu_create_doc({title: `周报 ${formatWeekRange(newDate())}`,markdown: report });// 发送给团队awaitsendToFeishu({chatId: getTeamChatId(),content: `本周周报已生成:${doc.url}` }); } });return'✅ 周报已启用'; } catch (error) {console.error('周报初始化失败:', error);throw error; } }};案例 3:紧急消息提醒
module.exports = {name: 'urgent-alert',asyncexecute({ message }) {const text = message.content?.text || '';// 检测紧急关键词const urgentKeywords = ['紧急', 'urgent', 'critical', '生产事故', 'down'];const isUrgent = urgentKeywords.some(keyword => text.toLowerCase().includes(keyword) );if (isUrgent) {// 立即通知管理员awaitnotifyAdmin({title: '⚠️ 紧急消息',content: text,sender: message.sender_id,time: newDate().toLocaleString() });// 发送短信/电话(可选)if (text.includes('生产事故') || text.includes('down')) {awaitsendSMS({to: getAdminPhone(),message: '⚠️ 生产事故,请立即处理!' }); }return'⚠️ 已通知管理员,请尽快处理'; }// 非紧急消息,正常处理returnawaithandleNormal(message); }};✅ 学完这篇你能做什么
学完 Day 17,你将能够:
✅ 配置定时任务(系统 Cron、node-cron、外部服务) ✅ 处理消息事件和条件判断 ✅ 实现跨平台通知(钉钉、企业微信) ✅ 创建实用的自动化工作流 ✅ 处理工作流相关错误
🔜 下篇预告
Day 18:团队协作配置:群聊管理、权限控制、消息路由
在下一篇中,我们将学习:
💬 群聊管理:添加/移除成员、权限配置 🔐 权限控制:基于角色的访问控制 📨 消息路由:智能分发到不同 Agent 🎯 团队协作:多 Agent 协作配置
敬请期待!🚀
💬 互动环节
本周收获
留言分享你最大的收获!
遇到问题
遇到什么技术难题?大家一起解决!
实战经验
你在工作流自动化中实现过什么有趣的场景?
建议反馈
内容难度如何?需要调整什么?
公众号:OpenClaw 研习社系列:OpenClaw 30 天入门到精通作者:OpenClaw 研习社
夜雨聆风