Почему Puppeteer не показывает кнопку Open in Web в Telegram Mini App
При автоматизации Telegram Mini App через Puppeteer часто возникает ситуация: кнопка «Open in Web» отображается в обычном браузере, но исчезает в браузере, управляемом Puppeteer. Это связано с тем, что Telegram определяет, что браузер является автоматизированным (headless или с флагами тестирования) и скрывает элемент. Рассмотрим основные причины и способы решения.
Причина 1: Детект headless-режима
Telegram, как и многие современные веб-сервисы, использует JavaScript-скрипты для обнаружения автоматизированных браузеров. Puppeteer по умолчанию запускается с флагами, которые выдают его (например, --headless или --enable-automation). Сервер Telegram может проверять наличие этих флагов через navigator.webdriver или другие свойства, и если они обнаружены - скрывать кнопку.
Причина 2: Отсутствие корректного User-Agent
Браузер Puppeteer может отправлять нестандартный User-Agent (например, HeadlessChrome). Telegram анализирует строку User-Agent и, если видит признаки автоматизации, блокирует отображение кнопки. Вам нужно явно задать User-Agent, идентичный обычному браузеру (например, Chrome на Windows).
Причина 3: Проблемы с куками и сессией
При использовании --user-data-dir вы подгружаете профиль, но Telegram Web может требовать дополнительные куки или localStorage, которые не были сохранены корректно. Например, сессия может быть не полностью восстановлена, из-за чего сервер считает пользователя неавторизованным и убирает кнопку.
Как исправить: практические шаги
1. Отключите headless-режим и скройте автоматизацию
Запускайте браузер с явным headless: false (вы это уже делаете). Дополнительно передайте аргумент --disable-blink-features=AutomationControlled, чтобы скрыть флаг автоматизации. Также можно использовать page.evaluateOnNewDocument для переопределения navigator.webdriver:
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => false });
});2. Установите корректный User-Agent
Перед переходом на страницу задайте User-Agent, например, как в Chrome 120 на Windows:
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');3. Эмулируйте экран мобильного устройства
Telegram Mini App часто оптимизирован для мобильных устройств. Установите viewport как у телефона (например, 375x812) и включите touch-события:
await page.setViewport({ width: 375, height: 812, isMobile: true, hasTouch: true });4. Используйте stealth-плагины
Для обхода детекта автоматизации установите puppeteer-extra с плагином puppeteer-extra-plugin-stealth. Этот плагин автоматически маскирует Puppeteer под реальный браузер:
import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
puppeteer.use(StealthPlugin());5. Проверьте авторизацию в Telegram
Убедитесь, что вы залогинены в Telegram Web. Откройте https://web.telegram.org вручную через Puppeteer, войдите в аккаунт и сохраните куки. Затем используйте эти куки при открытии https://t.me/Something. Это гарантирует, что сервер видит авторизованного пользователя.
Заключение
Проблема с отсутствием кнопки «Open in Web» в Puppeteer почти всегда вызвана детектом автоматизации. Комбинируя отключение headless-флагов, подмену User-Agent, эмуляцию мобильного устройства и использование stealth-плагина, вы с высокой вероятностью решите её. Если кнопка всё ещё не появляется - проверьте, не требует ли Telegram Mini App дополнительных параметров (например, реферальных ссылок или стартовых параметров).