LinterBot
Telegram bot для отслеживания обновлений по ссылкам
Install / Use
/learn @Delphington/LinterBotREADME
📌 Link Tracker
Чтобы бот заработал нужно в переменные среды загрузить 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
Бот общается со Scrapper API через:
ScrapperTgChatClient— регистрация и удаление чатов.LinkClient— управление ссылками (добавление, удаление, получение списка ссылок).TagClient— получение списка тегов, получение ссылки по тегу и удаление тега у ссылки.ScrapperFilterClient— управление фильтрами (добавление, удаление, получение списка фильтров)
📩 Получение обновлений
- Бот получает обновления о ссылках через
UpdateControllerпо HTTP либо черезKafkaUpdateListenerпо Kafka. - Scrapper отправляет данные по OpenAPI-контракту.
- Обновления рассылаются чатам через
NotificationService.
📜 Дополнительно
- Бот поддерживает встроенное меню команд в Telegram.
🧠 Кеширование Redis
Бот кеширует ответы для следующих команд:
- /tag
- /tag <tag>
- /list
🔄 Кеш автоматически сбрасывается в следующих случаях:
- При добавлении или удалении ссылки (/track, /untrack, /untag)
При вызове команд бот сначала проверяет наличие ответа в кеше. Если данные найдены — используется кеш. В противном случае происходит обращение к Scrapper API, и результат сохраняется в кеш.
🗂️ Scrapper
📌 Функционал
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— таблица фильтров каждого пользователя
📌 Схема базы данных
💡 Один чат может отслеживать несколько ссылок, а одна ссылка может быть отслеживаемой несколькими чатами.
📌 Каждая ссылка может иметь несколько тегов и фильтров в рамках одного чата.
🗂️ Метрики
RED
Custom
- Количество пользовательских сообщений в секунду
- График количества активных ссылок в БД по типу (github, stackoverflow)
- p50, p95, p99 времени работы одного scrape по типу (github, stackoverflow)
jvm
🚀 Запуск проекта
-
Клонирование репозитория специальной ветки
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
Related Skills
node-connect
338.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
prose
338.0kOpenProse VM skill pack. Activate on any `prose` command, .prose files, or OpenProse mentions; orchestrates multi-agent workflows.
frontend-design
83.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
sonoscli
338.0kControl Sonos speakers (discover/status/play/volume/group).
