Браузер без графического интерфейса (GUI) — это браузер без графического интерфейса пользователя. Он может работать в фоновом режиме, позволяя программистам управлять и манипулировать браузером через интерфейс командной строки или скрипты.
Теперь пришло время начать изучать методы обнаружения и противодействия ботам с помощью Nstbrowser!
Headless Chrome — это режим работы Google Chrome без графического интерфейса. Он позволяет разработчикам управлять и манипулировать браузером Chrome через командную строку или скрипты без отображения интерфейса пользователя. Headless Chrome сочетает мощь Chrome с эффективностью режима без интерфейса, делая его незаменимым инструментом для современной веб-разработки и тестирования.
Часто блокируют при скрейпинге веба?
Nstbrowser полностью разблокирует веб-сайты, чтобы избежать обнаружения
Попробуйте Nstbrowser бесплатно сейчас!
Есть ли у вас хорошие идеи или вопросы о веб-скрейпинге и Browserless?
Посмотрите чем делятся другие разработчики в Discord и Telegram!
Браузеры без графического интерфейса часто используются для анти-скрейпинга из-за их высокой автоматизации. Поэтому становится важно обнаружить их присутствие.
Ниже приведены некоторые общие способы обнаружения браузеров без графического интерфейса с использованием кода на JavaScript в качестве примера и некоторые методы противодействия обнаружению:
User Agent — это идентификатор, который браузер отправляет серверу. Проверяя, содержит ли User Agent слово "Headless" или нет, мы можем первоначально определить, исходит ли запрос от Headless Chrome. Этот метод часто ненадежен, так как User Agent может быть подделан или изменен.
const isHeadlessUserAgent = navigator.userAgent.toLowerCase().includes('headless');
// настраиваемый User Agent без 'headless'
Object.defineProperty(navigator, 'userAgent', {
value: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/124.0.0.0 Safari/537.36'
});
Headless Chrome обычно не выполняет JavaScript или их способность к выполнению JavaScript ослаблена, поэтому мы можем определить, поддерживает ли браузер JavaScript, выполняя простой JavaScript-код. Это можно сделать, проверив доступность определенных JavaScript API или функций.
const isJavaScriptEnabled = typeof window !== 'undefined';
Некоторые функции браузера могут быть отключены или работать аномально в Headless Chrome. Мы можем использовать эти функции для обнаружения. Например, Canvas API можно использовать для этого.
const isCanvasSupported = () => {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
return !!context;
}
Обнаружение Headless Chrome можно выполнить, проверяя наличие свойства navigator.webdriver
. Браузеры без графического интерфейса обычно устанавливают это свойство, в то время как обычные браузеры — нет. Связанная информация: Chromium позволяет определить, является ли это Headless Chrome.
const isWebDriverSupported = () => {
return navigator.webdriver;
}
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
window.chrome
Обнаружение наличия window.chrome
может помочь определить, находится ли браузер в headless режиме. В headless режиме этот атрибут обычно отсутствует.
const isWindowChromeSupported = () => {
return window.chrome !== undefined;
}
WebRTC — это веб-стандарт, используемый для реального времени в браузерах, более подробную информацию можно найти на Webrtc официальном сайте. В других словах, Headless Chrome обычно отключает WebRTC, поэтому вы можете определить, является ли браузер headless, проверяя доступность WebRTC.
const isWebRTCSupported = () => {
return !!window.RTCPeerConnection;
}
Воспроизведение аудио или видео обычно отключено в headless режиме. Попытавшись воспроизвести аудио или видео, мы можем явно определить, является ли браузер headless или нет.
const isAudioVideoSupported = () => {
const audio = document.createElement('audio');
const video = document.createElement('video');
return !!(audio.canPlayType && video.canPlayType);
}
В настоящее время headless Chrome не может манипулировать разрешениями браузера, поэтому они не поддерживают Notification.permission
. Они не обрабатывают события пользовательского интерфейса, только загрузку и рендеринг страниц, поэтому в headless Chrome Notification.permission
и navigator.permissions.query
не совпадают.
const isHeadlessPermissionMatched = () => {
return navigator.permissions.query({name: 'notifications'})
.then(permissionStatus => {
return Notification.permission === 'denied' && permissionStatus.state === 'prompt';
})
.catch(() => {
return false;
});
};
navigator.plugins
navigator.plugins
может показать список плагинов, присутствующих в браузере. Обычные браузеры по умолчанию устанавливают некоторые плагины, такие как: Chrome PDF viewer или Google Native Client и т.д., но в headless режиме, как правило, нет никаких плагинов. Таким образом, можно определить, является ли это headless браузером, проверив список плагинов.
const pluginInstalled = () => {
return navigator.plugins.length > 0
}
const originalPlugins = navigator.plugins;
Object.defineProperty(navigator, 'plugins', {
get: () => originalPlugins
});
В Chrome язык, используемый пользователем, можно получить через navigator.language
и navigator.languages
, первое — это язык интерфейса браузера, а второе — список предпочитаемых пользователем языков. В headless Chrome navigator.languages
вернёт пустую строку.
const isHeadlessLanguage = () => {
return !navigator.languages || navigator.languages.length === 0
}
Object.defineProperty(navigator, 'languages', {
value: ['en-US', 'en']
});
Методы обнаружения:
Методы противодействия обнаружению:
Важно отметить, что поскольку headless браузеры могут имитировать поведение почти всех нормальных браузеров и используют различные методы противодействия обнаружению, чтобы выглядеть как поведение реального пользователя, это делает их обнаружение более сложным. Поэтому, какие бы методы ни использовались для противодействия обнаружению headless браузеров, они не являются абсолютно надёжными, по крайней мере, на данный момент.
Мы также можем использовать браузер с отпечатком, чтобы обойти обнаружение headless Chrome. Рассмотрим Nstbrowser как пример антидетект браузера. Решение API Nstbrowser — один из лучших способов избежать обнаружения ботов в настоящее время. Вы можете использовать его и получить API ключ бесплатно.
Далее мы сравним эффективность обнаружения headless браузера, посетив сайты для обнаружения headless Chrome CreepJS и Areyouheadless через антидетект браузер Nstbrowser и мой локальный Google Chrome браузер соответственно.
Мы будем использовать API вызова Puppeteer для запуска headless браузера с отпечатком, в частности будем использовать интерфейс LaunchExistBrowser
, но, конечно, вы можете выбрать любой другой API, который вам нужен, исходя из документации.
Перед началом вам нужно:
Когда всё будет готово, пришло время для кода. Следующий код показывает запуск браузера в headless режиме и посещение сайта для инспекции headless браузера и создания снимка экрана:
import puppeteer from 'puppeteer-core';
// wiat for millseconds
function sleep(millseconds) {
return new Promise(resolve => setTimeout(resolve, millseconds));
}
// visit headless detection site and take screenshots
async function execPuppeteer(browserWSEndpoint) {
try {
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint,
defaultViewport: null,
});
const page = await browser.newPage();
// detect headless on creepjs site
await page.goto('https://abrahamjuliot.github.io/creepjs');
await sleep(5 * 1000);
await page.screenshot({ fullPage: true, path: 'detect_headless_creepjs.png' });
// detect headless on areyouheadless site
await page.goto('https://arh.antoinevastel.com/bots/areyouheadless');
await sleep(2 * 1000);
await page.screenshot({ path: 'detect_headless_areyouheadless.png' });
await page.close();
await browser.disconnect();
} catch (err) {
console.error(err);
}
}
// LaunchExistBrowser: Connect to or start an existing browser
// You need to create the corresponding profile in advance
// Support custom config
async function launchAndConnectToBrowser(profileId) {
const host = 'localhost:8848';
const apiKey = 'you api key;
const config = {
headless: true, // support: true, 'new'
autoClose: true,
};
const query = new URLSearchParams({
'x-api-key': apiKey, // required
config: encodeURIComponent(JSON.stringify((config))),
});
const browserWSEndpoint = `ws://${host}/devtool/launch/${profileId}?${query.toString()}`;
console.log('browserWSEndpoint: ', browserWSEndpoint);
await execPuppeteer(browserWSEndpoint);
}
launchAndConnectToBrowser('your profile id').then();
Сравнивая скриншоты результатов с результатами моего локального Google Chrome, мы обнаружили, что обнаружение headless режима на обоих сайтах не распознало, что мы используем headless браузер, что и было нашей целью.
Через обсуждение и примеры кода в этой статье мы надеемся предоставить разработчикам эффективные рекомендации и руководство по улучшению безопасности сайта и защите данных.
Обнаружение и противодействие обнаружению headless браузеров — это развивающийся процесс технологического противостояния. Риск обнаружения и блокировки можно минимизировать с помощью эффективных инструментов противодействия обнаружению. Nstbrowser может помочь вам обеспечить абсолютную незаметность и использовать передовые технологии для обхода сетевых блокировок.
Кроме того, разработчикам необходимо следить за последними технологическими разработками и обновлять свои стратегии обнаружения для решения новых задач. Какой бы метод ни использовался для противодействия обнаружению headless Chrome, его необходимо постоянно оптимизировать и улучшать, чтобы обеспечить его эффективность и надежность.