Может ли веб-сайт определить, когда вы используете селен с хромедрайвером?

Я тестировал 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.

26 ответов

Решение

По сути, способ обнаружения селена заключается в том, что они проверяют заранее определенные переменные javascript, которые появляются при работе с селеном. Сценарии обнаружения ботов обычно смотрят что-либо, содержащее слово "selenium" / "webdriver" в любой из переменных (в объекте окна), а также переменные документа, называемые $cdc_ а также $wdc_, Конечно, все это зависит от того, в каком браузере вы находитесь. Все разные браузеры выставляют разные вещи.

Для меня я использовал хром, так что все, что мне нужно было сделать, это убедиться, что $cdc_ больше не существует в качестве переменной документа и вуаля (загрузите исходный код chromedriver, измените chromedriver и перекомпилируйте $cdc_ под другим именем.)

это функция, которую я изменил в chromedriver:

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];
}

(обратите внимание на комментарий, все, что я сделал, я повернулся $cdc_ в randomblabla_,

Вот псевдокод, демонстрирующий некоторые методы, которые могут использовать бот-сети:

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;
};

По словам пользователя @szx, также можно просто открыть chromedriver.exe в шестнадцатеричном редакторе и просто выполнить замену вручную, фактически не выполняя никакой компиляции.

Для пользователей 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

vim /path/to/chromedriver

После запуска строки выше, вы, вероятно, увидите кучу тарабарщины. Сделайте следующее:

  1. Ищи cdc_ набрав /cdc_ и нажав return,
  2. Включить редактирование, нажав a,
  3. Удалить любое количество $cdc_lasutopfhvcZLmcfl и заменить то, что было удалено, равным количеством символов. Если нет, chromedriver не удастся.
  4. После завершения редактирования нажмите esc,
  5. Чтобы сохранить изменения и выйти, введите :wq! и нажмите return,
  6. Если вы не хотите сохранять изменения, но хотите выйти, введите :q! и нажмите return,
  7. Вы сделали

Перейти к измененному chromedriver и дважды щелкните по нему. terminal окно должно открыться. Если ты не видишь killed на выходе вы успешно изменили драйвер.


Использование Perl

Строка ниже заменяет cdc_ с dog_:

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

Убедитесь, что строка замены имеет то же количество символов, что и строка поиска, в противном случае chromedriver не удастся.

Perl Объяснение

s///g обозначает, что вы хотите найти строку и заменить ее глобально другой строкой (заменяет все вхождения).

например, s/string/replacment/g

Так,

s/// обозначает поиск и замену строки.

cdc_ это строка поиска.

dog_ является строкой замены.

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, другую сеть или что-то еще.

Как мы уже выяснили в этом вопросе и опубликованных ответах, здесь работает антискрипт-сеть и служба обнаружения ботов под названием "Distil Networks". И, согласно интервью генерального директора компании:

Несмотря на то, что они могут создавать новых ботов, мы нашли способ идентифицировать Selenium - инструмент, который они используют, поэтому мы блокируем Selenium независимо от того, сколько раз они повторяют действия с этим ботом. Мы делаем это сейчас с Python и множеством различных технологий. Как только мы видим, что паттерн появляется у одного типа бота, мы работаем над тем, чтобы перепроектировать технологию, которую они используют, и идентифицировать ее как вредоносную.

Потребуются время и дополнительные проблемы, чтобы понять, как именно они обнаруживают селен, но что мы можем сказать наверняка на данный момент:

  • это не связано с действиями, которые вы выполняете с селеном - как только вы переходите на сайт, вы сразу же обнаруживаетесь и забаняетесь. Я пытался добавить искусственные случайные задержки между действиями, сделать паузу после загрузки страницы - ничего не помогло
  • это также не касается отпечатков пальцев браузера - пробовал в нескольких браузерах с чистыми профилями и нет, режимы инкогнито - ничего не помогло
  • поскольку, согласно подсказке в интервью, это был "реверс-инжиниринг", я подозреваю, что это делается с помощью некоторого кода JS, выполняемого в браузере, показывающего, что это браузер, автоматизированный с помощью веб-драйвера селена

