Puppeteer获取第三方Cookie

13

如何使用Puppeteer获取网站的第三方cookie?

对于第一方cookie,我知道可以使用以下代码:

await page.cookies()

你为什么认为Cookiepedia在读取_你的_ cookie? - Cerbrus
不是我的 cookies。它只读取页面的 cookies。可能它打开提供的页面并获取所有的 cookies,包括第一方和第三方的。 - Piotr Wójcik
你为什么认为它是使用JavaScript来做那件事的? - Cerbrus
1
@PiotrWójcik,你能分享一下你的研究吗?我对你提到的第二种方法很感兴趣。 - Vaviloff
2
@Vaviloff 我完全忘记了,抱歉。无论如何,这段代码已经消失很长时间了,但我找到了其中的一些部分,所以可能不完整:
  1. Puppeteer在测试目录中创建了./Default/Cookies文件,它只是一个sqlite数据库,所有的cookie都在里面。
- Piotr Wójcik
显示剩余5条评论
3个回答

33

我想知道答案,所以我找到了一个解决方案,它适用于当前版本的Chromium 75.0.3765.0和puppeteer 1.15.0(更新于2019年5月2日)

使用内部puppeteerpage._client方法,我们可以直接使用Chrome DevTools Protocol

(async() => {
  const browser = await puppeteer.launch({});
  const page = await browser.newPage();
  await page.goto('https://stackoverflow.com', {waitUntil : 'networkidle2' });

  // Here we can get all of the cookies
  console.log(await page._client.send('Network.getAllCookies'));

})();

返回的对象中包含了 google.com 和 imgur.com 的 cookie,这些 cookie 通常不能通过正常的浏览器 JavaScript 获取:

第三方 cookie!


这个似乎在Chrome 73.0.3683.103版本中不再起作用了,对吧? - noli
@noli,我已经安装了最新的 puppeteer 1.15.0,使用了 Chromium 75.0.3765 版本,实际运行效果非常好:截图链接 - Vaviloff
1
已确认此方法适用于puppeteer@1.17.0和Chromium 74.0.3729.169。 - Yashveer Rana
1
对于任何感兴趣的人:它仍然适用于Chromium 92.0.4512.0和puppeteer 10.0.0。 - Fabio

12
您可以使用 target.createCDPSession()页面目标 上创建一个 Chrome DevTools Protocol 会话。然后,您可以发送 Network.getAllCookies 来获取所有浏览器 cookie 的列表。 page.cookies() 函数仅返回当前 URL 的 cookie。因此,我们可以将所有浏览器 cookie 中当前页面的 cookie 过滤掉,从而获得仅包含第三方 cookie 的列表。
const client = await page.target().createCDPSession();
const all_browser_cookies = (await client.send('Network.getAllCookies')).cookies;
const current_url_cookies = await page.cookies();
const third_party_cookies = all_browser_cookies.filter(cookie => cookie.domain !== current_url_cookies[0].domain);

console.log(all_browser_cookies); // All Browser Cookies
console.log(current_url_cookies); // Current URL Cookies
console.log(third_party_cookies); // Third-Party Cookies

你好@Grant Miller - 我想知道如何将特定的网页传递给它,以获取其cookie进行检查? - joe hoeller

1
  const browser = await puppeteer.launch({});
  const page = await browser.newPage();
  await page.goto('https://www.stackoverflow.com/', {waitUntil : 'networkidle0' });
  // networkidle2, domcontentloaded, load are the options for wai until
  // Here we can get all of the cookies
  var content = await page._client.send('Network.getAllCookies');

  console.log(JSON.stringify(content, null, 4));

这对顶部答案有什么补充?这在Pupp 19.1.0上不起作用:TypeError: page._client.send is not a function - ggorlen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接