From be09c6384fe1c802fbd62915e8ee0ab9b51b6002 Mon Sep 17 00:00:00 2001
From: "2569718930@qq.com" <2569718930@qq.com>
Date: Sun, 8 Feb 2026 18:13:03 +0800
Subject: [PATCH] feat: add multi-source weather data collector for
OpenWeatherMap, Visual Crossing, and NOAA METAR, integrating it for bot use.
---
bot_listener.py | 22 +++++++++++++++-------
src/data_collection/weather_sources.py | 8 ++++++--
2 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/bot_listener.py b/bot_listener.py
index 64d04181..93818b90 100644
--- a/bot_listener.py
+++ b/bot_listener.py
@@ -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📊 Open-Meteo 7天预测")
+ msg_lines.append(f"\n📊 Open-Meteo 3天预测")
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🏛️ MGM 官方实测 ({mgm_curr.get('station_name', 'Ankara')})")
- 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🏛️ MGM 官方实测 ({mgm_curr.get('station_name', 'Ankara Esenboğa')})")
+ 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", "")
diff --git a/src/data_collection/weather_sources.py b/src/data_collection/weather_sources.py
index 188a6a34..6d7adeab 100644
--- a/src/data_collection/weather_sources.py
+++ b/src/data_collection/weather_sources.py
@@ -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. 每日预报