LI YAO'S BLOG

有趣的人生, 一半家长里短, 一半山川胡海

OpenClaw 天气查询技能开发实录

OpenClaw 天气查询技能开发实录

背景

2026 年 3 月 6 日,我在 OpenClaw Control UI 中向我的 AI 助手提出了一个需求:帮我开发一个获取天气信息的 Skills,主要使用 Open-Meteo API。

这篇文章完整记录了从需求提出到最终实现的整个开发过程,包括技能设计、API 集成、定时任务配置等细节。


需求分析

初始需求

帮我开发一个获取天气信息的 skills,主要使用 https://open-meteo.com/en/docs

核心需求:

  1. 查询实时天气信息
  2. 支持天气预报
  3. 使用 Open-Meteo 免费 API(无需 API key)
  4. 中文输出

扩展需求

在开发过程中,逐步添加了以下功能:

  1. 当日最高/最低温度显示
  2. 每天早上 8:20 自动推送上海天气到 Telegram
  3. 使用 OpenClaw 原生 cron 定时任务

技能开发过程

1. 初始化技能结构

使用 OpenClaw 提供的技能创建工具:

1
2
3
python3 ~/.npm-global/lib/node_modules/openclaw/skills/skill-creator/scripts/init_skill.py weather \
--path ~/.openclaw/workspace/skills \
--resources scripts,references

生成的目录结构:

1
2
3
4
weather/
├── SKILL.md
├── scripts/
└── references/

2. 研究 Open-Meteo API

Open-Meteo 是一个免费的开源天气 API,主要特点:

  • 无需 API key(非商业用途)
  • 全球覆盖
  • 支持当前天气 + 7-16 天预报
  • 小时级数据

核心 API 端点:

1
2
3
4
5
6
7
https://api.open-meteo.com/v1/forecast?
latitude=31.23&
longitude=121.47&
current=temperature_2m,relative_humidity_2m,weather_code&
daily=temperature_2m_max,temperature_2m_min,weather_code&
forecast_days=7&
timezone=auto

3. 编写核心脚本

创建 scripts/get_weather.py,主要功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python3
"""Open-Meteo Weather API Client"""

import argparse
import json
from urllib.request import urlopen, Request

BASE_URL = "https://api.open-meteo.com/v1/forecast"

# 天气变量定义
CURRENT_VARIABLES = [
"temperature_2m",
"relative_humidity_2m",
"apparent_temperature",
"weather_code",
"wind_speed_10m",
"wind_direction_10m",
"pressure_msl",
"cloud_cover",
"visibility",
]

# WMO 天气代码映射
WEATHER_CODES = {
0: "Clear sky",
1: "Mainly clear",
2: "Partly cloudy",
3: "Overcast",
# ... 更多代码
}

def fetch_weather(lat, lon, days=7, timezone="auto"):
"""获取天气数据"""
params = {
"latitude": lat,
"longitude": lon,
"current": ",".join(CURRENT_VARIABLES),
"daily": "weather_code,temperature_2m_max,temperature_2m_min",
"forecast_days": min(max(days, 1), 16),
"timezone": timezone,
}

query_string = "&".join(f"{k}={v}" for k, v in params.items())
url = f"{BASE_URL}?{query_string}"

with urlopen(Request(url), timeout=10) as response:
return json.loads(response.read().decode("utf-8"))

4. 编写技能文档

SKILL.md 包含:

  • 技能描述和触发条件
  • 使用示例和参数说明
  • 常见城市坐标表
  • WMO 天气代码详解
  • 输出格式建议

5. 准备参考资料

城市坐标表 (references/city-coordinates.md)

收录 80+ 主要城市的经纬度:

城市 纬度 经度
北京 39.9042 116.4074
上海 31.2304 121.4737
纽约 40.7128 -74.0060
东京 35.6762 139.6503

天气代码表 (references/weather-codes.md)

WMO 标准天气代码详解,从 0(晴空)到 99(雷暴伴大冰雹)。


功能迭代

迭代 1:添加当日温度范围

用户反馈:

“当前天气”中再帮我加一个指标,当日最高温度和最低温度

修改 format_weather() 函数:

1
2
3
4
5
6
# 添加今日温度范围
if "daily" in data and len(data["daily"].get("time", [])) > 0:
today_max = data["daily"].get("temperature_2m_max", [None])[0]
today_min = data["daily"].get("temperature_2m_min", [None])[0]
if today_max is not None and today_min is not None:
lines.append(f"📈 Today's Range: {today_min}°C ~ {today_max}°C")

输出效果:

1
2
3
4
5
6
7
📍 上海
🕐 2026-03-06 10:15

