Selenium 将Puppeter中的window.navigator更改为绕过反机器人系统
我正试图让我的在线机器人无法检测。我读了很多关于如何做到这一点的文章,我把所有的技巧放在一起并加以利用。其中之一是更改Selenium 将Puppeter中的window.navigator更改为绕过反机器人系统,selenium,puppeteer,detection,Selenium,Puppeteer,Detection,我正试图让我的在线机器人无法检测。我读了很多关于如何做到这一点的文章,我把所有的技巧放在一起并加以利用。其中之一是更改window.navigator.webdriver 通过以下代码,我成功地在Puppeter中更改了window.navigator.webdriver: await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: ()
window.navigator.webdriver
通过以下代码,我成功地在Puppeter中更改了window.navigator.webdriver
:
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
});
我绕过了测试,很好:
然而,考试还是在嘲笑我:
为什么WEBDRIVER不一致?试试这个
首先,删除该定义,如果您从原型中定义并删除,它将不起作用
Object.defineProperty(navigator, 'webdriver', ()=>{}) // <-- delete this part
结果:
它为什么有效?
直接删除只需删除对象的实例,而不是实际的定义。getter和setter仍然存在,所以浏览器可以找到它
但是,如果从实际原型中删除,它将不再存在于任何实例中
附加提示
你提到你想让你的应用程序不被检测到,有很多插件可以实现同样的效果,例如这个名为的包包含一些很酷的反机器人检测技术。有时候,只重用一些包比一遍又一遍地重新创建解决方案要好
PS:上面的解释我可能是错的,请随意指导我,这样我可以改进答案。尝试
删除window.navigator.webdriver
,看看它是否有用。老实说,这更糟,因为window.navigator
是只读的,删除甚至不会删除此对象。这就是为什么我要使用Object.defineProperty
来覆盖它。当我删除Object.defineProperty
并添加delete window.navigator.webdriver时代码>然后当我在Puppeter chromedriver中打开控制台并在控制台窗口中写入.navigator.webdriver
时,我得到的是真的。因此,测试显然失败了。这很奇怪,但在我的环境中不起作用:你能在github/bitbucket上共享你的项目吗?这样我就可以匹配差异了?可以了,删除上面的“定义webdriver”部分。对,这是因为我多次重新定义navigator对象。非常感谢“其他提示”我不知道这个软件包的存在。还升级了木偶特效插件隐身!
delete navigator.__proto__.webdriver;