РазборИИРабота

Google и Яндекс в одном Telegram-боте с напоминаниями

Почему простое напоминание оказалось сложнее, чем казалось, и как мне помог вайбкодинг

15 минОбновлено
Пластилиновый осьминог в очках и с растрепанными волосами пишет код за ноутбуком

Есть одна фраза, которую я регулярно слышу перед рабочими созвонами: «Ссылка на встречу в календаре». Выглядит вполне разумно, пока у тебя один календарь и вся жизнь аккуратно разложена по его клеточкам. У меня же их четыре: личный Яндекс, Google на телефоне и еще два рабочих. И вот начинается квест. В каком именно аккаунте лежит встреча? Где организатор оставил ссылку? Это Google Meet, Яндекс Телемост или что-то еще? И зачем я вообще должен помнить, через какой сервис мне прислали приглашение, если мне нужно всего лишь вовремя подключиться к разговору?

В какой-то момент надоело бегать между приложениями, и я подумал: а почему бы не собрать все эти встречи в одном месте? Желательно там, куда я и так заглядываю постоянно, — в телеге. Не хочу каждое утро вручную сравнивать четыре расписания. Мне нужна одна понятная лента: какая встреча скоро начнется, во сколько, с кем, и по какой ссылке в нее попасть. А еще было бы здорово получать предупреждение заранее, чтобы не вспоминать о созвоне в тот момент, когда собеседник уже десять минут ждет тебя в виртуальной комнате.

Сразу оговорюсь: я не программист. Вопрос «можно ли технически соединить Google, Яндекс и Telegram» для меня еще недавно относился скорее к области фантастики. Но теперь можно открыть Codex и объяснить задачу обычными словами. ИИ напишет код, а мне останется разобраться, как его запустить и, что самое главное, выяснить, действительно ли он делает то, что обещает. Так родился мой календарный бот. И, конечно, не обошлось без тех самых чудесных ситуаций, когда программа видит встречу, но почему-то не считает нужным о ней напомнить.

Сначала выяснил, возможно ли это вообще

Начал не с установки библиотек, серверов и прочих страшных слов, а с обычного вопроса нейросети. Можно ли сделать бота для Телеграма, который будет подключаться к календарям Google и Яндекса, забирать оттуда события и напоминать о них? А если в событии указана ссылка на созвон, нельзя ли присылать ее прямо в сообщении, чтобы вообще не открывать календарь?

Мне хотелось получить не абстрактный совет «воспользуйтесь стандартными уведомлениями», а собственный небольшой инструмент под мой конкретный способ жить и работать. Важен был именно единый чат, а не еще одно приложение для планирования времени. Я и так уже пользуюсь четырьмя календарями; пятый мне совершенно ни к чему.

Мой первый вопрос. Текст запроса перенесен из переписки без правок.
Мой первый вопрос. Текст запроса перенесен из переписки без правок.

Кодекс ответил, что технически все возможно. Тогда я, не мудрствуя лукаво, попросил: «сделай мне такого бота и скажи, что нужно с моей стороны». Иишка собрала первую версию и выдала набор инструкций. Там, естественно, оказался BotFather для создания самого бота в Telegram, настройка доступа к календарям, переменные, запуск программы — все то, что для разработчика выглядит рутиной, а для человека со стороны напоминает список ингредиентов на неизвестном языке.

Бота через BotFather я создал довольно быстро. Потом решил сразу установить правила общения с электронным помощником: не вываливай на меня двадцать действий одновременно. Дай первый шаг, подожди, пока я его сделаю, посмотри на результат, и только потом переходи к следующему. Если появлялся непонятный экран, я отправлял скриншот и буквально спрашивал, куда нажать. Как выяснилось, это намного эффективнее, чем делать вид, что прекрасно понял все инструкции, а потом час искать причину ошибки, которую сам же допустил на втором пункте.

Попросил объяснять настройку по одному шагу.
Попросил объяснять настройку по одному шагу.

Первый локальный запуск удался: программа работала на моем компьютере, в телеге появился бот, он отвечал на команды. И вот тут легко было бы поставить галочку «готово» и порадоваться, что нейросеть создала очередной цифровой инструмент. Но если вернуться к моему исходному запросу, я ведь не собирался делать бота, который умеет приветствовать меня в чате. Мне нужны были напоминания о настоящих встречах.

Поэтому до первой проверки главный вопрос оставался открытым: умеет ли эта конструкция не просто прочитать календарь, а еще и вовремя написать мне сообщение? Разница кажется небольшой, пока не начинаешь проверять ее на практике.

Встречу он нашел. Предупредить о ней забыл

