Программирование без кода: разбираемся как в Shortcuts создавать свои сценарии
от kalter
Shortcuts — приложение для iOS, позволяющее пользователям выполнять задачи, связанные с приложениями. Меня заинтересовала эта тема и я на некоторое время погрузился в изучение работы с этим инструментом. В итоге я во всём разобрался и хочу рассказать как создавать свои сценарии на примере работы с API.
Задача
По нажатию на сценарий (я так буду называть шорткаты) отправлять играющую музыку в aNMusic. Видео, показывающее наглядно как это будет работать:
Принцип работы сценария
Сценарий состоит из последовательного набора действий. Действие может результат своей работы передать следующему действию, как pipeline в Linux. Пример:

Text используются для передачи произвольного текста следующему действию. Get Name of Emoji распознает наш эмоджи как "thinking face", и передаст следующему действию.
Это показывают линии, соединяющие действия. Если линия обрывается, значит действие не принимает входные данные. Пример:

Другой способ использовать результат других действий — переменные. Переменные задаются либо самими действиями, либо вручную. Пример:

Большинство действий имеют опции. Например, действие Alert имеет опцию Show Cancel Button. Её смысл в том, что если пользователь нажмёт Cancel, сценарий завершит работу.
Всё это написано в коротком описании действия прямо в приложении.
Отправление песни в aNMusic
Воспользуемся API-методом /nowplay.php. Список полей можно посмотреть здесь.

При нажатии на переменную можно указать какие именно данные мы хотим получить. Если это “Current Song” — можно узнать исполнителя, альбом, год, etc. Если файл — название файла, расширение, содержимое, размер, etc.

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

Теперь добавим обработку неуспешного ответа. Метод возвращает JSON с полем error в случае ошибки:
Для работы с JSON нужно использовать тип Dictionary. Есть специальное действие “Get Dictionary from Input”, которое преобразует JSON на входе в Dictionary. После преобразования мы сможем проверить есть ли поле error. Если есть, кинем алерт и завершим работу сценария.

Отправление сообщения на форум
Кроме отправки песни в aNMusic можно сделать отправку сообщения на форум. Это потребует сохранения и обновления auth_token.
Нужно будет выполнить два API-метода:
- /users/auth — если сценарий выполняется впервые или auth_token истёк
- /forum/say — для отправки сообщения
Пробуем получить auth_token и auth_expires из iCloud (единственное место, где их можно сохранить). Если их там не будет, значит сценарий выполняется впервые. Если будут, то проверяем время истечения токена.

Если этих файлов нет, сценарий выполняется впервые. Если есть, проверяем время истечения токена.

Для получения даты через Unix Time нужно установить дату в 00:00:00 Jan 1 1970 и прибавить секунды Unix Time.
Обновление токена можно было бы для упрощения алгоритма вынести в функцию, но функций нет. Поэтому обновление токена идёт после проверки наличия файлов и времени истечения токена, если выполнилось одно из этих условий. Для этого нужна переменная Need refresh access token.
Собственно, обновление токена:

Осталось только отправить сообщение на форум:

Итог
Shortcuts идеально подходит для создания простых сценариев. Отправку песни в aNMusic получилось сделать за несколько минут.
Отправка на форум получилась сложнее из-за логики временного токена. Но это терпимо.
Минусы
Есть как минимум 2 действия, которые срабатывают неожиданным образом:
- “Get Current Music” первый раз возвращает предыдущую песню
- Сохранение файла в несуществующую папку вырубает сценарий без показывания ошибки
Готовый сценарий:
aNMusic 1.shortcut
Задача
По нажатию на сценарий (я так буду называть шорткаты) отправлять играющую музыку в aNMusic. Видео, показывающее наглядно как это будет работать:
Принцип работы сценария
Сценарий состоит из последовательного набора действий. Действие может результат своей работы передать следующему действию, как pipeline в Linux. Пример:

Text используются для передачи произвольного текста следующему действию. Get Name of Emoji распознает наш эмоджи как "thinking face", и передаст следующему действию.
Это показывают линии, соединяющие действия. Если линия обрывается, значит действие не принимает входные данные. Пример:

Другой способ использовать результат других действий — переменные. Переменные задаются либо самими действиями, либо вручную. Пример:

Большинство действий имеют опции. Например, действие Alert имеет опцию Show Cancel Button. Её смысл в том, что если пользователь нажмёт Cancel, сценарий завершит работу.
Всё это написано в коротком описании действия прямо в приложении.
Отправление песни в aNMusic
Воспользуемся API-методом /nowplay.php. Список полей можно посмотреть здесь.

При нажатии на переменную можно указать какие именно данные мы хотим получить. Если это “Current Song” — можно узнать исполнителя, альбом, год, etc. Если файл — название файла, расширение, содержимое, размер, etc.

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

Теперь добавим обработку неуспешного ответа. Метод возвращает JSON с полем error в случае ошибки:
- {"error":"unknown token"}
Для работы с JSON нужно использовать тип Dictionary. Есть специальное действие “Get Dictionary from Input”, которое преобразует JSON на входе в Dictionary. После преобразования мы сможем проверить есть ли поле error. Если есть, кинем алерт и завершим работу сценария.

Отправление сообщения на форум
Кроме отправки песни в aNMusic можно сделать отправку сообщения на форум. Это потребует сохранения и обновления auth_token.
Нужно будет выполнить два API-метода:
- /users/auth — если сценарий выполняется впервые или auth_token истёк
- /forum/say — для отправки сообщения
Пробуем получить auth_token и auth_expires из iCloud (единственное место, где их можно сохранить). Если их там не будет, значит сценарий выполняется впервые. Если будут, то проверяем время истечения токена.

Если этих файлов нет, сценарий выполняется впервые. Если есть, проверяем время истечения токена.

Для получения даты через Unix Time нужно установить дату в 00:00:00 Jan 1 1970 и прибавить секунды Unix Time.
Обновление токена можно было бы для упрощения алгоритма вынести в функцию, но функций нет. Поэтому обновление токена идёт после проверки наличия файлов и времени истечения токена, если выполнилось одно из этих условий. Для этого нужна переменная Need refresh access token.
Собственно, обновление токена:

Осталось только отправить сообщение на форум:

Итог
Shortcuts идеально подходит для создания простых сценариев. Отправку песни в aNMusic получилось сделать за несколько минут.
Отправка на форум получилась сложнее из-за логики временного токена. Но это терпимо.
Минусы
Есть как минимум 2 действия, которые срабатывают неожиданным образом:
- “Get Current Music” первый раз возвращает предыдущую песню
- Сохранение файла в несуществующую папку вырубает сценарий без показывания ошибки
Готовый сценарий:
