当前位置: 首页 > article >正文

《OpenClaw架构与源码解读》· 第 12 章 Cron、Webhooks 与事件驱动自动化

第 12 章 Cron、Webhooks 与事件驱动自动化前面第 8–10 章介绍的消息处理链路都是被动响应式的用户先说话OpenClaw 才行动。但 OpenClaw 更有价值的地方之一恰恰是它可以主动出击——在你没有发消息的时候悄悄把事情做了再来汇报。本章介绍三种让 OpenClaw「自己动起来」的机制Cron 定时任务、Webhooks 外部触发、以及类 Gmail Pub/Sub 的长链路事件源。12.1 Cron Jobs让 OpenClaw「记住」该做什么12.1.1 什么是 Cron JobsCron Jobs 就是定时任务在指定时间或时间间隔触发一段操作。在 OpenClaw 里你可以用 Cron Jobs 让它每天早上 8 点给你发今日简报天气、日历、收件箱摘要每 2 小时检查一次 CI/CD 状态有失败时主动告警每周一整理一次你的 GitHub Issue 积压或者每晚 11 点发一条「今天的未完成 Todo」。12.1.2 Cron 配置在~/.openclaw/openclaw.json中Cron Jobs 的配置格式大致如下// ~/.openclaw/openclaw.json宽松 JSON{cron:[{id:morning-briefing,name:早晨简报,schedule:0 8 * * *,// 每天 8:00message:给我一个今天的早晨简报天气、日历安排、未读邮件摘要。,enabled:true},{id:ci-check,name:CI 状态检查,schedule:0 */2 * * *,// 每 2 小时message:检查最近 2 小时的 CI/CD 状态有失败的通知我。,enabled:true}]}schedule字段使用标准的 cron 表达式分 时 日 月 星期表达式含义0 8 * * *每天 8:000 */2 * * *每 2 小时整点*/15 * * * *每 15 分钟0 9 * * 1每周一 9:0012.1.3 Cron 任务的触发流程// src/cron/cron-engine.ts伪代码classCronEngine{privatejobs:Mapstring,CronJobnewMap();asyncinit(configs:CronConfig[],agentPool:AgentPool){for(constconfigofconfigs){if(!config.enabled)continue;constjobschedule.createJob(config.schedule,async(){awaitthis.triggerJob(config,agentPool);});this.jobs.set(config.id,job);}}privateasynctriggerJob(config:CronConfig,agentPool:AgentPool){constsyntheticMsg:InboundMessage{id:cron:${config.id}:${Date.now()},channel:internal:cron,peerId:system,chatId:config.sessionId,text:config.message,timestamp:newDate(),raw:{triggerType:cron,jobId:config.id},};awaitgateway.dispatchInbound(syntheticMsg);}}关键设计点在于Cron 触发的「消息」走的是和用户消息完全一样的分发链路。这意味着 Cron 任务也会经过 Session 解析、Agent 路由、Agent Runtime、Skill 调用、回复生成最终把结果发回你的 Slack/iMessage。这种「统一入口」设计极大地简化了代码避免了 Cron 路径和用户消息路径之间的逻辑重复。12.1.4 管理 Cron Jobs# 列出所有 Cron Jobsopenclawcronlist# 启用/禁用某个 Jobopenclawcronenablemorning-briefing openclawcrondisable ci-check# 立刻手动触发一次不等到下次调度时间openclawcrontrigger morning-briefing# 新增一个 Cron Jobopenclawcronadd--idnightly-todo--schedule0 23 * * *\--message给我一个今天的未完成 Todo 总结--agentpersonal-assistant12.2 Webhooks让外部系统「推」给 OpenClaw12.2.1 Webhook 的使用场景Cron 是「定时触发」Webhook 是「事件触发」。GitHub 合并了一个 PR 可以触发 OpenClaw 发一条通知Sentry 检测到线上报错可以触发 OpenClaw 通知你并自动尝试诊断Stripe 收到一笔付款可以触发收款通知某个爬虫任务完成后可以触发 OpenClaw 处理数据并发送摘要。Webhook 的核心优势是近实时——事件发生后几秒内就能触发而不是像 Cron 那样要等到下一个轮询周期才知道。12.2.2 Webhook 端点的注册与配置Gateway 会暴露一个统一的 Webhook 端点POST http://localhost:18789/webhook/{webhookId}在~/.openclaw/openclaw.json里注册一个 Webhook{webhooks:[{id:github-pr-merged,name:GitHub PR 合并通知,secret:my-secret-token,messageTemplate:GitHub 上有一个 PR 被合并了{payload.pull_request.title}仓库{payload.repository.full_name},enabled:true}]}然后在 GitHub 的 Webhook 设置里填入对应的 Payload URL、Secret 和 Content type。12.2.3 Webhook 处理流程// src/gateway/server-webhook.ts伪代码app.post(/webhook/:webhookId,async(req,res){constconfigwebhookRegistry.get(req.params.webhookId);if(!config||!config.enabled){res.status(404).end();return;}// 1. 验证签名防止伪造请求constsignaturereq.headers[x-hub-signature-256]asstring;constisValidverifySignature(req.rawBody,config.secret,signature);if(!isValid){res.status(401).end();return;}// 2. 立即返回 200让发起方尽快确认接收避免超时重发res.status(200).end();// 3. 异步处理 Webhook 内容setImmediate(async(){constpayloadreq.body;constmessageTextrenderTemplate(config.messageTemplate,{payload});constsyntheticMsg:InboundMessage{id:webhook:${config.id}:${Date.now()},channel:internal:webhook,peerId:system,chatId:config.sessionId,text:messageText,timestamp:newDate(),raw:{triggerType:webhook,webhookId:config.id,payload},};awaitgateway.dispatchInbound(syntheticMsg);});});注意第 2 步先返回 200再异步处理。这是 Webhook 处理的最佳实践——大多数发起方GitHub、Stripe 等要求在 5 到 10 秒内收到响应如果处理逻辑太慢就会触发重发。先回 200 确认收到再慢慢处理是标准做法。12.2.4 幂等性重复触发的防护由于网络或发送方重试同一个 Webhook 事件可能被发送多次。为了避免重复触发 AgentGateway 需要做幂等去重constdeliveryIdreq.headers[x-github-delivery]asstring;if(deliveryId){constisDuplicateawaitidempotencyStore.check(deliveryId);if(isDuplicate){res.status(200).end();return;}awaitidempotencyStore.mark(deliveryId,TTL_24H);}12.3 Gmail Pub/Sub长链路事件源处理对于邮件这类特殊场景既不适合 Cron延迟较高也没有可靠的 Webhook 推送Gmail 提供了一套基于 Google Cloud Pub/Sub 的实时通知机制。你授权 Gmail 把邮件变更事件推送到某个 Google Cloud Pub/Sub 主题OpenClaw 订阅该主题收到通知后拉取最新邮件变更然后根据规则决定是否触发 Agent例如「有新的 GitHub 通知邮件时」。// src/gateway/gmail-pubsub.ts伪代码asyncfunctionstartGmailWatch(config:GmailPubSubConfig){constclientawaitgetGmailClient(config.userId);awaitclient.users.watch({userId:me,requestBody:{topicName:config.pubsubTopicName,labelIds:[INBOX],},});constpubsubnewPubSub({projectId:config.gcpProjectId});constsubscriptionpubsub.subscription(config.subscriptionName);subscription.on(message,async(message){message.ack();constnotificationJSON.parse(Buffer.from(message.dataasstring,base64).toString());awaitprocessGmailHistory(notification.historyId,config);});}asyncfunctionprocessGmailHistory(historyId:string,config:GmailPubSubConfig){constclientawaitgetGmailClient(config.userId);consthistoryawaitclient.users.history.list({userId:me,startHistoryId:historyId,historyTypes:[messageAdded],});constnewMessageshistory.data.history?.flatMap(hh.messagesAdded??[])??[];for(const{message}ofnewMessages){if(matchesRule(message,config.rules)){constsyntheticMsg:InboundMessage{id:gmail-pubsub:${message.id},channel:internal:gmail-pubsub,peerId:system,chatId:config.sessionId,text:收到一封新邮件ID:${message.id}。请检查并根据规则处理。,timestamp:newDate(),raw:{messageId:message.id,historyId},};awaitgateway.dispatchInbound(syntheticMsg);}}}12.4 事件总线统一的异步事件分发除了上面三种机制Gateway 内部还有一个轻量级的事件总线EventBus用于在各模块之间发布和订阅事件避免直接耦合// 发布事件eventBus.emit(skill:gmail:archive_completed,{sessionId:main,count:17,timestamp:newDate(),});// 订阅事件eventBus.on(skill:gmail:archive_completed,async(data){awaitdashboard.updateStats({type:archive,count:data.count});});EventBus 让不同模块Skills、Nodes、Automation Engine、Web UI可以松散地相互感知而不需要直接调用对方的接口。12.5 源码走读导向在阅读自动化相关代码时可以沿以下路径。Cron Engine 在src/cron/中关注如何把 cron 表达式转化为定时器以及如何构造合成消息触发 Gateway。Webhook Handler 在src/gateway/中与 webhook 相关的文件如server-webhook.ts以及src/plugin-sdk/webhook-request-guards.ts签名验证和src/plugin-sdk/persistent-dedupe.ts幂等去重。Gmail Pub/Sub 相关代码可能分布在 Skills 或src/gateway/的特定模块中关注 Watch 注册和 Pub/Sub 消息解析。EventBus 在src/gateway/中事件相关模块。12.6 小结本章介绍了 OpenClaw 的三种主动触发机制。Cron 定时触发构造合成消息走标准分发链路配置简单直观。Webhook 是外部事件推送先 200 再异步处理注意签名验证和幂等去重。Gmail Pub/Sub 专为邮件类实时通知设计依赖 GCP 基础设施。三种机制的共同点是都最终收敛到 Gateway 的dispatchInbound这同一个入口这让自动化任务和用户主动触发的任务在处理逻辑上保持完全一致。下一章我们进入本书的「动手实战」章节从零开始一步步构建你自己的 Skill。

