<< Назад От Panda-Admin | 15 ноября 2023 г.
Внутри Torrents Tracker bot
Введение
Ниже показана примерная схема того, как все устроено с обратной стороны бота.
В качестве основного языка программирования выбран Python 3.11. Для работы с некоторыми библиотеками, например libtorrent, приходится использовать другую версию Python, например Python 3.10, т.к. это самая свежая поддерживаемая версия Python этой библиотекой.
Давайте пройдем по порядку, по всем используемым технологиям.
Для работы с Телеграмом используется callback
подход, это значит, что после старта сервиса с ботом, он регистрируется доменное имя на сервере Телеграма. Затем уже Телеграм шлет запросы именно по этому адресу. В качестве адреса у нас используется наш домен - red-panda-dev.xyz, с поддоменом, для удобства доступа.
Когда пользователь стартует бота, либо выполняет любую команду - на зарегистрированный ранее адрес приходит POST
запрос с информацией о действии пользователя. Этот запрос вначале попадает на reverse proxy
, мы используем Nginx.
Nginx, на основе прописанных в нем конфигураций, пропускает запрос дальше, на API сервис. Для API сервиса мы используем Flask - неплохой, проверенный временем мини-фреймворк. API сервис верифицирует запрос, сериализирует и передает дальше в очередь задач Телеграм бота.
Для работы с API ботов в Телеграм мы используем библиотеку - aiogram. Она позволяет удобно работать с ботом, хранить состояние диалогов пользователя, активно поддерживается сообществом. Логика бота получает обработанное сообщение, ищет подходящую под команду логику и выполняет ее, если надо - обращается к базе данных, либо создает задание, к примеру, на обработку ссылки на торрент файл.
После того как пользователь начал работать с ботом - информация о нем добавляется в нашу базу данных - PostgreSQL. В базе данных хранится ID пользователя, для того что бы была возможность инициировать отправку сообщения со стороны бота и для привязки торрент файлов к конкретному пользователю.
Различные дополнительные данные хранятся в кеше, используется Redis. В частности там хранятся данные о состоянии диалога пользователя, последние активные действия с ботом.
Для работы с отложенными задачами настроены и работают serverless functions
. Данные функции получают информацию из очереди с задачами. Задачи в которую отправляет основной сервер. В качестве очереди для задач используется SQS.
Часть задач выполняется по расписанию, к примеру - проверка статуса прокси, "Proxies checker" на схеме. Доступ к сервисам для проверки статуса торрента осуществляется через socks5 прокси. Периодически запускается задача, которая берет пул прокси и проверяет их статус - открывая через них различные веб сайты с которыми работает наш сервис. Если сайт не открывается - "рейтинг" прокси в базе данных понижается, если же сайт открылся штатно - "рейтинг" прокси растет. Периодически прокси с низким "рейтингом" удаляются. Пополнение списка прокси в данный момент происходит в полу-ручном режиме.
Так же по расписанию выполняется периодическая проверка торрентов - "Page parser". Функция занимается парсингом страниц с торентами и поиском Magnet ссылки или торрент файла.
- Если на странице находит Magnet ссылку - отправляется сообщение для функции "Torrent explorer", которая занимается подключением к торрент сети и извлечением свежих данных о данном торренте.
- Если же на странице есть только торрент файл - функция его скачивает в S3 хранилище и так же создает задание для "Torrent explorer" на скачивание и извлечение данных из торрент сети по данному файлу.
После успешного извлчение данных о торренте из сети, функция "Torrent explorer" отправляет их на API сервис, для обновления информации в базе данных и отправке оповещения пользователю, если произошли какие-либо изменения в торренте.
RSS лента пользователя генерируется автоматически, на основе успешно обработанных торрентов, информация о которых хранится в базе данных.
Fin
Изначально в схеме присутствовал еще один сервис - Celery, но запуск довольно долгих (парсинг на некоторых сайтах отнимает до 2-3 минуты) и объемных (затратных по RAM) задач отнимал слишком много вычислительных ресурсов. Перенос этой логики в функции позволил съэкономить финансы на покупки более мощных серверов, которые бы простаивали большую часть времени, а так же позволил упростить горизонтальное масштабирование. Так же это решило проблему требований к версии Python, все сервисы работают на свежей стабильной версии - 3.11, со всеми ее плюсами. В это же время, функция "Torrent explorer" использует 3.10 из-за ограничений используемых библиотек.
Пример стоимости serverless
функций:
Присоединяйтесь к нашему боту уже сегодня и выведите свой опыт работы с торрентами на новый уровень: @torrents_tracker_bot