Files
tg-digest/main.py
Тимур Абайдулин 9fd7d42c6a init
2026-02-07 14:46:15 +03:00

125 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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()