Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
nickshtefan
6 лет назад

Модификация бота-лайкера для поддержки новичков

В предыдущей статье я описал как устроен и работает бот mayakovskiy.
Сегодня предлагаю перейти от теории к практике, немного изменить код и некоторые параметры

Приступаем.

  • В текущий момент, бот голосует только за посты, опубликованные через golosio и это жестко прописано в коде. Я хочу добавить возможность указывать любого бенефициара либо же вовсе не указывать никого.

  • Аккаунт @golosio в данный момент раздает лайки пользователям с силой голоса > 100. Я собираюсь добавить возможность указывать минимальную СГ автора и максимальную. В таком случае можно будет настроить бота, чтобы он голосовал, например, за пользователей, у которых СГ больше 3, но меньше 100

  • Количество лайков в сутки также запрограммировано в виде константы. Я бы хотел иметь возможность ставить 100% лайки по любви, без серьезных потерь в батарейке, поэтому я хочу сделать данное значение настраиваемым.

В первую очередь надо форкнуть проект на github, дальше все изменения я буду вносить в свой репозиторий, чтобы не нести мои личные изменения в код проекта, а в случае необходимости

Структура проекта выглядит следующим образом.

Снимок экрана 2018-08-09 в 14.51.44.png

Первым делом добавим новые переменные в файл ENV.js

  • MAX_GOLOS_POWER - максимальное количество СГ пользователя, при котором за него будет отдан голос. По умолчанию выставим значение 0. Это будет означать, что максимального предела нет.
  • VOTE_BY_DAY_WITH_MAX_WEIGHT - максимальное количество голосов с силой 100%, которые будут распределены при помощи бота за сутки. По умолчанию устанавливаем значение в 40 голосов.
  • BENEFICIARY_NAME - определяем бенефициара, который должен быть указан в посте, для того чтобы бот отдал голос за пост. По умолчанию устанавливаем значение null, что означает, что бенефициар не учитывается при голосовании.
  • BENEFICIARY_PROCENT - определяем процент, бенефициарских выплат, по умолчанию 0. Стоит обратить внимание на то, что значение процента необходимо умножать на 100, например 5% бенефициарская выплата будет равна 500.

Для того, чтобы докер применил указанные выше настройки при запуске сервиса надо обновить файл docker-compose.yml, а именно в секцию environment вносим новые переменные, описанные выше, в итоге данная секция должна выглядеть следующим образом.

image.png

Для простоты дальнейшей работы с данным сервисом, я создам файл .env. Добавляем сюда все ENV переменные, описанные в файле ENV.js, теперь при запуске значения будут автоматически подставляться из этого файла.

image.png

Теперь перейдем непосредственно к валидации постов.
Как я писал ранее, валидация происходит в файле Registrator.js
Нас интересует функция _checkAndRegister, как видно из названия именно в ней происходит проверка поста, прежде чем добавить его в очередь к голосованию.

В данной функции идет вызов двух проверок, и, в случае, если обе пройдены успешно, то пост регистрируется в очереди к голосованию. Метод _remoteValidation в данный момент нас не интересует, поскольку это заглушка, поэтому будем рассматривать только _basicValidation, который в свою очередь состоит из трех проверок, рассмотрим _validateBeneficiaries и _validatePower более детально.

_validateBeneficiaries - как видно из названия, данная функция проверяет пост на наличие бенефициара. Также в данной функции происходит проверка на процент бенефициарских выплат.

Добавим сюда дополнительную проверку, сразу после объявления переменной valid. Сверимся, что боту действительно надо проверять наличие бенефициара в посте, а так же, что процент бенефициарской выплаты отличен от 0.
Соответственно, если бенефициар не указан, или не указан минимальный процент бенефициарской выплаты, то пост считается валидным.

image.png

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

image.png

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

image.png

Далее по коду происходит расчет текущей Силы Голоса пользователя, результат вычислений попадает в переменную power.
Добавим еще одну проверку, в которой мы будем сверять Силу Голоса пользователя с максимально допустимой.
Для этого создадим дополнительную переменную checkMaxPower, и в случае, если максимальный порог не установлен, то сразу считаем, что автор прошел проверку, в противном случае, производим проверку Силы Голоса автора и максимально допустимую, указанную в конфиге.
image.png
И добавляем данную проверку в return
image.png

