[SHELL] Bash-скрипт для загрузки информации из блокчейна Голоса [Автоматизация, linux scripting]

Доброй ночи, owls ^_^ . Полез я сегодня обновлять свой файл статистики по моим постам в гугл-драйве, и понял, что мне дико лень делать это вручную... И надо задачу автоматизировать.

Script

Вначале полез читать информацию о JSON в Google Sheets, нашёл даже рабочий скрипт, который сумел мне загрузить в таблицу JSON-данные с демонстрационного сервера jsontest, вот таким образом:

=ImportJSON("http://date.jsontest.com"; "/date"; "noInherit, noTruncate")

Замечу, чтобы это сработало, вам надо вначале зайти в "Инструменты - редактор скриптов", вставить туда код скрипта по ссылке выше, сохранить его как ImportJSON.gs и затем уже использовать вышеуказанную конструкцию в вашей таблице.

Однако, насколько я понял, принцип обращения к данным в JSON Golos API немного другой, и напрямую в гуглдрайв-таблицу у меня пока не получилось загрузить значения. Зато получилось их хотя бы взять из блокчейна, через публичную ноду node.golos.ws, и вот как:

curl -s http://node.golos.ws --data '{"id":1,"method":"get_content","params":["sxiii","kraudspisok-news-and-largest-blogs-about-bitcoin-and-cryptocurrencies-english-post-topic-13"]}' | jq -r '.result.created,.result.children,.result.net_votes,.result.total_pending_payout_value,[.result.json_metadata|fromjson.tags],[.result.json_metadata|fromjson.image|length],[.result.body|length]'

Вот что возвращается в виде текста, для удобства я всё подписал:

2017-02-13T16:33:57 # Дата и время поста, .result.created
4                   # Количество "детей" (комментариев), .result.children
16                  # Количество голосов, .result.net_notes
94.547 GBG          # Количество золотых, .result.total_pending_payout_value
[                   # Массив тегов поста, .result.json_metadata|fromjson.tags
  [
    "ru--kraudspisok",
    "english",
    "crowdlist",
    "news",
    "crypto"
  ]
]
[
  4              # Картинок в посте, .result.json_metadata|fromjson.image|length
]
[
  6802           # Символов в посте, .result.body|length
]

Для тех, кто не совсем всё понял, поясню несколько моментов. Curl - это консольное приложение для (почти) прямой (сырой, raw) работы с сетью, в данном случае оно обменивается данными, без лишних слов (флаг -s = silent) с нодой, содержащей блокчейн голоса, по адресу node.golos.ws. Если вдруг у вас не установлен кёрл, то, пожалуйста (для ubuntu/debian), а заодно поставьте и jq (он тоже используется в команде выше):

sudo apt install curl jq

Curl есть в 99% всех дистрибутивов Linux и даже больше, так что поставить его из репозиториев не составит труда. Введите пароль от вашего пользователя и через пару мгновений можете попробовать мою команду выше.

Далее, флаг --data означает передачу данных, и в нашем случае мы передаём JSON-запрос. В нём содержится:

  • Идентификатор (id:1), может быть любой;
  • Метод (get_content) - получение контента поста;
  • Параметры метода - в данном случае, ник автора и название поста

Затем, после того как curl загрузил нужные данные из Blockchain, он передаёт их через UNIX Pipe (конвеер) следующему приложению - jq.

JQ - это консольное приложение, интерпретатор JSON (читайте документацию). Быстрое, удобное и простое. Правда тянет с собой иногда некоторые зависимости, но что уж тут поделать ;) Флаг -r означает то же, что --raw-output, то есть "сырой вывод", без изменений. Далее, в одинарных кавычках и через точки, мы осуществляем навигацию по дереву JSON, например .result.created означает "загрузить запись created объекта result", и так далее. Через запятую указаны другие запросы, чтобы не пришлось делать для каждого кусочка данных отдельный запуск (ведь мы всё равно уже целиком загрузили и распарсили файл).

Расскажу чуть подробнее о конструкциях [.result.json_metadata|fromjson.tags] и [.result.json_metadata|fromjson.image|length].

Во-первых, их необходимо брать в квадртаные скобки, как я понял, это из-за того, что они возвращают массив, а не одну запись. Впрочем, вы можете взять и остальные записи в квадртаные скобки, тогда соответствующим образом изменится и вывод терминала, если вам так больше нравится.

Во-вторых, почему такая сложная конструкция? Дело в том, что если вы посмотрите на структуру JSON-раздела json_metadata, то увидите, что данные там хранятся чуть-чуть по другому - образно говоря, массив "запихнут" в одну переменную, а сами подразделы экранированы (не знаю, почему разработчики так сделали, но пусть объяснят или это будет на их совести :). Поэтому мы используем функцию jq "fromjson" и подгружаем json-запись "tags" из json-переменной в нашем json... Кажется, если я ещё раз скажу это слово, придёт плачущий сатана ;) Ну, попьем с ним чаю.

В-третьих, что за image|length? Length - это удобная конструкция, которая автоматически подсчитывает количество элементов в массиве (у нас массив fromjson.image в данном посте содержит 4 изображения). Ура, вроде, всё понятно? =)

Ах да, ну, получили мы данные, но как теперь взять их и запихнуть в Google Spreadsheet? Основных путей несколько:

  • Простой - сделать вывод данных в CSV, импортировать CSV вручную в гугл-таблицу
  • Сложный - заставить корректно работать скрипт импорта JSON-данных от гугла
  • Эксперт - написать свой скрипт для импорта данных

Если есть желающие помочь или у вас есть фрагменты реализованных решений, прошу, комментируйте и присоединяйтесь. Хотелось бы сделать блокчейн максимально доступным для внешних систем, чтобы можно было быстро делать инфографику, прикидывать и проверять что-то, ну вы поняли =)

Продолжение истории - более завершенный скрипт!
https://golos.io/linux/@sxiii/shell-bash-skript-dlya-sozdaniya-gibkoi-analitiki-vashikh-postov-v-paru-klikov-vytyagivaem-dannye-iz-golosa-v-libreoffice-calc

До скорейших встреч,
Den Ivanov
IT linux geek из Ростова-на-Дону

P.S. Да, я знаю, что на самом деле одна команда curl это нифига не скрипт, но подождите! Кто знает, до чего этот oneliner вырастет в будущем ;)

P.P.S. Кстати, параллельно написанию этой статьи и отладке я также запустил свою ноду на серверах cloudatcost (писал о них в своём посте) - спасибо за удобный однострочник для поднятия ноды @ruslan :) Пока она в режиме теста, как только будет о чём рассказать, опубликую!

scriptbashshellblockchainголос
39
305.208 GOLOS
0
В избранное
Den Ivanov
Crazybrained IT geek with wide Linux tools knowledge
39
0

Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий

Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.

Зарегистрироваться
Комментарии (3)
Сортировать по:
Сначала старые