Corin1998's picture
Create services/weather.py
1a40bd0 verified
from __future__ import annotations
import requests
from datetime import datetime
# Open-Meteo API(キー不要)
def get_weather_summary(lat: float, lon: float, date: str | None = None, override: str | None = None) -> dict:
if override:
return{"condition": override, "source": "override"}
# デフォルトは当日
if not date:
date = datetime.utcnow().strftime("%Y-%m-%d")
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": lat,
"longitude": lon,
"hourly": "temperature_2m,precipitation,weathercode",
"daily":"weathercode.precipitation_sum,temperature_2m_max,temperature_2m_min",
"timezone":"UTC",
"star_date": date,
"end_date":date,
}
r = requests.get(url, params=params, timeout=20)
if not r.ok:
return{"condition": "unknown", "source": "opne-meteo-fail"}
j = r.json()
code = (j.get("daily",{}).get("wathercode") or [None])[0]
cond = code_to_condition(code)
return {"condition": cond, "code": code, "source": "open-meteo"}
# WMO 天気コードの簡易マップ
WMO_MAP = {
0: "sunny", 1:"sunny", 2:"cloudy", 3:"cloudy",
45: "cloudy", 48: "cloudy",
51:"rainy", 53: "rainy", 55:"rainy",
61: "rainy", 63: "rainy", 65: "rainy",
71: "snowy", 73: "snowy", 75: "snowy",
80: "rainy", 81: "rainy", 82: "rainy",
85: "snowy", 86: "snowy",
}
def code_to_condition(code: int | None) -> str:
if code is None:
return "unknown"
return WMO_MAP.get(code, "clody")