相关文章:

《OpenClaw架构与源码解读》· 第 12 章 Cron、Webhooks 与事件驱动自动化

第 12 章 Cron、Webhooks 与事件驱动自动化 前面第 8–10 章介绍的消息处理链路,都是被动响应式的:用户先说话,OpenClaw 才行动。但 OpenClaw 更有价值的地方之一,恰恰是它可以主动出击——在你没有发消息的时候,悄悄把…...

x86与ARM架构通用:cpuid库跨平台CPU特性检测最佳实践

x86与ARM架构通用:cpuid库跨平台CPU特性检测最佳实践 【免费下载链接】cpuid CPU feature identification for Go 项目地址: https://gitcode.com/gh_mirrors/cp/cpuid 在现代软件开发中,针对不同CPU架构优化程序性能变得越来越重要。无论是x86还…...

贪心:保卫花园

题目:P2878 [USACO07JAN] Protecting the Flowers S - 洛谷 题目概述:每头牛都呆在数组的某个坐标上,并且每分钟会吃掉i朵花,问如何排序把牛牵回坐标0处,使花的损失最小。求最小吃掉花的数量。 思路:每一波…...

OpenClaw 安卓设备接入指南:从零开始配置你的移动节点

最近 OpenClaw 项目热度很高,我也开始学习和探索。本文记录了我学习过程中,将 Android 设备接入 OpenClaw Gateway 的完整流程,涵盖了环境准备、应用编译、Gateway 配置及最终连接,并特别记录了针对较旧 Android 设备的适配方法。…...

