Изменение window.navigator в puppeteer для обхода системы защиты от ботов

Я пытаюсь сделать своего онлайн-бота незаметным. Я прочитал множество статей, как это сделать, и я собрал все советы вместе и использовал их. Один из них - изменить window.navigator.webdriver.

Мне удалось изменить window.navigator.webdriver в кукловоде с помощью этого кода:

await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    });
});

Я отлично обхожу тест это:

Изменение window.navigator в puppeteer для обхода системы защиты от ботов

Однако тест это все еще как-то надо мной смеется:

Изменение window.navigator в puppeteer для обхода системы защиты от ботов

Почему WEBDRIVER несовместим?

Попробуйте delete window.navigator.webdriver и посмотрите, поможет ли это

Tarun Lalwani 28.05.2019 07:58

Это не помогает, если честно, это еще хуже, и это потому, что window.navigator доступен только для чтения и delete даже не удалит этот объект. Вот почему я использую Object.defineProperty, чтобы перезаписать его. Когда я удалил Object.defineProperty и вместо этого добавил delete window.navigator.webdriver;, то, когда я открываю консоль в chromedriver puppeteer и пишу в консоли window.navigator.webdriver, это дает мне true. Поэтому тест явно провален.

BT101 28.05.2019 08:05
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
5
2
3 725
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это,

Во-первых, удалите определение, оно не будет работать, если вы определите и удалите его из прототипа.

Object.defineProperty(navigator, 'webdriver', ()=>{}) // <-- delete this part

Замените свой код на этот.

delete navigator.__proto__.webdriver;

Результат:

Почему это работает?

Удаление напрямую просто удаляет экземпляр объекта, а не фактическое определение. Геттер и сеттер все еще там, поэтому браузер может их найти.

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

Дополнительные советы

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

PS: я могу ошибаться в приведенном выше объяснении, не стесняйтесь направлять меня, чтобы я мог улучшить ответ.

Это очень странно, но это не работает в моей среде: i.imgur.com/6RnZgD1.png Не могли бы вы поделиться своим проектом на github/bitbucket, чтобы я мог сопоставить различия?

BT101 28.05.2019 08:46

Это будет работать, удалите раздел определения веб-драйвера выше.

Md. Abu Taher 28.05.2019 08:47

Правильно, потому что я несколько раз переопределял объект навигатора.

BT101 28.05.2019 08:50

Обновил ответ.

Md. Abu Taher 28.05.2019 08:52

Большое спасибо за "Дополнительные советы" Я не знал о существовании этого пакета.

BT101 28.05.2019 08:54

Также повысился на puppeteer-extra-plugin-stealth!

Vaviloff 30.05.2019 17:57

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