Puppeteer's page.cookies() 未检索 Chrome 开发工具中显示的所有 cookie



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

我的代码是:

// 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 Dev工具时,它显示了更多内容。

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

我应该调用其他函数吗?我做得对吗?

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

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

利用Chrome DevTools Protocol ->getAllCookies获取所有浏览器 Cookie,无论任何标志如何。

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

这也将与打字稿和 tslint 配合得很好,因为类似

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

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

谢谢@try-catch-final。我解决了这个问题,这是一个简单的菜鸟错误。我正在比较我自己的Google Chrome实例中的cookie和Puppeteer实例。但是,在我的实例中,我登录到我的Google帐户,而Puppeteer(显然(没有。当您未登录时,谷歌使用 2 个 Cookie,在您登录时使用 12 个 Cookie。

如果您使用 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
  }
]

只需await page.goto('https://google.com', { waitUntil: 'networkidle2' })使用它即可。你可以得到所有相关的饼干。

相关内容

最新更新