【问题标题】:Problem overwriting navigator.languages in puppeteer在 puppeteer 中覆盖 navigator.languages 的问题
【发布时间】:2021-02-16 00:09:28
【问题描述】:

我有一个无法解决的问题,要完成匿名 puppeteer 的制作。 到目前为止我已经通过了所有的anti-bot测试,但是我无法配置语言,让我解释一下:

  • 覆盖用户代理,我设法将“navigator.language”从“en-US,in”更改为“es-ES,es”

  • 但我已经尝试了所有方法,但我无法覆盖它始终保留在“en-US, en”中的“navigator.languages”

我希望有人可以帮助我更改语言。

我附上我使用的插件的截图和链接。

https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth

https://github.com/berstend/puppeteer-extra/blob/master/packages/puppeteer-extra-plugin-stealth/evasions/user-agent-override/index.js



const puppeteer = require("puppeteer-extra");


// add stealth plugin and use defaults (all evasion techniques)


const stealth_plugin = require("puppeteer-extra-plugin-stealth");
const stealth = stealth_plugin();

puppeteer.use(stealth);

const UserAgentOverride = require("puppeteer-extra-plugin-stealth/evasions/user-agent-override");

const ua = UserAgentOverride({locale: "es-ES,es;q=0.9", userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36", platform: "MacIntel"});

const path = require('path')
const websites = require('./websites.json')

async function run() {
    puppeteer.use(ua);

    const browser = await puppeteer.launch({
        headless: false,
        userDataDir: "./cache",
        ignoreHTTPSErrors: true,
        ignoreDefaultArgs: [
            "--disable-extensions",
            "--enable-automation",
        ],
        args: [
            "--lang=es-ES,es;q=0.9",
            "--no-sanbox",
            "--disable-dev-shm-usage",
            "--disable-gpu"
        ]
    })

    console.log(await browser.userAgent());
    const page = await browser.newPage()

    const pathRequire = path.join(__dirname, 'src/scripts/index.js')
    for (const website of websites) {
        require(pathRequire)(page, website)
    }

}

run().catch(error => { console.error("Something bad happend...", error); });

反爬虫测试结果图片:


你好 感谢您的回答,在测试编辑后的代码后,我注意到以下内容:

  • 当我启动浏览器时,一旦输入任何 url,配置就会消失。
  • 但是,如果我不输入任何 url,它完全通过了测试。

即使没有放置 url,它也配置得很好,我附上了两张图片,一张有 url,一张没有,我不明白我能做什么,我已经尝试了一切。

Object.getOwnPropertyDescriptors (navigator.languages)

it's writable using the languages evasion:

[value] => en-US
[writable] => 1
[enumerable] => 1
[configurable] => 1

while it should be
configurable: false
enumerable: true
value: "es-ES"
writable: false

Image of anti bot test results

Image of anti bot test results

【问题讨论】:

  • 嗨@vsemozhebuty,感谢您的回答我附上一个问题,以防您有兴趣讨论它,它一直让我颠倒过来。
  • 嗨 @jfriend00 你会很乐意帮助我的,谢谢。
  • 抱歉,我没有为您的问题提供任何答案,我刚刚修复了一些格式。我希望有经验的人能提供帮助。
  • @vsemozhebuty 非常感谢您的支持和关注,问候。

标签: javascript node.js puppeteer


【解决方案1】:

我已经设法在每次启动新页面时保留指定的语言,但我仍然没有解决 chrome 浏览器中的默认权限:

Object.getOwnPropertyDescriptors (navigator.languages)

虽然它应该是 可配置:假 可枚举:真 值:“es-ES” 可写:假

如果有人知道如何解决这个问题,我将不胜感激。


const websites = require('./websites.json')

异步函数运行(){ puppeteer.use(ua);

const optionslaunch = require("./src/scripts/options/optionslaunch");    
const browser = await puppeteer.launch(optionslaunch)

const page = await browser.newPage()

// Set the language forcefully on javascript
await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, "language", {
        get: function () {
            return "es-ES";
        }
    });
    Object.defineProperty(navigator, "languages", {
        get: function () {
            return ["es-ES", "es"];
        }
    });
});

const pathRequire = path.join(__dirname, 'src/scripts/app.js')

for (const website of websites) {
    // require(pathRequire)(page, pageEmail, website)
    require(pathRequire)(page, website)
}

}

run().catch(error => { console.error("发生了不好的事情...", error); });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多