【问题标题】:Puppeteer Headless Blocked by googlePuppeteer Headless 被谷歌屏蔽
【发布时间】:2022-07-15 23:45:50
【问题描述】:

我正在使用 puppeteer 执行一些动作并拍摄屏幕截图。整个过程有多重身份验证,首先是 Gmail 登录,然后 SSO 重定向到 Microsoft,然后我们从它们进入应用程序。我面临的问题是,当我设置我的浏览器 - 无头:假时,一切正常,但是当我设置无头:真时,Gmail 开始要求验证码,有时它说,浏览器不安全。

我已经尝试解决这个问题很长一段时间了,但我完全被蒙蔽了。我已经通过互联网阅读并找到了很多选项,例如设置用户代理、添加首选项等,但它们都不起作用。

这是我的简单代码和屏幕截图。

// puppeteer-extra is a drop-in replacement for puppeteer,
// it augments the installed puppeteer with plugin functionality
const puppeteer = require('puppeteer-extra');
//puppeteer.use(require('puppeteer-extra-plugin-stealth')());

// add stealth plugin and use defaults (all evasion techniques)
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
console.log(StealthPlugin.availableEvasions);
puppeteer.use(StealthPlugin());
//const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha')


//const puppeteer = require('puppeteer')

// puppeteer usage as normal
puppeteer.launch({ headless: true, executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', setUserAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36' }).then(async browser => {
  console.log('Running tests..')
  const page = await browser.newPage()
  //await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.61 Safari/537.36')
  await page.goto('https://accounts.google.com/signin/v2/identifier?service=mail&passive=1209600&osid=1&continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&followup=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&emr=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin')
  await page.waitForTimeout(5000)
  await page.setViewport({ width: 1300, height: 950 }); 
  await page.waitForTimeout(1000)
  await page.screenshot({path: '1.png', fullPage: true})
  await page.waitForSelector('[type="email"]')
  await page.type('[type="email"]', 'nxxxx@xxxx.com');
  await page.keyboard.press('Enter');

  await page.waitForTimeout(1000);
  //await page.solveRecaptchas()
  //await page.waitForNavigation({'waitUntil':'domcontentloaded'});
  await page.screenshot({path: '2.png', fullPage: true})
  await page.screenshot({ path: 'testresult.png', fullPage: true })
  await browser.close()
  console.log(`All done, check the screenshot. ✨`)
})

我只更新了部分代码,但结果还是一样,除非我绕过检测,否则我无法继续前进。请找到随附的屏幕截图。

Output of the Image

我只想通过这个阶段并进入下一个屏幕.....

请帮忙.... :(

【问题讨论】:

  • 好吧,这不是你应该做的。如果 Google 不希望您使用自动化工具登录,请接受它。而且,即使您今天绕过了它,谷歌很有可能在将来以安全的名义注册时添加新页面。在这里玩猫鼠游戏是徒劳的:)。
  • 另外,它适用于有头为什么你甚至需要无头?您可以使用 xfvb 等工具在 ci 中运行。
  • 嗨,谢谢您的回复,是的,但是整个 puppeteer 都在 docker 容器中运行,我也不能使用 xfvb....
  • 那就没有好的解决办法了。谷歌有时会怀疑由于IP、指纹数据等不同的变量……无头模式和有头模式有不同的细微差别。例如 -- 自动化标志等被传递,导航器的属性被改变等等。有时谷歌会显示验证屏幕,如电话号码确认等。因此,我认为你以错误的方式解决问题。
  • 也试试火狐。

标签: puppeteer headless-browser


【解决方案1】:

如果它在 headful 模式下工作,但不是在 headless 模式下,一个解决方案是使用 Xvfb。所以在启动选项中使用headless: false,并使用xvfb-run 运行脚本。

Xvfb 是一个 X 服务器,可以在没有显示硬件和没有物理输入设备的机器上运行,比如您正在使用的容器。 Xvfb 使用虚拟内存模拟哑帧缓冲区。

Chrome(或 Firefox)在由 X 客户端库(如 XCB)创建的窗口中呈现其图形。 XVFB 打开该窗口(在您的容器上)。

在 Ubuntu 中,您可以使用以下命令安装 Xvfb:

sudo apt-get install xvfb

以下命令将运行您的 Puppeteer 脚本并在虚拟帧缓冲区中渲染 Chrome:

xvfb-run --auto-servernum node your-puppeteer-script.js

请记住Puppeteer itself uses xvfb for its CI tests

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2018-08-07
    • 2021-01-04
    • 1970-01-01
    • 2018-09-16
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多