Un navegador sin cabeza es un navegador sin una interfaz gráfica de usuario (GUI). Puede ejecutarse en segundo plano, permitiendo a los programadores controlar y manipular el navegador a través de una interfaz de línea de comandos o scripts.
¡Es hora de comenzar a aprender sobre la detección y la anti-detección de bots con Nstbrowser!
Headless Chrome es un modo sin cabeza de Google Chrome. Permite a los desarrolladores controlar y manipular el navegador Chrome a través de la línea de comandos o scripts sin mostrar la interfaz de usuario del navegador. Headless Chrome combina el poder de Chrome con la eficiencia del modo sin cabeza, convirtiéndose en una herramienta indispensable para el desarrollo y pruebas web modernas.
¿A menudo te bloquean al raspar la web?
Nstbrowser desbloquea completamente los sitios web para evitar la detección
Prueba gratis Nstbrowser ahora!
¿Tienes ideas y dudas interesantes sobre el web scraping y el Browserless?
¡Veamos qué comparten otros desarrolladores en Discord y Telegram!
Los navegadores sin cabeza también se usan a menudo con fines anti-crawler debido a su naturaleza altamente automatizada. Por lo tanto, es crucial detectar su presencia.
A continuación se presentan algunas formas comunes de detectar navegadores sin cabeza utilizando código Javascript como ejemplo y algunos métodos de anti-detección:
El User Agent es un identificador que el navegador envía al servidor. Al verificar si el User Agent contiene la palabra “Headless” o no, podemos determinar inicialmente si la solicitud proviene de un Headless Chrome. Este método a menudo es poco confiable porque el User Agent puede ser falsificado o modificado.
const isHeadlessUserAgent = navigator.userAgent.toLowerCase().includes('headless');
// UserAgent personalizado sin 'headless'
Object.defineProperty(navigator, 'userAgent', {
value: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/124.0.0.0 Safari/537.36'
});
Los Headless Chrome usualmente no ejecutan JavaScript o su capacidad de ejecución de JavaScript es débil, por lo que podemos determinar si el navegador admite JavaScript ejecutando un código JavaScript simple. Esto se puede hacer verificando si ciertas APIs o funciones de JavaScript están disponibles.
const isJavaScriptEnabled = typeof window !== 'undefined';
Ciertas características del navegador pueden estar deshabilitadas o comportarse de manera anormal en los Headless Chrome. Luego, podemos usar estas características para la detección. Por ejemplo, se puede usar la API de Canvas para detectarlo.
const isCanvasSupported = () => {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
return !!context;
}
La detección de Headless Chrome se puede realizar verificando la presencia de la propiedad navigator.webdriver
. Los navegadores sin cabeza usualmente establecen esta propiedad, mientras que los navegadores normales no. Fuente relacionada: Chromium se puede determinar si es un Chrome sin cabeza.
const isWebDriverSupported = () => {
return navigator.webdriver;
}
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
window.chrome
Detectar la presencia de window.chrome
puede ayudar a determinar si el navegador está en modo sin cabeza. En modo sin cabeza, este atributo generalmente no está presente.
const isWindowChromeSupported = () => {
return window.chrome !== undefined;
}
WebRTC es un estándar web utilizado para la comunicación en tiempo real en los navegadores, y más detalles estarán en el sitio web oficial de WebRTC. En otras palabras, los Headless Chrome usualmente deshabilitan WebRTC, por lo que puedes determinar si el navegador es sin cabeza o no verificando la disponibilidad de WebRTC.
const isWebRTCSupported = () => {
return !!window.RTCPeerConnection;
}
La reproducción de audio o video generalmente está deshabilitada en modo sin cabeza. Al intentar reproducir audio o video, podemos detectar si el navegador es sin cabeza o no.
const isAudioVideoSupported = () => {
const audio = document.createElement('audio');
const video = document.createElement('video');
return !!(audio.canPlayType && video.canPlayType);
}
Actualmente, los navegadores en modo sin cabeza no pueden manipular los permisos del navegador, por lo que no son compatibles con Notification.permission
. No manejan eventos de la interfaz de usuario, solo la carga y el renderizado de páginas, por lo que en el modo sin cabeza, Notification.permission
y navigator.permissions.query
son inconsistentes.
const isHeadlessPermissionMatched = () => {
return navigator.permissions.query({name: 'notifications'})
.then(permissionStatus => {
return Notification.permission === 'denied' && permissionStatus.state === 'prompt';
})
.catch(() => {
return false;
});
};
navigator.plugins
navigator.plugins
puede mostrar la lista de plugins presentes en el navegador. Los navegadores normales instalarán algunos plugins por defecto, como el visor de PDF de Chrome o Google Native Client, etc., pero en el modo sin cabeza generalmente no tendrán ningún plugin. Así que puedes determinar si es un navegador sin cabeza revisando la lista de plugins.
const pluginInstalled = () => {
return navigator.plugins.length > 0
}
const originalPlugins = navigator.plugins;
Object.defineProperty(navigator, 'plugins', {
get: () => originalPlugins
});
En Chrome, el idioma utilizado por el usuario se puede obtener a través de navigator.language
y navigator.languages
, siendo el primero el idioma de la interfaz de usuario del navegador y el segundo una lista de los idiomas preferidos por el usuario. En el modo sin cabeza, navigator.languages
devolverá una cadena vacía.
const isHeadlessLanguage = () => {
return !navigator.languages || navigator.languages.length === 0
}
Object.defineProperty(navigator, 'languages', {
value: ['en-US', 'en']
});
Métodos de detección:
Métodos de anti-detección:
Es importante señalar que, debido a que los navegadores sin cabeza pueden imitar el comportamiento de casi todos los navegadores normales y utilizarán una variedad de métodos de anti-detección para que el navegador sin cabeza parezca más el comportamiento de un usuario real, lo que hace más difícil contrarrestar los rastreadores. Así que, independientemente de los métodos que se utilicen para la anti-detección de navegadores sin cabeza, no son absolutamente fiables, al menos no hasta ahora.
También podemos usar un navegador de huellas digitales para eludir la detección de Chrome sin cabeza. Tomemos como ejemplo el navegador anti-detección Nstbrowser. La solución API de Nstbrowser es una de las mejores opciones para evitar la detección de bots en la actualidad. Puedes usarlo y obtener la clave API gratis.
A continuación, compararemos la efectividad de la detección del navegador sin cabeza visitando los sitios de detección de headless Chrome CreepJS y Areyouheadless a través del navegador anti-huellas digitales Nstbrowser y mi navegador local Google Chrome, respectivamente.
Usaremos la API de llamada de Puppeteer para iniciar el navegador de huellas digitales en modo sin cabeza, específicamente usaremos la interfaz LaunchExistBrowser
, pero por supuesto, puedes elegir cualquier otra API que necesites según la documentación.
Antes de comenzar, necesitas:
Una vez que todo esté listo, es hora de codificar. El siguiente código muestra cómo iniciar el navegador en modo sin cabeza y visitar el sitio de inspección de navegadores sin cabeza y tomar una captura de pantalla:
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();
Comparando las capturas de pantalla de los resultados con los de mi Google Chrome local, descubrimos que la detección en ambos sitios no reconoció que estábamos utilizando un navegador sin cabeza, que es lo que queríamos.
A través de la discusión y el código de ejemplo en este artículo, esperamos proporcionar a los desarrolladores una referencia efectiva y orientación para mejorar la seguridad del sitio y las capacidades de protección de datos.
La detección y anti-detección de navegadores sin cabeza es un proceso evolutivo de confrontación tecnológica. El riesgo de detección y bloqueo puede contrarrestarse con la ayuda de herramientas efectivas de anti-detección. Nstbrowser puede ayudarte a asegurar que seas absolutamente indetectable y utilizar tecnología avanzada para desbloquear bloqueos de red.
Además, los desarrolladores necesitan estar atentos a los últimos avances tecnológicos y actualizar sus estrategias de detección para enfrentar nuevos desafíos. Cualquiera que sea el método utilizado para contrarrestar la detección de headlesschrome, necesita ser continuamente optimizado y mejorado para asegurar su efectividad y fiabilidad.