Puppeteer 删除 Navigator.Webdriver

6

我正在使用puppeteer进行网页抓取。我可以将navigator.webdriver属性设置为false,但我需要完全删除该属性。

https://bot.sannysoft.com/

我尝试将navigator.webdriver设置为false。这个技巧可以通过 https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html 但是在 https://bot.sannysoft.com/ 无法通过。

这是一个测试机器人的网页。此测试正在寻找浏览器中是否存在“webdriver”属性。无论其值是true还是false都不重要。我需要从浏览器中删除此webdriver属性。


你修好了吗? - Nodarius
暂时还没有,正在等朋友。 - Ali Haydar Güleç
https://dev59.com/HlQJ5IYBdhLWcg3w05VM#60403652 - Sire
4个回答

10

试一下这个:

const newProto = navigator.__proto__;
delete newProto.webdriver;
navigator.__proto__ = newProto;

为什么不将其定义为false而不是删除它呢? - Matrix
2
@Matrix因为在普通浏览器中它未被定义。 - Chad Cache
你的代码应该放在 "pageFunction" 中。例如:page.evaluateOnNewDocument(pageFunction[, ...args]); - Nodarius

1

由于我无法发表评论,所以我将留下一个答案:

我有同样的问题,@Nodarius的答案对我很有用。由于您没有接受它,我认为您的问题仍在持续。

这可能是因为即使您使用run in命令,也需要在页面加载之前(或在网站访问变量之前)运行该代码。

我使用代理(https://mitmproxy.org/)实现了这一点,该代理在页面加载之前加载脚本。

希望能帮到您。


0

这个有效

await page.evaluateOnNewDocument(() => {
  window.navigator = {}
})

尽快尝试这个。 - Ali Haydar Güleç
这是我正在做的事情,除了 WebGL 供应商之外,一切都正常工作,但在 Chrome 上通常无法正常工作。 - Havish Netla

0
await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, "webdriver", {
      get: () => false,
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接