Решил выложить это как ответ, так как четко

Может ли веб-сайт определить, когда вы используете селен с хромедрайвером?

Да.


Кроме того, я не экспериментировал с более старыми селенами и более старыми версиями браузеров - теоретически, в определенный момент может быть что-то реализовано / добавлено к селену, на который в настоящее время опирается бот-детектор Distil Networks. Затем, если это так, мы могли бы обнаружить (да, давайте обнаружим детектор), в какой точке / версии было сделано соответствующее изменение, посмотреть журнал изменений и наборы изменений и, возможно, это может дать нам больше информации о том, где искать и что они используют, чтобы обнаружить браузер на базе веб-драйвера. Это просто теория, которая должна быть проверена.

Многое было проанализировано и обсуждено об обнаружении веб-сайта, управляемого Selenium- управляемым ChromeDriver. Вот мои два цента:

Согласно статье обнаружение браузера с использованием пользовательского агента, обслуживающего разные веб-страницы или службы для разных браузеров, обычно не входит в число лучших идей. Интернет должен быть доступен всем, независимо от того, какой браузер или устройство использует пользователь. Изложены передовые методы разработки веб-сайта с целью его постепенного улучшения на основе доступности функций, а не нацеливания на конкретные браузеры.

Тем не менее, браузеры и стандарты не являются идеальными, и есть еще некоторые крайние случаи, когда некоторые сайты все еще обнаруживает браузер и, если браузер управляется Селен проконтролировано WebDriver. Браузеры могут быть обнаружены различными способами, и некоторые из наиболее часто используемых механизмов следующие:

Вы можете найти соответствующее подробное обсуждение в разделе Как recaptcha 3 знает, что я использую селен / хромированный драйвер?

  • Обнаружение термина HeadlessChrome в Chrome UserAgent без головы

Вы можете найти соответствующее подробное обсуждение на странице "Отказано в доступе" с Chrome без головы в Linux, в то время как Chrome работает в Windows с использованием Selenium через Python.

Вы можете найти соответствующее подробное обсуждение в Невозможно использовать Selenium для автоматизации входа на сайт Chase.

  • Использование службы Bot Manager от Akamai

Вы можете найти соответствующее подробное обсуждение в динамическом раскрывающемся списке, не заполняющем автоматические предложения на https://www.nseindia.com/, когда значения передаются с использованием Selenium и Python

Вы можете найти соответствующее подробное обсуждение на веб-сайте с использованием DataDome блокирует капчу при парсинге с использованием Selenium и Python.

Однако использование пользовательского агента для обнаружения браузера кажется простым, но на самом деле сделать это правильно - немного сложнее.

Примечание. Здесь стоит упомянуть следующее: использование сниффинга пользовательского агента очень редко бывает хорошей идеей. Всегда есть лучший и более широко совместимый способ решения определенной проблемы.


Рекомендации по обнаружению браузера

Идея обнаружения браузера может быть одной из следующих:

  • Попытка обойти конкретную ошибку в каком-то конкретном варианте или конкретной версии веб-браузера.
  • Попытка проверить наличие определенной функции, которую некоторые браузеры еще не поддерживают.
  • Пытаться предоставить разные HTML в зависимости от того, какой браузер используется.

Альтернатива обнаружения браузера через UserAgents

Вот некоторые из альтернатив обнаружения браузера:

  • Реализация теста для определения того, как браузер реализует API функции, и определения того, как ее использовать. Примером была поддержка экспериментального просмотра назад без пометки в регулярных выражениях.
  • Адаптация методики проектирования прогрессивного улучшения, которая будет включать в себя разработку веб-сайта по слоям с использованием восходящего подхода, начиная с более простого слоя и улучшая возможности сайта на последовательных уровнях, каждый из которых использует больше функций.
  • Адаптация нисходящего подхода Graceful degradation, при котором мы создаем лучший сайт, используя все необходимые функции, а затем настраиваем его, чтобы он работал в старых браузерах.

