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

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

Продолжим экспериментировать с 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 и как сделать периодический опрос каждые пять секунд.

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