【问题标题】:Puppeteer get 3rd-party cookiesPuppeteer 获得 3rd-party cookie
【发布时间】:2020-05-11 13:04:24
【问题描述】:

如何使用 Puppeteer 从网站获取 3rd-party cookie?

对于第一方,我知道我可以使用:

await page.cookies()

【问题讨论】:

  • 你可能做不到。 JS 通常没有这种访问权限。
  • 一定有办法。例如 cookiepedia 从任何页面中提取所有 cookie
  • 是什么让您认为 cookiepedia 正在读取 您的 cookie?
  • @PiotrWójcik,你能分享你的研究吗?我很好奇你提到的第二种方式。
  • @Vaviloff F*k 我完全忘记了,抱歉。无论如何,这段代码已经消失了很长时间,但我找到了它的一些部分,所以它可能不完整: 1. Puppeteer 在测试目录中创建:./Default/Cookies 文件,该文件只是 sqlite 数据库,所有 cookie 都在那里。

标签: javascript node.js cookies puppeteer google-chrome-headless


【解决方案1】:

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

使用internal 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,这是我们用普通浏览器 javascript 无法获得的:

【讨论】:

  • 这似乎不再有效,从 Chrome 73.0.3683.103 开始​​,对吧?
  • @noli 我已经用 Chromium 75.0.3765 安装了最新的 puppeteer 1.15.0 并且它工作正常:screenshot
  • 确认这适用于 puppeteer@1.17.0 和 Chromium 74.0.3729.169
  • 致任何感兴趣的人:它仍然适用于 Chromium 92.0.4512.0 和 puppeteer 10.0.0
【解决方案2】:

您可以使用target.createCDPSession()page target 上创建Chrome DevTools Protocol session。然后您可以发送Network.getAllCookies 以获取所有浏览器cookie 的列表。

page.cookies() 函数只会返回当前 URL 的 cookie。所以我们可以从所有浏览器cookies中过滤掉当前页面cookies,只获取第三方cookies列表。

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 以供检查?
【解决方案3】:
  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));

【讨论】:

    猜你喜欢
    • 2022-08-08
    • 1970-01-01
    • 2017-07-23
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多