Решение

Чтобы предотвратить обнаружение WebDriver, управляемого Selenium, нишевый подход будет включать любой / все из нижеперечисленных подходов:

  • Вращение UserAgent при каждом выполнении вашего Test Suite с использованием fake_useragent модуль следующим образом:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from fake_useragent import UserAgent
    
    options = Options()
    ua = UserAgent()
    userAgent = ua.random
    print(userAgent)
    options.add_argument(f'user-agent={userAgent}')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\ChromeDriver\chromedriver_win32\chromedriver.exe')
    driver.get("https://www.google.co.in")
    driver.quit()
    

Вы можете найти соответствующее подробное обсуждение в разделе Как изменить пользовательский агент Google Chrome в Selenium?

  • Вращение UserAgent в каждом из ваших тестов с использованиемNetwork.setUserAgentOverride через execute_cdp_cmd() следующим образом:

    from selenium import webdriver
    
    driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.exe')
    print(driver.execute_script("return navigator.userAgent;"))
    # Setting user agent as Chrome/83.0.4103.97
    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.97 Safari/537.36'})
    print(driver.execute_script("return navigator.userAgent;"))
    

Вы можете найти соответствующее подробное обсуждение в Как изменить User Agent с помощью Selenium и Python.

  • Изменение стоимости недвижимостиnavigator для webdriver в undefined следующим образом:

    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
      "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    

Вы можете найти соответствующее подробное обсуждение в Selenium webdriver: Изменение флага navigator.webdriver для предотвращения обнаружения селена

  • Изменение значений navigator.plugins, navigator.languages, WebGL, тонкая линия, отсутствующее изображение и т. Д.

Вы можете найти соответствующее подробное обсуждение в разделе Существует ли не обнаруживаемая версия selenium webdriver?

Вы можете найти соответствующее подробное обсуждение в Как обойти Google captcha с помощью Selenium и python?


Работа с reCAPTCHA

Имея дело с 2captcha и recaptcha-v3, вместо этого нажимая флажок, связанный с текстом, я не робот, может быть проще получить аутентифицированное извлечение и использованиеdata-sitekey.

Вы можете найти соответствующее подробное обсуждение в разделе Как определить 32-битный ключ данных в ReCaptcha V2, чтобы программно получить корректный ответ с помощью запросов Selenium и Python?

С появлением Selenium Stealth уклонение от обнаружения управляемого SeleniumChromeDriver , инициированного контекстом просмотра google-chrome , стало намного проще.


селен-стелс

selenium-stealth — это пакет python selenium-stealth для предотвращения обнаружения. Эта программа пытается сделать Python Selenium более незаметным. Однако на данный момент selenium-stealth поддерживает только Selenium Chrome.

Возможности, которые на данный момент может предложить selenium-stealth:

  • selenium-stealth со скрытностью проходит все общедоступные тесты ботов.

  • С помощью selenium-stealth selenium может выполнять вход в учетную запись Google.

  • selenium-stealth помогает поддерживать нормальный показатель reCAPTCHA v3


Монтаж

Selenium-stealth доступен на PyPI, поэтому вы можете установить его с помощью pip следующим образом:

      $ pip install selenium-stealth

selenium4код, совместимый с

  • Блок кода:

            from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium_stealth import stealth
    
    
    options = Options()
    options.add_argument("start-maximized")
    
    # Chrome is controlled by automated test software
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    s = Service('C:\\BrowserDrivers\\chromedriver.exe')
    driver = webdriver.Chrome(service=s, options=options)
    
    # Selenium Stealth settings
    stealth(driver,
          languages=["en-US", "en"],
          vendor="Google Inc.",
          platform="Win32",
          webgl_vendor="Intel Inc.",
          renderer="Intel Iris OpenGL Engine",
          fix_hairline=True,
      )
    
    driver.get("https://bot.sannysoft.com/")
    
  • Скриншот браузера:


