Существует ли версия селена, которая не обнаруживается? может ли селен быть действительно необнаружимым?

Я использую драйвер Chrome поверх селена на сервере Ubuntu. за жилой прокси-сетью. все же мой селен обнаруживается. Есть ли способ сделать Chrome Driver и селен на 100% необнаружимыми?

Я так долго пытался забыть о многих вещах, которые я сделал, в том числе 1) пробовать разные версии chrome 2) добавлять несколько флагов и удалять некоторые слова из файла драйвера chrome. 3) испортить его за прокси. жилые тоже. используя режим инкогнито. 4) загрузка профилей. 5) случайные движения мыши. 6) все рандомизировано

Я ищу настоящую версию селена, которая на 100% не обнаруживается. если это когда-либо существовало. Или другой способ автоматизации, который не обнаруживается бот-трекерами.

это часть запуска браузера

sx = random.randint(1000,1500)
sn = random.randint(3000,4500)

display = Display(visible=0, size=(sx,sn))
display.start()


    randagent =  random.randint(0,len(useragents_desktop)-1)

    uag = useragents_desktop[randagent]
    #this is to prevent ip leaking
    preferences = 
"webrtc.ip_handling_policy" : "disable_non_proxied_udp",
"webrtc.multiple_routes_enabled": False,
"webrtc.nonproxied_udp_enabled" : False

    chrome_options.add_experimental_option("prefs", preferences)
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-impl-side-painting")
    chrome_options.add_argument("--disable-setuid-sandbox")
    chrome_options.add_argument("--disable-seccomp-filter-sandbox")
    chrome_options.add_argument("--disable-breakpad")
    chrome_options.add_argument("--disable-client-side-phishing-detection")
    chrome_options.add_argument("--disable-cast")
    chrome_options.add_argument("--disable-cast-streaming-hw-encoding")
    chrome_options.add_argument("--disable-cloud-import")
    chrome_options.add_argument("--disable-popup-blocking")
    chrome_options.add_argument("--ignore-certificate-errors")
    chrome_options.add_argument("--disable-session-crashed-bubble")
    chrome_options.add_argument("--disable-ipv6")
    chrome_options.add_argument("--allow-http-screen-capture")
    chrome_options.add_argument("--start-maximized")
    wsize = "--window-size=" +  str(sx-10) + ',' + str(sn-10)
    chrome_options.add_argument(str(wsize) )

    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_options.add_experimental_option("prefs", prefs)

    chrome_options.add_argument("blink-settings=imagesEnabled=true")
    chrome_options.add_argument("start-maximized")
    chrome_options.add_argument("user-agent="+uag)
    chrome_options.add_extension(pluginfile)#this is for the residential proxy
    driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)

3 ответа

Решение

Тот факт, что селен обнаруживается, не зависит от конкретной версии Selenium, Chrome или ChromeDriver. Сами веб-сайты могут обнаруживать сетевой трафик и могут идентифицировать браузерный клиент, т.е. веб-браузер, как контролируемый WebDriver.

Однако некоторые общие подходы, позволяющие избежать обнаружения при просмотре веб-страниц, заключаются в следующем:

  • Первый и главный атрибут сайта, который может определить ваш скрипт / программа, - это размер вашего монитора. Поэтому рекомендуется не использовать обычный видовой экран.
  • Если вам нужно отправить несколько запросов на веб-сайт, вам нужно постоянно менять агента пользователя при каждом запросе. Здесь вы можете найти подробное обсуждение о том, как изменить пользовательский агент Google Chrome в Selenium?
  • Для имитации поведения, подобного человеческому, вам может потребоваться замедлить выполнение скрипта даже за пределами создания WebDriverWait и Ожидаемые условия. time.sleep(secs), Здесь вы можете найти подробную дискуссию о том, как перевести webdriver в python на миллисекунды.

