首页 教程 分类 Skills下载 关于
ZH EN JA KO
进阶玩法

OpenClaw REST API开发和第三方集成教程

· 35 分钟

前言

OpenClaw Gateway 不仅为聊天频道提供服务,还暴露了一套完整的 REST API。通过这些 API,你可以将 AI 能力集成到任何应用中——无论是自建的 Web 前端、CRM 系统还是客服工单平台。本文将详细介绍 API 的使用方法和集成实践。

一、API 概览

1.1 基础信息

属性
基础 URL http://localhost:18789/api/v1
协议 HTTP/HTTPS
数据格式 JSON
认证方式 Bearer Token
速率限制 默认 60 RPM

1.2 核心端点列表

方法 端点 功能
POST /api/v1/chat 发送消息并获取 AI 回复
POST /api/v1/chat/stream 流式发送消息
POST /api/v1/send 向指定频道发送消息
GET /api/v1/conversations 获取对话列表
GET /api/v1/conversations/:id 获取对话详情
DELETE /api/v1/conversations/:id 删除对话
GET /api/v1/skills 获取技能列表
GET /api/v1/models 获取可用模型列表
GET /health 健康检查
GET /health/detail 详细状态

二、认证配置

2.1 生成 API Token

# 生成 API Token
openclaw token create --name "my-app" --scope "chat,send,read"

# 输出:
# Token: oc_tok_a1b2c3d4e5f6g7h8i9j0...
# Scope: chat, send, read
# Created: 2026-04-09

# 查看所有 Token
openclaw token list

# 撤销 Token
openclaw token revoke oc_tok_a1b2c3d4e5f6g7h8i9j0

2.2 在配置文件中设置

// ~/.config/openclaw/openclaw.json5
{
  "api": {
    "enabled": true,
    "port": 18789,
    "auth": {
      "enabled": true,
      "tokens": [
        {
          "name": "my-web-app",
          "token": "oc_tok_a1b2c3d4e5f6g7h8i9j0",
          "scope": ["chat", "send", "read", "admin"],
          "rateLimit": 120  // RPM
        },
        {
          "name": "crm-integration",
          "token": "oc_tok_x9y8z7w6v5u4t3s2r1q0",
          "scope": ["chat", "send"],
          "rateLimit": 30
        }
      ]
    }
  }
}

2.3 认证请求示例

所有 API 请求需要在 Header 中携带 Token:

curl -H "Authorization: Bearer oc_tok_a1b2c3d4e5f6g7h8i9j0" \
  http://localhost:18789/api/v1/models

三、核心 API 使用

3.1 发送消息并获取回复

curl 示例:

curl -X POST http://localhost:18789/api/v1/chat \
  -H "Authorization: Bearer $OPENCLAW_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "帮我用Python写一个快速排序算法",
    "conversationId": "conv_123",
    "model": "claude-sonnet-4-20250514",
    "systemPrompt": "你是一个专业的编程助手",
    "maxTokens": 2000,
    "temperature": 0.7
  }'

响应示例:

{
  "id": "msg_abc123",
  "conversationId": "conv_123",
  "role": "assistant",
  "content": "以下是Python实现的快速排序算法:\n\n```python\ndef quicksort(arr):\n    if len(arr) <= 1:\n        return arr\n    pivot = arr[len(arr) // 2]\n    left = [x for x in arr if x < pivot]\n    middle = [x for x in arr if x == pivot]\n    right = [x for x in arr if x > pivot]\n    return quicksort(left) + middle + quicksort(right)\n```",
  "model": "claude-sonnet-4-20250514",
  "usage": {
    "inputTokens": 45,
    "outputTokens": 156
  },
  "latency": 2341
}

3.2 流式输出

curl 示例(SSE):

curl -X POST http://localhost:18789/api/v1/chat/stream \
  -H "Authorization: Bearer $OPENCLAW_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{
    "message": "写一篇关于人工智能的短文",
    "model": "claude-sonnet-4-20250514"
  }'

# 返回 SSE 事件流:
# data: {"type":"start","conversationId":"conv_456"}
# data: {"type":"delta","content":"人工"}
# data: {"type":"delta","content":"智能"}
# data: {"type":"delta","content":"(AI)"}
# ...
# data: {"type":"done","usage":{"inputTokens":20,"outputTokens":350}}

