¿Puede un sitio web detectar cuando estás usando Selenium con Chromedriver?
He estado probando Selenium con Chromedriver y noté que algunas páginas pueden detectar que estás usando Selenium aunque no haya ninguna automatización. Incluso cuando estoy navegando manualmente usando Chrome a través de Selenium y Xephyr , a menudo aparece 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 iguales para cualquier servidor web, pero de alguna manera pueden detectarlo.
Si quieres algún 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 navegas por stubhub, serás redirigido y "bloqueado" en una o dos solicitudes. He estado investigando esto y no puedo entender cómo pueden saber que un usuario está usando Selenium.
¿Cómo lo hicieron?
Instalé el complemento Selenium IDE en Firefox y me prohibieron cuando entré a stubhub.com en el navegador Firefox normal con solo el complemento adicional.
Cuando uso Fiddler para ver las solicitudes HTTP que se envían de un lado a otro, noté que las solicitudes del 'navegador falso' a menudo tienen 'sin caché' en el encabezado de respuesta.
Resultados como este ¿Hay alguna manera de detectar que estoy en una página de Selenium Webdriver desde JavaScript? sugiere que no debería haber forma de detectar cuándo está utilizando un controlador web. Pero esta evidencia sugiere lo contrario.
El sitio carga una huella digital en sus servidores, pero lo verifiqué y la huella digital de Selenium es idéntica a la huella digital cuando se usa Chrome.
Esta es una de las cargas de huellas dactilares 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":"WidevineContentDecryptionMo
dule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":
{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-
flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContent
DecryptionModuleapplication/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":"Trebu
chetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationM
ono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}
Es idéntico en Selenium y Chrome.
Las VPN funcionan para un solo uso, pero se detectan después de cargar la primera página. Claramente se está ejecutando algún código JavaScript para detectar Selenium.
Básicamente, la forma en que funciona la detección de Selenium es que prueban variables de JavaScript predefinidas que aparecen cuando se ejecuta con Selenium. Los scripts de detección de bots generalmente buscan cualquier cosa que contenga la palabra "selenium" / "webdriver" en cualquiera de las variables (en el objeto de la ventana), y también documentan variables llamadas $cdc_
y $wdc_
. Por supuesto, todo esto depende del navegador que utilices. Todos los diferentes navegadores exponen cosas diferentes.
Para mí, usé Chrome, así que todo lo que tenía que hacer era asegurarme de que $cdc_
ya no existiera como una variable de documento y listo (descargar el código fuente de Chromedriver, modificar Chromedriver y volver a compilar $cdc_
con un nombre diferente).
Esta es la función que modifiqué en chromedriver:
Archivo call_function.js :
function getPageCache(opt_doc) {
var doc = opt_doc || document;
//var key = '$cdc_asdjflasutopfhvcZLmcfl_';
var key = 'randomblabla_';
if (!(key in doc))
doc[key] = new Cache();
return doc[key];
}
(Tenga en cuenta el comentario. Todo lo que hice lo recurrí $cdc_
a randomblabla_
).
Aquí hay un pseudocódigo que demuestra algunas de las técnicas que las redes de bots podrían usar:
runBotDetection = function () {
var documentDetectionKeys = [
"__webdriver_evaluate",
"__selenium_evaluate",
"__webdriver_script_function",
"__webdriver_script_func",
"__webdriver_script_fn",
"__fxdriver_evaluate",
"__driver_unwrapped",
"__webdriver_unwrapped",
"__driver_evaluate",
"__selenium_unwrapped",
"__fxdriver_unwrapped",
];
var windowDetectionKeys = [
"_phantom",
"__nightmare",
"_selenium",
"callPhantom",
"callSelenium",
"_Selenium_IDE_Recorder",
];
for (const windowDetectionKey in windowDetectionKeys) {
const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
if (window[windowDetectionKeyValue]) {
return true;
}
};
for (const documentDetectionKey in documentDetectionKeys) {
const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
if (window['document'][documentDetectionKeyValue]) {
return true;
}
};
for (const documentKey in window['document']) {
if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
return true;
}
}
if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;
if (window['document']['documentElement']['getAttribute']('selenium')) return true;
if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
if (window['document']['documentElement']['getAttribute']('driver')) return true;
return false;
};
Según la respuesta , existen varios métodos para eliminarlos. Uno de ellos es simplemente abrir chromedriver.exe
con un editor HEX y eliminar todas las apariciones de$cdc_
Reemplazo cdc_
de cuerda
Puede usar Vim o Perl para reemplazar la cdc_
cadena en chromedriver
. Vea la respuesta de @ Erti-Chris Eelmaa para obtener más información sobre esa cadena y cómo es un punto de detección .
Usar Vim o Perl evita que tengas que recompilar el código fuente o usar un editor hexadecimal.
Asegúrese de hacer una copia del original chromedriver
antes de intentar editarlo.
Nuestro objetivo es alterar la cdc_
cadena, que se parece a $cdc_lasutopfhvcZLmcfl
.
Los métodos siguientes se probaron en chromedriver version 2.41.578706
.
Usando Vim
vim -b /path/to/chromedriver
Después de ejecutar la línea anterior, probablemente verás un montón de galimatías. Haz lo siguiente:
- Reemplace todas las instancias de
cdc_
condog_
escribiendo:%s/cdc_/dog_/g
.dog_
es solo un ejemplo. Puede elegir cualquier cosa siempre que tenga la misma cantidad de caracteres que la cadena de búsqueda (por ejemplo,cdc_
); de lo contrario,chromedriver
fallará.
- Para guardar los cambios y salir, escriba
:wq!
y presionereturn
.- Si necesita salir sin guardar los cambios, escriba
:q!
y presionereturn
.
- Si necesita salir sin guardar los cambios, escriba
La -b
opción le dice a vim por adelantado que abra el archivo como binario, para que no interfiera con cosas como finales de línea (faltantes) (especialmente al final del archivo).
Usando Perl
La siguiente línea reemplaza todas cdc_
las apariciones con dog_
. Crédito a Vic Seedoubleyew :
perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver
Asegúrese de que la cadena de reemplazo (p. ej., dog_
) tenga la misma cantidad de caracteres que la cadena de búsqueda (p. ej., cdc_
); de lo contrario, chromedriver
fallará.
Terminando
Para verificar que todas las apariciones de cdc_
fueron reemplazadas:
grep "cdc_" /path/to/chromedriver
Si no se devolvió ningún resultado, el reemplazo fue exitoso.
Vaya al modificado chromedriver
y haga doble clic en él. Debería abrirse una ventana de terminal. Si no lo ve killed
en el resultado, ha modificado correctamente el controlador.
Asegúrese de que el nombre del chromedriver
binario modificado sea chromedriver
y de que el binario original se mueva de su ubicación original o se le cambie el nombre.
Mi experiencia con este método
Anteriormente me detectaron en un sitio web mientras intentaba iniciar sesión, pero después de reemplazarlo cdc_
con una cadena del mismo tamaño, pude iniciar sesión. Sin embargo, como han dicho otros, si ya te han detectado, es posible que te bloqueen por un tiempo. Hay una gran cantidad de otras razones incluso después de usar este método. Por lo que es posible que tengas que intentar acceder al sitio que te estaba detectando usando una VPN, una red diferente, etc.