@Antoine Vastel в своем блоге сайта Detecting Chrome Headless упомянул несколько подходов, которые отличают браузер Chrome от браузера без головы Chrome.

  • Пользовательский агент: атрибут пользовательского агента обычно используется для определения ОС, а также браузера пользователя. В Chrome версии 59 он имеет следующее значение:

    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36
    
    • Проверить наличие Chrome без головы можно через:

      if (/HeadlessChrome/.test(window.navigator.userAgent)) {
          console.log("Chrome headless detected");
      }
      
  • Плагины: navigator.plugins возвращает массив плагинов, присутствующих в браузере. Как правило, в Chrome мы находим плагины по умолчанию, такие как Chrome PDF viewer или же Google Native Client, Напротив, в режиме без заголовка возвращаемый массив не содержит плагинов.

    • Проверить наличие плагинов можно с помощью:

      if(navigator.plugins.length == 0) {
          console.log("It may be Chrome headless");
      }
      
  • Языки: в Chrome два атрибута Javascript позволяют получать языки, используемые user: navigator.language а также navigator.languages, Первый - это язык пользовательского интерфейса браузера, а второй - массив строк, представляющих предпочтительные языки пользователя. Тем не менее, в режиме без головы, navigator.languages возвращает пустую строку.

    • Проверить наличие языков можно через:

      if(navigator.languages == "") {
           console.log("Chrome headless detected");
      }
      
  • WebGL: WebGL - это API для выполнения 3D-рендеринга на холсте HTML. С помощью этого API можно запросить информацию о поставщике графического драйвера, а также о представителе графического драйвера. С ванильным Chrome и Linux мы можем получить следующие значения для рендерера и вендора: Google SwiftShader а также Google Inc., В режиме без головы мы можем получить Mesa OffScreen, которая является технологией, используемой для рендеринга без использования какой-либо оконной системы и Brian Paul, которая является программой, которая запустила графическую библиотеку Mesa с открытым исходным кодом.

    • Проверить наличие WebGL можно через:

      var canvas = document.createElement('canvas');
      var gl = canvas.getContext('webgl');
      
      var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
      var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
      var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
      
      if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
          console.log("Chrome headless detected");
      }
      
    • Не все Chrome без заголовка будут иметь одинаковые значения для вендора и рендерера. Другие сохраняют значения, которые также могут быть найдены в безголовой версии. Тем не мение, Mesa Offscreen а также Brian Paul указывает на наличие безголовой версии.

  • Функции браузера: библиотека Modernizr позволяет проверить, присутствует ли в браузере широкий спектр функций HTML и CSS. Единственное различие, которое мы обнаружили между Chrome и Chrome без головы, заключалось в том, что у последнего не было функции линии роста волос, которая обнаруживает поддержку hidpi/retina hairlines,

    • Проверить наличие функции волосяного покрова можно с помощью:

      if(!Modernizr["hairline"]) {
          console.log("It may be Chrome headless");
      }
      
  • Отсутствующее изображение: последнее в нашем списке также представляется наиболее надежным, исходя из размера изображения, используемого Chrome в случае, если изображение не может быть загружено. В случае ванильного Chrome изображение имеет ширину и высоту, которые зависят от масштаба браузера, но отличаются от нуля. В Chrome без головы изображение имеет ширину и высоту, равные нулю.

    • Проверить наличие отсутствующего изображения можно с помощью:

      var body = document.getElementsByTagName("body")[0];
      var image = document.createElement("img");
      image.src = "http://iloveponeydotcom32188.jg";
      image.setAttribute("id", "fakeimage");
      body.appendChild(image);
      image.onerror = function(){
          if(image.width == 0 && image.height == 0) {
          console.log("Chrome headless detected");
          }
      }   
      

Рекомендации

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

почему бы не попробовать необнаруженный хромированный драйвер?

Оптимизированный патч Selenium Chromedriver, который не запускает службы защиты от ботов, такие как Distill Network / Imperva / DataDome / Botprotect.io, автоматически загружает двоичный файл драйвера и исправляет его.

Протестировано до текущих бета-версий Chrome. Работает также в браузере Brave и во многих других браузерах на основе Chromium. Python 3.6 ++.

вы можете установить его с помощью: pip install undetected-chromedriver

Есть важные вещи, о которых вам следует помнить: Из-за внутренней работы модуля его необходимо просматривать программно (например, используя .get(url)). Никогда не используйте графический интерфейс для навигации. Использование клавиатуры и мыши для навигации может привести к обнаружению! Новые вкладки: та же история. Если вам действительно нужны несколько вкладок, откройте вкладку с пустой страницей (подсказка: url - это данные:, включая запятую, и да, драйвер принимает это) и делайте свои дела как обычно. Если вы будете следовать этим «правилам» (на самом деле его поведение по умолчанию), тогда вы отлично проведете время.

      In [1]: import undetected_chromedriver as uc
In [2]: driver = uc.Chrome()
In [3]: driver.execute_script('return navigator.webdriver')
Out[3]: True  # Detectable
In [4]: driver.get('https://distilnetworks.com') # starts magic
In [4]: driver.execute_script('return navigator.webdriver')
In [5]: None  # Undetectable!

Как насчет:

      import random
from selenium import webdriver
import time
driver = webdriver.Chrome("C:\\Users\\DusEck\\Desktop\\chromedriver.exe")
username = "username"  # data_user
password = "password"  # data_pass
driver.get("https://www.depop.com/login/")  # get URL
driver.find_element_by_xpath('/html/body/div[1]/div/div[3]/div[2]/button[2]').click()  # Accept cookies

split_char_pw = []  # Empty lists
split_char = []
n = 1  # Splitter
for index in range(0, len(username), n):
    split_char.append(username[index: index + n])

for user_letter in split_char:
    time.sleep(random.uniform(0.1, 0.8))
    driver.find_element_by_id("username").send_keys(user_letter)

for index in range(0, len(password), n):
    split_char.append(password[index: index + n])


for pw_letter in split_char_pw:
    time.sleep(random.uniform(0.1, 0.8))
    driver.find_element_by_id("password").send_keys(pw_letter)
Другие вопросы по тегам