На голосе уже не раз писали о подключении к голосу средствами JavaScript.
Мне front-end разработка не очень нравится, поэтому я решил подключиться к нему на серверном уровне и без использования NodeJS.
Использовать я буду PHP. Готовых образцов кода я в сети не нашел, так что пришлось пробираться сквозь дебри.
Для подключения к сокету голоса я использовал библиотеку от Textalk
Подключается она через Composer
Если у вас на сервере не установлен composer - ставим его одной строчкой в консоли:
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
Если у вас хостинг и хостер не установил его - то придётся обратиться в техподдержку хостера.
Будем считать, что вы разобрались с композером.
Далее пишите в консоли:
#создаём папку проекта
mkdir golos_socket
#переходим в папу проекта
cd golos_socket
#инициализируем composer
composer init
#далее везде нажимаем Enter(у авторов пишем n)
Вот так это выглядит в консоли
Если вы всё сделали так-же - то у вас создастся файл composer.json
Теперь нужно сказать композеру о нужной нам библиотеке.
Пишите в консоли
composer require textalk/websocket
Эта команда добавит запись о библиотеке textalk/websocket в файл composer.json и сразу же скачает его.
Если всё прошло успешно - то в проекте у вас появится папка vendor с нужной нам библиотекой.
Теперь создадим файл для работы с блокчейном. Пусть это будет index.php
Я использую среду разработки PhpStorm.
Подключаем библиотеку(в index.php) и указываем пространство имён:
require('vendor/autoload.php');
use WebSocket\Client;
Затем создаем клиент для подключения
$client = new Client("wss://ws.golos.io/");
Теперь у объекта $client есть следующие методы, которыми мы будем пользоваться:
send - отправить данные
receive - прочитать ответ
close - закрыть соединение
Телом запроса будет json массив. В php обычный массив превращается в json при помощи функции json_encode и обратно - json_decode (лично я всегда их путаю)
Теперь можно посылать запросы.
Первый запрос будет с методом get_dynamic_global_properties. Процитирую @vik - этот метод вернёт глобальные динамические значения базы данных. В этом значении базы будет номер текущего блока с активностью пользователей.
Он уже не раз писал о подключении к блокчейну на JavaScript. Собственно его посты (и то, что именно сегодня у @arcange отвалилась база) помогли мне написать этот рабочий код.
Наш массив формируется имеет точно такую-же структуру, различия лишь в синтаксисе:
//сразу преобразуем в json
$a = json_encode(
[
'id' => 1, 'method' => 'get_dynamic_global_properties', 'params' => []
]
);
ключ id обязателен, без него работать не будет.
ключ params - не обязателен
Передаём запрос в блокчейн методом send:
$client->send($a);
И выводим на экран ответ:
print_r($client->receive());
Затем закрываем соединение:
$client->close();
Полностью index.php будет выглядеть так:
//подключение библиотеки
require('vendor/autoload.php');
use WebSocket\Client;
//создание клиента
$client = new Client("wss://ws.golos.io/");
//основной запрос
$a = json_encode(
[
'id' => 1, 'method' => 'get_dynamic_global_properties'
]
);
//отправка запроса
$client->send($a);
//вывод ответа
print_r($client->receive());
//закрытие соединения
$client->close();
Листинг на pastebin http://pastebin.com/eHhv5fZt
Если у вас всё сработало - то в браузере вы увидите примерно следующее:
Я немного подправил html, чтобы всё влезло на экран, а так - не помешали бы пробелы между запятыми. Это сейчас был камень в огород разработчиков.
Теперь можно преобразовать этот json в массив и по-человечески на него посмотреть:
//заменяем
print_r($client->receive());
//на
echo '<pre>';
print_r(json_decode($client->receive()));
echo '</pre>';
И видим вот такой расчудесный объект(не массив).
В нём мы видим id последнего блока, время его создания, хозяина ноды(к которой мы сейчас подключились) и другую статистическую информацию.
Теперь попробуем вытащить пользователя методом get_accounts:
$b = json_encode(
[
'id' => 2, 'method'=>'get_accounts', 'params'=>[['tristamoff', 'mir', 'qqc']]
]
);
Я передал сразу 3 аккаунта. @tristamoff - это собственно я, @mir стал моим продюсером в рамках конкурса #вырастиблогера , организованного @lumia , а @qqc - просто простой ник и я его запомнил))
Соответственно передаём теперь этот запрос и сразу выводим ответ:
$client->send($b);
echo '<pre>';
print_r(json_decode($client->receive()));
echo '</pre>';
В ответе вы получите большую портянку, на скриншот она не влезет. Давайте я просто для наглядности выведу некоторые данные, например аватар, дату регистрации, количество постов и баланс в золотых:
//получение ответа
$response = json_decode($client->receive());
if (!empty($response->result)) {
//ответ получен, перебираем массив пользователей
foreach ($response->result as $user) {
//вывод фото
$json_metadata = json_decode($user->json_metadata);
if (!empty($json_metadata->user_image)) {
$img_src = $json_metadata->user_image;
echo '<' . 'img src="' . $img_src . '" style="max-width:200px;" /><br />';//пишу так, потому что парсер голоса не пропускает код по-человечески.
}
echo 'Зарегистрирован: ' . $user->created . '<br />';
echo 'Постов: ' . $user->post_count . '<br />';
echo 'Золота: ' . $user->sbd_balance . '<br />';
echo '<hr />';
}
}
У меня всё получилось:
И самый простой метод get_block - это получение информации о блоке. Например:
$c = json_encode(
[
'id' => 3, 'method' => 'get_block', 'params' => [3452345]
]
);
Соответственно, если перебрать все блоки, начиная с 1 - то сможете собрать свою базу блокчейна и делать по ней sql выборки.
Весь код, со всеми методами http://pastebin.com/auSsaf8C
Вот собственно и всё.
Почему собственно получился этот урок... Я писал продолжение темы о написании бота для Telegram (Урок 1) и момент подтягивания информации из блокчейна вышел в целый пост. Так что в следующем уроке мы подружим Telegram и Golos. Спасибо за внимание.
@tristamoff, Поздравляю!,
Ваш пост был упомянут в моем хит-параде в следующей категории:
копайте в сторону докера) много плюшек дает) например тот же композер не нужно ставить) одноразово выполняет любую команду и после себя убивает контейнер) но правда нужно не бояться линухи)
Да, не боюсь) Не очень конечно всё это мне по душе, но приходится администрировать. А Chef - это примерно тоже самое?
скажу честно, я сам не шипко во всем прошарен и про чиф не слышал,просто прусь от докера и его возможностей)
Это то что искал! Спасибо)
Есть вот такое
https://github.com/lukestokes/php-steem-tools
Но насколько вижу, там для постинга,апвота и т.д задействован piston. Т.е. php просто посылает команды в piston, который так же установлен на сервере. Т.е. все по прежнему уперлось в надобность root доступа к своему vps
Это не совсем то, что хотелось бы. Хочется все склеить с WP, что б без composer и любых других инсталляций на сервер. Что бы любой новичок мог просто поставить плагин на свой WP и работать с голосом не только в режиме read-only , но и постить-апвотить.
Плагины для фида существуют. Для постинга зародыш есть у меня, но он на фронтенде увы. Постинг в ноду на чистом php - очень нужная штука.
Пожалуйста))
Ок. Я тогда сперва допишу про бота, завтра. А потом могу оформить всё это без композера, чтоб просто папку со скриптами на хост закинуть и всё.
О, там на гитхабе вроде есть и другие команды))
Я не уверен, что понимаю это. Вы хотите сказать, что база данных не доступна?
В этом случае, это не правильно. Наличие GolosSQL не прерывалась.
Со вчерашнего для(и сейчас) показывает 0 баз. А до этого базы я видел.
https://i.imgsafe.org/9b75fc4c3c.png
Я укрепил безопасность на сервер MS-SQL, на котором GolosSQL.
К сожалению, эти изменения привели, что базы данных/таблицы не отображается, даже если она присутствуют и доступны.
Это проблема, сообщил в Microsoft восемь лет назад. И, к сожалению, до сих пор нет решения.
Это "by design", как заявил Microsoft.
Все функции GolosSQL остаются доступными.
Спасибо. А БД как называется?)
DBGolos
Я вот тоже заметил, что эксель данные втягивает.
А могу я как-то увидеть структуру таблиц(и их список)?
У вас есть список таблиц здесь
Чтобы получить список столбцов в каждой таблице, вы можете использовать запрос, как это:
SELECT TOP 1 * FROM [tablename]
Я создам документации к этой теме, когда я нахожу немного времени. ;)
Запросы типа get_dynamic_global_properties отлично отрабатывают через обычный curl, без композеров