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

Php для Голоса. Небольшой вклад в библиотеку json-rpc php-graphene-node-client.

Всем привет!
Решил применить свои профессиональные навыки на благо Голоса.

Увидел в одном из чатов, запрос на простой скрипт для @liga.avtorov и промоушена "Взлёт" по сбору информации из постов Голоса. И взялся за дело!

Так как я работаю с PHP, то начал с поиска готовых библиотек на PHP для работы с API Голоса или Steemit`a.
Нашел только одну начатую разработку: https://golos.io/@php-node-client , под авторством @t3ran13.
И решил посмотреть что умеет этот Json-RPC Client.

В библиотеке имеется небольшой список запросов к API голоса.

namespace: GrapheneNodeClient\Commands\DataBase;

GetContentCommand
GetDiscussionsByAuthorBeforeDateCommand
GetDiscussionsByBlogCommand
GetDiscussionsByCreatedCommand
GetDiscussionsByFeedCommand
GetDiscussionsByTrendingCommand
GetTrendingCategoriesCommand

Мне же для моего бота не хватает нескольких запросов. Один из них get_accounts - для получения общей информации о пользователе. Название запросов (методов), я взял в Golos API Explorer by @on0tole. И еще что то тут http://ropox.tools/steemjs by @ropox

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

Добавляем файл GetAccountCommand.php в папку Commands/DataBase
со следующим содержимым

namespace GrapheneNodeClient\Commands\DataBase;
class GetAccountCommand extends CommandAbstract
{
   /** @var string */
   protected $method = 'get_accounts';

   /** @var array */
   protected $queryDataMap = [
       '0' => ['array'], //authors
   ];
}

Также мне нужен еще запрос get_followers. По аналогии создаем новый файл GetFollowersCommand.php:

class GetFollowersCommand extends CommandAbstract
{
   /** @var string */
   protected $method = 'get_followers';

   /** @var array */
   protected $queryDataMap = [
       '0' => ['string'], //author
       '1' => ['nullOrString'], //startFollower
       '2' => ['string'], //followType //blog, ignore
       '3' => ['integer'], //limit
   ];
}

Но увы - она не сработала. Пошел копать дальше app.js с сайта golos.io. Как-то он же получает список подписчиков?
Там я выяснил что есть разные API: DataBase_api, Follow_api, Login_api, NetworkBroadcast_api.
И у каждого свой индекс. А так же для запроса формируется следующая json строка
{"id":16,"method":"call","params":[0,"get_dynamic_global_properties",[]]} где в params идет первым как раз этот индекс апи.

apiIds: {
           database_api: 0,
           login_api: 1,
           follow_api: 2,
           network_broadcast_api: 4
       },

но далее тут же на golos.io формируется такой запрос
{"id":29,"method":"call","params":[5,"get_follow_count",["semasping"]]}

В этом запросе API индекс равен 5, но метод get_follow_count принадлежит follow_api
Выходит что для follow_api id=5 хотя выше указано что id=2.
Может кто то из разработчиков Голоса подскажет. Обращаюсь к @sheriff, может знаете кто сможет подсказать подробнее про эти apiIds

Другие методы и их параметры можно посмотреть в gist на github. Список большой, а возможности спойлеров тут нет, поэтому выложил в гист
https://gist.github.com/semasping/d717478e731372c20ee14d8752c8f8e5
Также судя из этого списка различных разделов API даже больше чем указано в apiIds. Есть еще market_history_api и assets_api, но возможно они относятся именно к сайту golos.io

Теперь вернемся к библиотеке.

В самой библиотеке на данный момент нет возможности задавать API индекс.
В методе doRequest() класса `` код формирования запроса

       $data = [
           'id'     => $this->getNextId(),
           'method' => $data['method'],
           'params' => $data['params']
       ];

я изменил на такой

    $apiId = 0
    $data = [
           'id'     => $this->getNextId(),
           'method' => 'call',
           'params' => [$apiId,$data['method'],$data['params']]
       ];

Такой код работает и для database_api и для follow_api. Другие я пока не пробовал.

Обращаюсь к автору, @t3ran13, Вы лучше знаете свой код, и имеете представление, как лучше добавить поддержку разных API. Тем более, что у вас уже есть начало для разделения.
namespace GrapheneNodeClient\Commands\DataBase; соответственно можно добавить namespace GrapheneNodeClient\Commands\Follow; и т.д.
Давайте спишемся и обсудим.

Я в телеграме: https://t.me/Semasping
Skype: semasping.

С GitHub работал мало, и боюсь накосячить. Но в моём представлении мне надо было вашу библиотеку fork`нуть -> Внести изменения -> оформить pull request?
Сейчас же я её поставил через composer. И так как не обнаружил нужных мне методов, то решил попробовать свои силы в доработке.

Также я еще добавил в Tools
Reputation.php для расчета репутации
Пример использования

Reputation::calculate($account['reputation'])

Теперь немного о скрипте.

В рамках промоушена “Взлёт” скрипт раз в сутки будет запрашивать репутацию у участников и сохранять себе на сервер. В других случаях этот же скрипт можно будет применить для сбора разной информации у пользователей Голоса.
Например: количество постов, подписчиков или других показателей собранных за необходимый период.
Другой скрипт будет раз в час собирать данные авторов постов по тегу # идунавзлёт и добавлять их в список для обработки.

Подобный функционал будет полезен и для других инициатив на Голосе.
Если интересуют подробности, задавайте вопросы в комментариях.
Буду рад общению и поддержке!

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