<< Назад От Panda-Admin | 1 июля 2024 г.

Inside a Torrents Tracker bot V2


В этом тексте мы расскажем и покажем, из чего состоит обновленная версия Torrents Tracker бота, какие сервисы, библиотеки, решения используются.

LogoHat Development

Введение

Это вторая версия старой записи о том, как устроен наш бот изнутри. Вы можете сравнить старую схему бота с новой и увидеть какие изменения произошли с ним за последнее время. Как расширение функционала повлияло на изменение структуры приложения и работу бота.

В качестве основного языка программирования выбран Python 3.12. Для работы с некоторыми библиотеками, например libtorrent, необходимо использовать другую версию Python, например Python 3.10, так как это последняя версия Python, поддерживаемая данной библиотекой. Но на самом деле уже есть наш собственный билд свежей версии этой бибилиотеки для Python 3.11 и 3.12, но пока он не применятется по причине ограничений версии Python в Serverless функция сервиса Scaleway.

Ниже приведена схема того, как все организовано на серверной части бота в данный момент.

Torrents Tracker Bot Schema V2

Описание схемы

Для работы с Телеграмом используется callback подход, это значит, что после старта сервиса с ботом, он регистрируется доменное имя на сервере Телеграма. Затем уже Телеграм шлет запросы именно по этому адресу. В качестве адреса у нас используется наш домен - red-panda-dev.xyz, с поддоменом, для удобства доступа.

Когда пользователь стартует бота, либо выполняет любую команду - на зарегистрированный ранее адрес приходит POST запрос с информацией о действии пользователя. Этот запрос вначале попадает на reverse proxy, мы используем Nginx.

Nginx, на основе прописанных в нем конфигураций, пропускает запрос дальше, на API сервис. Для API сервиса мы используем Flask - неплохой, проверенный временем мини-фреймворк. API сервис верифицирует запрос, сериализирует и передает дальше в очередь задач Телеграм бота.

Для работы с API ботов в Телеграм мы используем библиотеку - aiogram. Она позволяет удобно работать с ботом, хранить состояние диалогов пользователя, активно поддерживается сообществом. Логика бота получает обработанное сообщение, ищет подходящую под команду логику и выполняет ее, если надо - обращается к базе данных, либо создает задание, к примеру, на обработку ссылки на торрент файл.

После того как пользователь начал работать с ботом - информация о нем добавляется в нашу базу данных - PostgreSQL v16. В базе данных хранится ID пользователя, для того что бы была возможность инициировать отправку сообщения со стороны бота и для привязки торрент файлов к конкретному пользователю.

Различные дополнительные данные хранятся в кеше, используется Redis. В частности там хранятся данные о состоянии диалога пользователя, последние активные действия с ботом.

Для работы с отложенными задачами настроены и работают serverless functions. Данные функции получают информацию из очереди с задачами. Задачи в которую отправляет основной сервер. В качестве очереди для задач используется SQS.

В некоторых задачах требуется сохранение торрент файлов для последующей их обработки, для этих целей используется S3-подобное хранилище. Оно предоставляет быстрый доступ и неограниченный объем для хранения файлов.

Serverless функции

Основная работа по сбору информации о торрентах, парсингу истоничков и сети лежит на Serverless функциях. Все функции написаны на Python 3.10 - 3.11. Это дешевый, масштабируемый и легко настраиваемый инструмент для работы. Аналоги данного сервиса есть у всех крупных облачных провайдеров.

Основным инициализатором задач является Tasker - функция которая запускается по расписанию каждые N-часов и создает сообщения-тригеры для остальных функций.

Отсльаные функции тригерется сообщениями из SQS очереди, оттуда же получая основные данные для работа. Если данных для выполнения задачи не хватает - функция обращается к основному API для получения дополнительных данных, например, таких как адрес для прокси, User-Agent для хэдера и т.п.

Функции и их задачи:

  1. RSS Parser - Функция занимается парсингом RSS лент и обновляемых страниц со свежими торрентами (если RSS отсутствует).
  2. RSS Explorer - Функция занимается извлечением метеданных торента из сети. Она запускает торрент клиент, передает в него magnet-link или же торрент и ждет информацию о данном торрент.
  3. Page Parser - Функция служит для сбора скачивания торрента со страницы, когда пользователь добавил ее в отслеживание. Она скачивает торрент, кладет в базу данных и уже другая функция собирает информацию о данном торренте, сравнивает ее с прошлой версией и, если произошли изменения в размере, кол-ве файлов и т.д. - оповещает юзера о свежей версии отслеживаемой раздачи. После того как торрент-файл или magnet-link скачаны, данная функция отправляет тригер-сообщение для Torrent Explorer функции запуская ее для обработки свежего торрента.
  4. Torrent Explorer - Занимается проверкой отслеживаемых торрентов, получая метаданные раздач и отправляя их в бэкэнд.
  5. Torrent Converter - Единственной задачей данной функции является конвертация торрент файла или magnet-link пользователя в торрент файл и magnet-link.
  6. DHT Crawler - Функция отвечает за сбор адресов и хэш-индексов торрентов в DHT сети. Полученные данные она так же отправляет в бэкэнд для хранения и последующей обработки.
  7. DHT Explorer - Функция получает ранее найденные хэш-индексы торрентов, IP адреса и пытается по ним выкачать метаданные торрента.
Scaleway serverless functions

Аналитические дашборды

Абсолютно новым модулем в системе является дашборд с аналитикой и статистикой работы бота и функций - Apache Superset. Это довольной гибкий и мощный инструмент для визуализации данных хранящихся в БД. Визуализированные в нем данные позволяют лучше понять работоспособность парсеров и акивность пользователей при работе с различными функциями бота.

Веб страница

О добавлении веб-поиска мы писали ранее, как он устроен:
После добавления торрента в базу данных, из его имени удаляются все специальные символы и различный мусор (некоторые трекеры автоматически добавляют в названия своих раздач). Очищенная строка сохраняется в отдельную колонку в базе данных и затем уже по ней осуществляется поиск при помощи триграм. Для улучшения пользовательского опыта применяется соритровка по степени совпадения строки запроса и строки в базе данных. Степень схожести запроса и данных определяется при помощи функции strict_word_similarity которую предоставляет модуль pg_trgm.

strict_word_similarity - Возвращает число, представляющее наибольшую степень схожести между набором триграмм в первой строке и любым непрерывным фрагментом упорядоченного набора триграмм во второй строке. Так как триграммы не пересекают слова, эта функция фактически выдаёт наибольшую степень схожести между первой строкой и любой непрерывной последовательностью слов во второй строке.
PostgreSQL search logic

Fin

Недавно в бот были добавлены дополнительные языки для общения с пользователем. Теперь бот умеет отвечать на 6 языках:

  1. English
  2. French
  3. Spanish
  4. Russian
  5. Belarusian
  6. Ukrainian

Для перевода мы используем сервис Crowdin. Вы можете помочь нам добавить больше переводов или улучшить уже имеющиеся - нажмите здесь для перехода в сервис и примите участие в переводе.

Для разработки мы используем Git для контроля версий и сервис Github для хранения кодовой базы. Внизу немного статистики из наших репозиторием, Superset и CMS (этот веб сайт) не включены.


Присоединяйтесь к нашему боту сегодня и поднимите свой опыт работы с торрентами на новый уровень: @torrents_tracker_bot и попробуйте наш веб-поиск торрентов.