我非常赞同您对CAPTCHA的看法。我将列出迄今为止我已经能够检测到的内容,供我的检测脚本使用,其目标类似。这只是部分内容,因为有许多其他无头浏览器。
可以相对安全地使用公开的窗口属性来检测/假设那些特定的无头浏览器:
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文档和使用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 不支持outerWidth或outerHeight。
补充说明:然而,Chrome/Blink存在outer/innerDimensions的一个bug。当一个页面在隐藏选项卡中加载时,例如从上一个会话中恢复时,Chromium 不会报告这些维度。Safari似乎没有这个问题。
更新:事实证明iOS Safari 8+存在outerWidth和outerHeight为0的错误,Sailfish webview也可能存在这个问题。因此,尽管它是一种信号,但如果不考虑这些错误,它不能单独使用。因此,警告:除非您确切知道自己在做什么,请不要使用此原始代码。
PS:如果您知道这里未列出的其他无头浏览器属性,请在评论中分享。