3.3 向频道发送消息

# 向 Telegram 用户发送消息
curl -X POST http://localhost:18789/api/v1/send \
  -H "Authorization: Bearer $OPENCLAW_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "telegram",
    "chatId": "123456789",
    "message": "这是一条通过 API 发送的消息"
  }'

# 向 Discord 频道发送消息
curl -X POST http://localhost:18789/api/v1/send \
  -H "Authorization: Bearer $OPENCLAW_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "discord",
    "chatId": "CHANNEL_ID",
    "message": "系统通知:服务器维护将于今晚 22:00 开始"
  }'

四、Webhook 接收

4.1 配置 Webhook 回调

当 OpenClaw 收到消息或完成处理时,可以向你的应用发送 Webhook 通知:

{
  "api": {
    "webhooks": {
      "outgoing": [
        {
          "url": "https://your-app.com/api/openclaw-callback",
          "secret": "your-webhook-secret",
          "events": [
            "message.received",
            "message.sent",
            "conversation.created",
            "channel.connected",
            "channel.disconnected"
          ],
          "retry": {
            "maxAttempts": 3,
            "backoffMs": 5000
          }
        }
      ]
    }
  }
}

4.2 Webhook 事件格式

{
  "event": "message.received",
  "timestamp": "2026-04-09T10:30:00Z",
  "data": {
    "messageId": "msg_xyz789",
    "conversationId": "conv_123",
    "channel": "telegram",
    "chatId": "123456789",
    "from": {
      "id": "user_456",
      "name": "Alice"
    },
    "content": "用户发送的消息内容",
    "timestamp": "2026-04-09T10:30:00Z"
  },
  "signature": "sha256=abcdef..."
}

4.3 验证 Webhook 签名

import hmac
import hashlib

def verify_webhook(payload, signature, secret):
    expected = 'sha256=' + hmac.new(
        secret.encode(),
        payload.encode(),
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

五、Python 集成示例

5.1 基础封装

import requests
from typing import Optional, Generator

class OpenClawClient:
    def __init__(self, base_url: str = "http://localhost:18789",
                 token: str = ""):
        self.base_url = base_url.rstrip("/")
        self.headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        }

    def chat(self, message: str, conversation_id: Optional[str] = None,
             model: str = "claude-sonnet-4-20250514",
             system_prompt: Optional[str] = None) -> dict:
        """发送消息并获取 AI 回复"""
        payload = {
            "message": message,
            "model": model,
        }
        if conversation_id:
            payload["conversationId"] = conversation_id
        if system_prompt:
            payload["systemPrompt"] = system_prompt

        resp = requests.post(
            f"{self.base_url}/api/v1/chat",
            json=payload,
            headers=self.headers,
            timeout=120
        )
        resp.raise_for_status()
        return resp.json()

    def chat_stream(self, message: str,
                    model: str = "claude-sonnet-4-20250514") -> Generator:
        """流式发送消息"""
        payload = {"message": message, "model": model}
        headers = {**self.headers, "Accept": "text/event-stream"}

        resp = requests.post(
            f"{self.base_url}/api/v1/chat/stream",
            json=payload,
            headers=headers,
            stream=True,
            timeout=120
        )
        resp.raise_for_status()

        for line in resp.iter_lines():
            if line:
                line = line.decode("utf-8")
                if line.startswith("data: "):
                    yield line[6:]

    def send(self, channel: str, chat_id: str, message: str) -> dict:
        """向指定频道发送消息"""
        resp = requests.post(
            f"{self.base_url}/api/v1/send",
            json={
                "channel": channel,
                "chatId": chat_id,
                "message": message
            },
            headers=self.headers
        )
        resp.raise_for_status()
        return resp.json()

    def health(self) -> dict:
        """健康检查"""
        resp = requests.get(f"{self.base_url}/health")
        return resp.json()


# 使用示例
client = OpenClawClient(token="oc_tok_a1b2c3d4e5f6g7h8i9j0")

# 普通对话
result = client.chat("今天天气怎么样?")
print(result["content"])

