From c5093e78c968ed465b5632e25a41983ebc9ab65b Mon Sep 17 00:00:00 2001 From: AmandaloveYang <2569718930@qq.com> Date: Sat, 14 Feb 2026 15:22:10 +0800 Subject: [PATCH] fix: rain detection false positive and emoji confusion --- bot_listener.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/bot_listener.py b/bot_listener.py index f9bf47f2..1d9d728b 100644 --- a/bot_listener.py +++ b/bot_listener.py @@ -1,21 +1,22 @@ import sys import os from datetime import datetime -import telebot -from loguru import logger +from typing import List, Dict, Any, Optional +import telebot # type: ignore +from loguru import logger # type: ignore # 确保项目根目录在 sys.path 中 project_root = os.path.dirname(os.path.abspath(__file__)) if project_root not in sys.path: sys.path.insert(0, project_root) -from src.utils.config_loader import load_config -from src.data_collection.weather_sources import WeatherDataCollector -from src.data_collection.city_risk_profiles import get_city_risk_profile, format_risk_warning +from src.utils.config_loader import load_config # type: ignore +from src.data_collection.weather_sources import WeatherDataCollector # type: ignore +from src.data_collection.city_risk_profiles import get_city_risk_profile, format_risk_warning # type: ignore def analyze_weather_trend(weather_data, temp_symbol): """根据实测与预测分析气温态势,增加峰值时刻预测""" - insights = [] + insights: List[str] = [] metar = weather_data.get("metar", {}) open_meteo = weather_data.get("open-meteo", {}) @@ -100,7 +101,7 @@ def analyze_weather_trend(weather_data, temp_symbol): if is_breakthrough: insights.append(f"🌡️ 异常高温:最热的时间已经过了,但温度还是比预报高,降温可能会来得比较晚。") # 如果实测已经接近"任一"主流预报的最高温 (使用 min_forecast_high) - elif max_so_far and max_so_far >= min_forecast_high - 0.5: + elif max_so_far and min_forecast_high is not None and max_so_far >= min_forecast_high - 0.5: insights.append(f"✅ 今天最热已过:温度已经到了预报最高值附近,接下来会慢慢降温了。") else: # 虽然时间过了,但离最高温还有差距 @@ -154,12 +155,23 @@ def analyze_weather_trend(weather_data, temp_symbol): # 5. 特殊天气现象 wx_desc = metar.get("current", {}).get("wx_desc") + mgm_rain = mgm.get("current", {}).get("rain_24h") or 0 if wx_desc: - if any(x in wx_desc.upper() for x in ["RA", "DZ", "RAIN", "DRIZZLE"]): - insights.append(f"🌧️ 在下雨:雨水蒸发会吸收热量,温度很难涨上去。") - elif any(x in wx_desc.upper() for x in ["SN", "SNOW", "GR", "GS"]): + wx_upper = wx_desc.upper().strip() + wx_tokens = wx_upper.split() + # 用分词匹配,避免 "METAR" 中的 "RA" 误判 + rain_codes = {"RA", "DZ", "-RA", "+RA", "-DZ", "+DZ", "TSRA", "SHRA", "FZRA", "RAIN", "DRIZZLE"} + snow_codes = {"SN", "GR", "GS", "-SN", "+SN", "BLSN", "SNOW"} + fog_codes = {"FG", "BR", "HZ", "MIST", "FOG", "FZFG"} + + if rain_codes & set(wx_tokens): + if mgm_rain > 0: + insights.append(f"🌧️ 在下雨:已累计 {mgm_rain}mm,雨水蒸发会吸收热量,温度很难涨上去。") + else: + insights.append(f"🌦️ 有零星小雨:METAR 探测到轻微降水,但雨量极小(MGM 记录 0mm),对升温影响有限。") + elif snow_codes & set(wx_tokens): insights.append(f"❄️ 在下雪/冰雹:温度会一直低迷。") - elif any(x in wx_desc.upper() for x in ["FG", "BR", "HZ", "FOG", "MIST"]): + elif fog_codes & set(wx_tokens): insights.append(f"🌫️ 有雾/霾:阳光被挡住了,湿度也高,升温会很慢。") # 6. 风向分析 (仅在未进入降温期前显示) @@ -431,7 +443,7 @@ def start_bot(): dir_str = dirs[int((float(wind_dir) + 22.5) % 360 / 45)] + "风 " msg_lines.append(f" [MGM] 🌡️ 体感: {m_c.get('feels_like')}°C | 💧 {m_c.get('humidity')}%") - msg_lines.append(f" [MGM] 🌬️ {dir_str}{wind_dir}° ({m_c.get('wind_speed_ms')} m/s) | 🌧️ {m_c.get('rain_24h') or 0}mm") + msg_lines.append(f" [MGM] 🌬️ {dir_str}{wind_dir}° ({m_c.get('wind_speed_ms')} m/s) | 💧 降水: {m_c.get('rain_24h') or 0}mm") # 新增:气压和云量 extra_parts = []