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'])
Теперь немного о скрипте.
В рамках промоушена “Взлёт” скрипт раз в сутки будет запрашивать репутацию у участников и сохранять себе на сервер. В других случаях этот же скрипт можно будет применить для сбора разной информации у пользователей Голоса.
Например: количество постов, подписчиков или других показателей собранных за необходимый период.
Другой скрипт будет раз в час собирать данные авторов постов по тегу # идунавзлёт и добавлять их в список для обработки.
Подобный функционал будет полезен и для других инициатив на Голосе.
Если интересуют подробности, задавайте вопросы в комментариях.
Буду рад общению и поддержке!