返回

14. OpenClaw 自動化與排程任務:Cron、Webhook 與 Gmail 整合

本文介紹 OpenClaw 的自動化能力,包括 Cron 排程任務、Webhook 觸發器、Gmail Pub/Sub 整合等,讓你的 AI 助手主動工作,而不只是被動回應。

適用於 OpenClaw v2026.2 | 本文適合想讓 AI 助手主動工作而非被動回應的使用者。

TL;DR: Cron 排程任務:"cron": [{"id": "daily", "schedule": "0 9 * * *", "message": "..."}]。Webhook 觸發:POST /webhook/your-path。Gmail Pub/Sub 自動處理郵件。Heartbeat 主動檢查。設定範例:每日晨報 0 8 * * 1-5,CI 通知 webhook,郵件過濾器 gmail pub/sub。

自動化概覽

自動化類型

類型 觸發方式 適用場景
Cron 定時觸發 每日報告、定期檢查
Webhook HTTP 請求 外部系統整合
Gmail Pub/Sub 新郵件 郵件自動化
Heartbeat 週期檢查 主動提醒、建議

架構圖

flowchart TB
    subgraph Triggers["觸發源"]
        CRON[Cron 定時]
        WH[Webhook HTTP]
        GM[Gmail Pub/Sub]
        HB[Heartbeat]
    end
    
    subgraph Gateway["Gateway"]
        SCHED[排程器]
        ROUTE[路由器]
        AGENT[Agent]
    end
    
    subgraph Actions["動作"]
        MSG[傳送訊息]
        EXEC[執行任務]
        NOTIF[傳送通知]
    end
    
    CRON --> SCHED
    WH --> ROUTE
    GM --> ROUTE
    HB --> SCHED
    
    SCHED --> AGENT
    ROUTE --> AGENT
    AGENT --> MSG
    AGENT --> EXEC
    AGENT --> NOTIF

Cron 排程任務

Cron 表達式

┌───────────── 分鐘 (0 - 59)
│ ┌───────────── 小時 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期幾 (0 - 6, 0 = 週日)
│ │ │ │ │
* * * * *

常用表達式

表達式 說明
0 9 * * * 每天 9:00
0 18 * * 1-5 工作日 18:00
*/30 * * * * 每 30 分鐘
0 0 1 * * 每月 1 日 0:00
0 9,18 * * * 每天 9:00 和 18:00
0 9 * * 1 每週一 9:00

設定 Cron 任務

{
  "cron": [
    {
      "id": "daily-briefing",
      "schedule": "0 9 * * *",
      "session": "main",
      "message": "請給我今天的日程安排和待辦事項",
      "enabled": true
    },
    {
      "id": "weekly-summary",
      "schedule": "0 18 * * 5",
      "session": "main",
      "message": "產生本週工作總結",
      "enabled": true
    },
    {
      "id": "health-check",
      "schedule": "*/15 * * * *",
      "session": "main",
      "message": "檢查系統狀態,回報任何異常",
      "enabled": true
    }
  ]
}

Cron 設定項

欄位 類型 說明
id string 任務唯一識別碼
schedule string Cron 表達式
session string 目標工作階段
message string 傳送的訊息
enabled boolean 是否啟用
timezone string 時區(預設系統時區)

管理 Cron 任務

# 列出所有任務
openclaw cron list

# 輸出範例:
# ID               Schedule       Status    Last Run
# daily-briefing   0 9 * * *     enabled   2026-02-26 09:00
# weekly-summary   0 18 * * 5    enabled   2026-02-23 18:00
# health-check    */15 * * * *   enabled   2026-02-26 10:30

# 手動觸發任務
openclaw cron run daily-briefing

# 啟用/停用任務
openclaw cron enable daily-briefing
openclaw cron disable daily-briefing

# 檢視任務日誌
openclaw cron logs daily-briefing

Webhook 觸發器

設定 Webhook

{
  "webhooks": [
    {
      "id": "github-push",
      "path": "/webhook/github",
      "secret": "your-webhook-secret",
      "session": "main",
      "handler": "github-push"
    },
    {
      "id": "custom-alert",
      "path": "/webhook/alert",
      "secret": "your-webhook-secret",
      "session": "main",
      "message": "收到告警: {{data.message}}"
    }
  ]
}

Webhook 端點

POST http://your-gateway:18789/webhook/github-push
POST http://your-gateway:18789/webhook/alert

GitHub Webhook 範例

{
  "webhooks": [
    {
      "id": "github-push",
      "path": "/webhook/github",
      "secret": "${GITHUB_WEBHOOK_SECRET}",
      "session": "work",
      "handler": "github-push"
    }
  ]
}

Handler 指令碼:

// ~/.openclaw/handlers/github-push.js
module.exports = async (payload, session) => {
  if (payload.ref === 'refs/heads/main') {
    const commits = payload.commits.map(c => c.message).join('\n- ');
    return `偵測到新的推送:\n\n分支: main\n提交:\n- ${commits}\n\n需要我幫你做什麼嗎?`;
  }
  return null;
};

自訂 Webhook 處理

{
  "webhooks": [
    {
      "id": "monitoring-alert",
      "path": "/webhook/alert",
      "methods": ["POST"],
      "session": "main",
      "message": "🚨 告警通知\n\n級別: {{data.level}}\n服務: {{data.service}}\n資訊: {{data.message}}\n時間: {{data.timestamp}}"
    }
  ]
}

