如何在Puppeteer中用page.evaluateOnNewDocument()修改navigator.languages?
你的预加载脚本存在语法错误,同时缺少对单个语言属性的覆盖,导致修改未生效。以下是具体修复步骤:
1. 修正预加载脚本的语法错误并完善属性覆盖
将你的预加载JS文件内容替换为以下代码:
// 覆盖navigator.languages数组 Object.defineProperty(navigator, 'languages', { get: () => ['fr-ca', 'fr'], configurable: true, enumerable: true }); // 同步覆盖单个语言属性,确保页面检测一致 Object.defineProperty(navigator, 'language', { get: () => 'fr-ca', configurable: true, enumerable: true });
- 原脚本中
get方法后的分号;是语法错误,需改为逗号,(Object.defineProperty的配置对象是键值对结构,键之间用逗号分隔)。 - 添加
configurable和enumerable属性,让自定义属性与原生属性行为一致,避免被页面脚本识别出异常。 - 同步覆盖
navigator.language,因为很多页面会同时读取这个单值属性判断语言偏好。
2. 验证脚本读取是否正确
可以在NodeJS脚本中添加日志,确认预加载文件是否被正确读取:
const preloadFile = fs.readFileSync(preldpath, 'utf8'); console.log('已读取的预加载脚本:', preloadFile); // 检查输出是否与修改后的脚本一致 await page.evaluateOnNewDocument(preloadFile);
3. 排除Stealth插件的干扰(可选)
如果修改后仍未生效,可以临时禁用StealthPlugin测试,部分插件的内置反检测逻辑可能会覆盖你的自定义属性。若禁用后生效,可调整插件配置或在插件加载后重新注入你的修改脚本。
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

