Продолжим экспериментировать с Node-RED и попробуем сделать свой извещатель о новых отданных голосах за ваши посты или о новых комментариях. Я пользуюсь ботом для Telegram, очень удобно, но почему бы не сделать свой личный.
Дисклеймер. Я конечно только чуть более недели на голосе, не во всем еще сам разобрался, но чтобы показать возможности Node-RED думаю того, что я наскреб в поиске будет достаточно. Возможно я буду делать что то неоптимально и может быть неверно. Если что поправьте меня, что бы я не распространял неверные сведения.
В начале немного теории. Во первых нам понадобится возможность опросить golos.io, появились ли новые комментарии или голоса за ваш пост. К счастью есть REST API для голоса, для этого можно подключиться к серверу по вебсокету (websocket) и слать запросы и получать ответы в виде json структур. Так как Node-RED создан на основе javascript движка Node.js то совершенно естественно, что Node-RED поддерживает вебсокеты, а json вообще нативен для javascript-а и само собой для Node-RED.
Доступ к API голоса производится по следующему URL
wss://ws.golos.io
Чтобы опросить историю аккаунта я буду использовать метод get_account_history
. Этот метод получает три параметра. Имя аккаунта, в моем случае “ropox”, потом стартовый ID в истории и последний параметр - количество элементов истории которые нам вернет сервер. По этому адресу можно попробовать JSON API. В ответ сервер возвращает список с элементами истории. Каждый элемент имеет свой уникальный ID для заданного аккаунта. Он то нам и пригодится. Если второй и третий параметры задать как “-1” и “0”, то метод вернет самый последний элемент истории. Для нашего извещателя мы будем периодически опрашивать последний элемент истории, проверять не изменился ли ID и если да, то будем извещать о новом событии.
JSON запрос выглядит следующим образом.
{"id":21,"method":"get_account_history","params":["ropox","-1","0"]}
Ну что же, приступим. Для начала создадим новый сценарий (Flow).
И переименуем его в “Вестник Голоса”.
Из палитры слева добавьте входную (input) ноду Inject, функциональную ноду Change и исходящую (output) ноду Websocket. И соедините как на иллюстрации.
Откройте свойства средней, Change ноды и введите наш json и для наглядности задайте имя ноды, к примеру “get_account_history(ropox)”.
Теперь откройте свойства ноды websocket. В поле Type выберите “Connect to”. В строке с URL, нажмите на кнопку слева, с карандашом, чтобы добавить новое websocket подключение.
В новом окне введите URL API “wss://ws.golos.io” и сохраните новое подключение нажав кнопку Add .
Задайте имя для ноды WebSocket и сохраните все.
В итоге нажав кнопку на ноде Inject мы можем отослать запрос на сервер. Но нам нужно также получить ответ и обработать его. Для этого добавим на сценарий входную ноду Websocket
В свойства выберите также тип ноды “Connect to”, URL выберите из списка ранее созданное подключение и введите имя “golos.io API”.
Websocket нода на выходе выдает msg объект, у которого payload содержит ответ сервера в виде json структуры. Для удобства мы преобразуем json в javascript обеъект. Для этого из палитры добавим функциональную ноду Json, которая этим и занимается. Она преобразовывает json в javascript объект и наоборот, преобразовывает полученный на вход javascript объект в json.
Следующим шагом мы извлечем ID последнего элемента истории. Ответ сервера выглядит следующим образом.
{
"id": 21,
"result": [
[372, {
"id": "2.17.1704603",
После преобразования json в javascript объект, чтобы извлечь ID (в примере это “372”) мы обратимся к атрибуту result, который содержит массив элементов. В терминах javascript это выглядит как
msg.payload.result[0][0].
Добавьте на сценарий функциональную ноду Change и свойствах введите код выше и задайте осмысленное имя для ноды. Имя задавать необязательно, оно будет сгенерировано Node-RED, но для наглядности я советую задавать свое.
Чтобы протестировать полученный результат добавьте отладочную ноду Debug и соедините все как на иллюстрации.
Задеплойте новый сценарий и нажмите кнопку на ноде Inject.
В отладочном окне Debug справа мы увидим два сообщения. Ответ сервера в виде javascript объекта, по которому можно навигировать мышкой. И второе сообщение нужное нам “374”. Как видно, пока я писал этот текст, ID увеличился с 372 до 374, мне было перечислено вознаграждение в размере 241 GBG. Чему я конечно очень рад :)
Практически совсем без программирования нам удалось опросить сервер golos-а и извлечь нужные данные.
Чтобы не загромождать, я разобью тему на два поста и в следующем блоге опишу как сохранять последний ID и как послать сообщение в чат Telegram и как сделать периодический опрос каждые пять секунд.