# 流式对话
for chunk in client.chat_stream("讲一个故事"):
    print(chunk, end="", flush=True)

# 发送到 Telegram
client.send("telegram", "123456789", "Hello from API!")

六、Node.js 集成示例

6.1 基础封装

// openclaw-client.js
const axios = require('axios');

class OpenClawClient {
  constructor(baseUrl = 'http://localhost:18789', token = '') {
    this.baseUrl = baseUrl;
    this.headers = {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    };
  }

  async chat(message, options = {}) {
    const { conversationId, model = 'claude-sonnet-4-20250514', systemPrompt } = options;

    const payload = { message, model };
    if (conversationId) payload.conversationId = conversationId;
    if (systemPrompt) payload.systemPrompt = systemPrompt;

    const resp = await axios.post(
      `${this.baseUrl}/api/v1/chat`,
      payload,
      { headers: this.headers, timeout: 120000 }
    );
    return resp.data;
  }

  async send(channel, chatId, message) {
    const resp = await axios.post(
      `${this.baseUrl}/api/v1/send`,
      { channel, chatId, message },
      { headers: this.headers }
    );
    return resp.data;
  }

  async health() {
    const resp = await axios.get(`${this.baseUrl}/health`);
    return resp.data;
  }

  async getModels() {
    const resp = await axios.get(
      `${this.baseUrl}/api/v1/models`,
      { headers: this.headers }
    );
    return resp.data;
  }
}

module.exports = OpenClawClient;

// 使用示例
async function main() {
  const client = new OpenClawClient(
    'http://localhost:18789',
    'oc_tok_a1b2c3d4e5f6g7h8i9j0'
  );

  // 普通对话
  const result = await client.chat('用JavaScript实现斐波那契数列', {
    systemPrompt: '你是一个编程导师,解释要清晰易懂'
  });
  console.log(result.content);

  // 发送到 Discord
  await client.send('discord', 'CHANNEL_ID', '来自 API 的消息');

  // 获取可用模型
  const models = await client.getModels();
  console.log('可用模型:', models);
}

main().catch(console.error);

七、与第三方系统集成

7.1 CRM 系统集成

以下示例将 OpenClaw 集成到 CRM,自动分析客户反馈:

# crm_integration.py
from openclaw_client import OpenClawClient

client = OpenClawClient(token="oc_tok_xxx")

def analyze_customer_feedback(feedback_text, customer_id):
    """分析客户反馈并分类"""
    result = client.chat(
        f"请分析以下客户反馈,并返回 JSON 格式结果:\n\n{feedback_text}",
        options={
            "systemPrompt": """你是客户反馈分析专家。请将反馈分类并返回JSON:
{
  "sentiment": "positive/neutral/negative",
  "category": "产品质量/客户服务/价格/物流/其他",
  "urgency": "high/medium/low",
  "summary": "一句话摘要",
  "suggestedAction": "建议处理方式"
}"""
        }
    )
    return result["content"]

# 使用
analysis = analyze_customer_feedback(
    "你们的产品质量太差了,买了两天就坏了,而且客服态度还很差!",
    "CUST_001"
)
print(analysis)

7.2 工单系统集成

# helpdesk_integration.py
def auto_reply_ticket(ticket):
    """自动生成工单初步回复"""
    result = client.chat(
        f"工单标题:{ticket['title']}\n"
        f"工单描述:{ticket['description']}\n"
        f"优先级:{ticket['priority']}\n\n"
        f"请生成一份专业的初步回复。",
        options={
            "systemPrompt": "你是技术支持专家。基于工单内容提供初步解答和处理建议。回复要专业、友善。"
        }
    )

    return {
        "reply": result["content"],
        "auto_generated": True,
        "model": result.get("model"),
        "needs_review": ticket["priority"] == "high"
    }

7.3 自建 Web 前端