Теперь осталось только использовать значение максимального количества стопроцентных голосов, при раздаче лайков.
Для этого отправляемся в Planner.js

Подключаем описанные выше энвы
image.png

Теперь можно забрать переменную VOTE_BY_DAY_WITH_MAX_WEIGHT из настроек.

image.png

Все, готово, можно перейти к установке.

Я собираюсь использовать самую дешевую виртуалку, которую предоставляет hetzner.

Пропустим часть с регистрацией на hetzner, надеюсь, что это не вызовет каких либо проблем, и перейдем сразу к установке и настройке бота.

Характеристики сервера: 1 CPU, 2GB RAM, 20GB SSD, Ubuntu 18.04

Первым делом нужно подготовить виртуалку к работе, для этого я рекомендую воспользоваться достаточно подробный гайдом от Digital Ocean

После первичной настройки сервера необходимо установить Docker и docker-compose . Подробная инструкция от Digital Ocean по установке Docker.

И по установке Docker-Compose

И так, на данном этапе весь необходимый софт уже установлен и можно приступить непосредственно к установке и настройке бота.

Первым делом склонируем код с git (я клонирую именно свой репозиторий)

shtefan@ubuntu$ git clone git@github.com:NickShtefan/mayakovskiy.git
shtefan@ubuntu$ cd mayakovskiy/

Теперь необходимо заполнить файл .env, с конфигурацией, я буду использовать vim, но вы можете использовать любой текстовый редактор

shtefan@ubuntu:~/mayakovskiy$ vim .env

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

LOGIN=ВАШ ЛОГИН НА ГОЛОСЕ
WIF=ВАШ ПРИВАТНЫЙ ПОСТИНГ КЛЮЧ
MIN_GOLOS_POWER=0 // Мой бот будет голосовать за пользователей с Силой голоса от 0
MAX_GOLOS_POWER=100 // До 100
VOTE_BY_DAY_WITH_MAX_WEIGHT=35 // У бота в распоряжении будет 35 лайков с силой 100%

На этом настройки завершены, можно запустить сервис.

shtefan@ubuntu:~/mayakovskiy$ sudo docker-compose up -d

Данная команда установит все необходимые зависимости, такие как mongodb, nodejs, проведет инициализацию приложения и запустит его.

Successfully built dde3063c0b32
Successfully tagged mayakovskiy_node:latest
WARNING: Image for service node was built because it did not already exist. To rebuild this image you must use docker-compose build or docker-compose up --build.
Creating mongo ... done
Creating node ... done

Теперь давайте убедимся, что сервис запустился и работает.
shtefan@ubuntu:~/mayakovskiy$ sudo docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99011734222c mayakovskiy_node "node ./src/Main.js" 48 seconds ago Up 47 seconds node
50e2701aa788 mongo "docker-entrypoint.s…" 49 seconds ago Up 48 seconds 127.0.0.1:27017->27017/tcp mongo

shtefan@ubuntu:~/mayakovskiy$ sudo docker logs -f 99011734222c
2018-08-10 17:00:02 <1> [info] Start services...
2018-08-10 17:00:02 <1> [info] Start MongoDB...
2018-08-10 17:00:02 <1> [info] MongoDB connection established.
2018-08-10 17:00:02 <1> [info] The MongoDB done!
2018-08-10 17:00:02 <1> [info] Start Registrator...
2018-08-10 17:00:02 <1> [info] The Registrator done!
2018-08-10 17:00:02 <1> [info] Start Planner...
2018-08-10 17:00:02 <1> [info] The Planner done!
2018-08-10 17:00:02 <1> [info] Start services done!
2018-08-10 17:00:02 <1> [info] Main service started!
2018-08-10 17:00:02 <1> [info] BlockSubscribe websocket connection established.
2018-08-10 17:00:03 <1> [log] Empty Post collection, then start sync from block 18711118

На этом все, бот установлен, настроен и работает. Он будет лайкать всех пользователей, вне зависимости от клиента, который они используют и чья Сила Голоса находится в диапазоне от 0 до 100.

В следующей статье я начну описывать какие еще сервисы мы разработали, и как они работают.
Я всегда открыт для конструктивного диалога, со мной можно связаться и обсудить волнующие вас задачи в телеграмме в нашей группе, посвященной разработке клиента golos.io, либо лично.

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

image.png

0
60.576 GOLOS
На Golos с September 2017
Комментарии (15)
Сортировать по:
Сначала старые