Об Integromat
2020-06-07
Вокруг стали много говорить о no-code и low-code. Это когда программисты сделали так, что программисты больше не нужны. Совсем, если no-code. Или всё же нужен хоть кто-то с программистским мышлением, если low-code. Это про платформы автоматизации всего. IFTTT тоже сюда относится.
Мы даже провели маленький внутренний хакатон по no-code. А я, прочитав большую правильную статью, решил повторить один полезный пример из неё. В Integromat.
Integromat — это скорее low-code.
Вот прямо совсем кодить не придётся.
Но понимать, что такое сообщения, циклы при их обработке,
функции для преобразования дат и округления чисел,
форматирование строк,
это всё надо.
Ну и соображать, что такое OAuth
или Telegram боты,
и как общаться с @BotFather
,
тоже надо.
В документации Integromat эти нюансы,
конечно, описаны,
но очень скупо.
Итак. Вот такой сценарий:
Присылает мне каждое утро примерно такие сообщения:
Да, наступила эпоха, когда алгоритмы интеграции накликиваются из модулей. На скриншоте сообщения поздний вечер, потому что отлаживал я это дело по вечерам. На весь этот сценарий потрачено вечера три.
В Integromat сценарий выполняется, в основном, по таймеру. Забесплатно не чаще раза в 15 минут. Поэтому к первому модулю прилепляется таймер. Если что, таймер можно потом перетащить на другой модуль.
В более или менее серьёзном сценарии вам понадобится запустить много всего сразу. Поэтому имеет смысл первым модулем поставить Router. Он разветвляет «поток управления».
Циферка «12» у модуля — это его идентификатор в сценарии. Он будет появляться, когда мы будем ссылаться на данные модуля. Да, здесь я добавил Router сильно позднее.
«Поток управления» в Integromat показывает, в каком порядке будут выполняться модули, и к каким данным у них будет доступ (ко всем «предыдущим» по потоку модулям). А ещё на него завязаны циклы.
Начнём с простого. С погоды. Погода берётся из OpenWeatherMap. Никаких ключей или регистраций не надо. Вам достаточно указать название города (по-английски) и какую погоду хотите получать. Мне нужна погода на текущий день.
Из структуры, что выдаёт погодный модуль, надо бы составить грамотное сообщение на русском языке. OpenWeatherMap умеет выдавать погодные условия по-русски, но в Integromat не завезли установку соответствующего параметра. Придётся делать руками. Проще всего взять в качестве ключа иконку погоды, путь до которой возвращает OpenWeatherMap. Да, нужно знать регулярные выражения.
Теперь можно собрать готовое сообщение с погодой. Здесь можно брать значения и из выхлопа погодного модуля, и из предыдущего модуля выбора погодных условий. И можно применить математические формулы округления.
Отформатированную погоду теперь нужно, вместе с данными из календаря, послать в Telegram сообщение. Router в качестве разветвителя в Integromat есть. А вот соответствующий Converger, который объединял бы «потоки выполнения», пока ещё везут. В качестве обходного манёвра предлагают сохранить результат одной ветки в переменную, а в другой ветке прочитать. Это мы и сделаем.
Теперь календарь. Google Calendar. Integromat умеет его. И читать события, и создавать события. Тут пригодятся функции работы с датами, чтобы задать интервал за сегодняшний день.
Чтобы читать из календаря, Integromat попросит права доступа к вашему Google аккаунту. Модуль календаря потребует сразу права и на чтение из календаря, и на создание новых событий, и на... А ещё есть модули работы с Google Drive, и с Google Photos, и Google много чего. И очень быстро может оказаться так, что у Integromat будут все права, чтобы испоганить или удалить все ваши гуглодокументы, события в гуглокалендаре и фоточки из отпуска. Страшно неприятно. А Google что-то убрал (или никогда не предоставлял) возможность подредактировать права приложения, авторизованного через OAuth, чтобы прирезать их, независимо от хотелок самого приложения. Единственным выходом из этого я вижу создание для Integromatа отдельного Google аккаунта, и уже этому аккаунту раздавать доступ к календарям и документам.
Из календаря меня интересуют не все события,
а лишь те,
которые организовал я сам,
или же те, на которые я согласился прийти.
Тут нам поможет фильтр.
Фильтр можно навесить на любую связь между модулями.
И здесь понадобятся функции работы с массивами,
потому что Attendees
у календарного события — это массив.
А функция map()
ещё и нетривиальна в применении.
У этих элементов данных,
помимо человекопонятных имён,
которые можно накликать,
есть ещё и raw имена,
и именно их нужно указывать функции map()
.
Форматирование одного календарного события делается просто. Лишь снова чуток функций работы с датами.
Календарный модуль на вход получает одно событие из таймера,
а производит столько событий, сколько найдёт в календаре.
Это цикл, который надо замкнуть.
Например, модулем Text aggregator
.
Он сформирует единое текстовое значение,
где в каждой строке будет отформатированное событие из календаря.
Модуль Text aggregator
замыкает цикл.
И в его свойстве Source Module
нужно указать начало цикла.
В нашем случае цикл начал календарь.
Цикл и сколько событий где прошло
видно на диаграмме при дебаге.
Да, в Integromat довольно неплохой дебаг. После выполнения сценария (и в любом прошлом прогоне сценария) можно посмотреть все входные и выходные значения.
Календарь готов. Берём подготовленную в другой ветке погоду.
Собираем итоговое сообщение для Telegram. После всех этих циклов и свичей, это просто.
И отправляем в Telegram.
Интеграция с Telegram не тривиальна. В отличие от IFTTT, у Integromat нет своего зарегистрированного бота на все случаи жизни. Вам нужно создать своего, поговорив с @BotFather. И скормить токен доступа в Integromat.
Выяснить Chat ID для персональных сообщений от бота тоже не очевидно.
Если для каналов и групп можно взять идентификатор @имя_канала
,
то цифровой ID своего личного чата нужно выяснять,
например, у @userinfobot.
Так, сценарий готов. Можно позапускать его ручками, убедиться, что всё правильно форматируется, полазать по дебагу. В конце концов нужно настроить периодический, в данном случае ежедневный, запуск. К сожалению, таймзона задаётся глобально для всего Integromat аккаунта, будьте осторожны.
Это пост с самым большим количеством скриншотов. Издержки no-code и визуального программирования. Но в Integromat вроде можно экспортировать и импортировать сценарий в JSON. Если хотите, можете модифицировать мой.
Лично я хочу сюда добавить чтение событий из ещё пары календарей. Это должно быть сложно, сливать несколько списков в один и делать общую сортировку. И надо добавить преобразование направления ветра из азимутальных градусов в человекопонятные слова «северный» или «северо-западный». Аналогичная функция на Java у меня занимала 30 строк, для Integromat нужно придумать что-то попроще.
Это всё, кстати, абсолютно бесплатно. Но не совсем, конечно. Самое серьёзное ограничение бесплатного тарифа: 1000 операций в месяц. Каждый модуль — отдельная операция. Чем сложнее ваши сценарии и чем чаще они выполняются, тем быстрее вы выберите этот лимит. Я, за эти три вечера отладки, выел треть.
В этом сценарии сейчас 11 модулей. Он должен запускаться раз в день. Да. Просто на обычную ежедневную эксплуатацию этой милой мелочи я буду тратить треть бесплатного бюджета. На серьёзную интеграцию не хватит :)