Чтобы бот заработал нужно в переменные среды загрузить TELEGRAM_TOKEN
Приложение для отслеживания обновлений контента по ссылкам. При появлении новых событий отправляется уведомление в Telegram.
Проект написан на Java 23
с использованием Spring Boot 3
.
Проект состоит из 2-х приложений:
- Bot
- Scrapper
Для работы требуется PostgreSQL
, Redis
, Kafka
.
Бот поддерживает следующие команды:
/start
— регистрация пользователя./help
— список всех доступных команд./track
— добавление ссылки для отслеживания/untrack
— удаление ссылки из списка отслеживаемых./list
— получение списка всех отслеживаемых ссылок./tag
— выводит все ссылки, у которых есть определенный тег (/tag < tag >)/taglist
— все теги, которые ввел пользователь/untag
— удаление тега у ссылки (/untag < tag > < link >)/filter
— позволяет добавить фильтр/filterlist
— выводит все фильтры пользователя/unfilter
— удаление фильтров (/unfilter < filter >)
Бот общается со Scrapper API через:
ScrapperTgChatClient
— регистрация и удаление чатов.LinkClient
— управление ссылками (добавление, удаление, получение списка ссылок).TagClient
— получение списка тегов, получение ссылки по тегу и удаление тега у ссылки.ScrapperFilterClient
— управление фильтрами (добавление, удаление, получение списка фильтров)
- Бот получает обновления о ссылках через
UpdateController
по HTTP либо черезKafkaUpdateListener
по Kafka. - Scrapper отправляет данные по OpenAPI-контракту.
- Обновления рассылаются чатам через
NotificationService
.
- Бот поддерживает встроенное меню команд в Telegram.
Бот кеширует ответы для следующих команд:
- /tag
- /tag
- /list
🔄 Кеш автоматически сбрасывается в следующих случаях:
- При добавлении или удалении ссылки (/track, /untrack, /untag)
При вызове команд бот сначала проверяет наличие ответа в кеше. Если данные найдены — используется кеш. В противном случае происходит обращение к Scrapper API, и результат сохраняется в кеш.
Scrapper обрабатывает запросы от бота:
- Работа с чатами через
ChatController
. - Работа с ссылками через
LinkController
. - Работа с тегами через
TagController
. - Работа с фильтрами через
FilterController
.
Все контроллеры работают по OpenAPI-контракту.
LinkUpdateScheduler
.- 📡 Источники данных:
- GitHub — через
GitHubClient
- Stack Overflow — через
StackOverflowClient
- GitHub — через
- ⚙️ Обработка полученных данных
- Запрос обновлений
- Для каждого URL запрашивается обновление через открытый API GitHub и StackOverflow
- Фильтрация обновлений
- Определяются подписанные пользователи (чаты), которые отслеживают данный URL.
- Для каждого пользователя применяется его список фильтров:
- Парсинг ответа
- Полученный JSON-ответ анализируется, извлекаются нужные значения.
- Проверка актуальности
- Обновление считается релевантным, если оно произошло после последнего запуска шедулера.
- Формирование уведомлений
- Отобранные обновления, соответствующие фильтрам, отправляются пользователям либо через HTTP, либо через Kafka.
- Запрос обновлений
- ⚙️ Обработка батчей и многопоточность
- Ссылки на обновления запрашиваются партиями (batch) заданного размера. Каждый батч делится между потоками. Количество потоков настраивается через конфигурацию.
tg_chats
— таблица чатов.links
— таблица ссылок.tags
— таблица тегов.filters
— таблица фильтров.filter_list
— таблица фильтров каждого пользователя
💡 Один чат может отслеживать несколько ссылок, а одна ссылка может быть отслеживаемой несколькими чатами.
📌 Каждая ссылка может иметь несколько тегов и фильтров в рамках одного чата.
- Количество пользовательских сообщений в секунду
- График количества активных ссылок в БД по типу (github, stackoverflow)
- p50, p95, p99 времени работы одного scrape по типу (github, stackoverflow)
-
Клонирование репозитория специальной ветки
git clone https://github.com/Delphington/LinterBot.git
-
Перейдите в директорию с docker-конфигурацией:
cd LinterBot
-
Нужно прокинуть специальную переменную среды (Обязательно❗️)
$env:TELEGRAM_TOKEN="YOUR_TOKEN"
3.1. Опционально можно прокинуть другие переменные среды для увеличения лимита запросов
$env:GITHUB_TOKEN="YOUR_GITBUB_TOKEN"
$env:SO_TOKEN_KEY="YOUR_STACKOVERFLOW_TOKEN"
$env:SO_ACCESS_TOKEN="YOUR_STACKOVERFLOW_TOKEN"
-
Запустите сборку и запуск контейнеров:
docker-compose up --build