Отец знакомого работает в Telegram. Сказал собрать игру в 4 КБ и никому её не пересылать. Кажется, началось
В Telegram появились HTMLBubbles: игра, трекер заказа или калькулятор живут прямо в сообщении, без Mini App и хостинга. Я запихнул туда свою мини-игру в обход Bot API, через протокол самого Telegram, словил все грабли и только потом узнал, что можно было проще. Рассказываю, как это устроено, что сломалось, куда такие игры не пускают и где взять шаблон, чтобы сделать своё.
Что такое HTMLBubbles и зачем это нужно
Бот присылает сообщение, а в нём не текст и не картинка, а живая вёрстка со скриптом. Нажимаешь кнопку - внутри пузыря что-то двигается, считается, взрывается. Mini App открывать не надо, хостинг не нужен: весь код едет в самом сообщении.
Telegram показывает в демо трекер заказа, который сам двигается по статусам, крестики-нолики на двоих прямо в чате, список «кто идёт» на событие и бегущий курс. Обычными сообщениями с кнопками такое не сделать: там максимум текст, картинка и кнопки под ними. Я решил проверить на игре.
Недавно у меня вышла браузерная игра «Бар «Шипучка»», переливайка с газировкой. Целиком она в виджет не лезет: один файл на 68 КБ, а лимит, как выяснилось, куда жёстче. Поэтому я сделал отдельную мини-игру «Взболтай шипучку». Трясёшь бутылку, множитель растёт, вовремя открыл - забрал очки, передержал - БАХ, очки сгорели. Пять бутылок за партию, общая таблица рекордов.
Потыкать: @game_barulin_cv_bot. Если вместо игры видите «unsupported message», обновите Telegram.
Bot API 10.4 с виджетами пока в бете
Первое, что я выяснил: в Bot API виджетов нет. Последняя публичная версия - 10.3, а 10.4 с методами sendWidget и answerWidgetQuery Telegram пока гоняет на бете. Обычный бот на aiogram или python-telegram-bot виджет не отправит. По крайней мере, так я думал. Спойлер в конце статьи.
Зато в протоколе самого Telegram, MTProto, всё уже есть с 233-го слоя. Бот может ходить в MTProto напрямую по своему же токену, например через Telethon. Схему я взял из исходников Telegram Desktop, файл api.tl. Документация и песочница лежат в открытом репозитории Telegram: github.com/TelegramMessenger/widget-sandbox.
Шаблон с этим механизмом я выложил на GitHub: бот, все нужные типы с парсерами для 233-го слоя, сторож и пробник, который показывает, что умеет движок виджетов на вашем телефоне, и умеет спрашивать бота. Запускается через Docker, дальше подставляете свой HTML: github.com/fedor-barulin/shipuchka-widget-bot
Что сломалось по дороге
Первая версия пришла с нулевой высотой: привычные для верстальщика единицы высоты экрана внутри сообщения не работают, и игра схлопнулась в полоску.
Потом Telegram показывал сообщение «Виджет остановлен». Я сделал красивые брызги: 30 капель, у каждой свой таймер. Скрипту в сообщении дают полсекунды, а мессенджер, видимо, решил, что я майню. Свёл всё в один общий цикл - продержалось до второй бутылки. Помогло только убрать постоянную анимацию совсем: брызги теперь статичная картинка.
Дальше на телефоне игру обрезало справа: сообщение на телефоне уже, чем на компьютере. А ещё рекорд показывал неправильно т.к. каждую сессию игра помнит только себя. Теперь общий рекорд присылает сервер.
Что нельзя в HTMLBubbles
Вся игра должна уложиться в 4 КБ в сжатом виде. Моя весит 4038 байт. На новые фичи осталось 58 байт, это примерно одно короткое предложение.
Скрипт дольше полсекунды - «Виджет остановлен». Картинок и шрифтов из интернета нет, всё должно лежать внутри.
Один тап - одно действие: либо открыть ссылку, либо написать боту. Я на этом потерял клики по "рекламе" (шуточной, конечно): тап по надписи на бутылке открывает мой канал, но сообщить боту о клике в тот же момент уже нельзя. Игра запоминает клик и отправляет его позже.
Переслать нельзя, хотя документация разрешает
В документации прямо написано: игру можно переслать в любой чат. На практике Telegram пишет «копирование и пересылка из этого чата запрещены». Причём везде: компьютер, iPhone, Android, веб. Обычные сообщения того же бота пересылаются спокойно.
Я отправил игру в четырёх разных режимах - запрет на пересылке стоял у всех. Бот его не ставит, ставит сам Telegram. Дальше проверил остальные пути:
- Личка с ботом - работает
- Переслать другу - запрещено
- Через @бота в чужом чате - отказ
- В канал - отказ
- В комментарии к посту - отказ
Похоже, пока игры живут только в личке с ботом. Поэтому в канале я продвигаю игру по старинке: бот публикует обычный пост с гифкой и кнопкой «Играть», кнопка ведёт в бота. Без пересылки игра сама не разлетится, и для промо это главная проблема.
Что можно
Игра может переписываться с ботом короткими сообщениями, примерно «я набрал 688, запиши». На этом держится общая таблица рекордов бара. Бот знает, кто играет, а ссылки из игры открываются.
На бутылке вместо логотипа я написал «Здесь могла быть ваша реклама», а бот записывает, кто по ней ткнул. За первый вечер ткнули двое. Один из них, подозреваю, я.
Сюжетный поворот: можно было не мучиться
Когда бот уже вовсю работал, Telegram выложил тестовую документацию для новой версии API. Я проверил на всякий случай и обнаружил, что бета открыта для всех ботов: тот же токен, только в адресе запроса дописываешь /beta.
Завёл тестового бота и прогнал всё заново: игра отправилась, нажатия дошли, бот ответил. Без притворства и без копания в исходниках. День ковыряния протокола против одного слова в адресе. Обидно.
Ограничения на бете те же: переслать нельзя, в чаты и комментарии не пускает. Своего бота я на бету пока не перевожу: он работает, а до релиза там ещё может что-то поменяться. Но если начинаете с нуля, начинайте с беты или с моего репозитория.
Победная тактика
Я прогнал 100 тысяч симулированных партий для разных тактик. Больше всего очков в среднем, около 374 за партию, даёт открывать бутылку при множителе ×2,1.
Мои 688 продержались недолго: первым в баре сейчас игрок outcast с 755. Чтобы обогнать его, держите бутылку до ×2,8 и запаситесь терпением: 756 и больше выходит примерно в одной партии из 37.
Итого
Мини-игры, трекеры, калькуляторы и прочие интерактивные штуки прямо в чате - огонь. Ничего не нужно открывать, игра работает у всех, у кого свежий Telegram.
Нормальную игру туда пока не засунешь: 4 КБ и полсекунды на скрипт. И пока игру нельзя переслать, распространять её придётся по старинке, ссылкой на бота.
Первое место в баре сейчас у outcast - 755. Отберёте? @game_barulin_cv_bot
Про свои проекты: сколько это стоит и где обжигаюсь, пишу в канале «Это Барулин сделал».