我非常赞同您对 CAPTCHA 的看法。我将列出到目前为止我能够检测到的内容,用于我自己的检测脚本,具有类似的目标。这只是部分内容,因为它们还有更多 headless browsers。
使用暴露的窗口属性来检测/假设那些特定的无头浏览器相当安全:
window._phantom (or window.callPhantom) //phantomjs
window.__phantomas //PhantomJS-based web perf metrics + monitoring tool
window.Buffer //nodejs
window.emit //couchjs
window.spawn //rhino
以上内容来自jslint doc,并使用phantom js进行测试。
浏览器自动化驱动程序(由 BrowserStack 或其他网络捕获服务用于快照):
window.webdriver //selenium
window.domAutomation (or window.domAutomationController) //chromium based automation driver
这些属性并不总是公开的,我正在寻找其他更强大的方法来检测此类机器人,我可能会在完成后将其作为完整的脚本发布。但这主要回答了你的问题。
这是另一种相当完善的方法,可以更广泛地检测支持 JS 的无头浏览器:
if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser }
这应该很好用,因为属性是 0 默认情况下即使虚拟视口大小是由无头浏览器设置的,并且 默认情况下它不能报告大小一个不存在的浏览器窗口。特别是 Phantom JS doesn't support outerWith or outerHeight。
附录:然而,外部/内部维度存在 Chrome/Blink 错误。 Chromium does not report those dimensions when a page loads in a hidden tab,例如从上一个会话恢复时。 Safari 似乎没有这个问题。.
更新:原来 iOS Safari 8+ 有一个 bug,outerWidth 和 outerHeight 为 0,而 Sailfish webview 也可以。因此,虽然它是一个信号,但如果不注意这些错误,就不能单独使用它。因此,警告:除非您真的知道自己在做什么,否则请不要使用此原始 sn-p。
PS:如果您知道这里未列出的其他无头浏览器属性,请在 cmets 中分享。