Saltar al contenido

Selenium webdriver: modificación del indicador navigator.webdriver para evitar la detección de selenio

Este dilema se puede tratar de diversas formas, pero en este caso te enseñamos la respuesta más completa en nuestra opinión.

Primero la actualización 1

execute_cdp_cmd(): Con la disponibilidad de execute_cdp_cmd(cmd, cmd_args) comando ahora puede ejecutar fácilmente los comandos google-chrome-devtools usando Selenium. Con esta función puede modificar el navigator.webdriver fácilmente para evitar que se detecte el selenio.


Prevención de la detección 2

Para prevenir el selenio impulsado WebDriver ser detectado un enfoque de nicho incluiría uno o todos los pasos mencionados a continuación:

  • Rotar el usuario-agente a través execute_cdp_cmd() comando de la siguiente manera:

    #Setting up Chrome/83.0.4103.53 as useragent
    driver.execute_cdp_cmd('Network.setUserAgentOverride', "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36')
    
  • Cambiar el propiedad valor de la navigator por webdriver a indefinido

    driver.execute_script("Object.defineProperty(navigator, 'webdriver', get: () => undefined)")
    
  • Excluir la colección de enable-automation interruptores

    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    
  • Apagar useAutomationExtension

    options.add_experimental_option('useAutomationExtension', False)
    

Código de muestra 3

Aprovechar todos los pasos mencionados anteriormente y el bloque de código efectivo será:

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:WebDriverschromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', get: () => undefined)")
driver.execute_cdp_cmd('Network.setUserAgentOverride', "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36')
print(driver.execute_script("return navigator.userAgent;"))
driver.get('https://www.httpbin.org/headers')

Historia

Según el Borrador del editor del W3C la implementación actual menciona estrictamente:

El webdriver-activebandera se establece en true cuando el agente de usuario está debajo control remoto que inicialmente se establece en false.

Más,

Navigator includes NavigatorAutomationInformation;

Cabe señalar que:

El NavigatorAutomationInformationinterfaz no debe exponerse en TrabajadorNavigator.

El NavigatorAutomationInformationinterfaz Se define como:

interface mixin NavigatorAutomationInformation 
    readonly attribute boolean webdriver;
;

que regresa true Si webdriver-activebandera Está establecido, false de lo contrario.

Finalmente, el navigator.webdriver define una forma estándar para que los agentes de usuario cooperantes informen al documento que está controlado por WebDriver, de modo que se puedan activar rutas de código alternativas durante la automatización.

Precaución: La alteración / ajuste de los parámetros mencionados anteriormente puede bloquear la navegación y consigue el WebDriver instancia detectada.


Actualización (6-nov-2019)

A partir de la implementación actual, una forma ideal de acceder a una página web sin ser detectado sería utilizar el ChromeOptions() class para agregar un par de argumentos a:

  • Excluir la colección de enable-automation interruptores
  • Apagar useAutomationExtension

a través de una instancia de ChromeOptions como sigue:

  • Ejemplo de Java:

    System.setProperty("webdriver.chrome.driver", "C:\Utility\BrowserDrivers\chromedriver.exe");
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver =  new ChromeDriver(options);
    driver.get("https://www.google.com/");
    
  • Ejemplo de Python

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:pathtochromedriver.exe')
    driver.get("https://www.google.com/")
    

Leyendas

1: Se aplica solo a los clientes Python de Selenium.

2: Se aplica solo a los clientes Python de Selenium.

3: Se aplica solo a los clientes Python de Selenium.

ChromeDriver:

¡Finalmente descubrí la solución simple para esto con una simple bandera! 🙂

--disable-blink-features=AutomationControlled

navigator.webdriver =true ya no aparecerá con esa bandera configurada.

Para obtener una lista de las cosas que puede deshabilitar, véalas aquí.

No use el comando cdp para cambiar el valor de webdriver, ya que provocará inconsistencias que luego se pueden usar para detectar webdriver. Utilice el siguiente código, esto eliminará cualquier rastro de webdriver.

options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *