Про устройство бота-лайкера
Привет, нация!
Недавно мы, команда @golosio, запустили бота, голосующего за посты написанные через сайт golos.io. Сегодня я бы хотел открыть исходный код и подробно рассказать про этот инструмент.
Приступим, исходный код данного бота можно найти здесь, ниже представлена общая архитектура данного бота. Я подробно расскажу про каждый отдельный модуль, и их взаимодействие.
Бот написан на node.js, и состоит из нескольких частей. Хочу обратить ваше внимание, что в данном сервисе используются внешние зависимости, например хорошо знакомый вам пакет golos.js. Поскольку данный бот это первая ласточка из множества сервисов, которые мы сейчас разрабатываем, мы в нем используем первую версию core-service. Loop, обозначенный на картинке ниже как раз является частью core-service. В текущий момент core-service уже значительно изменился, и был вынесен в отдельный репозиторий.
Если данная статья будет вам интересна, я приступлю к написанию целой серии статей о том, как мы сейчас перестраиваем архитектуру клиента golos.io, а пока проигнорируем абстракции верхнего уровня и приступим к описанию непосредственно бота.
Общая архитектура выглядит следующим образом.
Registrator
Представляет из себя сервис регистрации новых постов со встроенной системой фильтрации. Также в состав данного модуля встроена система автоматического восстановления при возникновении сбоев.
Разберем каждую часть по отдельности.
Listener работает постоянно, собирая данные приходящие в каждом новом блоке. В случае, если в блоке появляется новый пост, то данные отправляются по цепочке на проверку, во время которой сервис проверяет был ли опубликован пост через golos.io, является ли проверяемый пост первым за сутки от автора, и достаточно ли Силы Голоса у автора. Если пост прошел все необходимые проверки, то он добавляется в БД. Уже сейчас предусмотрена возможность подключать сторонние валидаторы, которые могут быть как отдельно написанной функцией, так и сторонним сервисом. Однако пока подобного рода валидаторы отсутствуют и метод всегда возвращает true.
В случае если что то пошло не так, в сервисе предусмотрено автоматическое восстановление после сбоев. Механизм работает следующим образом. Во время сбора данных из БЧ, помимо всего прочего бот записывает номер последнего обработанного блока. При старте проверяется номер последнего обработанного блока и сравнивается с текущим номером блока. Если данные не совпадают, то бот начинает обрабатывать все пропущенные блоки, до тех пор, пока не дойдет до последнего актуального, после чего продолжается работа в штатном режиме.
Planner
Данный сервис предназначен для агрегации собранных данных, составления плана на день и расчета Силы Голоса с которой бот будет голосовать за посты. Принципиальная схема выглядит следующим образом.
При запуске планировщика происходит проверка на наличие сбоев. Планы создание которых было прервано удаляются, планы которые были выполнены частично продолжат свое выполнение с места остановки. Так же запускается составление нового плана, в процессе чего рассчитывается Сила Голоса, с которой бот будет голосовать за посты и интервалы, с которыми будет происходить голосование и запускается процесс раздачи лайков.
Liker
Пожалуй самая простая часть бота. Данный сервис работает ровно сутки, выставляет лайки, согласно составленному плану, с заранее рассчитанной Силой Голоса и интервалами голосования. После того как голос за пост был отдан, сам пост помечается как “готовый”, как только в плане заканчиваются необработанные посты, сам план также помечается как завершенный.
В следующей статье я расскажу как установить и настроить бота.
Я всегда открыт для конструктивного диалога, со мной можно связаться и обсудить волнующие вас задачи в телеграмме в нашей группе, посвященной разработке клиента golos.io, либо лично.
Голосуйте за мою делегатскую ноду, если вам интересны подобные статьи, а я, вне зависимости от вашего голоса, направлю все свои силы для улучшения и развития проекта Голос.