тл; доктор

Вы можете найти пару соответствующих подробных обсуждений в:

Пример того, как это реализовано на wellsfargo.com:

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""

Запутывающий результат JavaScripts

Я проверил исходный код chromedriver. Это добавляет некоторые файлы JavaScript в браузер.
Каждый файл JavaScript по этой ссылке добавляется на веб-страницы: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

Поэтому я использовал реверс-инжиниринг и запутал js-файлы с помощью Hex-редактирования. Теперь я был уверен, что никакие переменные javascript, имена функций и фиксированные строки не использовались для выявления активности селена. Но все же некоторые сайты и reCaptcha обнаруживают селен!
Возможно они проверяют модификации, которые вызваны выполнением chromedriver js:)


Изменить 1:

Chrome 'навигатор' модификация параметров

Я обнаружил, что в "навигаторе" есть некоторые параметры, которые кратко раскрывают использование chromedriver. Это параметры:

  • "navigator.webdriver" В неавтоматическом режиме это "неопределено". В автоматическом режиме это "правда".
  • "navigator.plugins" На безголовом хроме имеет длину 0. Поэтому я добавил несколько поддельных элементов, чтобы обмануть процесс проверки длины плагина.
  • " navigator.languages" был установлен в значение chrome по умолчанию '["en-US", "en", "es"]' .

Так что мне нужно было расширение Chrome для запуска JavaScript на веб-страницах. Я сделал расширение с помощью кода js, предоставленного в статье, и использовал другую статью, чтобы добавить расширение zip в свой проект. Я успешно изменил значения; Но все равно ничего не изменилось!

Я не нашел других переменных, подобных этим, но это не значит, что они не существуют. Тем не менее reCaptcha обнаруживает chromedriver, поэтому должно быть больше переменных для изменения. Следующим шагом должно стать обратное проектирование служб детекторов, которое я не хочу делать.

Теперь я не уверен, стоит ли тратить больше времени на этот процесс автоматизации или поиск альтернативных методов!

Попробуйте использовать селен с определенным профилем пользователя Chrome. Таким образом, вы можете использовать его как конкретного пользователя и определять любую вещь, которую хотите. При этом он будет работать как "настоящий" пользователь, посмотрите на процесс chrome с помощью какого-либо проводника процессов и вы увидите разницу с тегами.

Например:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# add here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

список тегов chrome здесь

Все, что мне нужно было сделать, это:

      my_options = webdriver.ChromeOptions()
my_options.add_argument( '--disable-blink-features=AutomationControlled' )

Еще немного информации по этому поводу: Это относится к веб-сайту skyscanner.com . В прошлом я был в состоянии очистить его. Да, он обнаружил автоматизацию браузера и дал мне капчу, чтобы нажать и удерживать кнопку. Раньше я мог ввести капчу вручную, затем найти рейсы, а затем очистить. Но на этот раз после ввода капчи я снова и снова получаю одну и ту же капчу, просто не могу от нее убежать. Я попробовал некоторые из самых популярных предложений, чтобы избежать обнаружения автоматизации, но они не сработали. Затем я нашел эту статью , которая действительно работала, и в процессе исключения я обнаружил, что для обхода их обнаружения автоматизации браузера потребовался только вариант, описанный выше. Теперь я даже не понимаю капчу, а все остальное работает нормально.

Версии, которые я использую в настоящее время:

  • ОС: Windows 7 64bit
  • Браузер: Chrome версии 100.0.4896.60 (официальная сборка) (64-разрядная версия)
  • Селен 4.1.3
  • ChromeDriver 100.0.4896.60 chromedriver_win32.zip 930ff33ae8baeaa74e0dd1ce1dae7ff

