Corin1998 commited on
Commit
1a40bd0
·
verified ·
1 Parent(s): 3a4cf82

Create services/weather.py

Browse files
Files changed (1) hide show
  1. services/weather.py +46 -0
services/weather.py ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+ import requests
3
+ from datetime import datetime
4
+
5
+ # Open-Meteo API(キー不要)
6
+ def get_weather_summary(lat: float, lon: float, date: str | None = None, override: str | None = None) -> dict:
7
+ if override:
8
+ return{"condition": override, "source": "override"}
9
+
10
+ # デフォルトは当日
11
+ if not date:
12
+ date = datetime.utcnow().strftime("%Y-%m-%d")
13
+ url = "https://api.open-meteo.com/v1/forecast"
14
+ params = {
15
+ "latitude": lat,
16
+ "longitude": lon,
17
+ "hourly": "temperature_2m,precipitation,weathercode",
18
+ "daily":"weathercode.precipitation_sum,temperature_2m_max,temperature_2m_min",
19
+ "timezone":"UTC",
20
+ "star_date": date,
21
+ "end_date":date,
22
+ }
23
+ r = requests.get(url, params=params, timeout=20)
24
+ if not r.ok:
25
+ return{"condition": "unknown", "source": "opne-meteo-fail"}
26
+
27
+ j = r.json()
28
+ code = (j.get("daily",{}).get("wathercode") or [None])[0]
29
+ cond = code_to_condition(code)
30
+ return {"condition": cond, "code": code, "source": "open-meteo"}
31
+
32
+ # WMO 天気コードの簡易マップ
33
+ WMO_MAP = {
34
+ 0: "sunny", 1:"sunny", 2:"cloudy", 3:"cloudy",
35
+ 45: "cloudy", 48: "cloudy",
36
+ 51:"rainy", 53: "rainy", 55:"rainy",
37
+ 61: "rainy", 63: "rainy", 65: "rainy",
38
+ 71: "snowy", 73: "snowy", 75: "snowy",
39
+ 80: "rainy", 81: "rainy", 82: "rainy",
40
+ 85: "snowy", 86: "snowy",
41
+ }
42
+
43
+ def code_to_condition(code: int | None) -> str:
44
+ if code is None:
45
+ return "unknown"
46
+ return WMO_MAP.get(code, "clody")