【问题标题】:Selenium and non-headless browser keeps asking for CaptchaSelenium 和非无头浏览器不断要求验证码
【发布时间】:2019-10-01 01:13:52
【问题描述】:

我遇到了一个问题,我们的一个网站在云中的浏览器中不断要求以无头模式输入验证码,所以我将其切换为非无头模式,这样我就可以自己输入验证码,我想下一个有时它会起作用,也许是因为已经存储了一些 cookie,但即使我输入了几次验证码,它也没有。

另外值得一提的是,它在本地以任何模式运行都很好,对于非自动化版本,它也可以在云中运行良好,但是只要我在 Selenium 那里以它一直要求的任何模式运行它验证码。非常感谢任何可能发生的想法和解决方案的想法

【问题讨论】:

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


    【解决方案1】:

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


    无头浏览器

    无头浏览器是一种无需图形界面即可使用的浏览器。它可以通过编程方式控制以自动执行任务,例如进行测试或截取网页截图。


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

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

    直到一年前,最流行的无头浏览器之一是 PhantomJS。由于它是基于 Qt 框架构建的,因此与大多数流行的浏览器相比,它表现出许多不同之处。可以使用一些浏览器指纹技术检测 PhantomJS。从 59 版开始,Google 发布了 Chrome 浏览器的无头版本。与 PhantomJS 不同,它基于原生 Chrome,而不是外部框架,因此更难检测到它的存在。因此,可能还有其他方法可以检测 Chrome 无头。


    检测 Chrome Headless

    • 用户代理:用户代理属性通常用于检测操作系统以及用户的浏览器。对于 Chrome 版本 59,它具有以下值:

      Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/59.0.3071.115 Safari/537.36
      
      • 可以通过以下方式检查是否存在 Chrome headless

        if (/HeadlessChrome/.test(window.navigator.userAgent)) {
            console.log("Chrome headless detected");
        }
        
    • 插件navigator.plugins返回浏览器中存在的插件数组。通常,在 Chrome 上,我们会找到默认插件,例如 Chrome PDF viewerGoogle Native Client。相反,在无头模式下,返回的数组包含 no 插件。

      • 可以通过以下方式检查是否存在 插件

        if(navigator.plugins.length == 0) {
            console.log("It may be Chrome headless");
        }
        
    • 语言:在 Chrome 中,两个 Javascript 属性可以获取 user: navigator.languagenavigator.languages 使用的语言。第一个是浏览器 UI 的语言,而第二个是代表用户首选语言的字符串数组。但是,在无头模式下,navigator.languages 返回一个 empty 字符串。

      • 可以通过以下方式检查是否存在语言

        if(navigator.languages == "") {
             console.log("Chrome headless detected");
        }
        
    • WebGL:WebGL 是一种在 HTML 画布中执行 3D 渲染的 API。使用此 API,可以查询图形驱动程序的供应商以及图形驱动程序的渲染器。使用 vanilla Chrome 和 Linux,我们可以获得以下渲染器和供应商的值:Google SwiftShaderGoogle 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 OffscreenBrian Paul 表示存在无头版本。

    • 浏览器功能:Modernizr 库可以测试浏览器中是否存在各种 HTML 和 CSS 功能。我们发现 Chrome 和无头 Chrome 之间的唯一区别是后者没有细线功能,该功能检测对 hidpi/retina hairlines 的支持。

      • 可以通过以下方式检查是否存在细线特征

        if(!Modernizr["hairline"]) {
            console.log("It may be Chrome headless");
        }
        
    • 缺少图片:我们列表中的最后一个似乎也是最可靠的,来自 Chrome 使用的图片尺寸,以防图片无法加载。在 vanilla 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");
            }
        }
        

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


    结尾

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 2014-08-29
        • 1970-01-01
        • 2018-11-15
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        相关资源
        最近更新 更多