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

Делаем своего бота для уведомлений на Node-RED для golos.io. Часть вторая, телеграмная.

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

Чтобы проверить изменился ли ID мы добавим на сцену функциональную ноду Switch (русск. Переключатель).

Нода Switch может проверять значение msg.payload и в зависимости от того соблюдается ли заданное условие, перенаправлять поток на определенный выход или не пропускать сообщение дальше вообще. У этой ноды могут быть несколько выходов.

Это эквивалентно чему то подобному на яваскрипте

if(msg.payload == “on”) {
    return msg;
} else if(msg.payload == “off”) {
    return msg;
}

Откройте окно с настройками ноды switch. В качестве имени задайте к примеру “Сменился ID?”, В качестве Property (русск. Свойство) в качестве объекта сравнения выберите “flow.” и имя атрибута задайте lastId (русск. Последний ID).

Кстати обращайте на написание переменных, имен атрибутов. Javascript чувствителен к регистру, иначе говоря “lastId” не равно “lastid”.

Ниже у нас располагаются условия. Сколько условий сравнения у нас, столько и выходов у этой ноды Switch.

В первом условии мы выберем “is null” (русск. является пустым). Дело в том, что при самом первом запуске атрибут flow.lastId еще не будет установлен (пустой). Естественно при первой проверке полученный от сервера ID не будет совпадать с сохраненным, которого вообще нет. В итоге мы бы получили при первом запуске беспочвенное сообщение. Что бы избежать этого мы проверим flow.lastId на null и если null, то ничего не будем слать в telegram.

В самом низу выберите из списка “stopping after first match”. Что означает “останавливаться после первого совпадения”. То есть если у нас переменная flow.lastId еще не установлена, то второе условие мы проверять не будем.

Под боксом с условиями есть кнопка “Add” (русск. Добавить). Добавьте еще одно условие. Во втором условии оператор сравнения выберите “!=” (не равно) и в качестве объекта сравнения выберите msg., а атрибут введите “payload”.

Чтобы сохранить ID мы добавим на сценарий ноду Changе. В настройках этой ноды задайте имя “Сохранить ID в кэше”, а в правилах (Rule) выберите “Set”, в качестве модифицируемого объекта выберите “flow.” и задайте имя атрибута “lastId”. А в качестве источника данных выберите “msg.” и введите атрибут “payload”.

Подсоедините оба выхода ноды Switch на вход ноды Change которая сохраняет последний ID как на иллюстрации.

Мы соединили оба выхода с нодой Change, чтобы в любом случае сохранять ID, если flow.lastId пустая и если она сменилась. Ноду Change “Сохранить ID” никуда подключать не надо, она сделала свое дело.

Собственно осталось только послать сообщение в чат telegram. Для этого надо установить из репозитория нод, ноду для telegram. Для этого в меню выберите “Manage palette”.

Слева палитра сменится панелью управления палитрой. Выберите вкладку “Install” и в строке поиска введите “telegram”. У меня показывает два доступных модуля telegram. Telegrambot и telegrambot-plus. Мы будем использовать вариант без приставки “plus”. Для установки нажмите кнопку Install.

После установки модуля нажмите на панели палитры кнопку Done и пролистайте вниз. Там будут новые ноды для работы с telegram.

Нам понадобится “Telegram Sender” для отсылки сообщений. Добавьте ноду на сценарий.

Теперь нам надо будет создать бота telegram. Как это делать я не буду описывать детально, так как на эту тему есть несчетное количество инструкций. По сути нужен только сам бот. Я в telegram попросил BotFather-а создать нового бота в итоге бот был создан и я получил API токен для бота.

Откройте свойства ноды “Telegram Sender” и нажмите кнопку с карандашом, чтобы добавить бота telegram.

Задайте имя бота и токен. В поля users и chatids введите открывающиеся и закрывающиеся квадратные скобки “[]” (пустой массив).

Нажмите кнопку Add и сохраните настройки бота и настройки ноды.

Чтобы послать сообщение необходим еще и chatId чата с ботом. Для того, чтобы узнать chatId мы сделаем короткую цепочку из ноды “Telegram Receiver” (приемник Telegram) и отладочной ноды Debug. Откройте конфигурационную панель ноды “Telegram Receiver”, задайте имя и выберите из списка ранее сконфигурированного бота.

Подключите оба выхода ноды Telegram Receiver ноды. На первом выходе появляются сообщения от авторизованных пользователей, а на втором выходе от неавторизованных. У нас все неавторизованные.

Задеплойте все, найдите в Telegram вашего бота и начните с ним чат. Пошлите какое нибудь сообщение и посмотрите в отладочном окне Node-RED. Вы должны были получить сообщение.

Собственно осталось только сформировать осмысленное сообщение и отослать его нашему боту.

Добавьте на сценарий ноду Change. Что бы отослать сообщение боту Telegram нужно послать json следующего вида.

{ “chatId”:”191909222”, “type”:”message”, “content”:”Движение в вашем аккаунте”}

Откройте панель свойств новой ноды Change и заполните как на иллюстрации. Соответственно замените ChatID на свой. Строки с действиями добавляются кнопкой “Add” в самом низу.

Первой строкой мы создаем Json, а потом присваиваем необходимые атрибуты. Сохраните изменения и подключите ноды как на иллюстрации ниже. Не забудьте изменить chatId на ID вашего чата.

Чтобы не ждать милостей от природы и новых изменений в своем аккаунте можно добавить отладочную ноду Inject и подключить ее к ноде Change с именем “Сохранить ID в кэше”. В свойствах ноды вместо timestamp выберите string и введите значение “1”.

Нажав на кнопку этой ноды Inject мы выставим flow.lastId в 1 и при следующем опросе сервера нам в любом случае придет сообщение.

Теперь задеплойте все и нажмите на ноде Inject которая сбрасывает flow.chatId, а потом на первой ноде Inject.

Вы должны были получить сообщение в ваш чат с ботом.

Теперь если нажимать кнопку на первой ноде Inject ничего не будет происходить, пока не будет изменений в вашем аккаунте.

Последним штрихом сделаем периодический опрос сервера. Для этого рядом с нодой Change с именем “get_account_history(ropox)” добавьте из палитру ноду Delay. Подключите вход ноды Delay к выходу ноды Change и вход ноды Change с выходом ноды Delay. Задержку можно оставить как есть 5 секунд. Получился цикл с задержкой 5 секунд в теле цикла.

Задеплойте все и нажмите на кнопку первой ноды Inject. Осталось только дождаться изменений в аккаунте или для симуляции сбрасывайте lastId второй нодой Inject.

В итоге сценарий выглядит следующим образом.

А это результат в telegram.

В следующем блоге о Node-RED я думаю продолжить тему расширив посылаемое сообщение дополнительной информацией и попутно думаю ввести фильтрацию событий.

Кстати, чтобы повысить качество статьи я раздам 20 золотых за дельные замечания.

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