javascript - Python Selenium AWS Lambda 更改 WebGL vendor/渲染器以实现无法检测的 headless 刮刀

标签 javascript python amazon-web-services selenium google-chrome

概念:
使用带有 Python 和 Selenium 的 AWS Lambda 函数,我想通过传递 headless chrome test 创建一个无法检测到的 headless chrome 刮板。 .我通过打开测试并截取屏幕截图来检查 headless 刮刀的不可检测性。我在本地 IDE 和 Lambda 服务器上运行了这个测试。

执行:
我将使用一个名为 selenium-stealth 的 python 库。并将遵循其基本配置:

stealth(driver,
        languages=["en-US", "en"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        )
我在本地 IDE 和 AWS Lambda 服务器上实现了这个配置来比较结果。

本地 IDE:
下面是在本地 IDE 上运行的测试结果:
enter image description here

lambda 服务器:
当我在 Lambda 服务器上运行它时,WebGL Vendor 和 Renderer 都是空白的。如下所示:
enter image description here
我什至尝试使用以下 JavaScript 命令手动更改 WebGL vendor/渲染器:
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {"source": "WebGLRenderingContext.prototype.getParameter = function(parameter) {if (parameter === 37445) {return 'VENDOR_INPUT';}if (parameter === 37446) {return 'RENDERER_INPUT';}return getParameter(parameter);};"})
然后我想可能是参数号有问题。我在没有 if 语句的情况下配置了命令执行,但发生了同样的事情:它在我的本地 IDE 上工作,但对 AWS Lambda 服务器没有影响。
简单的说:
有没有可能在 AWS Lambda 上添加 vendor/渲染器 ?在我的努力下,似乎没有办法。我确保提交 this issue在 selenium-stealth GitHub 存储库上。

最佳答案

WebGL
WebGL是一个跨平台的开放网络标准,用于基于 OpenGL ES 的低级 3D 图形 API,通过 HTML5 Canvas 元素暴露给 ECMAScript。 WebGL 的核心是使用 GLSL 的基于着色器的 API,其结构在语义上类似于底层 OpenGL ES API。它遵循 OpenGL ES 规范,但内存管理不足的语言(如 JavaScript)有一些异常(exception)。 WebGL 1.0 公开了 OpenGL ES 2.0 功能集; WebGL 2.0 公开了 OpenGL ES 3.0 API。
现在,Selenium Stealth 的可用性使用 Selenium 构建不可检测的刮板驱动 ChromeDriver发起浏览上下文变得更加容易。

Selenium 隐形
selenium-stealth是一个 python 包 selenium-stealth 以防止检测。这个程序试图让 python selenium 更加隐蔽。但是,目前 selenium-stealth 仅支持 Selenium Chrome。

  • 代码块:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium_stealth import stealth
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    s = Service('C:\\BrowserDrivers\\chromedriver.exe')
    driver = webdriver.Chrome(service=s, options=options)
    
    # Selenium Stealth settings
    stealth(driver,
          languages=["en-US", "en"],
          vendor="Google Inc.",
          platform="Win32",
          webgl_vendor="Intel Inc.",
          renderer="Intel Iris OpenGL Engine",
          fix_hairline=True,
      )
    
    driver.get("https://bot.sannysoft.com/")
    
  • 浏览器截图:

  • bot_sannysoft

    You can find a detailed relevant discussion in Can a website detect when you are using Selenium with chromedriver?



    在 AWS Lambda 中更改 WebGL vendor/渲染器
    AWS Lambda 使我们能够 deliver compressed WebGL websites to end users .当请求的网页对象被压缩时,传输大小会减小,从而导致更快的下载、更低的云存储费用和更低的数据传输费用。改进的加载时间也直接影响观众体验和留存率,这有助于提高网站的转化率和可发现性。使用 WebGL,网站更加身临其境,同时仍可通过浏览器 URL 访问。 AWS Lambda 通过这种技术自动压缩上传到 S3 的对象。
    product-page-diagram_Lambda-RealTimeFileProcessing.a59577de4b6471674a540b878b0b684e0249a18c
    压缩和 WebGL 的背景
    HTTP 压缩是一种可以内置到 Web 服务器和 Web 客户端中的功能,以提高传输速度和带宽利用率。这种能力是在服务器和客户端之间使用 HTTP header 协商的,该 header 可以指示正在传输、缓存或以其他方式引用的资源是压缩的。服务器端的 AWS Lambda 支持 Content-Encoding header 。
    在客户端,当今大多数浏览器都支持通过 HTTP header (Accept-Encoding: deflate, br, gzip) 进行 brotli 和 gzip 压缩,并且可以处理服务器响应 header 。这意味着在将网页呈现给查看器之前,浏览器将自动从客户端的 Web 服务器下载和解压缩内容。

    结论
    由于这个限制,您可能无法更改 AWS Lambda 中的 WebGL Vendor/Renderer,否则它可能会直接影响向查看者呈现网页的过程,并可能成为 UX 的瓶颈。

    tl;博士
    您可以在以下位置找到一些相关的详细讨论:
  • Can a website detect when you are using Selenium with chromedriver?
  • 关于javascript - Python Selenium AWS Lambda 更改 WebGL vendor/渲染器以实现无法检测的 headless 刮刀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70265306/

    相关文章:

    python - django-modeltranslation : how to know if the value is defined in a given language?

    amazon-web-services - 使用 AWS 负载均衡器之一负载均衡 gRPC 请求

    node.js - 放大初始化错误 - ✖ 根堆栈创建失败初始化失败 TypeError : Cannot redefine property: default

    javascript - jQuery 使用方法 replaceWith() 替换输入占位符

    javascript - 删除appendElement javascript

    javascript - 在 alertifyjs 中设置标题和标签

    python - 如何遍历每个 [ :2] overlapping characters in a string of DNA code?

    python - FTP 显式 TLS 连接 Python 3.7

    amazon-web-services - 不能将 Auth.userAttributes 与联合登录一起使用

    javascript - jQuery根据其中的文本选择元素