终极指南:5分钟完成Social-Engineer Toolkit容器化部署

终极指南:5分钟完成Social-Engineer Toolkit容器化部署 【免费下载链接】social-engineer-toolkit The Social-Engineer Toolkit (SET) repository from TrustedSec - All new versions of SET will be deployed here. 项目地址: https://gitcode.com/GitHub_Tren…...

VibeVoice推理优化终极指南:如何减少内存占用并提升语音生成速度

VibeVoice推理优化终极指南:如何减少内存占用并提升语音生成速度 【免费下载链接】VibeVoice Open-Source Frontier Voice AI 项目地址: https://gitcode.com/GitHub_Trending/vib/VibeVoice VibeVoice作为开源前沿语音AI项目,在提供高质量语音生…...

如何快速入门Esplora:从安装到查询的完整指南

如何快速入门Esplora:从安装到查询的完整指南 【免费下载链接】esplora Explorer for Bitcoin and Liquid 项目地址: https://gitcode.com/gh_mirrors/es/esplora Esplora是一款功能强大的比特币和Liquid区块链浏览器,帮助用户轻松查询交易、区块…...

PHP面试中的Redis与Memcached选型:PHP-Interview-Best-Practices-in-China对比分析

PHP面试中的Redis与Memcached选型:PHP-Interview-Best-Practices-in-China对比分析 【免费下载链接】PHP-Interview-Best-Practices-in-China 项目地址: https://gitcode.com/gh_mirrors/ph/PHP-Interview-Best-Practices-in-China 在PHP开发领域&#xff0…...