傳送 Webhook:

curl -X POST http://localhost:18789/webhook/alert \
  -H "Content-Type: application/json" \
  -H "X-Webhook-Secret: your-secret" \
  -d '{
    "level": "critical",
    "service": "api-server",
    "message": "CPU 使用率超過 90%",
    "timestamp": "2026-02-26T10:30:00Z"
  }'

Webhook 安全

{
  "webhooks": [
    {
      "id": "secure-webhook",
      "path": "/webhook/secure",
      "secret": "your-secret-key",
      "signatureHeader": "X-Signature",
      "signatureAlgorithm": "sha256",
      "ipWhitelist": ["192.168.1.0/24"]
    }
  ]
}

Gmail Pub/Sub 整合

設定 Gmail Pub/Sub

{
  "gmail": {
    "pubsub": {
      "enabled": true,
      "projectId": "your-project-id",
      "subscription": "gmail-subscription",
      "credentials": {
        "type": "service_account",
        "project_id": "your-project-id",
        "private_key_id": "...",
        "private_key": "...",
        "client_email": "..."
      },
      "filters": [
        {
          "from": "[email protected]",
          "session": "main",
          "message": "收到重要郵件:\n寄件人: {{sender}}\n主旨: {{subject}}"
        }
      ]
    }
  }
}

設定 Gmail Pub/Sub

  1. 建立 Google Cloud 專案
  2. 啟用 Gmail API
  3. 建立 Pub/Sub 主題
  4. 建立服務帳號
  5. 設定 Gmail watch
# 設定 Gmail watch
openclaw gmail watch --email [email protected]

Gmail 過濾器

過濾條件 說明
from 寄件人信箱
to 收件人信箱
subject 主旨關鍵字
hasAttachment 是否有附件
label Gmail 標籤
{
  "filters": [
    {
      "from": "[email protected]",
      "session": "work",
      "message": "收到 GitHub 通知: {{subject}}"
    },
    {
      "from": "[email protected]",
      "hasAttachment": true,
      "session": "main",
      "message": "收到 Stripe 文件,請處理"
    }
  ]
}

Heartbeat 主動檢查

設定 Heartbeat

{
  "heartbeat": {
    "enabled": true,
    "interval": 3600000,
    "session": "main",
    "message": "Heartbeat: 請檢查是否有需要我關注的事項"
  }
}

Heartbeat 用途

用途 說明
主動提醒 定期提醒使用者
狀態檢查 檢查系統或服務狀態
任務建議 根據上下文提供建議
上下文維護 保持工作階段活躍

Heartbeat 範例

{
  "heartbeat": {
    "enabled": true,
    "interval": 1800000,
    "conditions": [
      {
        "type": "time",
        "start": "09:00",
        "end": "18:00"
      },
      {
        "type": "active",
        "session": "main"
      }
    ],
    "message": "根據目前時間,建議檢查以下事項:\n1. 今日待辦\n2. 郵件提醒\n3. 日程安排"
  }
}

自動化實戰範例

範例一:每日晨報

{
  "cron": [
    {
      "id": "morning-briefing",
      "schedule": "0 8 * * 1-5",
      "session": "main",
      "message": "早安!請給我今天的晨報:\n1. 天氣預報\n2. 今日日程\n3. 待辦事項\n4. 重要郵件摘要"
    }
  ]
}

範例二:CI/CD 通知

{
  "webhooks": [
    {
      "id": "ci-failure",
      "path": "/webhook/ci",
      "session": "dev",
      "message": "⚠️ CI 失敗\n\n專案: {{data.repository}}\n分支: {{data.branch}}\n提交: {{data.commit}}\n錯誤: {{data.error}}\n\n需要我幫你分析嗎?"
    }
  ]
}

範例三:郵件自動處理

{
  "gmail": {
    "pubsub": {
      "filters": [
        {
          "from": "[email protected]",
          "hasAttachment": true,
          "session": "main",
          "message": "收到發票郵件,正在處理...\n請將附件儲存到財務資料夾"
        }
      ]
    }
  }
}

範例四:系統監控

{
  "cron": [
    {
      "id": "system-monitor",
      "schedule": "*/5 * * * *",
      "session": "main",
      "message": "檢查系統狀態",
      "skills": ["system-monitor"]
    }
  ]
}

故障排查

Cron 任務不執行

# 檢查任務狀態
openclaw cron list

# 檢查日誌
openclaw logs --filter cron

# 手動觸發測試
openclaw cron run task-id

Webhook 不回應

# 檢查 Webhook 端點
curl -X POST http://localhost:18789/webhook/test \
  -H "Content-Type: application/json" \
  -d '{"test": true}'

# 檢視日誌
openclaw logs --filter webhook

Gmail Pub/Sub 不運作

# 檢查訂閱狀態
openclaw gmail status

# 重新設定
openclaw gmail setup

# 檢查權限
openclaw gmail check-permissions

小結

自動化讓 OpenClaw 從被動回應變為主動工作:

  • Cron:定時執行任務
  • Webhook:外部事件觸發
  • Gmail Pub/Sub:郵件自動化
  • Heartbeat:主動提醒和建議

更新記錄

  • 2026-02-26:初版發布

系列導航