<!-- 一个简单的 Web 聊天前端 -->
<!DOCTYPE html>
<html>
<head>
  <title>AI 助手</title>
  <style>
    #chat { max-width: 600px; margin: 0 auto; padding: 20px; }
    .message { margin: 10px 0; padding: 10px; border-radius: 8px; }
    .user { background: #e3f2fd; text-align: right; }
    .assistant { background: #f5f5f5; }
    #input-area { display: flex; gap: 10px; margin-top: 20px; }
    #message-input { flex: 1; padding: 10px; border: 1px solid #ccc; border-radius: 4px; }
    button { padding: 10px 20px; background: #1976d2; color: white; border: none; border-radius: 4px; cursor: pointer; }
  </style>
</head>
<body>
  <div id="chat">
    <h2>AI 助手</h2>
    <div id="messages"></div>
    <div id="input-area">
      <input id="message-input" placeholder="输入消息..." />
      <button onclick="sendMessage()">发送</button>
    </div>
  </div>

  <script>
    const API_URL = 'http://localhost:18789/api/v1/chat';
    const TOKEN = 'oc_tok_a1b2c3d4e5f6g7h8i9j0';
    let conversationId = null;

    async function sendMessage() {
      const input = document.getElementById('message-input');
      const message = input.value.trim();
      if (!message) return;

      appendMessage('user', message);
      input.value = '';

      try {
        const resp = await fetch(API_URL, {
          method: 'POST',
          headers: {
            'Authorization': `Bearer ${TOKEN}`,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({
            message,
            conversationId,
            model: 'claude-sonnet-4-20250514'
          })
        });

        const data = await resp.json();
        conversationId = data.conversationId;
        appendMessage('assistant', data.content);
      } catch (error) {
        appendMessage('assistant', '发生错误:' + error.message);
      }
    }

    function appendMessage(role, content) {
      const div = document.createElement('div');
      div.className = `message ${role}`;
      div.textContent = content;
      document.getElementById('messages').appendChild(div);
      div.scrollIntoView({ behavior: 'smooth' });
    }

    document.getElementById('message-input')
      .addEventListener('keydown', e => { if (e.key === 'Enter') sendMessage(); });
  </script>
</body>
</html>

八、API 速率限制

8.1 速率限制配置

{
  "api": {
    "rateLimit": {
      // 全局限制
      "global": {
        "windowMs": 60000,    // 1 分钟窗口
        "maxRequests": 120    // 最多 120 次
      },
      // 按 Token 限制
      "perToken": {
        "windowMs": 60000,
        "maxRequests": 60
      }
    }
  }
}

8.2 处理速率限制错误

当触发速率限制时,API 返回 429 Too Many Requests

{
  "error": "rate_limit_exceeded",
  "message": "请求过于频繁,请稍后再试",
  "retryAfter": 30
}

在客户端实现重试逻辑:

import time

def chat_with_retry(client, message, max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.chat(message)
        except requests.exceptions.HTTPError as e:
            if e.response.status_code == 429:
                retry_after = int(e.response.headers.get('Retry-After', 30))
                print(f"速率限制,{retry_after}秒后重试...")
                time.sleep(retry_after)
            else:
                raise
    raise Exception("超过最大重试次数")

九、安全最佳实践

措施 说明
使用 HTTPS 生产环境必须通过 Nginx 反向代理启用 HTTPS
Token 权限最小化 只授予必要的 scope
IP 白名单 限制 API 访问来源
输入验证 对用户输入进行清理,防止提示注入
日志审计 记录所有 API 调用
定期轮换 Token 每 90 天更换一次
{
  "api": {
    "security": {
      // IP 白名单
      "allowedIPs": ["10.0.0.0/8", "192.168.1.0/24"],
      // CORS 配置
      "cors": {
        "enabled": true,
        "origins": ["https://your-app.com"],
        "methods": ["GET", "POST", "DELETE"]
      },
      // 请求体大小限制
      "maxBodySize": "1MB"
    }
  }
}

十、调试与排错

# 查看 API 请求日志
openclaw logs | grep -i "api\|request\|response"

# 使用 verbose curl 调试
curl -v -X POST http://localhost:18789/api/v1/chat \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message":"test"}'

# 检查 API 服务状态
curl -s http://localhost:18789/health | jq .

通过以上 API 集成方案,你可以将 OpenClaw 的 AI 能力无缝融入任何现有系统,构建出强大的智能化应用。

OpenClaw 是开源免费的个人AI助手,支持 WhatsApp、Telegram、Discord 等多平台接入