Для начала подключил Google Календарь и создал тестовое событие на ближайшие минуты. Все максимально просто: если бот работает правильно, он должен увидеть встречу и незадолго до ее начала прислать уведомление. Я открыл список событий через команду — нужная запись там была. Прекрасно. Значит, доступ к календарю есть, данные оттуда читаются, как минимум часть системы функционирует.

Осталось дождаться напоминания. Проходит время, встреча все ближе, а в TG тишина. Бот прекрасно знает, что мне куда-то нужно, но предупредить об этом не удосуживается. Очень полезный сотрудник: с удовольствием покажет расписание, если его попросить, но на главное поручение почему-то не выходит.

Именно здесь мне пригодилась привычка проверять не ответы нейросети, а реальное поведение программы. Технически успешное подключение не доказывает, что работает сама функция, ради которой весь огород городили. Можно хоть десять раз получить сообщение «календарь подключен», но если предупреждение не приходит в нужный момент, моя проблема остается на месте.

Для проверки я создал событие на ближайшие минуты.
Для проверки я создал событие на ближайшие минуты.
Так я сообщил, что главная функция пока не работает.
Так я сообщил, что главная функция пока не работает.
Бот видит события в календаре, но напоминание пока не присылает.
Бот видит события в календаре, но напоминание пока не присылает.

Я написал в чат, что до начала осталось меньше десяти минут, а уведомления так и нет. Помощник полез разбираться и обнаружил довольно приземленную ошибку: программа могла отображать события, но механизм отслеживания времени встреч вообще не запускался. То есть расписание она видела, но будильник внутри нее, условно говоря, никто не включил.

После исправления я завел новую тестовую встречу. И вот на этот раз сообщение действительно прилетело вовремя. Это была первая маленькая, но настоящая победа: я получил не отчет об успешной работе кода, а то, ради чего все затевалось, — уведомление в мессенджере. С этого момента тестирование стало почти ритуалом. Добавить событие на ближайшее время, посмотреть, появилось ли оно в списке, дождаться сообщения. Если какой-то из шагов не срабатывает, все остальное не имеет значения.

Собираем четыре расписания в одном окне

Когда первая встреча наконец напомнила о себе как положено, можно было возвращаться к основной задумке. Напоминаю, задача была не подключить один Google Календарь — это было бы слишком просто. Мне нужно было соединить несколько разных аккаунтов, включая Яндекс, и перестать думать о том, в каком из них находится нужный созвон.

Я попросил добавить остальные подключения и настроить три предупреждения: за час, за десять минут и непосредственно в момент начала события. Такой набор мне казался удобным: первое сообщение — чтобы вспомнить о предстоящем разговоре и успеть закончить текущие дела; второе — чтобы уже не упускать встречу из виду; последнее — фактически кнопка «пора заходить», желательно сразу со ссылкой.

Но тут нейронка поняла мою формулировку слишком буквально. Под «несколькими календарями» она подразумевала несколько календарей внутри одного аккаунта. А я имел в виду совершенно разные учетные записи. В какой-то момент стало ясно, что мы с ИИ снова разговариваем вроде бы на одном языке, но представляем себе разные вещи. Пришлось отдельно уточнить: нужны календари разных аккаунтов, а не несколько вкладок одного.

Пришлось уточнить, какие именно календари я хочу подключить.
Пришлось уточнить, какие именно календари я хочу подключить.

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

Правда, когда объединяешь несколько источников данных, довольно быстро обнаруживается, что одинаковое на вид слово «встреча» разные сервисы могут хранить по-разному. И Яндекс вскоре устроил нам небольшую демонстрацию.

В личном календаре у меня было событие на 17 июня. Я вижу его на экране, знаю, что оно существует, но наш новый помощник ведет себя так, будто его нет. И тут особенно раздражает расхождение между двумя источниками: календарь показывает одну реальность, а бот — другую. Я отправил в чат скриншот встречи и то, что отображалось в TG. Просил не просто «починить синхронизацию», а объяснить, почему именно эта запись выпала.

Выяснилось, что событие повторяющееся, а первая версия некорректно обрабатывала такие встречи. Для человека разницы почти никакой: в календаре есть запись на определенную дату, значит, я хочу о ней узнать. Но для программы повторяющееся событие — не всегда такая же отдельная запись, как разовый созвон; его еще нужно правильно развернуть по датам. ИИ поправил обработку повторов, после чего встреча появилась в общем списке.

Для меня это был очередной хороший урок о том, как тестировать собственный инструмент. Недостаточно добавить одну красивую тестовую встречу. Надо посмотреть на реальные события: повторяющиеся, созданные в другом сервисе, с разными ссылками и настройками. Именно в них обычно и прячутся проблемы, которых не видно на демонстрации.

