Skip to content

TG Bot парсит RSS-ленты новостей и выводит новости подписчикам

Notifications You must be signed in to change notification settings

kaevdokimov/tg-rss

Repository files navigation

📰 TG-RSS - Telegram RSS Reader Bot

CI/CD Pipeline

Telegram-бот для чтения RSS-лент с использованием Apache Kafka в качестве брокера сообщений. Бот предоставляет удобный интерфейс для подписки на новостные источники и получения автоматических уведомлений.

🚀 Основные возможности

  • 📰 Чтение RSS-лент - поддержка любых RSS-источников
  • 🔔 Автоматические уведомления - мгновенное получение свежих новостей
  • 📱 Интерактивный интерфейс - удобное управление через inline-кнопки
  • 🚀 Быстрый старт - подписка на популярные источники одним нажатием
  • 📖 Интерактивный туториал - пошаговое обучение работе с ботом
  • 📋 Гибкое управление подписками - добавление и удаление источников
  • Оптимизация ресурсов - работает на серверах с ограниченными ресурсами (1 CPU, 1GB RAM)
  • 🚀 Высокая производительность - асинхронная обработка с использованием Apache Kafka
  • 🗄️ Надежное хранение - PostgreSQL для хранения данных
  • 💾 Сохранение данных - данные сохраняются между деплоями
  • 🐳 Простое развертывание - полная поддержка Docker
  • 📊 Аналитика новостей - автоматический анализ и группировка новостей в темы (модуль "Карта дня")
  • 🤖 Умные отчеты - автоматическая отправка аналитических отчетов в Telegram

🏗️ Архитектура

RSS Sources → RSS Poller → Kafka (news-items) → News Processor → PostgreSQL + Telegram Users

Компоненты системы:

  1. RSS Poller

    • Периодически опрашивает RSS-источники
    • Отправляет новые новости в топик Kafka news-items
  2. News Processor

    • Асинхронно обрабатывает сообщения из Kafka
    • Сохраняет новости в базу данных PostgreSQL
    • Отправляет уведомления подписанным пользователям
  3. Telegram Bot

    • Предоставляет пользовательский интерфейс
    • Управление подписками и настройками

Топики Kafka:

  • news-items - входящие новости от RSS источников
  • news-notifications - уведомления для пользователей (резервный канал)

🛠️ Технологический стек

  • Go - основной язык разработки (1.25+)
  • Python 3.13 - аналитический модуль "Карта дня"
  • PostgreSQL - реляционная база данных
  • Apache Kafka - высокопроизводительный брокер сообщений
  • Telegram Bot API - интеграция с мессенджером
  • Docker & Docker Compose - контейнеризация и оркестрация
  • gofeed - библиотека для парсинга RSS/Atom
  • Scikit-learn, HDBSCAN, NLTK - машинное обучение и обработка текста (Python модуль)

🚀 Быстрый старт

Предварительные требования

  • Docker и Docker Compose
  • Go 1.25+ (только для локальной разработки)
  • Токен Telegram бота от @BotFather

Требования к ресурсам сервера

Минимальные требования для работы:

  • CPU: 1 ядро
  • RAM: 1 ГБ
  • Disk: 15 ГБ

Система оптимизирована для работы на серверах с ограниченными ресурсами.

Настройка окружения

  1. Клонируйте репозиторий:

    git clone https://github.com/kaevdokimov/tg-rss.git
    cd tg-rss
  2. Создайте и настройте файл .env:

    cp .env.example .env
  3. Отредактируйте .env файл, указав ваши настройки:

    # Telegram Bot Token (обязательно)
    TELEGRAM_API_KEY=your_telegram_bot_token_here
    
    # Telegram Bot Token для аналитических отчетов (опционально)
    # Отдельный бот для отправки отчетов анализа новостей
    TELEGRAM_SIGNAL_API_KEY=your_signal_bot_token_here
    
    # Настройки базы данных
    POSTGRES_HOST=db
    POSTGRES_PORT=5432
    POSTGRES_USER=postgres
    POSTGRES_PASSWORD=your_secure_password
    POSTGRES_DB=news_bot
    
    # Дополнительные настройки
    TZ=Europe/Moscow
    TIMEOUT=60
    LOG_LEVEL=INFO
    
    # Настройки Kafka
    KAFKA_BROKERS=kafka:29092
    KAFKA_NEWS_TOPIC=news-items
    KAFKA_NOTIFY_TOPIC=news-notifications
    
    # Настройки парсера контента новостей
    CONTENT_SCRAPER_INTERVAL=1   # интервал парсинга контента в минутах (по умолчанию: 2)
    CONTENT_SCRAPER_BATCH=60     # размер батча для парсинга контента (по умолчанию: 20)
    CONTENT_SCRAPER_CONCURRENT=6 # количество параллельных запросов (по умолчанию: 6)
    
    # Настройки аналитического модуля (Python)
    ANALYZER_SCHEDULE_TIMES=3:00,9:00,12:00,15:00,21:00  # расписание запуска анализа
    RUN_ON_STARTUP=false  # запуск анализа при старте контейнера

