Chrome扩展程序可获取所有标签Cookie

时间:2018-04-30 10:04:50

标签: cookies google-chrome-extension google-chrome-devtools

尝试使用Chrome扩展程序从页面获取所有Cookie。

例如页面os https://ya.ru

这是我的代码:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    var domain = getDomain(tabs[0].url);

    chrome.cookies.getAll({
        domain: domain
    }, function(cookies) {
        console.log(cookies);
    });

});

此代码将返回域ya.ru的所有cookie(8)。 但问题是当我打开浏览器控制台时,我不仅看到了ya.ru域名的cookie:

enter image description here

谷歌和其他网站的情况相同。所以我在一个页面上有多个域cookie。如何在页面上获取所有cookie?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

Devtools显示页面请求的所有资源URL(source code)的Cookie,因此我们可以通过访问我们将在页面中执行的内容脚本代码中的Performance API来执行相同操作:

chrome.tabs.executeScript({
  code: 'performance.getEntriesByType("resource").map(e => e.name)',
}, data => {
  if (chrome.runtime.lastError || !data || !data[0]) return;
  const urls = data[0].map(url => url.split(/[#?]/)[0]);
  const uniqueUrls = [...new Set(urls).values()].filter(Boolean);
  Promise.all(
    uniqueUrls.map(url =>
      new Promise(resolve => {
        chrome.cookies.getAll({url}, resolve);
      })
    )
  ).then(results => {
    // convert the array of arrays into a deduplicated flat array of cookies
    const cookies = [
      ...new Map(
        [].concat(...results)
          .map(c => [JSON.stringify(c), c])
      ).values()
    ];

    // do something with the cookies here
    console.log(uniqueUrls, cookies);
  });
});

重要说明:

  • 您的manifest.json应该在"<all_urls>"中有"permissions"或明确的网址匹配模式列表,以便在chrome.cookies.getAll中显示相应的结果。

  • 当有数千个Cookie时,上面的Cookie重复数据删除代码可能会很慢。

  • 我们正在为网址而非域名阅读Cookie,因为它是获取包含cookie(imgur.com)的唯一可靠方式,例如i.stack.imgur.com