Chrome如何設定webdriver=undefined以避免Selenium檢測?


Chrome如何設定webdriver=undefined以避免Selenium檢測?

一、WebDriver規范

根據WebDriver規范(https://w3c.github.io/webdriver/#x4-interface)的描述,WebDriver定義了一個標准方法,以便於文檔(document)判斷當前瀏覽器處於自動化控制之中。

這個方法就是檢測window.navigator.webdriver的值,正常情況下其值為undefined,自動化控制下為true。注意,正常情況下不是false,在JavaScript中undefined為未定義,即該值不存在,而false表示一布爾值。

附上規范原文:

The webdriver-active flag is set to true when the user agent is under remote control. It is initially false.

Defines a standard way for co-operating user agents to inform the document that it is controlled by WebDriver, for example so that alternate code paths can be triggered during automation.

二、突破

ChromeDriver的設計符合這一規范,如何突破

舊版本

版本79.0.3945.16之前,可用如下方法:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)

driver = webdriver.Chrome(options=options)
driver.get("YOUR_URL")
# 在控制台中驗證window.navigator.webdriver的值為undefined。
driver.quit()

新版本

版本79.0.3945.16之后,ChromeDriver修正了這一“問題”。

根據注記原文:

Resolved issue 3133: window.navigator.webdriver is undefined when "enable-automation" is excluded in non-headless mode (should be true) [Pri-2]

如何突破

execute_cdp_cmd函數來幫忙!cdp即Chrome DevTools Protocal,Chrome開發者工具協議。

通過該函數在文檔加載前注入一段js代碼以消去webdriver值。

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

from selenium import webdriver

driver = webdriver.Chrome()
script = '''
Object.defineProperty(navigator, 'webdriver', {
    get: () => undefined
})
'''
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": script})
driver.get("YOUR_URL")
# 在控制台中驗證window.navigator.webdriver的值為undefined。
driver.quit()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM