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

Слушаем блокчейн голоса. Один файл, без использования библиотек


Начнем цикл статей, в которой будем работать с блокчейном нашего дорого любимого Golos. С полученными данными будем работать на языке Python. В планах анализировать посты на голосе.

Давайте начнем. Первым делом нам надо из блокчейна получать данные.

Установим библиотеку для работы с websocket'ом.

pip3 install websocket-client

Создаем новый скрипт python.

Создаем соединение с websocket, и объявим функции для открытия соединения(on_open), получения сообщений (on_message) и получения ошибок(on_error).

ws = websocket.WebSocketApp("wss://ws18.golos.io/",
                            on_message = on_message,
                            on_error = on_error,
                            on_close = on_close)

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

ws.on_open = on_open

Допишем:

ws.run_forever()

Эта строчка запускает бесконечный цикл обработки данных WebSocket, он жив пока не жив сам WebSocket.

Теперь реализуем функции.

Первая функция - обработчик открытия соединения.

def on_open(ws):
    ws.send(json.dumps({'id': 1, 'method': 'call', 'jsonrpc':'2.0', 'params': ['database_api', 'set_block_applied_callback', [0]]}))

Реализация по сути не отличается от реализации на JS, за исключением некоторых нюансов.

Функция json.dumps преобразовывает JSON объект в строку JSON формата.

Реализуем функции обработки ошибок и закрытия соединения:

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("### closed ###")

В них вы выводим ошибку и уведомляем о закрытии.

Слушаем вебсокет.

def on_message(ws, message):
    jsons = json.loads(message)
    data_result = jsons.get('result')
    if jsons.get('id') == 1:
        height = int(data_result.get('previous')[0:8], 16)
        ws.send(json.dumps({'id': 2, 'method': 'call', 'jsonrpc':'2.0', 'params': ['operation_history', 'get_ops_in_block', [height, 'false']]}))
    elif jsons.get('id') == 2:
        print(data_result)

Остановимся на функции-обработчике приходящих сообщений.

Мы получаем входящее сообщение в строковом формате.
Его надо преобразовать в json.

jsons = json.loads(message)

Так мы получим массив result, в котором хранятся нужные данные. Проверим id, пришедших данных, если он равен 1, то получаем номер блока и отправим данные снова.

int(data_result.get('previous')[0:8], 16)

data_result.get('previous')[0:8] - получаем первые 8 символов, которые хранятся в previous.

int(str, 16) - переводим в шестнадцетиричную систему счисления - это номер нужного нам блока.
И отправляем данные.

ws.send(json.dumps({'id': 2, 'method': 'call', 'jsonrpc':'2.0', 'params': ['operation_history', 'get_ops_in_block', [height, 'false']]}))

Если id в сообщении равен 2, то это значит, что пришли данные блоков, которые мы будем обрабатывать в следующей статье.

Можете сохранить код в файл с расширением .py и запустить его в консоли через python3.

Листинг кода

Материал подготовлен автором @zheev

1
200.165 GOLOS
На Golos с August 2017
Комментарии (2)
Сортировать по:
Сначала старые