在 puppeteer 中更改 window.navigator 以绕过反机器人系统
Changing window.navigator within puppeteer to bypass antibot system
我正在努力让我的在线机器人无法检测到。我阅读了很多文章如何做到这一点,并将所有技巧放在一起并使用它们。其中之一是更改 window.navigator.webdriver
.
我设法通过以下代码在 puppeteer 中更改 window.navigator.webdriver
:
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
});
我绕过了 this 测试就好了:
然而 this 测试仍然以某种方式嘲笑我:
为什么WEBDRIVER不一致?
试试这个,
首先,去掉定义,如果你在prototype中定义再删除是不行的。
Object.defineProperty(navigator, 'webdriver', ()=>{}) // <-- delete this part
用这个替换你的代码。
delete navigator.__proto__.webdriver;
结果:
为什么有效?
直接删除只是删除对象的实例而不是实际定义。 getter 和 setter 仍然存在,因此浏览器可以找到它。
但是,如果您从实际原型中删除,它在任何情况下都将不再存在。
其他提示
您提到您想让您的应用程序无法检测到,有许多插件可以实现相同的目的,例如这个名为 puppeteer-extra-plugin-stealth 的软件包包含一些很酷的 anti-bot 检测技术。 有时只重用一些包比一遍又一遍地re-create一个解决方案更好。
PS: 上面的解释可能有误,欢迎大家多多指教,我会改进答案的。
我正在努力让我的在线机器人无法检测到。我阅读了很多文章如何做到这一点,并将所有技巧放在一起并使用它们。其中之一是更改 window.navigator.webdriver
.
我设法通过以下代码在 puppeteer 中更改 window.navigator.webdriver
:
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
});
我绕过了 this 测试就好了:
然而 this 测试仍然以某种方式嘲笑我:
为什么WEBDRIVER不一致?
试试这个,
首先,去掉定义,如果你在prototype中定义再删除是不行的。
Object.defineProperty(navigator, 'webdriver', ()=>{}) // <-- delete this part
用这个替换你的代码。
delete navigator.__proto__.webdriver;
结果:
为什么有效?
直接删除只是删除对象的实例而不是实际定义。 getter 和 setter 仍然存在,因此浏览器可以找到它。
但是,如果您从实际原型中删除,它在任何情况下都将不再存在。
其他提示
您提到您想让您的应用程序无法检测到,有许多插件可以实现相同的目的,例如这个名为 puppeteer-extra-plugin-stealth 的软件包包含一些很酷的 anti-bot 检测技术。 有时只重用一些包比一遍又一遍地re-create一个解决方案更好。
PS: 上面的解释可能有误,欢迎大家多多指教,我会改进答案的。