Запуск с Docker Compose

Для быстрого старта всех компонентов выполните:

# Запуск всех сервисов в фоновом режиме
docker-compose up -d

# Просмотр логов в реальном времени
docker-compose logs -f

Локальная разработка

  1. Запустите зависимости (Kafka и PostgreSQL):

    docker-compose up -d kafka zookeeper db
  2. Запустите приложение локально:

    go run main.go

🔍 Мониторинг и отладка

Kafka UI

Примечание: Kafka UI отключен по умолчанию для экономии ресурсов. Для включения раскомментируйте секцию kafka-ui в docker-compose.yml.

После включения доступен по адресу: http://localhost:8080

  • Просмотр топиков и сообщений
  • Мониторинг производительности
  • Управление партициями и репликами

Полезные команды для отладки

# Просмотр списка топиков
docker exec -it kafka kafka-topics --bootstrap-server localhost:29092 --list

# Просмотр сообщений в топике новостей
docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:29092 --topic news-items --from-beginning

# Просмотр логов бота
docker-compose logs -f bot

📈 Преимущества архитектуры

  • Масштабируемость - возможность запуска нескольких экземпляров компонентов
  • Надежность - сообщения сохраняются в Kafka и не теряются при сбоях
  • Изоляция - RSS парсинг и отправка сообщений разделены
  • Фильтрация - отправляются только подписанным пользователям
  • Производительность - асинхронная обработка новостей через брокер сообщений
  • Оптимизация ресурсов - работает на серверах с ограниченными ресурсами
  • Сохранение данных - данные сохраняются между деплоями
  • Улучшенный UX - интерактивный туториал и быстрый старт для новых пользователей
  • Умная обработка ошибок - понятные сообщения об ошибках для пользователей
  • Адаптивный rate limiting - автоматическая обработка ограничений Telegram API
  • Тестирование - unit-тесты для критичных компонентов

🎯 Использование

📱 Удобная навигация с кнопками

После команды /start бот показывает улучшенное приветствие с описанием возможностей:

  • 🚀 Быстрый старт - подписка на популярные источники одним нажатием (для новых пользователей)
  • 📖 Туториал - интерактивное обучение работе с ботом (для новых пользователей)
  • 📰 Последние новости - получить последние 10 новостей
  • 📋 Мои источники - просмотреть все доступные источники
  • Добавить источник - добавить новый RSS-источник
  • 📝 Мои подписки - управление подписками
  • Помощь - справка по командам

🚀 Быстрый старт

Для новых пользователей доступна функция "Быстрый старт", которая позволяет:

  • Подписаться на популярные источники одним нажатием
  • Подписаться на все источники сразу (кнопка "✅ Подписаться на все")
  • Увидеть статус подписки (подписан/не подписан)

Также доступна подписка на все источники из меню "📋 Мои источники" - кнопка "✅ Подписаться на все".

📖 Интерактивный туториал

Бот включает интерактивный туториал из 4 шагов:

  1. Что такое RSS News Bot?
  2. Как подписаться на источники?
  3. Управление подписками
  4. Завершение

Доступен через кнопку "📖 Туториал" или команду /tutorial.

⌨️ Текстовые команды

Команда Описание
/start Начать работу с ботом (показывает приветствие и меню)
/tutorial Пройти интерактивный туториал
/add <URL> Добавить RSS-источник
/sources Посмотреть все источники новостей
/subscribe_all Подписаться на все источники сразу
/news Получить последние 10 новостей
/help Показать справку по командам
/tutorial Пройти интерактивный туториал
/stats Статистика бота (только для администратора)

