Install
openclaw skills install @thcjp/free-weather-api-tool-freeopenclaw skills install @thcjp/free-weather-api-tool-free本工具为个人用户提供准确的天气查询服务,支持实时天气、未来 7 天预报、空气质量、降水概率、风力风向等完整指标。基于天气数据智能分析,为出行、穿衣、户外活动提供决策建议,并在恶劣天气时主动预警。
免费版聚焦个人日常查询,适合出行规划、习惯养成、生活决策等场景。
| 能力模块 | 描述 | 免费版支持 |
|---|---|---|
| 实时天气 | 当前温度、天气、湿度、风力 | 支持 |
| 多日预报 | 未来 1-7 天预报 | 支持 |
| 空气质量 | AQI、PM2.5、紫外线指数 | 支持 |
| 出行建议 | 基于天气的智能建议 | 支持 |
| 天气预警 | 暴雨、台风、高温等预警 | 支持 |
| 历史天气 | 过去天气数据查询 | 不支持 (升级 PRO) |
| 多城市对比 | 同时对比多个城市 | 不支持 (升级 PRO) |
| 农业气象 | 农业专项预报 | 不支持 (升级 PRO) |
| 天气推送 | 定时推送天气 | 不支持 (升级 PRO) |
用input_params参数进行配置。
输入: 用户提供核心功能执行所需的指令和必要参数。 处理: 解析核心功能执行的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回核心功能执行的响应数据,包含状态码、结果和日志。
input_params参数,支持创建/查询/导出操作用config_options参数进行配置。
输入: 用户提供参数配置与调用所需的指令和必要参数。 处理: 解析参数配置与调用的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回参数配置与调用的响应数据,包含状态码、结果和日志。
config_options参数,支持修改/重置/导入操作用output_format参数进行配置。
输入: 用户提供结果处理与输出所需的指令和必要参数。 处理: 解析结果处理与输出的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回结果处理与输出的响应数据,包含状态码、结果和日志。
output_format参数,支持导出/保存/转换操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:查询城市天气、支持实时天气、空气质量与出行建、面向个人用户的天、气查询助手、提供实时天气、空气质量与智能建、核心能力、城市天气查询、空气质量分析、天气预警提醒、适用场景、出行规划、穿衣建议、户外活动决策、差旅准备、差异化、免费版聚焦单城市、查询与基础建议、适合个人日常使用、适用关键词、天气查询、未来预报等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。用户: "北京今天天气怎么样?"
# ...
助手:
实时天气: 北京当前多云,气温 15°C,体感温度 13°C,西北风 3-4 级,湿度 45%,能见度 10 公里。
# ...
预报概况: 未来 3 天以晴到多云为主,气温逐步回升。
- 今天: 多云转晴,8-18°C
- 明天: 晴,10-20°C
- 后天: 晴,12-22°C
# ...
出行建议:
- 今日早晚温差 10 度,注意及时增减衣物
- 明天紫外线较强 (UV 指数 7),外出请做好防晒措施
- 空气质量一般 (AQI 85),敏感人群建议减少户外活动
用户: "下周去杭州旅游,帮我看看天气"
# ...
助手:
1. 查询杭州未来 7 天天气
2. 重点关注旅行期间 (7月22日-28日):
- 7月22-24日: 多云,25-32°C,适合游玩
- 7月25日: 午后雷阵雨,建议上午安排户外活动
- 7月26-28日: 晴热高温,35°C+,注意防暑
3. 行李建议:
- 防晒霜、遮阳帽
- 轻薄透气衣物
- 雨伞 (应对午后雷阵雨)
- 充足饮用水
用户: "广州天气如何?"
# ...
助手:
实时天气: 广州当前暴雨,气温 22°C,体感温度 20°C,东南风 5-6 级,湿度 90%,能见度 2 公里。
# ...
重点提示:
暴雨橙色预警: 预计今天 12-18 时有 50-80 毫米降雨
# ...
出行建议:
- 尽量避免外出,如需外出请远离低洼地区
- 驾车请减速慢行,注意积水路段
- 请关注最新天气预警信息
以下场景天气查询免费版不适合处理:
需要数据分析、报表生成、统计洞察、数据可视化时使用。不适用于非本工具能力范围的需求。
# 查询北京实时天气
curl -s "wttr.in/Beijing?format=%l:+%c+%t+%h+%w&lang=zh"
# ...
# 详细预报
curl -s "wttr.in/Beijing?T&lang=zh"
query_weather(location="北京", days=3, details=true)
参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
| location | 城市或地区名称 | 必填 |
| days | 预报天数 | 1 |
| details | 是否返回详细 (空气质量等) | false |
import requests
# ...
def query_weather(location, days=1, details=False):
"""查询天气"""
url = f"https://wttr.in/{location}"
params = {
"format": "j1", # JSON 格式
"lang": "zh",
}
resp = requests.get(url, params=params, timeout=30)
data = resp.json()
# ...
current = data.get("current_condition", [{}])[0]
forecast = data.get("weather", [])[:days]
# ...
return {
"location": location,
"query_time": current.get("localObsDateTime"),
"current": {
"temperature": current.get("temp_C"),
"feels_like": current.get("FeelsLikeC"),
"weather": current.get("lang_zh", [{}])[0].get("value"),
"humidity": current.get("humidity"),
"wind_speed": current.get("windspeedKmph"),
"wind_direction": current.get("winddir16Point"),
},
"forecast": [
{
"date": f.get("date"),
"temp_high": f.get("maxtempC"),
"temp_low": f.get("mintempC"),
"hourly": f.get("hourly", []),
}
for f in forecast
],
}
# ~/.weather-tool-free.yaml
api:
primary: wttr.in
fallback: open-meteo
timeout: 30
language: zh
# ...
user:
default_location: 北京
units: metric
timezone: Asia/Shanghai
# ...
output:
format: text # text | json
include_suggestions: true
include_alerts: true
REPORT_TEMPLATE = """实时天气: {location}当前{weather},气温{temp}°C,体感温度{feels_like}°C,{wind_direction}{wind_speed},湿度{humidity}%,能见度{visibility}公里。
# ...
预报概况: 未来{days}天{forecast_summary}。
# ...
重点提示:
{highlights}
# ...
出行建议:
{suggestions}
"""
# ...
def render_report(data):
return REPORT_TEMPLATE.format(
location=data["location"],
weather=data["current"]["weather"],
temp=data["current"]["temperature"],
feels_like=data["current"]["feels_like"],
wind_direction=data["current"]["wind_direction"],
wind_speed=data["current"]["wind_speed"],
humidity=data["current"]["humidity"],
visibility=data["current"].get("visibility", "10"),
days=len(data["forecast"]),
forecast_summary=summarize_forecast(data["forecast"]),
highlights=generate_highlights(data),
suggestions=generate_suggestions(data),
)
def generate_suggestions(data):
"""根据天气生成出行建议"""
suggestions = []
current = data["current"]
# ...
# 降水建议
precip_prob = int(current.get("precip_prob", 0))
if precip_prob > 70:
suggestions.append("建议携带雨具")
# ...
# 温差建议
for f in data["forecast"]:
diff = int(f["temp_high"]) - int(f["temp_low"])
if diff > 10:
suggestions.append(f"{f['date']} 温差 {diff}°C,建议备好外套")
break
# ...
# 空气质量建议
aqi = int(current.get("aqi", 0))
if aqi > 100:
suggestions.append("空气质量较差,建议佩戴口罩")
elif aqi > 150:
suggestions.append("空气污染严重,敏感人群减少户外活动")
# ...
# 紫外线建议
uv = int(current.get("uv_index", 0))
if uv > 7:
suggestions.append(f"紫外线较强 (UV 指数 {uv}),注意防晒")
# ...
# 风力建议
wind = int(current.get("wind_speed", 0))
if wind > 30:
suggestions.append("风力较大,注意高空坠物,避免户外活动")
# ...
# 温度建议
temp = int(current.get("temperature", 20))
if temp < 0:
suggestions.append("气温低于 0°C,注意防寒保暖")
elif temp > 35:
suggestions.append("气温高于 35°C,注意防暑降温")
# ...
return "\n".join(f"- {s}" for s in suggestions) if suggestions else "- 天气良好,适合正常活动"
使用城市中文名或拼音,避免歧义。
# 推荐
curl "wttr.in/Beijing?lang=zh"
curl "wttr.in/上海?lang=zh"
# ...
# 不推荐 (可能歧义)
curl "wttr.in/shanghai"
天气数据变化不频繁,建议缓存减少请求。
import json
from pathlib import Path
from datetime import datetime, timedelta
# ...
CACHE_DIR = Path.home() / ".weather_cache"
CACHE_DIR.mkdir(parents=True, exist_ok=True)
# ...
def get_with_cache(location, ttl_minutes=30):
cache_file = CACHE_DIR / f"{location}.json"
if cache_file.exists():
data = json.loads(cache_file.read_text())
age = datetime.now() - datetime.fromisoformat(data["cached_at"])
if age < timedelta(minutes=ttl_minutes):
return data["weather"]
# ...
weather = query_weather(location)
cache_file.write_text(json.dumps({
"cached_at": datetime.now().isoformat(),
"weather": weather,
}, ensure_ascii=False, indent=2))
return weather
ALERT_LEVELS = {
"暴雨": {"yellow": "关注", "orange": "重要", "red": "紧急"},
"台风": {"blue": "关注", "yellow": "重要", "orange": "紧急", "red": "极紧急"},
"高温": {"yellow": "关注", "orange": "重要", "red": "紧急"},
"寒潮": {"blue": "关注", "yellow": "重要", "orange": "紧急"},
}
# ...
def format_alert(alert_type, level):
severity = ALERT_LEVELS.get(alert_type, {}).get(level, "未知")
return f"{alert_type}{level}预警 ({severity})"
YYYY-MM-DD 格式尝试使用城市拼音或英文,如 "Shanghai"、"Beijing"。也可使用机场代码如 "PEK"、"PVG"。
实时天气约每 30 分钟更新一次,预报每天更新 2-4 次。
支持全球主要城市,中国地级市及以上基本全覆盖。
免费版支持最多 7 天预报。如需 15 天或更长,可升级 PRO 版本。
数据来自权威气象服务,与主流天气应用精度相当。极端天气请以当地气象部门发布为准。
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| wttr.in | 在线 API | 必需 | 免费,无需 Key |
| Open-Meteo | 在线 API | 备选 | 免费,无需 Key |
| LLM API | 推理服务 | 必需 | 由 Agent 内置 LLM 提供 |
| curl | 命令行工具 | 可选 | 系统自带 |
| Python 3.8+ | 运行时 | 可选 | python.org 下载 |
| requests 库 | Python 库 | 可选 | pip install requests |
# 免费版无需 API Key
# 天气服务均免费提供
# ...
# 可选: 默认位置
export WEATHER_DEFAULT_LOCATION="北京"
export WEATHER_LANGUAGE="zh"
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
{
"success": true,
"data": {
"result": "天气查询免费版处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "free weather api"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}