""" Telegram News Digest — точка входа. Использование: python main.py # Собрать и отправить дайджест python main.py --auth # Авторизация (первый запуск) python main.py --collect # Только собрать (без суммаризации) python main.py --dry-run # Собрать + суммаризировать, но не отправлять """ import argparse import asyncio import logging import sys from pathlib import Path import yaml from collector import MessageCollector from summarizer import Summarizer from delivery import DeliveryManager logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", datefmt="%H:%M:%S", ) logger = logging.getLogger(__name__) def load_config(path: str = "config.yaml") -> dict: """Загрузить конфигурацию.""" config_path = Path(path) if not config_path.exists(): logger.error( f"Конфиг не найден: {path}\n" f"Скопируй config.example.yaml → config.yaml и заполни." ) sys.exit(1) with open(config_path, encoding="utf-8") as f: return yaml.safe_load(f) async def run_auth(config: dict): """Авторизация в Telegram.""" logger.info("🔑 Авторизация в Telegram...") collector = MessageCollector(config) await collector.auth() logger.info("✓ Авторизация завершена. Сессия сохранена.") async def run_digest(config: dict, collect_only: bool = False, dry_run: bool = False): """Основной пайплайн: сбор → суммаризация → доставка.""" # 1. Сбор сообщений logger.info("📥 Сбор сообщений из каналов...") collector = MessageCollector(config) result = await collector.collect() if result.errors: logger.warning(f"Ошибки в {len(result.errors)} каналах:") for ch, err in result.errors.items(): logger.warning(f" {ch}: {err}") if not result.messages: logger.info("📭 Нет новых сообщений. Выход.") return if collect_only: # Вывести сырые сообщения for msg in result.messages[:20]: print(f"\n[{msg.channel_title}] {msg.date.strftime('%H:%M')}") print(msg.text[:200] + ("..." if len(msg.text) > 200 else "")) return # 2. Суммаризация logger.info("🤖 Суммаризация через LLM...") summarizer = Summarizer(config) digest = await summarizer.summarize(result.messages) if dry_run: print("\n" + "=" * 60) print(digest) print("=" * 60) logger.info("(dry-run: дайджест не отправлен)") return # 3. Доставка logger.info("📤 Отправка дайджеста...") delivery = DeliveryManager(config) await delivery.deliver(digest) logger.info("✅ Готово!") def main(): parser = argparse.ArgumentParser(description="Telegram News Digest") parser.add_argument( "--auth", action="store_true", help="Авторизация в Telegram" ) parser.add_argument( "--collect", action="store_true", help="Только сбор (без суммаризации)" ) parser.add_argument( "--dry-run", action="store_true", help="Без отправки (вывод в консоль)" ) parser.add_argument( "--config", default="config.yaml", help="Путь к конфигу" ) args = parser.parse_args() config = load_config(args.config) if args.auth: asyncio.run(run_auth(config)) else: asyncio.run( run_digest(config, collect_only=args.collect, dry_run=args.dry_run) ) if __name__ == "__main__": main()