You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.5 KiB

# -*- coding: utf-8 -*-
"""
===================================
大盘复盘命令
===================================
执行大盘复盘分析生成市场概览报告
"""
import logging
import threading
from typing import List
from bot.commands.base import BotCommand
from bot.models import BotMessage, BotResponse
logger = logging.getLogger(__name__)
class MarketCommand(BotCommand):
"""
大盘复盘命令
执行大盘复盘分析包括
- 主要指数表现
- 板块热点
- 市场情绪
- 后市展望
用法
/market - 执行大盘复盘
"""
@property
def name(self) -> str:
return "market"
@property
def aliases(self) -> List[str]:
return ["m", "大盘", "复盘", "行情"]
@property
def description(self) -> str:
return "大盘复盘分析"
@property
def usage(self) -> str:
return "/market"
def execute(self, message: BotMessage, args: List[str]) -> BotResponse:
"""执行大盘复盘命令"""
logger.info(f"[MarketCommand] 开始大盘复盘分析")
# 在后台线程中执行复盘(避免阻塞)
thread = threading.Thread(
target=self._run_market_review,
args=(message,),
daemon=True
)
thread.start()
return BotResponse.markdown_response(
"✅ **大盘复盘任务已启动**\n\n"
"正在分析:\n"
"• 主要指数表现\n"
"• 板块热点分析\n"
"• 市场情绪判断\n"
"• 后市展望\n\n"
"分析完成后将自动推送结果。"
)
def _run_market_review(self, message: BotMessage) -> None:
"""后台执行大盘复盘"""
try:
from src.config import get_config
from src.notification import NotificationService
from src.market_analyzer import MarketAnalyzer
from src.search_service import SearchService
from src.analyzer import GeminiAnalyzer
config = get_config()
notifier = NotificationService(source_message=message)
# 初始化搜索服务
search_service = None
if config.bocha_api_keys or config.tavily_api_keys or config.brave_api_keys or config.serpapi_keys:
search_service = SearchService(
bocha_keys=config.bocha_api_keys,
tavily_keys=config.tavily_api_keys,
brave_keys=config.brave_api_keys,
serpapi_keys=config.serpapi_keys
)
# 初始化 AI 分析器
analyzer = None
if config.gemini_api_key or config.openai_api_key:
analyzer = GeminiAnalyzer()
# 执行复盘
market_analyzer = MarketAnalyzer(
search_service=search_service,
analyzer=analyzer
)
review_report = market_analyzer.run_daily_review()
if review_report:
# 推送结果
report_content = f"🎯 **大盘复盘**\n\n{review_report}"
notifier.send(report_content, email_send_to_all=True)
logger.info("[MarketCommand] 大盘复盘完成并已推送")
else:
logger.warning("[MarketCommand] 大盘复盘返回空结果")
except Exception as e:
logger.error(f"[MarketCommand] 大盘复盘失败: {e}")
logger.exception(e)