# # import logging import asyncio import sys import os from datetime import datetime # Добавляем 'src' в sys.path, чтобы внутренние импорты (e.g., `from core...`) работали sys.path.insert(0, os.path.join(os.path.abspath(os.path.dirname(__file__)), 'src')) from orchestrator import AppOrchestrator from core.settings import settings from core.logging_config import setup_logging from analyzer import DataAnalyzer from utils.telegram_sender import send_telegram_notification # # # description: "Главная точка входа для сервиса мониторинга. Запускается по расписанию (cron)." # postconditions: # - "Парсер запускается, данные сохраняются в БД." # - "Если обнаружены изменения, отправляется отчет в Telegram." # # async def main(): """ Основная асинхронная функция, которая запускает парсер, анализирует данные и отправляет уведомление. """ run_id = datetime.now().strftime("%Y%m%d-%H%M%S") setup_logging(run_id=run_id) logger = logging.getLogger(__name__) logger.info(f"🚀 Запуск сервиса мониторинга. Run ID: {run_id}") try: # 1. Запуск парсера logger.info("Начало этапа парсинга...") orchestrator = AppOrchestrator(settings=settings) orchestrator.run() logger.info("Этап парсинга завершен.") # 2. Анализ данных logger.info("Начало этапа анализа данных...") analyzer = DataAnalyzer() report_message = analyzer.analyze() logger.info("Этап анализа данных завершен.") # 3. Отправка отчета if report_message: logger.info("Обнаружены изменения, отправка отчета в Telegram...") await send_telegram_notification(report_message) else: logger.info("Изменений не найдено, отправка отчета не требуется.") except Exception as e: logger.critical(f"💥 Критическая ошибка в сервисе мониторинга: {e}", exc_info=True) # Попытка отправить уведомление об ошибке try: error_message = f"❗️ Критическая ошибка в сервисе мониторинга\n\n
{e}
" await send_telegram_notification(error_message) except Exception as tg_e: logger.error(f"Не удалось даже отправить уведомление об ошибке в Telegram: {tg_e}") logger.info("✅ Сервис мониторинга завершил работу.") # # description: "Стандартный блок для запуска main() при выполнении скрипта." # if __name__ == "__main__": # Используем asyncio.run() для запуска асинхронной функции main asyncio.run(main()) #