feat: add multi-source weather data collector for OpenWeatherMap, Visual Crossing, and NOAA METAR, integrating it for bot use.

This commit is contained in:
2569718930@qq.com
2026-02-08 18:13:03 +08:00
parent accdb5104b
commit be09c6384f
2 changed files with 21 additions and 9 deletions
+15 -7
View File
@@ -273,13 +273,13 @@ def start_bot():
city_now = datetime.now(timezone.utc) + timedelta(seconds=utc_offset)
city_today_str = city_now.strftime("%Y-%m-%d")
msg_lines.append(f"\n📊 <b>Open-Meteo 7天预测</b>")
msg_lines.append(f"\n📊 <b>Open-Meteo 3天预测</b>")
nws = weather_data.get("nws", {})
nws_high = nws.get("today_high")
mgm = weather_data.get("mgm", {})
mgm_high = mgm.get("today_high")
for i, (d, t) in enumerate(zip(dates[:7], max_temps[:7])):
for i, (d, t) in enumerate(zip(dates[:3], max_temps[:3])):
# 跳过无效数据
if t is None:
continue
@@ -312,11 +312,19 @@ def start_bot():
mgm_curr = mgm.get("current", {})
mgm_temp = mgm_curr.get("temp")
if mgm_temp is not None:
msg_lines.append(f"\n🏛️ <b>MGM 官方实测 ({mgm_curr.get('station_name', 'Ankara')})</b>")
msg_lines.append(f" 🌡️ {mgm_temp}°C (湿度: {mgm_curr.get('nem', mgm_curr.get('humidity'))}%)")
msg_lines.append(f" 💨 风速: {mgm_curr.get('wind_speed_kt')}kt")
if mgm_curr.get("rain_24h"):
msg_lines.append(f" 🌧️ 24h降水: {mgm_curr.get('rain_24h')}mm")
# 翻译风向
wind_dir = mgm_curr.get("wind_dir")
dir_str = ""
if wind_dir is not None:
dirs = ["", "东北", "", "东南", "", "西南", "西", "西北"]
dir_str = dirs[int((float(wind_dir) + 22.5) % 360 / 45)] + ""
msg_lines.append(f"\n🏛️ <b>MGM 官方实测 ({mgm_curr.get('station_name', 'Ankara Esenboğa')})</b>")
msg_lines.append(f" 🌡️ {mgm_temp}°C (体感 {mgm_curr.get('feels_like', mgm_temp)}°C)")
msg_lines.append(f" 💧 湿度: {mgm_curr.get('humidity')}%")
msg_lines.append(f" 🌬️ {dir_str}{wind_dir}° / {mgm_curr.get('wind_speed_ms')} m/s")
if mgm_curr.get("rain_24h") is not None:
msg_lines.append(f" 🌧️ 24h 降水: {mgm_curr.get('rain_24h')}mm")
if metar:
icao = metar.get("icao", "")
+6 -2
View File
@@ -339,14 +339,18 @@ class WeatherDataCollector:
if data:
latest = data[0] if isinstance(data, list) else data
# MGM 数据字段映射
# ruzgarHiz 通常为 m/s 或 km/h,根据用户反馈这里使用 m/s 逻辑
ruz_hiz = latest.get("ruzgarHiz", 0)
results["current"] = {
"temp": latest.get("sicaklik"),
"feels_like": latest.get("hissedilenSicaklik") or latest.get("sicaklik"),
"humidity": latest.get("nem"),
"wind_speed_kt": round(latest.get("ruzgarHiz", 0) * 1.94, 1) if latest.get("ruzgarHiz") is not None else None,
"wind_speed_ms": ruz_hiz,
"wind_speed_kt": round(ruz_hiz * 1.94, 1) if ruz_hiz is not None else None, # 如果是 m/s 转 kt
"wind_dir": latest.get("ruzgarYon"),
"rain_24h": latest.get("toplamYagis"),
"time": latest.get("veriZamani"),
"station_name": latest.get("istasyonAd")
"station_name": latest.get("istasyonAd") or latest.get("adi") or latest.get("merkezAd") or "Ankara Esenboğa"
}
# 2. 每日预报