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
-
RSS Poller
- Периодически опрашивает RSS-источники
- Отправляет новые новости в топик Kafka
news-items
-
News Processor
- Асинхронно обрабатывает сообщения из Kafka
- Сохраняет новости в базу данных PostgreSQL
- Отправляет уведомления подписанным пользователям
-
Telegram Bot
- Предоставляет пользовательский интерфейс
- Управление подписками и настройками
- 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 ГБ
Система оптимизирована для работы на серверах с ограниченными ресурсами.
-
Клонируйте репозиторий:
git clone https://github.com/kaevdokimov/tg-rss.git cd tg-rss -
Создайте и настройте файл
.env:cp .env.example .env
-
Отредактируйте
.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 up -d
# Просмотр логов в реальном времени
docker-compose logs -f-
Запустите зависимости (Kafka и PostgreSQL):
docker-compose up -d kafka zookeeper db
-
Запустите приложение локально:
go run main.go
Примечание: 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 шагов:
- Что такое RSS News Bot?
- Как подписаться на источники?
- Управление подписками
- Завершение
Доступен через кнопку "📖 Туториал" или команду /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)
# Популярные новостные источники
/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/# Запуск
make up
# Остановка
make down
# Перезапуск
make restart
# Просмотр логов
make logs
# Подключение к контейнеру
make consoletg-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 отключен по умолчанию для экономии ресурсов. Для включения раскомментируйте секцию в
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
- Основной README - этот файл
- Аналитический модуль -
news-analyzer-python/README.md - Деплой модуля -
news-analyzer-python/README_DEPLOY.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
✅ Исправлено: Реализована адаптивная обработка rate limiting с автоматическим увеличением интервала между сообщениями. При получении ошибки с большим временем ожидания (>1 часа) система устанавливает интервал 1 минута между сообщениями, что позволяет постепенно отправлять новости без полной блокировки. После успешных отправок интервал постепенно уменьшается до базового значения (50ms).
MIT License
- Fork репозитория
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Откройте Pull Request
Если у вас есть вопросы или предложения, создайте Issue в репозитории.