Это работает для некоторых веб-сайтов, удалите веб-драйвер ресурса из навигатора

      from selenium import webdriver
driver = webdriver.Chrome()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source":
        "const newProto = navigator.__proto__;"
        "delete newProto.webdriver;"
        "navigator.__proto__ = newProto;"
    })

partial interface Navigator { readonly attribute boolean webdriver; };

IDL-атрибут webdriver интерфейса Navigator должен возвращать значение флага webdriver-active, которое изначально равно false.

Это свойство позволяет веб-сайтам определять, что пользовательский агент находится под контролем WebDriver, и может использоваться для смягчения атак типа "отказ в обслуживании".

Взято непосредственно из чернового варианта WebDriver редактора W3C 2017 года. Это в значительной степени подразумевает, что, по крайней мере, будущие итерации драйверов селена будут идентифицируемы для предотвращения неправильного использования. В конечном счете, трудно сказать без исходного кода, что именно делает драйвер Chrome специфичным для обнаружения.

В дополнение к великолепному ответу @ Erti-Chris Eelmaa - раздражает window.navigator.webdriver и это только для чтения. Событие, если вы измените его значение на false все равно будет true, Вот почему браузер, управляемый автоматизированным программным обеспечением, все еще может быть обнаружен. MDN

Переменная управляется флагом --enable-automation в хроме. Хромедрайвер запускает хром с этим флагом, и хром устанавливает window.navigator.webdriver в true, Вы можете найти это здесь. Вы должны добавить флаг "исключить переключатели". Например (Голанг):

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}

Говорят, что 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.

Обнаружение бота, которое я видел, кажется более сложным или, по крайней мере, отличным от того, что я прочитал в ответах ниже.

ЭКСПЕРИМЕНТ 1:

  1. Я открываю браузер и веб-страницу с Selenium из консоли Python.
  2. Мышь уже находится в определенном месте, где я знаю, что ссылка появится после загрузки страницы. Я никогда не двигаю мышь.
  3. Я нажимаю левую кнопку мыши один раз (это необходимо, чтобы сфокусироваться с консоли, на которой работает Python, на браузер).
  4. Я снова нажимаю левую кнопку мыши (помните, курсор находится над данной ссылкой).
  5. Ссылка открывается нормально, как и должно быть.

ЭКСПЕРИМЕНТ 2:

  1. Как и прежде, я открываю браузер и веб-страницу с Selenium из консоли Python.

  2. На этот раз вместо щелчка мышью я использую Selenium (в консоли Python), чтобы щелкнуть по тому же элементу со случайным смещением.

  3. Ссылка не открывается, но я перехожу на страницу регистрации.

ПОСЛЕДСТВИЯ:

  • открытие веб-браузера через Selenium не исключает возможности появления человека
  • перемещение мыши как человека не обязательно классифицировать как человека
  • щелчок чего-либо через Selenium со смещением все еще вызывает тревогу

Кажется таинственным, но я думаю, что они могут просто определить, происходит ли действие из Selenium или нет, в то время как им все равно, был ли сам браузер открыт через Selenium или нет. Или они могут определить, имеет ли окно фокус? Было бы интересно услышать, если у кого-нибудь есть идеи.

Еще одна вещь, которую я обнаружил, заключается в том, что некоторые веб-сайты используют платформу, которая проверяет пользовательский агент. Если значение содержит: "HeadlessChrome", поведение может быть странным при использовании режима без головы.

Обходной путь для этого - переопределить значение пользовательского агента, например, в Java: chromeOptions.addArguments("-user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/73.0.3683.86 Safari/537.36");