Встреча есть в Яндекс Календаре, но первой версии бота она была невидима.
Встреча есть в Яндекс Календаре, но первой версии бота она была невидима.

Бот не должен зависеть от того, включен ли мой компьютер

Пока вся конструкция работала локально, существовало небольшое, но фундаментальное неудобство: выключаю компьютер — вместе с ним выключается и мой персональный секретарь. Получается странная история. Я хочу напоминания о встречах, чтобы меньше держать в голове рабочее расписание, но для этого обязан помнить, что на компьютере должна быть запущена отдельная программа. Такой обмен меня не устраивал.

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

Разумеется, после переезда все не заработало мгновенно. Сначала не открывался нужный адрес — пришлось разбираться с настройками домена. Когда страницу удалось поднять, появилась новая неприятность: система сообщала, что подключение к Google Календарю не удалось. После уже пройденного пути очень не хотелось возвращаться к началу и заново привязывать все учетные записи.

Страница написала, что Google не подключился. Позже выяснилось, что причина была другой.
Страница написала, что Google не подключился. Позже выяснилось, что причина была другой.

К счастью, причина оказалась хитрее и одновременно забавнее. Само приложение могло успешно сохранить подключение к Google, но затем пыталось сообщить об успехе через Telegram. Если сообщение не отправлялось, страница показывала ошибку, будто календарь вообще не подключился. То есть одно действие прошло нормально, другое — нет, а пользователю объявили, что сломалось все целиком.

Мы разделили эти операции, чтобы сбой с уведомлением не маскировался под проблему авторизации. Потом я снова проверил всю цепочку: адрес открывается, календарная запись читается, напоминание долетает. Работает. И вот только после этого можно было считать переезд на сервер действительно состоявшимся. Программа перестала зависеть от моего включенного компьютера, а значит, наконец соответствовала смыслу всей затеи.

Почему Яндекс исчезал сам по себе и другие развлечения

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

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

Это сообщение помогло вернуться к ошибке и найти ее причину.
Это сообщение помогло вернуться к ошибке и найти ее причину.

Мы продолжили разбираться, и настоящая причина оказалась совершенно в другом месте. Когда бот обновлял доступ к Google, он каким-то образом затирал данные о подключении Яндекса. Хз, почему они вообще пересекались, но факт оставался фактом: одна интеграция ломала другую. Нейронка поправила сохранение сведений, и учетка перестала исчезать.

Вот такие истории особенно хорошо показывают, почему нельзя довольствоваться первым правдоподобным объяснением. «Наверное, настройки стираются при обновлении» звучит логично, но логичная версия и найденная причина — не одно и то же. Пришлось наблюдать поведение программы, возвращаться к симптомам и проверять, какой конкретно процесс приводит к сбою.

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

Первая версия оказалась слишком подробной. Кнопок было много, они занимали пространство и скорее напоминали служебную панель разработчика, чем чат, в который я пришел быстро посмотреть расписание. Пришлось убрать лишнее и оставить понятные действия. Вообще, очень характерная для ИИ проблема: если попросить «добавить удобное управление», он иногда добавляет столько управления, что пользоваться становится менее удобно. Нужно уметь вовремя остановиться.

Первое меню: кнопки появились, но часть из них я потом убрал.
Первое меню: кнопки появились, но часть из них я потом убрал.

На этом приключения не закончились. В какой-то момент пропал доступ к Google. Иишка нашла ошибку, связанную с сохранением ключа доступа, а я заодно выяснил, что приложение все еще находилось в тестовом режиме. После исправлений и повторного подключения аккаунтов встречи снова стали появляться. Затем случился новый цирк: русские надписи превратились в набор непонятных символов, а кнопка «Календари» решила, что отвечать на нажатия ей совершенно необязательно.

Это как раз те мелочи, которые технический отчет описывает одним сухим предложением: «исправлены кодировка и обработка команд». А пользователь видит довольно сюрреалистическую картину: вчера ему нормально писали по-русски, а сегодня чат будто пытается передать послание из другой галактики. Или кнопка есть, на ней красивое слово, ты нажимаешь — и не происходит абсолютно ничего. Я присылал скриншоты, показывал конкретные сбои, нейронка готовила правки. Не какие-то абстрактные «улучшения UX», а попытки добиться того, чтобы то, что нарисовано на экране, вело себя предсказуемо.

