From ba992f7d80a628f9dcfedf6e5eaaeceb5c6159f7 Mon Sep 17 00:00:00 2001
From: "2569718930@qq.com" <2569718930@qq.com>
Date: Fri, 6 Mar 2026 10:40:39 +0800
Subject: [PATCH] feat: Introduce automated Telegram trade alert push and add
target date option to `/tradealert` command.
---
bot_listener.py | 32 ++++++++++++++++++++++++++++----
src/utils/telegram_push.py | 10 +++++++---
2 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/bot_listener.py b/bot_listener.py
index 1b79c77a..8057bb05 100644
--- a/bot_listener.py
+++ b/bot_listener.py
@@ -242,16 +242,36 @@ def start_bot():
def tradealert_preview(message):
"""Preview the current trade-alert push payload for one city."""
try:
- parts = message.text.split(maxsplit=1)
+ parts = message.text.split()
if len(parts) < 2:
bot.reply_to(
message,
- "用法: /tradealert ankara",
+ "用法: /tradealert ankara 或 /tradealert ankara 2026-03-06",
+ parse_mode="HTML",
+ )
+ return
+
+ target_date = None
+ city_tokens = parts[1:]
+ if city_tokens:
+ last_token = city_tokens[-1].strip()
+ try:
+ from datetime import datetime as _dt
+ _dt.strptime(last_token, "%Y-%m-%d")
+ target_date = last_token
+ city_tokens = city_tokens[:-1]
+ except Exception:
+ pass
+
+ city_input = " ".join(city_tokens).strip().lower()
+ if not city_input:
+ bot.reply_to(
+ message,
+ "用法: /tradealert ankara 或 /tradealert ankara 2026-03-06",
parse_mode="HTML",
)
return
- city_input = parts[1].strip().lower()
city_name = ALIASES.get(city_input)
if not city_name and city_input in CITY_REGISTRY:
@@ -278,20 +298,24 @@ def start_bot():
bot.send_message(
message.chat.id,
- f"📡 正在生成 {city_name.title()} 的异动预警预览...",
+ f"📡 正在生成 {city_name.title()} 的异动预警预览"
+ f"{f' ({target_date})' if target_date else ''}...",
)
payload = build_trade_alert_for_city(
city_name,
config,
force_refresh=True,
+ target_date=target_date,
)
preview = ((payload.get("telegram") or {}).get("zh") or "").strip()
trigger_count = int(payload.get("trigger_count") or 0)
severity = str(payload.get("severity") or "none")
+ resolved_date = payload.get("target_date")
header = (
f"[TEST PREVIEW] city={city_name} "
+ f"date={resolved_date} "
f"severity={severity} triggers={trigger_count}"
)
diff --git a/src/utils/telegram_push.py b/src/utils/telegram_push.py
index f8852f36..fd2d43ca 100644
--- a/src/utils/telegram_push.py
+++ b/src/utils/telegram_push.py
@@ -3,6 +3,7 @@ import json
import os
import threading
import time
+from datetime import datetime
from typing import Any, Dict, List, Optional
from loguru import logger
@@ -138,13 +139,16 @@ def build_trade_alert_for_city(
city: str,
config: Dict[str, Any],
force_refresh: bool = False,
+ target_date: Optional[str] = None,
) -> Dict[str, Any]:
from web.app import _analyze
from src.analysis.market_alert_engine import build_trading_alerts
from src.data_collection.polymarket_client import build_city_market_snapshot
city_weather = _analyze(city, force_refresh=force_refresh)
- target_date = city_weather.get("local_date")
+ resolved_target_date = target_date or city_weather.get("local_date")
+ if resolved_target_date:
+ datetime.strptime(resolved_target_date, "%Y-%m-%d")
proxy = (
(config.get("polymarket", {}) or {}).get("proxy")
@@ -152,7 +156,7 @@ def build_trade_alert_for_city(
)
market_snapshot = build_city_market_snapshot(
city=city,
- target_date=target_date,
+ target_date=resolved_target_date,
proxy=proxy,
force_refresh=force_refresh,
)
@@ -162,7 +166,7 @@ def build_trade_alert_for_city(
market_snapshot=market_snapshot,
map_url=map_url,
)
- alert_payload["target_date"] = target_date
+ alert_payload["target_date"] = resolved_target_date
return alert_payload