Похоже, они находятся за брандмауэром веб-приложения. Посмотрите на modsecurity и owasp, чтобы увидеть, как они работают. В действительности, вы спрашиваете, как сделать уклонение от обнаружения ботов. Это не то, для чего селен веб-драйвер. Он предназначен для тестирования вашего веб-приложения, не затрагивая другие веб-приложения. Это возможно, но, в принципе, вам придется посмотреть на то, что WAF ищет в своем наборе правил, и, в частности, избегать этого с селеном, если можете. Даже тогда, это может все еще не работать, потому что вы не знаете, какой WAF они используют. Вы сделали правильный первый шаг - подделка пользовательского агента. Если это не сработало, тогда WAF на месте, и вам, вероятно, нужно быть более хитрым.

Изменить: точка взята из другого ответа. Сначала убедитесь, что ваш пользовательский агент действительно настроен правильно. Может быть, он попал на локальный веб-сервер или понюхал выходящий трафик.

Даже если вы отправляете все нужные данные (например, Selenium не отображается как расширение, у вас разумное разрешение / битовая глубина и т. Д.), Существует ряд служб и инструментов, которые определяют поведение посетителей, чтобы определить, Актер является пользователем или автоматизированной системой.

Например, посещение сайта и немедленное выполнение какого-либо действия путем перемещения мыши непосредственно к соответствующей кнопке менее чем за секунду - это то, что на самом деле не будет делать ни один пользователь.

Также может быть полезно в качестве инструмента отладки использовать сайт, такой как https://panopticlick.eff.org/ чтобы проверить, насколько уникален ваш браузер; это также поможет вам проверить, есть ли какие-то конкретные параметры, которые указывают, что вы работаете в Selenium.

Разработчики Chromium недавно добавили 2-й безголовый режим в 2021 году, который больше не добавляетHeadlessChromeв строку пользовательского агента. См. https://bugs.chromium.org/p/chromium/issues/detail?id=706008#c36 .

Добавьте, что позже они переименовали эту опцию в 2023 году для Chrome 109 -> https://github.com/chromium/chromium/commit/e9c516118e2e1923757ecb13e6d9fff36775d1f4 .

Чем новее--headless=newфлаг теперь позволит вам получить полную функциональность Chrome в новом безголовом режиме, и вы даже сможете запускать в нем расширения для Chrome 109 и выше. (Если вы используете Chrome с 96 по 108, используйте более раннюю версию.--headless=chromeвариант.)

Использование: (Chrome 109 и выше):

      options.add_argument("--headless=new")

Использование: (от Chrome 96 до Chrome 108):

      options.add_argument("--headless=chrome")

Этот новый безголовый режим позволяет браузерам Chromium работать так же, как и в обычном режиме, что означает, что их не так легко обнаружить, как Chrome в старом безголовом режиме.

Объедините это с другими инструментами, такими как undetected-chromedriver , для максимального уклонения от обнаружения Selenium.

Ответ: ДА

Некоторые сайты будут обнаруживать селен по отпечаткам пальцев браузера и другим данным, другие сайты будут обнаруживать селен на основе поведения, не только на основе того, что вы делаете, но и того, что вы не делаете.

Обычно данных, которые предоставляет селен, достаточно, чтобы его обнаружить.

вы можете проверить отпечатки пальцев браузера на таких сайтах

      https://bot.sannysoft.com
https://fingerprintjs.github.io/fingerprintjs/
https://antoinevastel.com/bots/

попробуйте с вашим пользовательским браузером, затем попробуйте с селеном, вы увидите различия.

Вы можете изменить некоторые отпечатки пальцев с помощью options(), например, пользовательский агент и другие, увидеть результаты самостоятельно.

Вы можете попытаться избежать этого обнаружения разными способами, я рекомендую использовать эту библиотеку:undetected_chromedriver:

https://github.com/ultrafunkamsterdam/undetected-chromedriver

      import undetected_chromedriver.v2 as uc

В противном случае вы можете попробовать использовать альтернативу селену. Я слышал о PhantomJS, но не пробовал.

Мне кажется, что самый простой способ сделать это с Selenium - перехватить XHR, который возвращает отпечаток браузера.

Но поскольку это проблема только для Selenium, лучше просто использовать что-то еще. Предполагается, что селен делает такие вещи проще, а не намного сложнее.

