Как я подключил Google Таблицу к мессенджеру MAX — и почему это оказалось сложнее всего проекта

Продолжение части 1

В прошлой статье я рассказал, как собрал на Google Таблицах автопилот для Telegram-канала: система сама пишет посты через Claude, рисует картинки в Runware и публикует их по расписанию, без меня. К тому моменту она несколько месяцев работала стабильно, и я решил расширяться — дублировать те же посты в мессенджер MAX. Казалось бы, дело на вечер: ещё один мессенджер, ещё один API, подставить токен — и готово. В итоге именно MAX отнял у меня больше времени, чем весь остальной проект.Зачем вообще MAX, если есть Telegram? Аудитория в России понемногу расползается по новым площадкам, и держать всё в одной корзине стало рискованно. А дублировать посты вручную в ещё один мессенджер — это ровно та рутина, ради борьбы с которой всё и затевалось. Логично было поручить это той же таблице.

Первая стена: сервер не мог достучаться до MAX

Первая же попытка отправить сообщение упёрлась в стену, которую я вообще не ждал. Google Apps Script — это код, который живёт прямо в таблице, и до сих пор он спокойно ходил в любые API: Telegram, Runware, HeyGen. А на запрос к MAX он просто падал с ошибкой защищённого соединения.
Оказалось, MAX требует особый TLS-сертификат — национальный, от Минцифры. Без него сервер не признаёт соединение доверенным. А подсунуть этот сертификат из Google Apps Script нельзя: среда закрытая, я не управляю тем, как она устанавливает соединение. То есть проблема была даже не в моём коде — в него в принципе нельзя добавить то, что требует MAX.

Решение: вынести MAX на отдельный сервер

Единственный рабочий путь оказался обходным — вынести общение с MAX за пределы таблицы. Я поднял отдельный небольшой сервер (VPS) на Node.js, поставил на него тот самый сертификат Минцифры (там это уже возможно) и научил его разговаривать с MAX напрямую.
Дальше выстроил простую схему обмена. Таблица по-прежнему остаётся «мозгом»: когда автопилот готовит пост, он кладёт задание в отдельную очередь. Сервер раз в несколько минут заглядывает в таблицу через веб-приложение, забирает новые задания и отправляет их в MAX. Отдельная важная мелочь: отметку о том, какие сообщения он уже прочитал, я храню не на сервере, а в самой таблице — чтобы при любой переустановке сервера прогресс не сбрасывался и старые комментарии не прилетали заново.

Вторая стена: половины методов API просто нет

Когда канал заработал, я взялся за комментарии — хотел собирать их так же, как в Telegram, и прогонять через Claude для анализа тем. И тут выяснилось, что часть официальных методов MAX закрыл. Метод, которым по-нормальному получают список чатов, отключён с лета. Отдельного способа читать комментарии — тоже нет.
Пришлось идти в обход второй раз. Единственный оставшийся канал данных — общий поток обновлений, куда сыпется всё подряд: и сообщения, и служебные события. Из этого потока я и вылавливаю нужное — например, кто именно написал в личку, чтобы потом суметь ему ответить. Не самый элегантный способ, но других мессенджер не оставил.

Мелкая, но злая деталь с видео

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

И ещё грабли: лишний канал

Отдельная история — как я на ровном месте создал в MAX два одинаковых канала «Сундук AI» и какое-то время не мог понять, почему посты уходят «в пустоту». Оказалось, автопилот честно публиковал во второй, забытый канал, а я смотрел в первый. Теперь у меня жёстко прописан один рабочий адрес канала, а второй помечен как «не трогать». Мелочь, а полдня нервов.

Что в итоге

Сейчас всё это работает как единый конвейер: автопилот готовит пост один раз, а публикуется он сразу и в Telegram, и в MAX — текст с картинкой, видео и даже ролик с говорящим AI-аватаром. Комментарии из обоих мессенджеров собираются в таблицу, и раз в час Claude размечает их по темам и тону, чтобы я видел, что аудитории заходит.
Главный вывод из этой части такой: сложнее всего в самодельных системах не то, что придумываешь сам, а то, что навязывает чужая платформа со своими ограничениями. Половина работы над MAX — это не «написать функцию», а «понять, почему очевидное не работает, и найти обход». Зато теперь один и тот же контент живёт сразу в двух мессенджерах, а я по-прежнему трачу на это столько же времени, сколько раньше на один Telegram.
Если интересно следить за проектом дальше — я пишу об AI-инструментах и автоматизации в Telegram-канале «Сундук AI» и МАКС-канале «Сундук AI».