Skip to content

OpenClaw API 集成完全指南

OpenClaw 提供丰富的 API 接口,可以与其他系统集成,实现更强大的自动化能力。本文详细介绍如何调用外部 API、处理响应数据、构建集成方案。

一、工具概述

API 集成能力

  • HTTP 请求:GET、POST、PUT、DELETE 等
  • 数据处理:JSON、XML、文本解析
  • 认证方式:API Key、OAuth、Bearer Token
  • 错误处理:超时、重试、降级

基本用法

javascript
// 使用 web_fetch 获取网页内容
web_fetch(
  url="https://api.example.com/data",
  extractMode="text",
  maxChars=5000
)

// 使用 exec 调用 curl
exec(
  command="curl -X GET https://api.example.com/data -H 'Authorization: Bearer TOKEN'",
  capture_output=True
)

二、实战案例 1:天气数据集成

场景说明

集成天气 API,获取实时天气数据并用于日常报告。

完整实现

javascript
// 1. 调用天气 API
weather_result = exec(
  command=`curl -s "https://wttr.in/驻马店?format=j1"`,
  capture_output=True
).stdout

// 2. 解析 JSON 数据
weather_data = JSON.parse(weather_result)

// 3. 提取关键信息
current = weather_data.current_condition[0]
forecast = weather_data.weather[0]

weather_report = \`
🌤️ 驻马店天气

当前温度:\${current.temp_C}°C
天气状况:\${current.weatherDesc[0].value}
风速:\${current.windspeedKmph} km/h
湿度:\${current.humidity}%

今日最高:\${forecast.maxtempC}°C
今日最低:\${forecast.mintempC}°C

建议:\${getWeatherAdvice(current, forecast)}
\`

// 4. 发送报告
message(
  action="send",
  channel="feishu",
  target="chat_team",
  message=weather_report
)

// 天气建议函数
function getWeatherAdvice(current, forecast) {
  const temp = parseInt(current.temp_C)
  if (temp < 10) return "天气寒冷,注意保暖"
  if (temp > 30) return "天气炎热,注意防暑"
  if (current.weatherDesc[0].value.includes("雨")) return "有雨,记得带伞"
  return "天气适宜,适合户外活动"
}

输出示例

🌤️ 驻马店天气

当前温度:15°C
天气状况:晴
风速:12 km/h
湿度:45%

今日最高:23°C
今日最低:11°C

建议:天气适宜,适合户外活动

三、实战案例 2:邮件 API 集成

场景说明

集成邮件服务 API,实现邮件自动发送和接收。

完整实现

javascript
// 邮件发送函数
async function sendEmail(to, subject, body, attachments=[]) {
  const payload = {
    to,
    subject,
    html: body,
    attachments
  }
  
  const result = exec(
    command=`curl -X POST https://api.mailgun.net/v3/messages \\
      -s \\
      -u "api:\${process.env.MAILGUN_API_KEY}" \\
      -d "from=通知 <noreply@example.com>" \\
      -d "to=\${to}" \\
      -d "subject=\${subject}" \\
      -d "html=\${encodeURIComponent(body)}"`,
    capture_output=True
  )
  
  const response = JSON.parse(result.stdout)
  
  if (response.id) {
    console.log(`✅ 邮件发送成功:\${response.id}`)
    return { success: true, id: response.id }
  } else {
    console.log(`❌ 邮件发送失败:\${response.message}`)
    return { success: false, error: response.message }
  }
}

// 使用示例
await sendEmail(
  "user@example.com",
  "每日报告 - 2026-03-19",
  \`
  <h1>每日报告</h1>
  <p>今日完成 12 篇文章发布</p>
  <p>总字数:115,000+ 字</p>
  \`,
  ["./report.pdf"]
)

四、实战案例 3:GitHub API 集成

场景说明

集成 GitHub API,自动创建 Issue、管理仓库。

完整实现

javascript
// 创建 GitHub Issue
async function createIssue(repo, title, body, labels=[]) {
  const payload = {
    title,
    body,
    labels
  }
  
  const result = exec(
    command=`curl -X POST https://api.github.com/repos/\${repo}/issues \\
      -s \\
      -H "Authorization: Bearer \${process.env.GITHUB_TOKEN}" \\
      -H "Accept: application/vnd.github.v3+json" \\
      -d '\${JSON.stringify(payload)}'`,
    capture_output=True
  )
  
  const issue = JSON.parse(result.stdout)
  
  if (issue.number) {
    console.log(`✅ Issue 创建成功:#\${issue.number}`)
    console.log(`链接:\${issue.html_url}`)
    return issue
  } else {
    console.log(`❌ 创建失败:\${issue.message}`)
    return null
  }
}

// 使用示例
await createIssue(
  "leiclaw/ai-knowledge-base",
  "添加新教程:浏览器自动化",
  \`
  ## 内容概述
  
  新增浏览器自动化实战教程,包含 5 个实战案例。
  
  ## 字数
  
  10,952 字
  
  ## 案例
  
  1. 百度热搜抓取
  2. 自动化表单提交
  3. 网站监控告警
  4. 批量截图工具
  5. 高级技巧
  \`,
  ["教程", "优先级:高"]
)

五、高级技巧

1. 错误处理和重试

javascript
async function fetchWithRetry(url, maxRetries=3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      const result = exec(
        command=`curl -s "\${url}"`,
        capture_output=True,
        timeout=30
      )
      
      if (result.code === 0) {
        return JSON.parse(result.stdout)
      }
    } catch (e) {
      console.log(`重试 \${i+1}/\${maxRetries}`)
      if (i === maxRetries - 1) throw e
      exec(command="sleep 2")
    }
  }
}

2. 批量请求

javascript
async function batchRequest(urls, concurrency=5) {
  const results = []
  
  for (let i = 0; i < urls.length; i += concurrency) {
    const batch = urls.slice(i, i + concurrency)
    const batchResults = await Promise.all(
      batch.map(url => fetchWithRetry(url))
    )
    results.push(...batchResults)
    
    // 避免请求过快
    if (i + concurrency < urls.length) {
      exec(command="sleep 1")
    }
  }
  
  return results
}

3. 数据缓存

javascript
const cache = new Map()

async function cachedFetch(url, ttl=3600000) {
  const cached = cache.get(url)
  
  if (cached && Date.now() - cached.timestamp < ttl) {
    return cached.data
  }
  
  const data = await fetchWithRetry(url)
  cache.set(url, { data, timestamp: Date.now() })
  return data
}

六、常见问题

Q: 如何处理 API 认证?

A:

  1. API Key:放在请求头或查询参数
  2. OAuth:使用授权码获取 access_token
  3. Bearer Token:Authorization: Bearer TOKEN

Q: 如何处理大文件上传?

A: 使用分片上传,避免超时。

Q: 如何限流?

A: 添加请求间隔,使用令牌桶算法。

七、总结

API 集成让 OpenClaw 可以连接外部服务,实现更强大的自动化。


相关资源:

Released under the MIT License.