Некоторые сайты обнаруживают это:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}

Напишите HTML-страницу со следующим кодом. Вы увидите, что в DOM Selen применяется атрибут webdriver в externalHTML.

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

Я нашел изменение javascript-переменной "key" следующим образом:

//Fools the website into believing a human is navigating it
        ((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

работает на некоторых веб-сайтах при использовании Selenium Webdriver вместе с Google Chrome, поскольку многие сайты проверяют эту переменную, чтобы избежать ее удаления из-за Selenium.

Вы можете попробовать использовать параметр "включить автоматизацию"

var options = new ChromeOptions();

// hide selenium
options.AddExcludedArguments(new List<string>() { "enable-automation" });

var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options);

Но хочу предупредить, что эта возможность исправлена ​​в ChromeDriver 79.0.3945.16. Так что, вероятно, вам следует использовать более старые версии Chrome.

Кроме того, в качестве другого варианта вы можете попробовать использовать InternetExplorerDriver вместо Chrome. Как по мне, IE вообще не блокирует без всяких взломов.

И для получения дополнительной информации попробуйте взглянуть здесь:

Selenium webdriver: изменение флага navigator.webdriver для предотвращения обнаружения селена

Невозможно скрыть информационную панель "Chrome управляется автоматизированным программным обеспечением" в Chrome v76

У меня такая же проблема, и я решил ее со следующей конфигурацией

      options.AddArguments("start-maximized");
                options.AddArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

                options.AddExcludedArgument("enable-automation");//for hiding chrome being controlled by automation..
                options.AddAdditionalCapability("useAutomationExtension", false);

//import cookies
options.AddArguments("user-data-dir=" + userDataDir);

                options.AddArguments("profile-directory=" + profileDir);

Ваш веб-браузер и драйвер можно сделать невидимыми. Но нужно понимать, что разработчики веб-браузеров и драйверов всегда находятся под большим давлением: штаб-квартиры хотят быть легальными, поэтому принимают специальные механизмы обнаружения . Таким образом, вы никогда не получите скрытый браузер и драйвер из коробки. Решение следующее:

  1. Вам следует исправить веб-браузер, драйвер и сам селен, удалив все, что может быть прозрачным.
  2. Не делитесь своими патчами с кем-либо. Если вы опубликуете свои патчи, они будут уничтожены новым механизмом обнаружения.
  3. Вам следует реализовать автоматические тесты, которые будут сравнивать стандартную среду браузера и исправленную среду браузера + драйвера. Оно должно быть идентичным со всех возможных точек зрения. Не публикуйте свои тесты.
  4. Вам следует сохранить свои исправления, перейдя на следующую версию веб-браузера, драйвера и селена.
  5. Вы должны поддерживать свои тесты и обновлять исправления в случае сбоя тестов.

Можно ли защитить свой сайт от ботов? В целом да, но единственное хорошее решение — это капча . Не уважатьnavigator,jsокружение, уникальныйeventповедение и т. д. Пожалуйста, не ждите, что патчи будут пушистыми игрушками, такими какundetected-chromedriver,selenium-stealth, и т. д.

Вы всегда должны помнить, что обнаружение означает, что вам нужно что-то от неизвестного приложения на стороне клиента. Клиент может удалить все, исправив свое собственное приложение, вы не знаете, насколько он (или его сотрудник) знает об исходном коде веб-браузера и драйверов. У вас нет шансов его обнаружить, если его сотрудник принимал участие в разработке веб-браузера с открытым исходным кодом.

Просто для примера (вещи, упомянутые в этом вопросе):

  1. navigator.webdriver
  2. CDC_
  3. БезголовыйChrome
  4. Языки
  5. __webdriver

Все в этом списке можно скрыть/удалить за 5 минут, но есть гораздо больше других побочных эффектов, которые могут выдать бота.

Другие вопросы по тегам