Как я запустил бота праздничных открыток в мессенджере MAX — и почему во второй раз было уже не так страшно

Как я запустил бота праздничных открыток в мессенджере MAX — и почему во второй раз было уже не так страшно

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

Что я взял из прошлого опыта

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

Но Праздник — это картинки, и грабли нашлись свои

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

Контроль качества и неожиданный лимит

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

Мелочь с меню и урок «сам себе злодей»

Была ещё мелкая, но досадная история с меню команд. В Telegram у бота есть привычная кнопка со списком команд. В MAX я их тоже зарегистрировал — вроде всё приняли, но в самом приложении кнопка так и не появилась. Бодаться с этим не стал, а просто сделал своё меню — на обычных кнопках прямо в сообщениях. Вышло даже нагляднее: человек с первого экрана видит, что можно сделать.
И отдельный урок, уже из разряда «сам себе злодей». Раз на одном сервере живут два бота, их легко перепутать. Один раз я чуть не внёс правку не тому боту — просто потому, что работал не в той папке. Теперь у меня железное правило: любые изменения — только по полному адресу файла, чтобы правка физически не могла уйти не туда. Мелочь, а нервов экономит много.

Чего я намеренно НЕ делал

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

Что в итоге

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

11