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. 每日预报