selenium selenium-webdriver webdriver captcha webdriver-w3c-spec

Selenium y el navegador sin cabeza sigue preguntando por Captcha



selenium-webdriver webdriver (2)

En la discusión titulada ¿Cómo sabe recaptcha 3 que estoy usando selenio / cromedriver? Hemos discutido sobre algunos enfoques genéricos para evitar ser detectados durante el raspado de la web. Profundicemos.

Navegador sin cabeza

Un navegador sin cabeza es un navegador que se puede usar sin una interfaz gráfica. Se puede controlar mediante programación para automatizar tareas, como hacer pruebas o tomar capturas de pantalla de páginas web.

¿Por qué detectar el navegador sin cabeza?

Según @AntoineVastel , los navegadores sin cabeza se utilizan para automatizar tareas maliciosas. Los casos más comunes son el raspado web, aumentar las impresiones de publicidad o buscar vulnerabilidades en un sitio web.

Hasta hace un año, uno de los navegadores sin cabeza más populares era PhantomJS. Dado que se basa en el marco Qt, presenta muchas diferencias en comparación con los navegadores más populares. Fue posible detectar PhantomJS utilizando algunas técnicas de huellas digitales del navegador. Desde la versión 59, Google lanzó una versión sin cabeza de su navegador Chrome. A diferencia de PhantomJS, se basa en un Chrome de vainilla y no en un marco externo, lo que hace que su presencia sea más difícil de detectar. Es probable que haya otras formas de detectar Chrome sin cabeza.

Detectando Chrome sin cabeza

  • Agente de usuario : el atributo de agente de usuario se usa comúnmente para detectar el sistema operativo y el navegador del usuario. Con Chrome versión 59 tiene el siguiente valor:

    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36

    • Se puede verificar la presencia de Chrome sin cabeza a través de:

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

  • Complementos : navigator.plugins devuelve una serie de complementos presentes en el navegador. Por lo general, en Chrome encontramos complementos predeterminados, como el Chrome PDF viewer o Google Native Client . Por el contrario, en modo sin cabeza, la matriz devuelta no contiene ningún complemento.

    • Se puede verificar la presencia de complementos a través de:

      if(navigator.plugins.length == 0) { console.log("It may be Chrome headless"); }

  • Idiomas : en Chrome, dos atributos de Javascript permiten obtener los idiomas utilizados por el user: navigator.language y navigator.languages . El primero es el idioma de la interfaz de usuario del navegador, mientras que el segundo es un conjunto de cadenas que representan los idiomas preferidos del usuario. Sin embargo, en modo sin cabeza, navigator.languages devuelve una cadena vacía .

    • Se puede verificar la presencia de idiomas a través de:

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

  • WebGL : WebGL es una API para realizar renderizado 3D en un lienzo HTML. Con esta API, es posible consultar al proveedor del controlador gráfico y al procesador del controlador gráfico. Con un Vanilla Chrome y Linux, podemos obtener los siguientes valores para el procesador y el proveedor: Google SwiftShader y Google Inc. En el modo sin cabeza, podemos obtener Mesa OffScreen , que es la tecnología utilizada para renderizar sin usar ningún tipo de sistema de ventanas y Brian Paul , que es el programa que inició la biblioteca de gráficos Mesa de código abierto.

    • Se puede verificar la presencia de WebGL a través de:

      var canvas = document.createElement(''canvas''); var gl = canvas.getContext(''webgl''); var debugInfo = gl.getExtension(''WEBGL_debug_renderer_info''); var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL); var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL); if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") { console.log("Chrome headless detected"); }

    • No todos los Chrome sin cabeza tendrán los mismos valores para el proveedor y el procesador. Otros mantienen valores que también se pueden encontrar en la versión sin cabeza. Sin embargo, Mesa Offscreen y Brian Paul indican la presencia de la versión sin cabeza.

  • Características del navegador : la biblioteca Modernizr permite probar si una amplia gama de características HTML y CSS están presentes en un navegador. La única diferencia que encontramos entre Chrome y Chrome sin cabeza fue que este último no tenía la función de rayita, que detecta el soporte para las hidpi/retina hairlines .

    • Se puede verificar la presencia de la característica de rayita a través de:

      if(!Modernizr["hairline"]) { console.log("It may be Chrome headless"); }

  • Imagen faltante : el último en nuestra lista también parece ser el más robusto, proviene de la dimensión de la imagen utilizada por Chrome en caso de que no se pueda cargar una imagen. En el caso de un Chrome de vainilla, la imagen tiene un ancho y una altura que dependen del zoom del navegador, pero son diferentes de cero. En un Chrome sin cabeza, la imagen tiene un ancho y una altura igual a cero.

    • Se puede verificar la presencia de Imagen faltante a través de:

      var body = document.getElementsByTagName("body")[0]; var image = document.createElement("img"); image.src = "http://iloveponeydotcom32188.jg"; image.setAttribute("id", "fakeimage"); body.appendChild(image); image.onerror = function(){ if(image.width == 0 && image.height == 0) { console.log("Chrome headless detected"); } }

Estos son algunos de los factores cruciales por los que los navegadores sin cabeza son más propensos a ser detectados.

Outro

Me encontraba con un problema en el que uno de nuestros sitios seguía pidiendo captcha en modo sin cabeza en un navegador en la nube, así que lo cambié a no sin cabeza, para poder ingresar al captcha yo mismo, y pensé que las siguientes veces sería trabajo, quizás porque algunas cookies ya estarían almacenadas, pero no lo hizo a pesar de que ingresé al captcha varias veces.

También vale la pena mencionar que funciona bien localmente en cualquier modo, y también funciona bien en la nube para la versión no automatizada, pero tan pronto como lo ejecuto allí con Selenium en cualquier modo, sigue pidiendo el captcha. Cualquier idea de lo que podría estar sucediendo y las ideas sobre la solución son muy apreciadas.


Entonces, cómo funciona el captcha, según la velocidad con la que realice las acciones, se activará una especie de indicador que notificará al servidor que está A) Intentando piratear la página web o B) Automatizándola. Esto casi siempre generará una instancia de captcha. Hasta la fecha, no hay forma de manejar captcha. Si este es un entorno que su empresa ha desarrollado, puede solicitar a los desarrolladores que desactiven el captcha en un entorno de ensayo con una URL diferente. Esta es la situación ideal, pero si se trata de un sitio externo, no hay nada que pueda hacer al respecto.