🌡️ Temperature: 8.8°C
🤔 Feels like: 5.3°C
📈 Today's Range: 5.2°C ~ 10.0°C ← 新增
☁️ Condition: Overcast

迭代 2:创建推送脚本

编写 scripts/daily_weather_push.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 每日天气推送脚本

TELEGRAM_BOT_TOKEN="868082...:AAGhRms7js14DZYAY..."
TELEGRAM_CHAT_ID="8523..."

# 获取天气数据
weather_json=$(python3 get_weather.py --lat 31.2304 --lon 121.4737 --json)

# 解析并构建消息
temp=$(echo "$weather_json" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['current']['temperature_2m'])")
# ...

# 发送 Telegram
curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "{\"chat_id\": \"${CHAT_ID}\", \"text\": \"${message}\"}"

定时任务配置

方案对比

方案 优点 缺点
OpenClaw Cron 控制面板可见、会话集成、推送渠道原生支持 依赖 Gateway
systemd timer 系统级、独立运行 不可见、配置复杂
Linux cron 简单直接 无集成、难管理

用户偏好:优先使用 OpenClaw 原生 cron

创建 OpenClaw Cron 任务

1
2
3
4
5
6
7
8
9
openclaw cron add \
--name "上海天气日报" \
--cron "20 8 * * *" \
--tz "Asia/Shanghai" \
--session isolated \
--message "使用 weather 技能查询上海天气并推送到 Telegram" \
--announce \
--channel telegram \
--to "user:8523121225"

任务配置:

  • Cron 表达式: 20 8 * * *(每天早上 8:20)
  • 时区: Asia/Shanghai
  • 执行模式: isolated(独立会话)
  • 推送渠道: Telegram
  • 任务 ID: 32cf4d06-28ae-4aac-abc8-f9b9b26f410a

管理命令

1
2
3
4
5
6
7
8
9
10
11
# 查看任务
openclaw cron list

# 手动执行
openclaw cron run 32cf4d06-28ae-4aac-abc8-f9b9b26f410a

# 查看历史
openclaw cron runs --id 32cf4d06-28ae-4aac-abc8-f9b9b26f410a

# 暂停任务
openclaw cron update --id <id> --enabled false

最终效果

技能打包

1
2
python3 ~/.npm-global/lib/node_modules/openclaw/skills/skill-creator/scripts/package_skill.py \
~/.openclaw/workspace/skills/weather

生成:weather.skill (9.1 KB)

推送消息示例

1
2
3
4
5
6
7
8
9
10
📍 上海 天气日报
🕐 2026-03-06 10:27

【当前天气】
🌡️ 温度:8.8°C(体感 5.3°C)
📈 今日:5.2°C ~ 10.0°C
☁️ 状况:阴天 ☁️
💧 湿度:65%
💨 风力:12.4 km/h
🌧️ 降水概率:3%

经验总结

技能设计原则

  1. 简洁优先 - SKILL.md 保持精简,详细资料放入 references
  2. 渐进式加载 - 元数据始终加载,正文触发后加载,参考资料按需加载
  3. 可复用性 - 脚本设计支持参数化,方便不同场景调用

Open-Meteo API 使用技巧

  1. 坐标精度 - 小数点后 4 位足够(约 10 米精度)
  2. 时区处理 - 使用 timezone=auto 自动返回本地时间
  3. 速率限制 - 免费用户约 10,000 次/天,足够个人使用

OpenClaw Cron 最佳实践

  1. isolated 模式 - 避免污染主会话历史
  2. announce 推送 - 直接发送到目标渠道,无需额外消息工具
  3. lightContext - 简单任务可启用轻量级上下文

文件清单

1
2
3
4
5
6
7
8
9
10
11
~/.openclaw/workspace/skills/weather/
├── SKILL.md # 技能说明
├── scripts/
│ ├── get_weather.py # 核心脚本
│ └── daily_weather_push.sh # 推送脚本
└── references/
├── city-coordinates.md # 城市坐标表
└── weather-codes.md # 天气代码表

~/.openclaw/cron/jobs.json # Cron 任务配置
/temp/liyao/ # Hexo 文章输出目录

后续优化方向

  1. 多城市支持 - 允许用户配置多个关注城市
  2. 天气预警 - 集成极端天气警报服务
  3. 历史数据 - 使用 Open-Meteo Historical API
  4. 语音播报 - 结合 TTS 生成天气语音简报

参考链接


本文记录了完整的 AI 辅助技能开发流程,从需求分析到最终部署,展示了 OpenClaw 技能开发的最佳实践。

赞赏一杯咖啡