Примечание: Для управления подписками используйте кнопки в меню "📋 Мои источники" и "📝 Мои подписки" - это удобнее, чем команды с ID.

📰 Формат отображения новостей

Новости отображаются в компактном минималистичном формате для удобства чтения:

Список новостей (команда /news):

1. Заголовок новости
   🔗 Источник • время

2. Другой заголовок
   🔗 Источник • время

Иконка ссылки:

  • 🔗 - иконка для ссылки на полную новость

Заголовок отображается обычным текстом для лучшей читаемости, ссылка на новость доступна через иконку 🔗.

Отдельные уведомления (автоматические сообщения):

*Заголовок новости*
Источник • время

Описание новости (если доступно)

Формат времени (компактный):

  • "только что" - менее минуты
  • "N мин" - менее часа (например: "28 мин")
  • "N ч" - менее суток (например: "2 ч")
  • "N дн" - менее недели (например: "3 дн")
  • Дата в формате ДД.ММ - для старых новостей (например: "07.12")

🔐 Административные команды

Команда /stats доступна только для администратора и показывает:

  • Общее количество новостей в базе данных
  • Количество новостей за сегодня
  • Количество новостей за вчера
  • Общее количество пользователей (подписчиков)

Доступ: Только для администратора (ChatID: 234501916)

📰 Примеры RSS-источников

# Популярные новостные источники
/add https://lenta.ru/rss/google-newsstand/main/
/add https://ria.ru/export/rss2/index.xml?page_type=google_newsstand
/add https://rssexport.rbc.ru/rbcnews/news/30/full.rss
/add https://tass.ru/rss/v2.xml
/add http://government.ru/all/rss/

🐳 Docker команды

# Запуск
make up

# Остановка
make down

# Перезапуск
make restart

# Просмотр логов
make logs

# Подключение к контейнеру
make console

📁 Структура проекта

tg-rss/
├── bot/                    # Telegram бот логика
│   ├── handlers.go         # Обработчики команд
│   ├── callback_handlers.go # Обработчики callback-запросов
│   ├── keyboards.go        # Клавиатуры для интерфейса
│   ├── rss_poller.go       # Опрос RSS источников
│   ├── news_processor.go  # Обработка новостей
│   ├── message_processor.go # Обработка сообщений из Kafka
│   ├── error_handler.go    # Обработка ошибок Telegram API
│   ├── error_handler_test.go # Тесты обработки ошибок
│   ├── rate_limiter.go     # Rate limiting для отправки сообщений
│   ├── rate_limiter_test.go # Тесты rate limiter
│   └── msg.go              # Форматирование сообщений
├── config/                 # Конфигурация приложения
├── db/                     # Работа с базой данных
├── kafka/                  # Kafka producer/consumer
├── monitoring/            # Метрики и логирование
├── rss/                    # RSS парсинг
├── news-analyzer-python/   # Аналитический модуль "Карта дня" (Python)
│   ├── src/                # Исходный код Python модуля
│   │   ├── config/         # Конфигурация
│   │   ├── db/             # Подключение к БД
│   │   ├── fetcher/        # Получение новостей
│   │   ├── preprocessor/   # Предобработка текста
│   │   ├── analyzer/       # Векторизация и кластеризация
│   │   ├── narrative/      # Построение нарративов
│   │   ├── reporter/       # Генерация отчетов
│   │   └── utils/          # Утилиты
│   ├── storage/            # Отчеты и логи
│   ├── Dockerfile          # Docker образ Python модуля
│   ├── requirements.txt    # Python зависимости
│   └── README.md           # Документация модуля
├── docker-compose.yml      # Docker Compose конфигурация
├── Dockerfile              # Docker образ приложения
├── go.mod                  # Go зависимости
├── main.go                 # Точка входа
└── Makefile                # Команды для разработки

🔧 Разработка

Локальная разработка

# Установка зависимостей
go mod download

# Запуск локально (требуется PostgreSQL)
go run main.go

Тестирование

Проект включает unit-тесты для основных компонентов:

# Запуск всех тестов
go test ./...

# Запуск тестов с подробным выводом
go test ./... -v

# Запуск тестов с покрытием
go test ./... -cover

# Запуск тестов конкретного пакета
go test ./bot/...

