Доброй ночи, owls ^_^ . Полез я сегодня обновлять свой файл статистики по моим постам в гугл-драйве, и понял, что мне дико лень делать это вручную... И надо задачу автоматизировать.
Вначале полез читать информацию о 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.id/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 :) Пока она в режиме теста, как только будет о чём рассказать, опубликую!
Нода поднялась в 1 строку без проблем? просто у некоторых возникают проблемы на определенных этапах...
Да, после того как обновил систему до 16.04, всё пошло без проблем :)
Отлично=)