硒和非无头浏览器不断要求验证码

时间:2019-05-14 04:45:07

标签: selenium selenium-webdriver webdriver captcha webdriver-w3c-spec

我遇到了一个问题,我们的一个站点一直在云浏览器中以无头模式请求验证码,因此我将其切换为非无头,以便我自己输入验证码,我想下一个有时它会工作,也许是因为已经存储了一些cookie,但是即使我多次输入验证码也没有。

另外,值得一提的是,无论使用哪种模式,它都可以在本地正常运行,对于非自动化版本,它也可以在云中很好地运行,但是一旦我在Selenium上以任何模式运行它,它就会一直要求验证码。任何想法可能发生的事情以及解决方案上的想法都将受到赞赏

2 个答案:

答案 0 :(得分:0)

因此,验证码的工作方式是,根据您执行操作的速度,它将触发一种标志,该标志将通知服务器您是A)试图入侵网页或B)使其自动化。这几乎总是会产生一个验证码实例。迄今为止,还没有办法处理验证码。如果这是您公司开发的环境,则可以要求开发人员在具有不同URL的登台环境中关闭验证码。这是理想的情况,但是,如果这是一个外部站点,那么您将无能为力。

答案 1 :(得分:0)

在名为How does recaptcha 3 know I'm using selenium/chromedriver的讨论中,我们讨论了一些通用的方法,以避免在网络抓取时被检测到。让我们深入探讨。


无头浏览器

无头浏览器是无需图形界面即可使用的浏览器。可以通过编程方式对其进行控制,以自动化任务,例如进行测试或拍摄网页屏幕截图。


为什么要检测无头浏览器?

根据@AntoineVastel,无头浏览器用于自动执行恶意任务。最常见的情况是抓取网页,增加广告展示次数或在网站上查找漏洞。

直到一年前,最流行的无头浏览器之一就是PhantomJS。由于它基于Qt框架构建,因此与大多数流行的浏览器相比,它表现出许多差异。使用某些浏览器指纹技术可以检测到PhantomJS。从59版开始,Google发布了无头版Chrome浏览器。与PhantomJS不同,它基于普通的Chrome,而不是基于外部框架,因此其存在更加难以检测。因此,可能还有其他方法可以检测无头的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 viewerGoogle 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是用于在HTML画布中执行3D渲染的API。使用此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");
          }
      }
      

这些是为什么无头浏览器更容易被检测到的一些关键因素。


Outro