He estado probando Selenium con Chromedriver y noté que algunas páginas pueden detectar que estás usando Selenium a pesar de que no hay ninguna automatización. Incluso cuando estoy navegando manualmente solo usando Chrome a través de Selenium y Xephyr, a menudo recibo una página que dice que se detectó actividad sospechosa. Revisé mi agente de usuario y la huella digital de mi navegador, y todos son exactamente idénticos al navegador Chrome normal.
Cuando navego por estos sitios en Chrome normal, todo funciona bien, pero en el momento en que uso Selenium me detectan.
En teoría, chromedriver y chrome deberían verse literalmente exactamente igual para cualquier servidor web, pero de alguna manera pueden detectarlo.
Si quieres un código de prueba prueba esto:
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')
Si navega por stubhub, será redirigido y 'bloqueado' dentro de una o dos solicitudes. He estado investigando esto y no puedo entender cómo pueden decir que un usuario está usando Selenium.
¿Cómo lo hicieron?
EDITAR ACTUALIZACIÓN:
Instalé el complemento Selenium IDE en Firefox y me prohibieron cuando fui a stubhub.com en el navegador normal de Firefox con solo el complemento adicional.
EDITAR:
Cuando uso Fiddler para ver las solicitudes HTTP que se envían de un lado a otro, he notado que las solicitudes de 'navegador falso' a menudo tienen 'sin caché' en el encabezado de respuesta.
EDITAR:
resultados como este ¿Hay alguna forma de detectar que estoy en una página de Selenium Webdriver desde Javascript? sugiere que no debería haber forma de detectar cuando está utilizando un webdriver. Pero esta evidencia sugiere lo contrario.
EDITAR:
El sitio carga una huella digital en sus servidores, pero lo verifiqué y la huella digital de selenio es idéntica a la huella digital cuando se usa Chrome.
EDITAR:
Esta es una de las cargas útiles de huellas digitales que envían a sus servidores
{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}
Es idéntico en selenio y en cromo.
EDITAR:
Las VPN funcionan para un solo uso, pero se detectan después de cargar la primera página. Claramente, se está ejecutando javascript para detectar Selenium.
fuente
distill
tecnología de detección de bot y ofrece contenido utilizandoakamaitechnologies.com
CDN de diferentes ips95.100.59.245
, por ejemplo104.70.243.66
,23.202.161.241
Respuestas:
Para usuarios de Mac
Reemplazar
cdc_
variable usando Vim o PerlPuede usar
vim
, o como @Vic Seedoubleyew ha señalado en la respuesta de @ Erti-Chris Eelmaaperl
, para reemplazar lacdc_
variable enchromedriver
( Vea la publicación de @ Erti-Chris Eelmaa para obtener más información sobre esa variable ). Usarvim
operl
evita tener que volver a compilar el código fuente o usar un editor hexadecimal. Asegúrese de hacer una copia del originalchromedriver
antes de intentar editarlo. Además, se probaron los siguientes métodoschromedriver version 2.41.578706
.Usando Vim
Después de ejecutar la línea de arriba, probablemente verá un montón de galimatías. Haz lo siguiente:
cdc_
escribiendo/cdc_
y presionandoreturn
.a
.$cdc_lasutopfhvcZLmcfl
y reemplace lo que se eliminó con una cantidad igual de caracteres. Si no lo hace,chromedriver
fallará.esc
.:wq!
y presionereturn
.:q!
y presionereturn
.Vaya a la alterada
chromedriver
y haga doble clic en ella. Seterminal
debe abrir una ventana. Si no vekilled
en la salida, alteró con éxito el controlador.Usando Perl
La siguiente línea reemplaza
cdc_
condog_
:Asegúrese de que la cadena de reemplazo tenga el mismo número de caracteres que la cadena de búsqueda; de lo contrario
chromedriver
, fallará.Explicación de Perl
s///g
denota que desea buscar una cadena y reemplazarla globalmente con otra cadena (reemplaza todas las ocurrencias).Entonces,
Cómo verificar si el reemplazo de Perl funcionó
La siguiente línea imprimirá cada aparición de la cadena de búsqueda
cdc_
:perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver
Si esto no devuelve nada, entonces
cdc_
ha sido reemplazado.Por el contrario, puede usar esto:
perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver
para ver si su cadena de reemplazo,,
dog_
ahora está en elchromedriver
binario. Si es así, la cadena de reemplazo se imprimirá en la consola.Vaya a la alterada
chromedriver
y haga doble clic en ella. Seterminal
debe abrir una ventana. Si no vekilled
en la salida, alteró con éxito el controlador.Terminando
Después de alterar el
chromedriver
binario, asegúrese de que el nombre delchromedriver
binario alterado seachromedriver
, y que el binario original se mueva de su ubicación original o cambie de nombre.Mi experiencia con este método
Anteriormente me detectaban en un sitio web mientras intentaba iniciar sesión, pero después de reemplazarlo
cdc_
por una cadena de igual tamaño, pude iniciar sesión. Como otros han dicho, si ya lo han detectado, es posible que se bloquee por un muchas otras razones, incluso después de usar este método. Por lo tanto, es posible que deba intentar acceder al sitio que lo estaba detectando utilizando una VPN, una red diferente o lo que sea que tenga.fuente
Básicamente, la forma en que funciona la detección de selenio es que prueban las variables de JavaScript predefinidas que aparecen cuando se ejecuta con selenio. Las secuencias de comandos de detección de bot generalmente parecen cualquier cosa que contenga la palabra "selenio" / "controlador web" en cualquiera de las variables (en el objeto de ventana), y también documentan las variables llamadas
$cdc_
y$wdc_
. Por supuesto, todo esto depende del navegador en el que se encuentre. Todos los diferentes navegadores exponen diferentes cosas.Para mí, utilicé Chrome, por lo que todo lo que tenía que hacer era asegurarme de que
$cdc_
ya no existiera como variable de documento, y listo (descargue el código fuente de chromedriver, modifique chromedriver y vuelva a compilar$cdc_
con un nombre diferente).esta es la función que modifiqué en chromedriver:
call_function.js:
(tenga en cuenta el comentario, todo lo que hice me di
$cdc_
arandomblabla_
.Aquí hay un pseudocódigo que muestra algunas de las técnicas que las redes bot pueden usar:
de acuerdo con el usuario @szx, también es posible simplemente abrir chromedriver.exe en el editor hexadecimal, y simplemente hacer el reemplazo manualmente, sin hacer ninguna compilación.
fuente
$cdc
conxxxx
enchromedriver.exe
un editor hexadecimal y funcionó! También noté que si maximiza la ventana del navegador (en lugar de usar un tamaño predefinido), se detecta con menos frecuencia.Como ya hemos descubierto en la pregunta y las respuestas publicadas, hay un servicio anti-scraping y un servicio de detección de Bot llamado "Distil Networks" en juego aquí. Y, según la entrevista del CEO de la compañía :
Tomará tiempo y desafíos adicionales entender cómo exactamente están detectando Selenium, pero qué podemos decir con seguridad en este momento:
Decidí publicarlo como respuesta, ya que claramente:
Si.
Además, con lo que no he experimentado es con selenio más antiguo y versiones más antiguas del navegador: en teoría, podría haber algo implementado / agregado al selenio en un punto determinado en el que actualmente se basa el detector de bot de Distil Networks. Entonces, si este es el caso, podríamos detectar (sí, detectemos el detector) en qué punto / versión se realizó un cambio relevante, buscar en el registro de cambios y conjuntos de cambios y, tal vez, esto podría darnos más información sobre dónde buscar y qué es lo que usan para detectar un navegador webdriver. Es solo una teoría que necesita ser probada.
fuente
Ejemplo de cómo se implementa en wellsfargo.com:
fuente
Resultado de ofuscación de JavaScripts
He comprobado el código fuente de chromedriver. Eso inyecta algunos archivos javascript al navegador.
Todos los archivos javascript de este enlace se inyectan en las páginas web: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/
Así que utilicé ingeniería inversa y ofusqué los archivos js mediante edición hexadecimal. Ahora estaba seguro de que no se usaron más variables de JavaScript, nombres de funciones y cadenas fijas para descubrir la actividad de selenio. ¡Pero todavía algunos sitios y reCaptcha detectan selenio!
Tal vez verifican las modificaciones causadas por la ejecución de chromedriver js :)
Editar 1:
Modificación de parámetros de 'navegador' de Chrome
Descubrí que hay algunos parámetros en 'navegador' que descubren brevemente el uso de chromedriver. Estos son los parámetros:
Entonces, lo que necesitaba era una extensión de Chrome para ejecutar JavaScript en las páginas web. Hice una extensión con el código js provisto en el artículo y usé otro artículo para agregar la extensión comprimida a mi proyecto. He cambiado con éxito los valores; ¡Pero todavía nada ha cambiado!
No encontré otras variables como estas, pero eso no significa que no existan. Todavía reCaptcha detecta el controlador cromático, por lo que debería haber más variables para cambiar. El siguiente paso debería ser la ingeniería inversa de los servicios de detectores que no quiero hacer.
¡Ahora no estoy seguro de si vale la pena dedicar más tiempo a este proceso de automatización o buscar métodos alternativos!
fuente
Intente usar selenio con un perfil de usuario específico de Chrome, de esa manera puede usarlo como usuario específico y definir lo que quiera, al hacerlo se ejecutará como un usuario 'real', observe el proceso de Chrome con algún explorador de procesos y Verás la diferencia con las etiquetas.
Por ejemplo:
lista de etiquetas de Chrome aquí
fuente
Tomado directamente del Borrador de WebDriver del Editor del W3C 2017 . Esto implica en gran medida que, al menos, las futuras iteraciones de los controladores de selenio serán identificables para evitar el mal uso. En última instancia, es difícil saber sin el código fuente, qué es exactamente lo que hace que el controlador de Chrome en específico sea detectable.
fuente
Se dice que Firefox se configura
window.navigator.webdriver === true
si se trabaja con un controlador web. Eso fue de acuerdo con una de las especificaciones más antiguas (por ejemplo: archive.org ), pero no pude encontrarla en la nueva, excepto por una redacción muy vaga en los apéndices.Una prueba de esto está en el código de selenio en el archivo fingerprint_test.js donde el comentario al final dice "Actualmente solo implementado en Firefox" pero no pude identificar ningún código en esa dirección con algo simple
grep
, ni en el actual (41.0.2) Firefox release-tree ni en el árbol de Chromium.También encontré un comentario para una confirmación anterior con respecto a las huellas digitales en el controlador firefox b82512999938 de enero de 2015 . Ese código todavía está en el Selenium GIT-master descargado ayer
javascript/firefox-driver/extension/content/server.js
con un comentario que enlaza con el apéndice redactado de forma ligeramente diferente en la especificación actual del controlador web w3c.fuente
window.navigator.webdriver
no está definida.window.navigator.webdriver == true
Además de la gran respuesta de @ Erti-Chris Eelmaa : hay una molestia
window.navigator.webdriver
y es de solo lectura. Evento si cambia el valor de la mismafalse
todavía tendrátrue
. Es por eso que aún se puede detectar el navegador controlado por software automatizado. MDNLa variable es administrada por la bandera
--enable-automation
en cromo. El chromedriver lanza Chrome con esa bandera y Chrome establece elwindow.navigator.webdriver
atrue
. Lo puedes encontrar aquí . Debe agregar a "excluir interruptores" la bandera. Por ejemplo (golang):fuente
Parece que están detrás de un firewall de aplicaciones web. Eche un vistazo a modsecurity y owasp para ver cómo funcionan. En realidad, lo que está preguntando es cómo hacer la evasión de detección de bot. Para eso no está el controlador web de selenio. Es para probar que su aplicación web no afecta a otras aplicaciones web. Es posible, pero básicamente, tendría que mirar lo que busca un WAF en su conjunto de reglas y evitarlo específicamente con selenio si puede. Incluso entonces, podría no funcionar porque no sabes qué WAF están usando. Hiciste el primer paso correcto, que es fingir el agente de usuario. Sin embargo, si eso no funcionó, entonces hay un WAF en su lugar y probablemente deba ser más complicado.
Editar: Punto tomado de otra respuesta. Asegúrese de que su agente de usuario se esté configurando correctamente primero. Tal vez haga que llegue a un servidor web local o huela el tráfico que sale.
fuente
Incluso si está enviando todos los datos correctos (por ejemplo, Selenium no aparece como una extensión, tiene una resolución razonable / profundidad de bits, etc.), hay una serie de servicios y herramientas que muestran el comportamiento del visitante para determinar si actor es un usuario o un sistema automatizado.
Por ejemplo, visitar un sitio e inmediatamente realizar alguna acción moviendo el mouse directamente al botón correspondiente, en menos de un segundo, es algo que ningún usuario realmente haría.
También podría ser útil como herramienta de depuración para usar un sitio como https://panopticlick.eff.org/ para verificar qué tan único es su navegador; también lo ayudará a verificar si hay algún parámetro específico que indique que está ejecutando en Selenium.
fuente
La detección de bot que he visto parece más sofisticada o al menos diferente de lo que he leído en las respuestas a continuación.
EXPERIMENTO 1:
Experimento 2:
Como antes, abro un navegador y la página web con Selenium desde una consola Python.
Esta vez, en lugar de hacer clic con el mouse, uso Selenium (en la consola de Python) para hacer clic en el mismo elemento con un desplazamiento aleatorio.
El enlace no se abre, pero me llevan a una página de registro.
TRASCENDENCIA:
Parece misterioso, pero supongo que solo pueden determinar si una acción se origina en Selenium o no, mientras que no les importa si el navegador se abrió a través de Selenium o no. ¿O pueden determinar si la ventana tiene foco? Sería interesante saber si alguien tiene alguna idea.
fuente
Una cosa más que encontré es que algunos sitios web utilizan una plataforma que verifica el Agente de usuario. Si el valor contiene: "HeadlessChrome", el comportamiento puede ser extraño cuando se utiliza el modo sin cabeza.
La solución para eso será anular el valor del agente de usuario, por ejemplo en Java:
fuente
Algunos sitios están detectando esto:
fuente
Escribe una página html con el siguiente código. Verá que en el DOM selenio se aplica un atributo webdriver en el HTML externo
fuente
He encontrado cambiar la variable "clave" de javascript de esta manera:
funciona para algunos sitios web cuando se utiliza Selenium Webdriver junto con Google Chrome, ya que muchos sitios verifican esta variable para evitar que Selenium lo descarte.
fuente
Me parece que la forma más sencilla de hacerlo con Selenium es interceptar el XHR que envía la huella digital del navegador.
Pero dado que este es un problema solo de selenio, es mejor usar otra cosa. Se supone que el selenio hace que cosas como esta sean más fáciles, no mucho más difíciles.
fuente
Puede intentar usar el parámetro "enable-automation"
Pero quiero advertir que esta capacidad se solucionó en ChromeDriver 79.0.3945.16 . Así que probablemente deberías usar versiones anteriores de Chrome.
Además, como otra opción, puede intentar usar InternetExplorerDriver en lugar de Chrome. En cuanto a mí, IE no bloquea en absoluto sin ningún truco.
Y para más información intenta echar un vistazo aquí:
Selenium webdriver: modificación del indicador navigator.webdriver para evitar la detección de selenio
No se puede ocultar la barra de información "Chrome está siendo controlado por software automatizado" dentro de Chrome v76
fuente