Waves区块链数据结构详解:Merkle树与状态管理机制

Waves区块链数据结构详解:Merkle树与状态管理机制 【免费下载链接】Waves ⛓️ Reference Waves Blockchain Node (client) implementation on Scala 项目地址: https://gitcode.com/gh_mirrors/wav/Waves Waves区块链作为一个开源的分布式账本系统&#xff…...

从0到1理解热成像技术:DIY-Thermocam带你走进红外世界

从0到1理解热成像技术:DIY-Thermocam带你走进红外世界 【免费下载链接】diy-thermocam A do-it-yourself thermal imager, compatible with the FLIR Lepton 2.5, 3.1R and 3.5 sensor with Arduino firmware 项目地址: https://gitcode.com/gh_mirrors/di/diy-th…...

Go 1.14+与gh_mirrors/gl/gl:checkptr问题解决方案与WithOffset函数使用

Go 1.14与gh_mirrors/gl/gl:checkptr问题解决方案与WithOffset函数使用 【免费下载链接】gl Go bindings for OpenGL (generated via glow) 项目地址: https://gitcode.com/gh_mirrors/gl/gl 在Go 1.14及更高版本中,checkptr检测器的引入为内存安…...

MLLM SDK与CLI工具使用指南:轻松实现模型部署与推理

MLLM SDK与CLI工具使用指南:轻松实现模型部署与推理 【免费下载链接】mllm Fast Multimodal LLM on Mobile Devices 项目地址: https://gitcode.com/gh_mirrors/ml/mllm MLLM(Fast Multimodal LLM on Mobile Devices)是一款专为移动设…...

如何在10分钟内安装Soft Actor-Critic:Docker与本地部署终极教程

如何在10分钟内安装Soft Actor-Critic:Docker与本地部署终极教程 【免费下载链接】sac Soft Actor-Critic 项目地址: https://gitcode.com/gh_mirrors/sa/sac Soft Actor-Critic(SAC)是一种高效的强化学习算法,广泛应用于连…...

一文读懂Dapr SDK for .NET的发布订阅机制:构建实时消息系统

一文读懂Dapr SDK for .NET的发布订阅机制:构建实时消息系统 【免费下载链接】dotnet-sdk Dapr SDK for .NET 项目地址: https://gitcode.com/gh_mirrors/do/dotnet-sdk Dapr SDK for .NET提供了强大的发布订阅(Pub/Sub)机制&#xff…...

如何实现Pyecharts自定义事件处理:从前端到后端的完整联动指南

如何实现Pyecharts自定义事件处理:从前端到后端的完整联动指南 【免费下载链接】pyecharts 🎨 Python Echarts Plotting Library 项目地址: https://gitcode.com/gh_mirrors/py/pyecharts Pyecharts是一款强大的Python数据可视化库,它…...

如何用DVA集成WebAssembly提升前端计算性能:终极优化指南

如何用DVA集成WebAssembly提升前端计算性能:终极优化指南 【免费下载链接】dva dvajs/dva: DVA 是一个基于 Redux 和 React 的轻量级前端框架,用于构建复杂的状态管理方案。它引入了模型(model)的概念,简化了Redux的应用状态管理和异步逻辑处…...

Dio缓存版本控制终极指南:平滑数据迁移的10个关键技巧

Dio缓存版本控制终极指南:平滑数据迁移的10个关键技巧 【免费下载链接】dio 项目地址: https://gitcode.com/gh_mirrors/dio/dio 在移动应用和API开发中,Dio作为强大的HTTP客户端库,其缓存机制和版本控制策略直接影响应用性能与用户体…...

Codis容器化终极指南:Docker Compose一键部署与集群管理

Codis容器化终极指南:Docker Compose一键部署与集群管理 【免费下载链接】codis 项目地址: https://gitcode.com/gh_mirrors/cod/codis Codis是一个分布式Redis解决方案,通过Docker容器化部署可以显著简化集群搭建与管理流程。本文将带你快速掌握…...

Bootstrap-sass 终极指南:如何快速掌握Sass版Bootstrap的核心功能

Bootstrap-sass 终极指南:如何快速掌握Sass版Bootstrap的核心功能 【免费下载链接】bootstrap-sass 项目地址: https://gitcode.com/gh_mirrors/boo/bootstrap-sass Bootstrap-sass是将流行的前端框架Bootstrap与强大的CSS预处理器Sass完美结合的项目&#…...

RS®CMW500 全场景一体化无线通信测试平台

看来你对罗德与施瓦茨的专业无线测试设备很熟悉,CMW500作为该品牌经典的宽带无线通信综合测试仪,确实是2G到4G时代无线终端测试领域的标杆产品,至今在消费电子、汽车电子、物联网等行业的研发、生产和认证环节仍有广泛应用。我会从核心定位、…...

Bootstrap-sass自动化测试完整指南:确保组件稳定性的5大策略

Bootstrap-sass自动化测试完整指南:确保组件稳定性的5大策略 【免费下载链接】bootstrap-sass 项目地址: https://gitcode.com/gh_mirrors/boo/bootstrap-sass Bootstrap-sass作为前端开发的重要工具,其组件稳定性直接影响项目质量。本文将分享5…...

7个CSS变量技巧,彻底改变Tippy.js主题定制体验

7个CSS变量技巧,彻底改变Tippy.js主题定制体验 【免费下载链接】tippyjs Tooltip, popover, dropdown, and menu library 项目地址: https://gitcode.com/gh_mirrors/ti/tippyjs Tippy.js是一款功能强大的Tooltip、popover、dropdown和菜单库,它让…...

终极指南:如何利用External-Attention-pytorch实现脑机接口中的神经信号解码

终极指南:如何利用External-Attention-pytorch实现脑机接口中的神经信号解码 【免费下载链接】External-Attention-pytorch 🍀 Pytorch implementation of various Attention Mechanisms, MLP, Re-parameter, Convolution, which is helpful to further …...

Pell编辑器终极扩展指南:10个实用Action与插件开发技巧

Pell编辑器终极扩展指南:10个实用Action与插件开发技巧 【免费下载链接】pell 📝 the simplest and smallest WYSIWYG text editor for web, with no dependencies 项目地址: https://gitcode.com/gh_mirrors/pe/pell Pell是一款轻量级无依赖的We…...

Vim-Pathogen终极指南:轻松管理Vim插件的神器

Vim-Pathogen终极指南:轻松管理Vim插件的神器 【免费下载链接】vim-pathogen pathogen.vim: manage your runtimepath 项目地址: https://gitcode.com/gh_mirrors/vi/vim-pathogen Vim-Pathogen是一款强大的Vim插件管理工具,它能帮助你轻松管理Vi…...

智能矿山GIS一张图:构建透明化智慧矿山新范式

在矿山数字化转型的浪潮中,如何打破数据孤岛、实现全要素安全管控,成为行业高质量发展的核心命题。汇智信科打造的“智能矿山GIS一张图”,以高性能、高安全、高可用、高智能的大数据技术为底座,通过地质测量数据动态处理与多维可视…...

如何用awspec实现AWS基础设施即代码(IaC)的自动化测试

如何用awspec实现AWS基础设施即代码(IaC)的自动化测试 【免费下载链接】awspec RSpec tests for your AWS resources. 项目地址: https://gitcode.com/gh_mirrors/aw/awspec awspec是一款专为AWS资源设计的RSpec测试框架,它能够帮助开…...

C语言--文件

1.什么是⽂件? 磁盘(硬盘)上的⽂件是⽂件。 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。 1.1程序⽂件 程序⽂件包括源程序⽂件(…...

isaac_ros_visual_slam API全解析:从基础到高级应用

isaac_ros_visual_slam API全解析:从基础到高级应用 【免费下载链接】isaac_ros_visual_slam Visual odometry package based on hardware-accelerated NVIDIA Elbrus library with world class quality and performance. 项目地址: https://gitcode.com/gh_mirro…...

Protege Desktop与推理机集成指南:让你的本体具备智能推理能力

Protege Desktop与推理机集成指南:让你的本体具备智能推理能力 【免费下载链接】protege Protege Desktop 项目地址: https://gitcode.com/gh_mirrors/pr/protege Protege Desktop是一款强大的本体编辑工具,通过与推理机集成,能够为你…...