Мне надоело искать нужную ссылку на конфколл, и я написал бота, который делает это за меня
Ожидание опоздавших на рабочие созвоны, извините, я пропустил, судорожный поиск нужной ссылки на звонок… Суровая реальность распределенных команд подтолкнула меня к созданию помощника в этих вопросах. Рассказываю, что из этого вышло.
Начну с небольшой предыстории. Мы в TYMY ведем дела по всем рабочим проектам в Яндекс календаре. И у него есть одна очень раздражающая особенность — отсутствие нормальных уведомлений о встречах. На телефоне уведомлений нет, настроить напоминание о встрече можно в почте или SMS-сообщением. Кто вообще в 2024 году оперативно читает почту? А в SMS нет информации о встрече, нельзя перейти по ссылке или посмотреть детали. Недавно Яндекс сделал оповещения через пуши в приложении почты, но меня раздражают уведомления о письмах, всегда отключаю их и смотрю поток рабочих писем, когда собственно проверяю почту. Так что проблему это не решило.
Для личных целей я использую Google Календарь, он справляется с задачей оповещений лучше, но всё равно приходится переходить в систему и искать ссылку на встречу. Жить можно, но неудобно. В какой-то момент я пытался синхронизировать календари, однако выяснилось, что Яндекс некорректно импортируется в Google — часть информации теряется.
И вот однажды, когда наш CEO в очередной раз спросил в общем чате ссылку на рабочую встречу, я подумал, что было бы здорово автоматизировать это. А заодно в принципе синхронизировать и привести в единый вид оповещения из календарей. Кроме того, мне давно было интересно написать бота для Телеграма. В общем, всё сошлось. Так осенью 2023 года я решил сделать бота для нормальных оповещений из календаря.
Разумеется, прежде чем садиться за работу, я попытался найти готовое решение — вдруг кто-то уже сделал такого бота до меня. Но поиск ничего толкового не принёс. Возможно, к слову, проблема в поиске Телеграма: по названию бота сложно понять его профиль, а поиска с описанием внутри самого Телеграма нет. Я протестировал несколько найденных ботов и не обнаружил ничего похожего, беглый поиск по интернету тоже ничего не дал. Не могу сказать, что меня это удивило — вряд ли много людей озадачены этой проблемой. Например, среди моего окружения процент тех, кто, ежедневно пользуется только Яндекс Календарем, а не Google, Outlook или iCloud, крайне мал. Так мне окончательно стало ясно, что писать бота нужно самостоятельно.
Немного о том, что у бота под капотом
Не вижу необходимости детально описывать разработку, если кому-то интересно, дайте знать, могу рассказать и подробней — здесь или на Хабре.
Если коротко, то писал я на Python. У меня не было иллюзии, что это будет нагруженный инструмент, который будет обрабатывать большое количество запросов, поэтому не стал брать низкоуровневые языки, как С++ или, например, Go. Плюс это личный проект, и я хотел написать его на языке, который знаю лучше всего. После изучения доступных библиотек остановился на наиболее продвинутой по отзывам aiogram.
Первый вариант, который еще не умел отправлять события в чат с пользователем, а имел только базовый флоу регистрации, занял у меня чуть больше времени, чем я ожидал – был ряд технических сложностей, которые возникли скорей из-за того, что я не был знаком с концепциями Телеграм. Например, в библиотеке реализован механизм конечных автоматов Finite-state machine, который помог реализовать добавление нового календаря. Также в боте реализовано три независимых сервиса и нужно было решить, как передавать состояние из сервиса, который присылает сообщения в сервис, где обрабатывается команда пользователя. Решить эту проблему удалось с помощью кэширования.
В общем, старт был дан: юзер уже мог подключить свой аккаунт к боту, который таким образом получает возможность проверять календарь, чтобы затем скачивать и показывать пользователю события в Телеграм.
Сбор данных у Яндекса
Вопрос с тем, как брать у Яндекса информацию о событиях, решился в принципе просто: бот отправляет Яндексу постоянные запросы, какие события произойдут в ближайшее время. И после прохождения проверки получает результат, который отправляет пользователю в Телеграм. Достать данные у Яндекса оказалось легко, так что я написал worker-а, который формирует и направляет постоянные запросы, получает, структурирует и предлагает пользователю в нужном виде полученную информацию.
Дополнив этот функционал, я получил уже готовую версию бота, который мог полноценно работать с Яндекс календарем. Оставалось разобраться с инфраструктурой, арендовать небольшой сервер и настроить минимальный CI/CD.
Перед тем, как отдать бота в тестирование коллегам, друзьям и знакомым, вспомнил ещё одно важное дополнение: многие сейчас живут и работают в разных часовых поясах. Из-за этого у бота могли возникать проблемы с датами и временем в уведомлениях. Поэтому добавил в код функцию сохранять часовой пояс пользователя и использовал его для показа уведомлений.
Сбор данных у Гугла
Я хотел распространить бот сразу и на другие календари. Но это оказалось не так легко сделать. Начал я с Гугл-календаря, которым, как уже говорил, пользуюсь сам. И если с Яндексом все было относительно просто, тут пришлось повозиться: нужно было сделать сайт для бота, составить и отправить в Google политику конфиденциальности — Privacy Policy, снять видео о работе бота для прохождения проверки. В общем, было интересно.
Сейчас у меня есть понимание, как подключить бота и к другим календарям, но пока я решил остановиться на Гугле и Яндексе. Остальные планирую подключать по мере необходимости. Кстати, заявки на то, с какими календарями стоит интегрировать бота в первую очередь, можно оставлять в комментариях.
Что в итоге
Сейчас бот прошел второе тестирование. После первого обнаружилось много нюансов, которые пришлось доработать, второе принесло пока только позитивный отклик. Несмотря на то, что релиз я готовил к дню рождения Алексея Майстренко, CEO TYMY, один из самых благодарных пользователей его – это я сам. Уже плотно интегрировал бота в ежедневную рутину. Если раньше я начинал день с просмотра рабочего календаря, то теперь открываю Телеграм и смотрю сводку событий в боте, а он мне желает хорошего дня :)
По отзывам коллег, которые находятся постоянно в движении, с ботом им стало проще и удобней следить за встречами в разных календарях — подключать к боту сразу два календаря и получать единую сводку событий на день.
Одной из задач для бота было создание напоминаний на телефоне о рабочем звонке, чтобы не пропускать встречи. Кроме настройки по часовому поясу, я добавил функцию настройки времени уведомления о встрече. Мой опыт показал, когда я ставил таймер на 5 минут до начала встречи, мог увлечься на эти пять минут рабочим процессом и в итоге все равно опоздать. Теперь я ставлю уведомления ровно за 1 минуту — время позволяет спокойно свернуть задачу и переключиться на конфколл.
Кроме того, позже я добавил функцию отключения уведомлений об отдельных встречах — если мое присутствие на них необязательно, однако, я оставляю их, чтобы знать, что они идут в регулярном режиме, и видеть, кто в них участвует.
Краткая сводка и ссылка на бот
Резюмирую, что умеет бот на сегодня:
- учитывать и подстраиваться под часовой пояс,
- помогать кастомизировать время уведомлений,
- отключать уведомления об избранных событиях,
- делать сводку на день (время сводки можно кастомизировать),
- отключить сводку на выходные и в целом выбирать дни недели.
Буду рад вашим тестам и отзывам: calendar_tracker_bot