Доступные тесты:

  • config - тесты конфигурации (52.9% покрытие)
  • bot - тесты rate limiter, error handler, GlobalRateLimiter, форматирования сообщений (7.3% покрытие)
  • rss - тесты парсинга RSS (41.7% покрытие)
  • monitoring - тесты метрик и логирования (94.7% покрытие)

Покрытие тестами: ~32.4% (среднее по проекту)

📊 Мониторинг и метрики

Проект включает встроенную систему мониторинга и метрик:

  • Метрики RSS: количество опросов, обработанных элементов, ошибок
  • Метрики Kafka: произведенные и потребленные сообщения, ошибки
  • Метрики Telegram: отправленные сообщения, команды, ошибки
  • Метрики БД: количество запросов и ошибок

Kafka UI

Примечание: Kafka UI отключен по умолчанию для экономии ресурсов. Для включения раскомментируйте секцию в docker-compose.yml.

Kafka UI предоставляет веб-интерфейс для мониторинга:

  • URL: http://localhost:8080 (после включения)
  • Возможности: просмотр топиков, сообщений, метрик

Логирование

Проект использует структурированное логирование с уровнями:

  • DEBUG - отладочная информация
  • INFO - информационные сообщения
  • WARN - предупреждения
  • ERROR - ошибки

Уровень логирования можно настроить через переменную окружения LOG_LEVEL.

📊 Аналитический модуль "Карта дня"

Проект включает Python-модуль для автоматического анализа новостей:

  • Автоматический анализ - группировка новостей в темы с помощью машинного обучения
  • Топ-5 нарративов дня - выявление основных тем за последние 24 часа
  • Автоматические отчеты - отправка аналитических отчетов в Telegram
  • Исторические данные - сохранение результатов анализа в БД для последующего анализа
  • Гибкое расписание - настраиваемое расписание запуска (по умолчанию: 5 раз в день)

Быстрый старт

# Просмотр логов аналитического модуля
make analyzer-logs

# Ручной запуск анализа
make analyzer-run

# Тест подключения к БД
make analyzer-test

Подробная документация: news-analyzer-python/README.md

📚 Дополнительная документация

⚙️ Оптимизация ресурсов

Проект оптимизирован для работы на серверах с ограниченными ресурсами:

  • Kafka: 512MB RAM, 0.5 CPU, JVM Heap 384MB
  • Zookeeper: 256MB RAM, 0.3 CPU, JVM Heap 128MB
  • PostgreSQL: 256MB RAM, 0.2 CPU
  • Retention: 24 часа (экономия ~85% места на диске)
  • Сжатие: snappy для экономии места

Система автоматически адаптируется к ограничениям ресурсов.

🔒 Сохранение данных

Все данные сохраняются между деплоями:

  • ✅ PostgreSQL данные (пользователи, новости, подписки)
  • ✅ Kafka данные (offsets, логи)
  • ✅ Zookeeper данные (метаданные)

Volumes не удаляются при деплое благодаря использованию именованных Docker volumes.

🐛 Известные проблемы и решения

Проблема: Не приходят новые новости

Исправлено: Добавлена фильтрация старых новостей и проверка дубликатов

Проблема: При подключении приходят все старые новости

Исправлено: Новости старше 24 часов не отправляются, проверка отправленных новостей

Проблема: Данные теряются при деплое

Исправлено: Volumes сохраняются, флаг -v убран из CI/CD

Проблема: Ошибка "Too Many Requests: retry after 52833"

Исправлено: Реализована адаптивная обработка rate limiting с автоматическим увеличением интервала между сообщениями. При получении ошибки с большим временем ожидания (>1 часа) система устанавливает интервал 1 минута между сообщениями, что позволяет постепенно отправлять новости без полной блокировки. После успешных отправок интервал постепенно уменьшается до базового значения (50ms).

📝 Лицензия

MIT License

🤝 Вклад в проект

  1. Fork репозитория
  2. Создайте feature branch (git checkout -b feature/amazing-feature)
  3. Commit изменения (git commit -m 'Add amazing feature')
  4. Push в branch (git push origin feature/amazing-feature)
  5. Откройте Pull Request

📞 Поддержка

Если у вас есть вопросы или предложения, создайте Issue в репозитории.

About

TG Bot парсит RSS-ленты новостей и выводит новости подписчикам

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors 2

  •  
  •