Так выглядела ошибка с русским текстом.
Так выглядела ошибка с русским текстом.
Кнопка «Календари» есть, но на нажатие ничего не происходит.
Кнопка «Календари» есть, но на нажатие ничего не происходит.

Чтобы ссылка сама приходила перед созвоном

Когда основные напоминания уже работали, я вернулся к первоначальной боли: мне нужно не просто помнить, что сегодня будет встреча, но и без лишнего копания попасть в нее. Поэтому в уведомлении обязательно должна быть ссылка, если организатор добавил ее в календарное событие. Открыл сообщение, нажал — и ты на созвоне. Никаких поисков среди четырех приложений, приглашений в почте и попыток вспомнить, где лежал этот несчастный Meet.

Следом захотелось получить чуть более широкий обзор расписания. Пусть бот вечером присылает список встреч на завтра, а утром — на текущий день. Так гораздо проще заранее понять, насколько плотное ожидается расписание, когда между созвонами вообще есть свободные окна и где нужно быть особенно внимательным.

А потом пришла еще одна идея. Допустим, у меня назначена встреча на завтра, я уже рассчитываю на нее, а организатор внезапно переносит событие или вовсе удаляет его из календаря. Не хочу узнавать об этом только после того, как открыл расписание сам. Почему бы не попросить помощника присылать отдельное уведомление об изменениях? Именно так появился следующий запрос.

С этого запроса началась работа над уведомлениями об изменениях встреч.
С этого запроса началась работа над уведомлениями об изменениях встреч.

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

А вот обычные напоминания и ссылки я проверял на себе. Перед созвоном открываю телегу, вижу сообщение со временем встречи, нажимаю на нужный адрес и подключаюсь. Именно это поведение, в отличие от красивых ответов нейросети, для меня и является результатом.

В итоге: один чат вместо четырех календарей

В начале этой истории мне хотелось всего лишь избавиться от раздражающего поиска ссылок по разным календарям. В итоге получился бот, который собирает события из Google и Яндекса в одном месте, напоминает о встречах за час, за десять минут и в момент начала, а вечером и утром присылает короткий обзор расписания. Когда внутри события есть ссылка на видеозвонок, она приходит вместе с уведомлением. Причем работает все это на сервере, так что держать ради него включенным собственный компьютер больше не требуется.

По дороге выяснилось много занятного. Программа может успешно подключиться к календарю, но так и не отправить напоминание. Может читать разовые встречи и не видеть повторяющиеся. Может сообщать об ошибке Google, хотя подключение прошло нормально, просто не получилось отправить сообщение в Телеграм. А может при обновлении доступа к одному сервису внезапно забыть другой. И все это не какие-то теоретические риски из учебника по программированию — это ситуации, с которыми я действительно столкнулся.

Наверное, главный вывод для меня даже не в том, что теперь можно собрать полезную штуку без навыков разработки. Гораздо интереснее, что для этого необязательно разбираться в устройстве каждой функции, но совершенно необходимо понимать, зачем она нужна, и уметь проверять результат. Сказать ИИ «сделай бота» относительно легко. А вот последовательно доказать самому себе, что он видит нужную встречу, вовремя присылает уведомление и не теряет остальные календари, — это уже настоящая работа. Зато теперь вместо утреннего обхода четырех календарей у меня есть один чат. Собственно, этого я и хотел.

Забрать в работу

Схема календарного бота и проверки

Упрощенная схема по статье. Ее можно использовать, чтобы описать похожую задачу разработчику или ИИ и договориться, как проверять результат.

Посмотреть схему6 этапов
  1. Подключения Google и Яндекса

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

  2. Получение встреч

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

  3. Расписание напоминаний

    В этой истории — за час, за десять минут и в момент начала. Для проверки создать ближайшую тестовую встречу и дождаться сообщения.

  4. Сообщение в Telegram

    Показать название, время и ссылку, если она есть в событии. Проверка: сообщение читается, ссылка открывает нужный созвон.

  5. Утренние и вечерние сводки

    Утром показать встречи на сегодня, вечером — на завтра. Сверить список с самими календарями.

  6. Работа на сервере

    Проверить доставку при выключенном компьютере и сохранность подключений после обновления. Если что-то пропало, сохранить конкретный пример сбоя.

Отдельно проверьте перенос и отмену встречи: наличие функции в коде еще не подтверждает, что уведомление пришло. Пароли и ключи в описание задачи не вставляйте.

Скачать схему · TXT

Поделиться статьей

В этой статье

Иллюстрация

Продолжим в Telegram

Заметки о маркетинге, эксперименты с ИИ и новые разборы — в «Как подобает». Можно читать между большими статьями.

Есть вопрос или тема для разбора? Напиши мне.