处理天气推送,加入debug日志
This commit is contained in:
@@ -234,8 +234,13 @@ class WeatherPlugin(MessagePluginInterface):
|
|||||||
|
|
||||||
async def _execute_daily_push(self):
|
async def _execute_daily_push(self):
|
||||||
"""执行全量推送 (基于 ID 聚合)"""
|
"""执行全量推送 (基于 ID 聚合)"""
|
||||||
self.LOG.info("🚀 执行每日推送...")
|
self.LOG.info("🚀 [Weather] 开始执行每日推送任务...")
|
||||||
|
|
||||||
|
if not self.bot:
|
||||||
|
self.LOG.warning("⚠️ [Weather] Bot 实例未初始化,无法发送消息!(若本次推送失败,请先在群里发送任意消息激活机器人)")
|
||||||
|
|
||||||
subs = self.redis_manager.get_all_subscriptions()
|
subs = self.redis_manager.get_all_subscriptions()
|
||||||
|
self.LOG.info(f"📋 [Weather] 共获取到 {len(subs)} 条订阅记录")
|
||||||
if not subs: return
|
if not subs: return
|
||||||
|
|
||||||
# 1. 按 [city_id] 聚合 (真正的去重)
|
# 1. 按 [city_id] 聚合 (真正的去重)
|
||||||
@@ -244,21 +249,28 @@ class WeatherPlugin(MessagePluginInterface):
|
|||||||
for key, sub in subs.items():
|
for key, sub in subs.items():
|
||||||
cid = sub.get('city_id')
|
cid = sub.get('city_id')
|
||||||
cname = sub.get('city_name')
|
cname = sub.get('city_name')
|
||||||
if not cid: continue # 兼容旧数据或错误数据
|
if not cid:
|
||||||
|
self.LOG.warning(f"⚠️ [Weather] 订阅记录 {key} 缺少 city_id,已跳过")
|
||||||
|
continue # 兼容旧数据或错误数据
|
||||||
|
|
||||||
if cid not in agg_map:
|
if cid not in agg_map:
|
||||||
agg_map[cid] = {"name": cname, "users": []}
|
agg_map[cid] = {"name": cname, "users": []}
|
||||||
agg_map[cid]["users"].append(sub)
|
agg_map[cid]["users"].append(sub)
|
||||||
|
|
||||||
|
self.LOG.info(f"🏙️ [Weather] 聚合为 {len(agg_map)} 个城市待处理: {[info['name'] for info in agg_map.values()]}")
|
||||||
|
|
||||||
# 2. 遍历 ID 获取天气
|
# 2. 遍历 ID 获取天气
|
||||||
for city_id, info in agg_map.items():
|
for city_id, info in agg_map.items():
|
||||||
try:
|
try:
|
||||||
city_name = info["name"]
|
city_name = info["name"]
|
||||||
user_list = info["users"]
|
user_list = info["users"]
|
||||||
|
self.LOG.info(f"🔄 [Weather] 正在处理城市: {city_name} (ID: {city_id}), 关联订阅: {len(user_list)} 个")
|
||||||
|
|
||||||
# 直接用 ID 查天气 (无需 Geo API,极速)
|
# 直接用 ID 查天气 (无需 Geo API,极速)
|
||||||
api_data = await self._fetch_weather_by_id(city_id)
|
api_data = await self._fetch_weather_by_id(city_id)
|
||||||
if not api_data: continue
|
if not api_data:
|
||||||
|
self.LOG.error(f"❌ [Weather] 获取城市 {city_name} (ID: {city_id}) 天气数据失败,跳过此城市推送")
|
||||||
|
continue
|
||||||
|
|
||||||
# 获取 Redis 历史 (Key 也是 ID)
|
# 获取 Redis 历史 (Key 也是 ID)
|
||||||
history_data = self.redis_manager.get_history(city_id)
|
history_data = self.redis_manager.get_history(city_id)
|
||||||
@@ -285,6 +297,8 @@ class WeatherPlugin(MessagePluginInterface):
|
|||||||
if room_id:
|
if room_id:
|
||||||
target_map[target_id]['mentions'].add(sender_id)
|
target_map[target_id]['mentions'].add(sender_id)
|
||||||
|
|
||||||
|
self.LOG.info(f"📤 [Weather] 准备向 {len(target_map)} 个目标(群/人) 发送推送")
|
||||||
|
|
||||||
for target_id, info in target_map.items():
|
for target_id, info in target_map.items():
|
||||||
await asyncio.sleep(0.5)
|
await asyncio.sleep(0.5)
|
||||||
try:
|
try:
|
||||||
@@ -295,14 +309,19 @@ class WeatherPlugin(MessagePluginInterface):
|
|||||||
else:
|
else:
|
||||||
# 私聊:直接发送文本
|
# 私聊:直接发送文本
|
||||||
await self.bot.send_text_message(target_id, final_msg)
|
await self.bot.send_text_message(target_id, final_msg)
|
||||||
|
self.LOG.info(f"✅ [Weather] 推送成功 -> {target_id}")
|
||||||
|
else:
|
||||||
|
self.LOG.error(f"❌ [Weather] Bot未就绪,无法推送给 -> {target_id}")
|
||||||
except Exception as send_e:
|
except Exception as send_e:
|
||||||
self.LOG.error(f"推送给 {target_id} 失败: {send_e}")
|
self.LOG.error(f"❌ [Weather] 推送给 {target_id} 失败: {send_e}")
|
||||||
|
else:
|
||||||
|
self.LOG.warning(f"⚠️ [Weather] 城市 {city_name} 分析后无推送内容(可能是数据缺失)")
|
||||||
|
|
||||||
# 存档
|
# 存档
|
||||||
self._save_today_as_history(city_id, api_data)
|
self._save_today_as_history(city_id, api_data)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.error(f"处理城市ID {city_id} 推送失败: {e}")
|
self.LOG.error(f"❌ [Weather] 处理城市ID {city_id} 发生异常: {e}")
|
||||||
|
|
||||||
# ================= 核心分析算法 (逻辑不变) =================
|
# ================= 核心分析算法 (逻辑不变) =================
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user