javascript Chrome扩展程序-获取特定选项卡的所有cookie-正确吗?

hfyxw5xn  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(109)

我正在尝试获取特定选项卡的所有cookie。
我遇到的麻烦,请原谅我,因为我不是饼干Maven,我从所有不同的方法得到的饼干都是不同的/不完整的。

方法一:

document.cookie-我的理解是,这些是与文档相关联的cookie。换句话说,我在chrome中加载了一个URL,在网络选项卡中,我看到有一个请求我加载的URL的文档。在请求头中,我可以看到cookie。
但是,由于某些原因,我在请求头中看到的cookie与document.cookie将打印的cookie不同。此外,当我检查DevTools - Application - Cookies时,与document.cookie相比,有多得多的cookie。

方法二:

我收到了一封来自先生的回信。wOxxOm - HERE

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);
  });
});

字符串
我理解先生的方式。wOxxOm的回答是,它从加载特定选项卡中的URL时发出的所有请求中获取所有cookie。
同样,当我比较我从上面的代码中得到的东西时,它与我在DevTools - Application - Cookies中看到的不同。
也许是因为一些cookie是在页面加载后使用JS设置的,因此在加载原始URL时不属于请求的一部分?

方法三:

然后是chrome.cookies.getAll,但它得到所有的cookie存储在 chrome .如果我理解正确,这就是方法2解决方案的原因。如果我们得到所有的cookie,我们不知道它们属于哪个标签,因为单个标签可以保存多个域的cookie。
我发现了一个评论先生。wOxxOm,它解释了如何识别隐身cookieStore,对我来说,这似乎是唯一的解决方案,真正让你所有的cookie保存为一个特定的标签,并应希望匹配什么是显示在DevTools -应用程序-Cookie。
通过在隐身模式下使用单个标签,我们基本上将该标签的cookie与其他cookie隔离开来,并希望覆盖所有cookie。
沿着如下的东西:
1.打开隐身窗口
1.浏览一个网址(并做一些事情,即登录等)
1.找出选项卡所属的cookieStore ID
1.使用chrome.cookies.getAll获取该特定cookieStore的所有cookie
沿着如下的东西:

// get current tab (my extension will work by clicking the extension icon, so popup.html/popup.js)
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    var currTab = tabs[0];
    if (!currTab["incognito"]) { // If it's not an incognito tab, stop here
        console.log("current tab is not incognito");
    }
    else { // If it is an incognito tab, return tabId
        console.log(currTab["id"]);
    }
});

// Check cookieStoreId based on the tabId
chrome.cookies.getAllCookieStores(function (cookiestores){
    var cookieStore = cookiestores.find(obj => {
        return obj.tabIds.includes(tabId);
    });
    console.log(cookieStore["id"]);
});

get all cookies based on cookieStoreId
chrome.cookies.getAll({"storeId": "1"},function (cookie){
    console.log(cookie)
});


我的假设正确吗?方法3真的是获取特定标签的所有cookie的唯一方法吗?

jdzmm42g

jdzmm42g1#

对我来说,这是一个权限问题。我需要请求"<all_urls>"主机权限才能看到所有cookie。没有它,我只看到了一部分饼干。
清单v3:

"host_permissions": [
        "<all_urls>"
    ]

字符串
如果你对我写的获取特定标签的所有cookie的脚本感兴趣,你需要脚本和cookie权限。

"permissions": [
        "cookies",
        "scripting"
    ]


我的脚本基于@wOxxOm的脚本,获取指定选项卡的所有cookie并删除它们:

/* eslint-disable */

const tabId = 114632975;

function getPerformanceEntries() {
    return performance
        .getEntriesByType('resource')
        .map(
            (r) => r.name
        );
}

const results = await chrome.scripting.executeScript(
    {
        target: { tabId },
        func: getPerformanceEntries
    }
);

const resourceUrls = results[0].result;

const origins = resourceUrls
    .map((url) => new URL(url).origin)
    .filter((url) => Boolean(url) && url !== 'null');

const uniqueOrigins = new Set(origins);

const getCookiesPromises = [];

for (const url of uniqueOrigins) {
    const promise = chrome.cookies
        .getAll(
            {
                url
            }
        )
        .then(
            (cookies) => (
                {
                    url,
                    cookies
                }
            )
        );

    getCookiesPromises.push(promise);
}

const urlCookies = await Promise.all(getCookiesPromises);

const filtered = urlCookies.filter((c) => c.cookies.length);

console.log('Found Cookies:', filtered);

console.log('Total Cookie Count:', filtered.reduce((acc, c) => acc + c.cookies.length, 0));

const deletePromises = [];

for (const { url, cookies } of filtered) {
    for (const cookie of cookies) {
        const promise = chrome.cookies.remove(
            {
                url,
                name: cookie.name,
                storeId: cookie.storeId
            }
        );

        deletePromises.push(promise);
    }
}

await Promise.all(deletePromises);

相关问题