selenium chromedriver 無頭瀏覽器檢測

JS常用的檢測無頭瀏覽器的方法

   1.User-Agent: 最常見的一種判斷無頭瀏覽器的方法。

      檢查User-Agent。在linux計算機裏  Chrome Version 59 無頭瀏覽器的UserAgent 的值是:

      “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36”

       於是,檢查是否是無頭Chrome瀏覽器:

        # 判斷‘HeadlessChrome’字符串是否包含在UserAgent中     

  if (/HeadlessChrome/.test(window.navigator.userAgent)) {

          console.log("chrome headless detected");

          }

      解決方法:

      

{"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"}

  注: User Agent 也可以從HTTP headers 裏獲取。然而,這兩種情況都容易僞造

 

  2. 插件 Plugins

       navigator.plugins 會返回一個數組,裏面是當前瀏覽器的插件信息。通常,普通Chrome瀏覽器

       有一些缺省插件,比如Chrome PDF viewer 或 Google Native Client. 相反,在無頭模式裏,沒有

       任何插件,返回的是個空數組。     

  if (navigator.plugins.length == 0) {

         console.log("It may be Chrome headless")

         }

    解決辦法:

navigator.plugins=[1,2,3,4,5]  # 方法1
navigator.plugins || [1,2,3,4,5]  # 方法2

   注:也可以替換最終的賦予值(根據實際環境)  

3. 語言

      在谷歌瀏覽器裏,有兩個JavaScript屬性可以獲取當前瀏覽器的語言設置:

      navigator.language 和 navigator.languages。 第一個是指瀏覽器界面的語言,後一個返回的是一個數組,

      裏面存儲的是瀏覽器用戶的所有次選語言。然而,在無頭模式裏,navigator.languages返回的是個

      空字符串

navigator.language="zh-CN"

   4.  WebGL

        WebGL 提供了一組能在HTML canvas裏執行3D渲染的APO.通過這些API.我們可以查詢出圖形驅動

        的vendor 和 render。

       在 Linux 上的普通谷歌瀏覽器裏,我們獲得的renderer 和 vendor 的值爲: ‘Google SwiftShader’

       和 ‘Google Inc.’。

       在無頭模式裏,,我們獲得的一個是 ‘MesaOffScreen’ --- 他是沒有使用任何 window 系統的

       渲染技術的名稱, 和‘ Brian Paul’ ---開源Mesa 圖形庫的最初的程序。

      var canvas = document.create.createElement('canvas');

      var gl = canvas.getContext('webgl')

      var debugInfo = gl.getExtension('WEBGL_debug_render_info');

      var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);

      var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);

      if (vendor == 'Brian Pual'  && renderer == "Mesa offScreen") {

         console.log("chrome headless detected");

       }

     注: 並不是所有版本的無頭瀏覽器都有同樣的這兩個值。然而目前在無頭瀏覽器裏是 “MesaOffscreen”

     和 “Brian Pual” 這兩個值。

   5. 瀏覽器特徵: Modernizr 可以探測出當前瀏覽器對HTML和CSS各種特性的支持程度。我發現,普通

       Chrome 和 無頭Chrome裏唯一的區別是,無頭模式下沒有hairline特徵。 他是用來檢測是否支持

       hidpi/retina hairlines的

   6. 加載失敗的圖片

       檢查切入點是檢查瀏覽器不能正常加載圖片的寬和高。

       在正常的Chrome裏面,未成功加載的圖片跟瀏覽器的zoom有關,但肯定不是零。

       而在無頭瀏覽器裏,這中圖片的寬和高都是0。

      var body = document.getElementsByTagName("body")[0];

      var image = document.createElement("img");

      image.src = "http://iloveponeydotcom32188.jg";

      image.setAtturibute("id","fakeimage");

      body.appendChild(image);

      image.onerror = function(){

      if (image.width == 0 && image.height == 0){

           console.log(chrome headless detected);

           }

      }

image.length=100;  # 可以使用mitmproxy 在代碼中進行替換,爲圖片指定寬高
image.width=100;

    原文地址: http://www.webhek.com/post/detecting-chrome-headless.html

 

 

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章