Об 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

Интеграция с Telegram не тривиальна. В отличие от IFTTT, у Integromat нет своего зарегистрированного бота на все случаи жизни. Вам нужно создать своего, поговорив с @BotFather. И скормить токен доступа в Integromat.

Выяснить Chat ID для персональных сообщений от бота тоже не очевидно. Если для каналов и групп можно взять идентификатор @имя_канала, то цифровой ID своего личного чата нужно выяснять, например, у @userinfobot.

Так, сценарий готов. Можно позапускать его ручками, убедиться, что всё правильно форматируется, полазать по дебагу. В конце концов нужно настроить периодический, в данном случае ежедневный, запуск. К сожалению, таймзона задаётся глобально для всего Integromat аккаунта, будьте осторожны.

расписание запуска

Это пост с самым большим количеством скриншотов. Издержки no-code и визуального программирования. Но в Integromat вроде можно экспортировать и импортировать сценарий в JSON. Если хотите, можете модифицировать мой.

Лично я хочу сюда добавить чтение событий из ещё пары календарей. Это должно быть сложно, сливать несколько списков в один и делать общую сортировку. И надо добавить преобразование направления ветра из азимутальных градусов в человекопонятные слова «северный» или «северо-западный». Аналогичная функция на Java у меня занимала 30 строк, для Integromat нужно придумать что-то попроще.

Это всё, кстати, абсолютно бесплатно. Но не совсем, конечно. Самое серьёзное ограничение бесплатного тарифа: 1000 операций в месяц. Каждый модуль — отдельная операция. Чем сложнее ваши сценарии и чем чаще они выполняются, тем быстрее вы выберите этот лимит. Я, за эти три вечера отладки, выел треть.

В этом сценарии сейчас 11 модулей. Он должен запускаться раз в день. Да. Просто на обычную ежедневную эксплуатацию этой милой мелочи я буду тратить треть бесплатного бюджета. На серьёзную интеграцию не хватит :)