Мой новый друг Баш

Удивительным образом работает моя мотивация. С одной стороны, никаких тебе книжек, английского или игр, но зато полный карт-бланш для программирования. Вдохновленный сегодняшним разговором со своей подругой Натой, решил зафигачить пост, который задумывался еще 9 дней назад, когда я создал свой первый репозиторий на «Гитхабе».

Отмотаем время на 10 дней назад. Я в очередной раз открывал какой-нибудь код на Bash или Apple Script и видел это в терминале:

chinese condom instructions Инструкция для презерватива на китайском

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

Я давно знал, что есть служебная программа cURL на Bash, которая может обращаться к сайту через Терминал. Она давно помогала мне сокращать ссылку через яндексовский сервис Clck.ru.

Проблема была в том, что я никак не мог понять, как извлечь данные из того, что делал cURL. Написал простой скрипт, который выдавал такое:

cURL utils.getShortLink

Вижу, что команда, написанная мной, работает, и апишка выдает короткий адрес страницы. Хотя ответ в Терминале и выглядит, как кракозябры с этими обратными слэшами:

{"response":{"short_url":"https:\/\/vk.cc\/8ATrT1"}}%

Оставалось понять, как привести ответ ВК в нормальный вид. Мне, гуманитарию, хватило ума почитать документацию Вконтакте и понять, что все ответы выдаются в формате JSON. Предыдущий ответ в документе выглядит как бы так:

{"response":
{"short_url":"https:\/\/vk.cc\/8ATrT1"}
}

Самым приятным оказалось, что большинство моих проблем с этим скриптом уже обсуждались десятки раз на Stackoverflow. И там ясно дают понять, что для парсинга JSON есть прекрасная утилита под названием jq, которая быстро обрабатывает данные и приводит их в текстовый вид. Увы, написать строчку кода для декодирования через cURL мне оказалось не под силу.

Меня понесло, и я сразу переписал несколько других команд для коротких ссылок. Но через день выяснилось, что мой скрипт не мог нормально работать с урлами, в которых были UTM-метки. А для меня это было критичным, потому что шортить ссылки мне нужно исключительно для рекламы в ВК. В процессе я выяснил, что амперсанд (&) читается как новая команда для Терминала. На выходе я получал ссылку такого вида:

https://mishatugushev.ru/blog/all/dary-nesovershenstva/?utm_source=instagram

Хотя оригинальная ссылка выглядела так

https://mishatugushev.ru/blog/all/dary-nesovershenstva/?utm_source=instagram&utm_medium=social&utm_campaign=promo&utm_content=profile-link&utm_term=blog

Каждый новый амперсанд пытался запустить новую команду, но не мог, так как там был набор символов. Итоговый код выглядит так:

# Копируем ссылку из буфера обмена
longUrl=$(pbpaste | sed -e 's/\&/%26/g')

# Параметры
token=ccc39829ccc39829ccc3982961ccb320e1cccc3ccc3982992464282e11588d3cb690dba
version=5.21
private=0

# Создаем короткую ссылку через api vk.com
shortUrl=$(curl --data "access_token=$token&v=$version&private=$private" "https://api.vk.com/method/utils.getShortLink?url=$longUrl" | /usr/local/bin/jq -r '.response.short_url')

# Копируем короткую ссылку в буфер обмена
printf "$shortUrl" | pbcopy
echo "$shortUrl"

# Отправляем уведомление
echo display notification "\"$shortUrl"\" | osascript

На этом моменте я понял, что в программировании нет универсальных команд. Если ты хочешь, чтобы твой скрипт работал с учетом некоторых особенностей, то бери и дописывай еще строчку кода. Так я нашел примитивный способ заменить амперсанд на %26, что позволяло дальше скрипту нормально обрабатывать данные. Потом добавил скрипт в мой любимый BetterTouchTool и назначил ему горячую клавишу. Работает это так:

Исходный код двух укорачивалок я выложил в отдельном репозитории на Гитхабе. Возможно, умелые программисты найдут в нем изъяны, или скажут, что это к черту не годится, но как бы кто меня может остановить в моем праве выложить такой вариант? :)

Send
Share
Pin