Безголовый браузер Chromium всегда отображает Captcha

я использую безголовый браузер google chrome с headless-chromium-php

для перехода на некоторые веб-сайты, но он всегда обнаруживается капчей

я попытался изменить пользовательский агент случайным образом, используя этот плагин

но ничего не изменилось

        $UserAgent = \Campo\UserAgent::random([
            'os_type' => 'Windows',
            'device_type' => 'desktop'
        ]);

        $browserFactory = new BrowserFactory('/opt/google/chrome/google-chrome');

        $browser = $browserFactory->createBrowser([
            'sendSyncDefaultTimeout' => 5000,
            'userAgent' => $UserAgent
        ]);
        $page = $browser->createPage();

        $page->navigate($NextURL)->waitForNavigation();

Почему это происходит ?


person Amr Ahmed    schedule 30.11.2019    source источник


Ответы (1)


Я настоятельно рекомендую вам прочитать обе статьи ниже и применить все эти методы к вашему коду, чтобы еще больше усложнить обнаружение Chrome Headless.

Новые методы обнаружения Chrome без заголовка

невозможно обнаружить и заблокировать Chrome без головы

Детекторы безголового браузера обычно используют множество методов, чтобы определить, управляется ли ваш браузер удаленно, например, некоторые свойства среды браузера:

Пользовательский агент (старый)

Это атрибут, обычно используемый для определения ОС, а также браузера пользователя. На компьютере Linux с Chrome версии 63 он имеет следующее значение: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/63.0.3071.115 Safari/537.36

Таким образом, мы можем проверить наличие Chrome Headless:

if (/HeadlessChrome/.test(window.navigator.userAgent)) {
    console.log('Chrome headless detected!')
}

Вебдрайвер (новый)

Для автоматизации Chrome headless в объект навигатора добавлено новое свойство webdriver (см. код Chromium). Таким образом, проверяя наличие свойства, можно обнаружить Chrome без заголовка.

if (navigator.webdriver) {
    console.log('Chrome headless detected!')
}

Хром (новый)

window.chrome — это объект, который, кажется, предоставляет функции разработчикам расширений Chrome. Хотя он доступен в ванильном режиме, он недоступен в безголовом режиме.

if (!window.chrome) {
    console.log('Chrome headless detected')
}

Разрешения (новое)

В настоящее время невозможно обрабатывать разрешения в автономном режиме. Таким образом, это приводит к несогласованному состоянию, когда Notification.permission и navigator.permissions.query сообщают о противоречивых значениях.

const permissionStatus = await navigator.permissions.query({ name: 'notifications' })
if (Notification.permission === 'denied' && permissionStatus.state === 'prompt') {
    console.log('This is Chrome headless!')
} else {
    console.log('This is not Chrome headless')
}

Плагины (старые)

navigator.plugins возвращает массив плагинов, присутствующих в браузере. Как правило, в Chrome мы находим плагины по умолчанию, такие как Chrome PDF Viewer или Google Native Client. Наоборот, в безголовом режиме возвращаемый массив не содержит плагина.

if (navigator.plugins.length === 0) {
    console.log('Chrome headless detected!')
}

Языки (старые)

В Chrome два атрибута Javascript позволяют получить языки, используемые пользователем: navigator.language и navigator.languages. Первый — это язык пользовательского интерфейса браузера, а второй — массив строк, представляющих предпочитаемые пользователем языки. Однако в автономном режиме navigator.languages ​​возвращает пустую строку.

if (navigator.languages === '') {
    console.log('Chrome headless detected')
}

WebGL

WebGL — это API для выполнения 3D-рендеринга на холсте HTML. С помощью этого API можно запросить поставщика графического драйвера, а также средство визуализации графического драйвера.

С ванильным Chrome и Linux я получаю следующие значения для рендерера и поставщика: «Google SwiftShader» и «Google Inc.». В безголовом режиме я получаю «Mesa OffScreen», технологию, используемую для рендеринга без использования какой-либо оконной системы, и «Brian Paul», программу, которая запустила графическую библиотеку Mesa с открытым исходным кодом.

const canvas = document.createElement('canvas')
const gl = canvas.getContext('webgl')

const debugInfo = gl.getExtension('WEBGL_debug_renderer_info')
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)

if (vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {
    console.log('Chrome headless detected')
}

Отсутствует изображение

Наконец, наш последний вывод, который также кажется наиболее надежным, связан с размером изображения, используемого Chrome в случае, если изображение не может быть загружено.

В случае ванильного Chrome ширина и высота изображения зависят от масштаба браузера, но отличны от нуля. В безголовом Chrome изображение имеет ширину и высоту, равные нулю.

const img = document.createElement('img')
img.src = "http://iloveponeydotcom32188.jg"
document.body.appendChild(img)
img.onerror = () => {
    if (img.width == 0 && img.height == 0) {
        console.log('Chrome headless detected')
    }
}
person henriquehbr    schedule 30.11.2019