From 7707c8db7de3af40611f7ee9d0744dd34b9c99df Mon Sep 17 00:00:00 2001
From: "2569718930@qq.com" <2569718930@qq.com>
Date: Wed, 25 Feb 2026 23:02:48 +0800
Subject: [PATCH] feat: add betting range, METAR data age, and OM realtime
fallback
---
bot_listener.py | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/bot_listener.py b/bot_listener.py
index 1a8a3803..dccb3c6b 100644
--- a/bot_listener.py
+++ b/bot_listener.py
@@ -787,25 +787,27 @@ def start_bot():
max_p = metar.get("current", {}).get("max_temp_so_far") if metar else None
max_p_time = metar.get("current", {}).get("max_temp_time") if metar else None
obs_t_str = "N/A"
+ metar_age_min = None # METAR 数据年龄(分钟)
main_source = "METAR" if metar else "MGM"
if metar:
obs_t = metar.get("observation_time", "")
try:
if "T" in obs_t:
- # 处理 ISO 格式 2026-02-08T09:46:00.000Z
from datetime import datetime, timezone, timedelta
dt = datetime.fromisoformat(obs_t.replace("Z", "+00:00"))
- # 转换为当地时间
utc_offset = open_meteo.get("utc_offset", 0)
local_dt = dt.astimezone(timezone(timedelta(seconds=utc_offset)))
obs_t_str = local_dt.strftime("%H:%M")
+ # 计算数据年龄
+ now_utc = datetime.now(timezone.utc)
+ metar_age_min = int((now_utc - dt).total_seconds() / 60)
elif " " in obs_t:
obs_t_str = obs_t.split(" ")[1][:5]
else:
obs_t_str = obs_t
except:
- obs_t_str = obs_t[:16] # 备选逻辑
+ obs_t_str = obs_t[:16]
elif mgm:
m_time = mgm.get("current", {}).get("time", "")
if "T" in m_time:
@@ -816,9 +818,18 @@ def start_bot():
m_time = m_time.split(" ")[1][:5]
obs_t_str = m_time
+ # 数据年龄标注
+ age_tag = ""
+ if metar_age_min is not None:
+ if metar_age_min >= 60:
+ age_tag = f" ⚠️{metar_age_min}分钟前"
+ elif metar_age_min >= 30:
+ age_tag = f" ⏳{metar_age_min}分钟前"
+
max_str = ""
if max_p is not None:
- settled_val = round(max_p)
+ import math
+ settled_val = math.floor(max_p + 0.5)
max_str = f" (最高: {max_p}{temp_symbol}"
if max_p_time:
max_str += f" @{max_p_time}"
@@ -867,12 +878,16 @@ def start_bot():
elif cover_code == "OVC" or (cover_code == "" and mgm_cloud is not None and mgm_cloud <= 8):
wx_summary = "☁️ 阴天"
elif mgm_cloud is not None:
- # 纯数字回退
cloud_names = {0: "☀️ 晴", 1: "🌤️ 晴", 2: "🌤️ 少云", 3: "⛅ 散云", 4: "⛅ 散云", 5: "🌥️ 多云", 6: "🌥️ 多云", 7: "☁️ 阴", 8: "☁️ 阴天"}
wx_summary = cloud_names.get(mgm_cloud, "")
wx_display = f" {wx_summary}" if wx_summary else ""
- msg_lines.append(f"\n✈️ 实测 ({main_source}): {cur_temp}{temp_symbol}{max_str} |{wx_display} | {obs_t_str}")
+ msg_lines.append(f"\n✈️ 实测 ({main_source}): {cur_temp}{temp_symbol}{max_str} |{wx_display} | {obs_t_str}{age_tag}")
+
+ # Open-Meteo 实时温度补充(当 METAR 数据超过 30 分钟时显示)
+ om_current_temp = open_meteo.get("current", {}).get("temp")
+ if om_current_temp is not None and metar_age_min is not None and metar_age_min >= 30:
+ msg_lines.append(f" 🌐 Open-Meteo 实时参考: {om_current_temp}{temp_symbol}(更新更快,仅供参考)")
if mgm:
m_c = mgm.get("current", {})