""" Telegram News Digest — точка входа. Использование (через Docker): docker compose run --rm app python main.py --auth # Авторизация docker compose run --rm app python main.py --dry-run # Тест (без отправки) docker compose run --rm app python main.py # Боевой запуск """ import argparse import asyncio import logging import sys from config import get_config 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__) async def run_auth(config: dict): logger.info("🔑 Авторизация в Telegram...") collector = MessageCollector(config) await collector.auth() logger.info("✓ Авторизация завершена. Сессия сохранена в /data/") 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") parser.add_argument("--collect", action="store_true") parser.add_argument("--dry-run", action="store_true") args = parser.parse_args() try: config = get_config() except (KeyError, ValueError) as e: logger.error(f"Ошибка конфигурации: {e}") logger.error("Проверь .env файл (см. .env.example)") sys.exit(1) 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()