【问题标题】:Puppeteer's page.cookies() not retrieving all cookies shown in the Chrome dev toolsPuppeteer 的 page.cookies() 没有检索 Chrome 开发工具中显示的所有 cookie
【发布时间】:2022-01-12 22:00:56
【问题描述】:

使用 puppeteer,我正在尝试从 Node.js 检索特定网站(即https://google.com)的所有 cookie。

我的代码是:

// Launch browser and open a new page
const browser = await puppeteer.launch({ headless: true, args: ['--disable-dev-shm-usage'] });
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
var cookies = await page.cookies();
console.log(cookies);
await browser.close();

它只检索 2 个 cookie,名为 1P_JARNID。但是,当我打开 Chrome 开发工具时,它会显示更多内容。

我尝试直接使用 Chrome 开发工具而不是 puppeteer,但我得到了相同的结果。

我应该调用另一个函数吗?我做得对吗?

【问题讨论】:

  • 请在开发工具中添加打开 cookie 的“应用程序”面板的屏幕截图(像素化 cookie 值)。在尝试以编程方式获取 cookie 之前,请确保已完成所有异步任务的页面加载。文档说“如果没有指定 URL,则此方法返回当前页面 URL 的 cookie。” - 这可能会排除为“www.google.com”或“.google.com”设置的 cookie(关于您的页面 URL“google.com”)。

标签: google-chrome-devtools puppeteer


【解决方案1】:

page.cookies() 调用仅获取浏览器内的 JavaScript 应用程序可用的 cookie,而不是您在 Chrome 开发工具中看到的标记为 httpOnly 的 cookie。解决方案是通过 Devtools 协议请求所有可用的 cookie,然后过滤您感兴趣的站点。

var data = await page._client.send('Network.getAllCookies');

【讨论】:

  • 不幸的是,它似乎不适用于打字稿,因为 _client 是私有的
【解决方案2】:

您可以使用Chrome DevTools Protocol -> getAllCookies 获取所有浏览器 cookie,无论任何标志。

const client = await page.target().createCDPSession();
const cookies = (await client.send('Network.getAllCookies')).cookies;

这也可以很好地与 typescript 和 tslint 配合使用,因为类似

const cookies = await page._client.send('Network.getAllCookies');

将引发错误TS2341: Property '_client' is private and only accessible within class 'Page'.

【讨论】:

    【解决方案3】:

    感谢@try-catch-finally。我解决了它,这是一个简单的新手错误。 我正在将我自己的 Google Chrome 实例中的 cookie 与 Puppeteer 实例进行比较。然而,在我的例子中,我登录了我的谷歌账户,而 Puppeteer(显然)没有。 Google 在您未登录时使用 2 个 cookie,在您登录时使用 12 个。

    【讨论】:

      【解决方案4】:

      如果您使用 Playwright 代替 Puppeteer,则可以轻松访问 httponly cookie:

      const { chromium } = require('playwright')
      (async () => {
          const browser = await chromium.launch()
          const context = await browser.newContext()
          const page = await context.newPage()
          await page.goto('https://google.com', { waitUntil: 'networkidle' })
          let allCookies = await context.cookies()
          console.log (allCookies)
      })();
      

      返回:

      [
        {
          sameSite: 'None',
          name: '1P_JAR',
          value: '2021-01-27-19',
          domain: '.google.com',
          path: '/',
          expires: 1614369040.389115,
          httpOnly: false,
          secure: true
        },
        {
          sameSite: 'None',
          name: 'NID',
          value: '208=VXtmbaUL...',
          domain: '.google.com',
          path: '/',
          expires: 1627588239.572781,
          httpOnly: true,
          secure: false
        }
      ]
      

      【讨论】:

      • 我看到Puppeteer中也有这种行为
      猜你喜欢
      • 2019-08-25
      • 2023-03-18
      • 1970-01-01
      • 2020-10-03
      • 2015-05-24
      • 2014-09-21
      • 2012-07-16
      • 2012-07-02
      • 2020-04-09
      相关资源
      最近更新 更多