Почему 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 дополнительных параметров (например, реферальных ссылок или стартовых параметров).

    Часто задаваемые вопросы