Я тестировал Selenium с помощью Chromedriver и заметил, что некоторые страницы могут обнаружить, что вы используете Selenium, хотя автоматизации вообще нет. Даже когда я просто просматриваю вручную, используя Chrome, через Selenium и Xephyr, я часто получаю страницу с сообщением об обнаружении подозрительной активности. Я проверил свой пользовательский агент и отпечаток моего браузера, и все они точно идентичны обычному браузеру Chrome.
Когда я захожу на эти сайты в обычном chrome, все работает нормально, но в тот момент, когда я использую Selenium, меня обнаруживают.
В теории chromedriver и chrome должны выглядеть буквально одинаково для любого веб-сервера, но каким-то образом они могут это обнаружить.
Если вам нужен тестовый код, попробуйте это:
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')
Если вы просматриваете stubhub, вы будете перенаправлены и заблокированы в течение одного или двух запросов. Я исследовал это, и я не могу понять, как они могут сказать, что пользователь использует Selenium.
Как они это делают?
РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ:
Я установил плагин Selenium IDE в Firefox, и меня забанили, когда я зашел на stubhub.com в обычном браузере Firefox только с дополнительным плагином.
РЕДАКТИРОВАТЬ:
Когда я использую Fiddler для просмотра HTTP-запросов, отправляемых взад и вперед, я заметил, что запросы «поддельного браузера» часто имеют «no-cache» в заголовке ответа.
РЕДАКТИРОВАТЬ:
Результаты, подобные этому. Есть ли способ обнаружить, что я на странице Selenium Webdriver из Javascript, предположить, что не должно быть способа обнаружить, когда вы используете веб-драйвер. Но это свидетельствует об обратном.
РЕДАКТИРОВАТЬ:
Сайт загружает отпечаток пальца на свои серверы, но я проверил и отпечаток селена идентичен отпечатку пальца при использовании хрома.
РЕДАКТИРОВАТЬ:
Это одна из полезных нагрузок отпечатков пальцев, которую они отправляют на свои серверы.
{"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"}}
Его идентично по селену и хрому
РЕДАКТИРОВАТЬ:
VPN работают для одноразового использования, но обнаруживаются после загрузки первой страницы. Очевидно, что какой-то javascript используется для обнаружения Selenium.
источник
distill
технологию обнаружения бота и доставляет контент с помощьюakamaitechnologies.com
CDN от diffrent изобр например95.100.59.245
,104.70.243.66
,23.202.161.241
Ответы:
Для пользователей Mac
Замена
cdc_
переменной с помощью Vim или PerlВы можете использовать
vim
или, как указал @Vic Seedoubleyew в ответе @ Erti-Chris Eelmaa,perl
заменитьcdc_
переменную вchromedriver
( см. Сообщение @ Erti-Chris Eelmaa, чтобы узнать больше об этой переменной ). Использованиеvim
или неperl
позволяет вам перекомпилировать исходный код или использовать hex-редактор. Обязательно сделайте копию оригинала,chromedriver
прежде чем пытаться редактировать его. Кроме того, методы ниже были проверены наchromedriver version 2.41.578706
.Использование Vim
После запуска строки выше, вы, вероятно, увидите кучу тарабарщины. Сделайте следующее:
cdc_
, печатая/cdc_
и нажимаяreturn
.a
.$cdc_lasutopfhvcZLmcfl
и замените то, что было удалено, равным количеством символов. Если вы этого не сделаете, неchromedriver
удастся.esc
.:wq!
и нажмитеreturn
.:q!
и нажмитеreturn
.Перейдите к измененному
chromedriver
и дважды щелкните по нему.terminal
Окно должно открыться. Если вы не видитеkilled
в выводе, вы успешно изменили драйвер.Использование Perl
Строка ниже заменяется
cdc_
наdog_
:Убедитесь, что строка замены имеет то же количество символов, что и строка поиска, иначе
chromedriver
произойдет сбой.Perl Объяснение
s///g
обозначает, что вы хотите найти строку и заменить ее глобально другой строкой (заменяет все вхождения).Так,
Как проверить, работает ли замена Perl
Следующая строка будет печатать каждое вхождение строки поиска
cdc_
:perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver
Если это ничего не возвращает, то
cdc_
был заменен.И наоборот, вы можете использовать это:
perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver
чтобы увидеть, если ваша строка замены
dog_
, теперь вchromedriver
двоичном. Если это так, строка замены будет напечатана на консоли.Перейдите к измененному
chromedriver
и дважды щелкните по нему.terminal
Окно должно открыться. Если вы не видитеkilled
в выводе, вы успешно изменили драйвер.Завершение
После изменения
chromedriver
двоичного файла убедитесь, что имя измененногоchromedriver
двоичного файла равноchromedriver
, и что исходный двоичный файл либо перемещен из исходного местоположения, либо переименован.Мой опыт с этим методом
Ранее я был обнаружен на веб-сайте при попытке войти в систему, но после замены
cdc_
строкой одинакового размера я смог войти в систему. Однако, как уже говорили другие, если вы уже были обнаружены, вы можете быть заблокированы для множество других причин даже после использования этого метода. Поэтому вам, возможно, придется попробовать зайти на сайт, который обнаружил вас, используя VPN, другую сеть или что-то еще.источник
По сути, способ обнаружения селена заключается в том, что они проверяют заранее определенные переменные javascript, которые появляются при работе с селеном. Сценарии обнаружения ботов обычно смотрят что-либо, содержащее слово «selenium» / «webdriver» в любой из переменных (в объекте окна), а также документируют переменные с именем
$cdc_
and$wdc_
. Конечно, все это зависит от того, в каком браузере вы находитесь. Все разные браузеры выставляют разные вещи.Для меня я использовал chrome, поэтому все, что мне нужно было сделать, это убедиться, что он
$cdc_
больше не существует как переменная документа, и вуаля (загрузить исходный код chromedriver, изменить chromedriver и пересобрать$cdc_
под другим именем).это функция, которую я изменил в chromedriver:
call_function.js:
(обратите внимание на комментарий, все , что я сделал , я повернулась
$cdc_
кrandomblabla_
.Вот псевдокод, демонстрирующий некоторые методы, которые могут использовать бот-сети:
По словам пользователя @szx, также можно просто открыть chromedriver.exe в шестнадцатеричном редакторе и просто выполнить замену вручную, фактически не выполняя никакой компиляции.
источник
$cdc
сxxxx
вchromedriver.exe
в шестнадцатеричном редакторе , и это сработало! Я также заметил, что если вы максимизируете окно браузера (а не используете предопределенный размер), оно обнаруживается реже.Как мы уже выяснили в этом вопросе и опубликованных ответах, здесь действует антискрипт-антивирус и служба обнаружения ботов под названием "Distil Networks" . И, согласно интервью генерального директора компании :
Понадобится время и дополнительные проблемы, чтобы понять, как именно они обнаруживают селен, но что мы можем сказать наверняка на данный момент:
Решил выложить это как ответ, так как четко
Да.
Кроме того, я не экспериментировал с более старыми селенами и более старыми версиями браузеров - теоретически в определенный момент может быть что-то реализовано / добавлено к селену, на который в настоящее время опирается бот-детектор Distil Networks. Затем, если это так, мы могли бы обнаружить (да, давайте обнаружим детектор), в какой точке / версии было сделано соответствующее изменение, посмотреть журнал изменений и наборы изменений и, возможно, это может дать нам больше информации о том, где искать и что они используют, чтобы обнаружить браузер на базе веб-драйвера. Это просто теория, которая должна быть проверена.
источник
Пример того, как это реализовано на wellsfargo.com:
источник
Обфусцирующий результат JavaScripts
Я проверил исходный код chromedriver. Это добавляет некоторые файлы JavaScript в браузер.
Каждый файл JavaScript по этой ссылке добавляется на веб-страницы: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/
Поэтому я использовал реверс-инжиниринг и запутал js-файлы с помощью Hex-редактирования. Теперь я был уверен, что никакие переменные javascript, имена функций и фиксированные строки не использовались для выявления активности селена. Но все же некоторые сайты и reCaptcha обнаруживают селен!
Возможно они проверяют модификации, которые вызваны выполнением chromedriver js :)
Изменить 1:
Chrome 'навигатор' модификация параметров
Я обнаружил, что в «навигаторе» есть некоторые параметры, которые кратко раскрывают использование chromedriver. Это параметры:
Так что мне нужно было расширение Chrome для запуска JavaScript на веб-страницах. Я сделал расширение с помощью кода js, представленного в статье, и использовал другую статью, чтобы добавить расширение zip в свой проект. Я успешно изменил значения; Но все равно ничего не изменилось!
Я не нашел других переменных, подобных этим, но это не значит, что они не существуют. Тем не менее reCaptcha обнаруживает chromedriver, поэтому должно быть больше переменных для изменения. Следующий шаг должен быть обратным инжинирингом услуг детекторных , что я не хочу делать.
Теперь я не уверен, стоит ли тратить больше времени на этот процесс автоматизации или поиск альтернативных методов!
источник
Попробуйте использовать селен с определенным профилем пользователя Chrome. Таким образом, вы можете использовать его как конкретного пользователя и определять любую вещь, которую хотите. При этом он будет работать как «настоящий» пользователь, посмотрите на процесс chrome с помощью какого-либо проводника процессов и вы увидите разницу с тегами.
Например:
список тегов chrome здесь
источник
Взято непосредственно из черновика WebDriver редактора W3C 2017 года . Это в значительной степени подразумевает, что, по крайней мере, будущие итерации драйверов селена будут идентифицируемы, чтобы предотвратить злоупотребление. В конечном счете, трудно сказать без исходного кода, что именно делает драйвер Chrome специфичным для обнаружения.
источник
Говорят, что Firefox устанавливается
window.navigator.webdriver === true
при работе с веб-драйвером. Это было в соответствии с одной из старых спецификаций (например, archive.org ), но я не смог найти ее в новой, за исключением некоторой очень расплывчатой формулировки в приложениях.Тест для этого находится в коде селена в файле fingerprint_test.js, где в конце комментария написано «В настоящее время реализовано только в Firefox», но я не смог идентифицировать какой-либо код в этом направлении с помощью каких-то простых
grep
операций, ни в текущее (41.0.2) дерево релизов Firefox, ни в дереве Chromium.Я также нашел комментарий к более старому сообщению о дактилоскопии в драйвере firefox b82512999938 от января 2015 года . Этот код все еще находится в GIT-мастере Selenium, загруженном вчера
javascript/firefox-driver/extension/content/server.js
с комментарием, ссылающимся на приложение с несколько иным названием в текущей спецификации веб-драйвера w3c.источник
window.navigator.webdriver
не определена.window.navigator.webdriver == true
В дополнение к великолепному ответу @ Erti-Chris Eelmaa - это раздражает
window.navigator.webdriver
и доступно только для чтения. Событие, если вы измените его значение,false
все равно будет иметь местоtrue
. Вот почему браузер, управляемый автоматизированным программным обеспечением, все еще может быть обнаружен. MDNПеременная управляется флагом
--enable-automation
в Chrome. Хромедрайвер запускает Chrome с этим флагом, и Chrome устанавливает значениеwindow.navigator.webdriver
вtrue
. Вы можете найти это здесь . Вы должны добавить флаг «исключить переключатели». Например (Голанг):источник
Похоже, они находятся за брандмауэром веб-приложений. Посмотрите на modsecurity и owasp, чтобы увидеть, как они работают. В действительности, вы спрашиваете, как сделать уклонение от обнаружения ботов. Это не то, для чего селен веб-драйвер. Он предназначен для тестирования вашего веб-приложения, не затрагивая другие веб-приложения. Это возможно, но, по сути, вам придется посмотреть, что WAF ищет в своем наборе правил, и, в частности, избегать этого с селеном, если можете. Даже тогда, это может все еще не работать, потому что вы не знаете, какой WAF они используют. Вы сделали правильный первый шаг - подделка пользовательского агента. Если это не сработало, тогда WAF на месте, и вам, вероятно, нужно быть более хитрым.
Изменить: точка взята из другого ответа. Сначала убедитесь, что ваш пользовательский агент настроен правильно. Может быть, он попал на локальный веб-сервер или понюхал выходящий трафик.
источник
Даже если вы отправляете все нужные данные (например, Selenium не отображается как расширение, у вас разумное разрешение / битовая глубина и т. Д.), Существует ряд служб и инструментов, которые определяют поведение посетителей, чтобы определить, Актер является пользователем или автоматизированной системой.
Например, посещение сайта, а затем немедленное выполнение какого-либо действия путем перемещения мыши непосредственно к соответствующей кнопке, менее чем за секунду, - это то, что на самом деле не будет делать ни один пользователь.
Также может быть полезно в качестве инструмента отладки использовать сайт, такой как https://panopticlick.eff.org/, чтобы проверить, насколько уникален ваш браузер; это также поможет вам проверить, есть ли какие-то конкретные параметры, которые указывают, что вы работаете в Selenium.
источник
Обнаружение бота, которое я видел, кажется более сложным или, по крайней мере, отличается от того, что я прочитал в ответах ниже.
ЭКСПЕРИМЕНТ 1:
ЭКСПЕРИМЕНТ 2:
Как и прежде, я открываю браузер и веб-страницу с Selenium из консоли Python.
На этот раз вместо щелчка мышью я использую Selenium (в консоли Python), чтобы щелкнуть по тому же элементу со случайным смещением.
Ссылка не открывается, но я перехожу на страницу регистрации.
ПОСЛЕДСТВИЯ:
Кажется таинственным, но я думаю, что они могут просто определить, происходит ли действие из Selenium или нет, в то время как им все равно, был ли сам браузер открыт через Selenium или нет. Или они могут определить, имеет ли окно фокус? Было бы интересно услышать, если у кого-нибудь есть идеи.
источник
Еще одна вещь, которую я обнаружил, заключается в том, что некоторые веб-сайты используют платформу, которая проверяет пользовательский агент. Если значение содержит: «HeadlessChrome», поведение может быть странным при использовании режима без головы.
Обходной путь для этого будет переопределить значение пользовательского агента, например в Java:
источник
Некоторые сайты обнаруживают это:
источник
Напишите HTML-страницу со следующим кодом. Вы увидите, что в селене DOM применяется атрибут webdriver в externalHTML
источник
Я нашел изменение javascript-переменной «key» следующим образом:
работает на некоторых веб-сайтах при использовании Selenium Webdriver вместе с Google Chrome, поскольку многие сайты проверяют эту переменную, чтобы избежать ее удаления из-за Selenium.
источник
Мне кажется, самый простой способ сделать это с Selenium - перехватить XHR, который возвращает отпечаток браузера.
Но поскольку это проблема только для Selenium, лучше просто использовать что-то еще. Предполагается, что селен делает такие вещи легче, а не намного сложнее.
источник
Вы можете попробовать использовать параметр «enable-автоматизации»
Но я хочу предупредить, что эта возможность была исправлена в ChromeDriver 79.0.3945.16 . Поэтому, вероятно, вам следует использовать более старые версии Chrome.
Также, в качестве другого варианта, вы можете попробовать использовать InternetExplorerDriver вместо Chrome. Как по мне, IE вообще не блокирует без всяких взломов.
А для получения дополнительной информации попробуйте посмотреть здесь:
Selenium webdriver: изменение флага navigator.webdriver для предотвращения обнаружения селена
Не удается скрыть информационную панель Chrome, управляемую автоматизированным программным обеспечением, в Chrome v76
источник