cookie_extract/popup.js
2025-04-23 00:44:06 +08:00

248 lines
9.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

document.addEventListener('DOMContentLoaded', function() {
const copyButton = document.getElementById('copyCookie');
const copyAllButton = document.getElementById('copyAllCookies');
const resultDiv = document.getElementById('result');
// 复制SESSION cookie的功能
copyButton.addEventListener('click', function() {
// 获取当前标签页信息
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
const currentTab = tabs[0];
const url = new URL(currentTab.url);
// 获取域名及其父域名下的所有cookie
// 例如如果当前网址是breeze.opd.netease.com也会查找netease.com的cookie
const domain = url.hostname;
const domains = getDomainAndParents(domain);
// 创建一个Promise数组每个Promise获取一个域的cookies
const cookiePromises = domains.map(domain => {
return new Promise((resolve) => {
chrome.cookies.getAll({domain: domain}, (cookies) => {
resolve(cookies || []);
});
});
});
// 合并所有域名下的cookie结果
Promise.all(cookiePromises).then(cookiesArrays => {
// 合并所有cookie数组
const allCookies = [].concat(...cookiesArrays);
// 查找名为SESSION的cookie不区分大小写
const sessionCookie = allCookies.find(cookie =>
cookie.name.toUpperCase() === 'SESSION');
if (sessionCookie) {
// 格式化为SESSION=xxx
const cookieText = `SESSION=${sessionCookie.value}`;
// 复制到剪贴板
navigator.clipboard.writeText(cookieText)
.then(() => {
resultDiv.textContent = '已复制: ' + cookieText;
resultDiv.className = 'success';
})
.catch(err => {
resultDiv.textContent = '复制失败: ' + err;
resultDiv.className = 'error';
});
} else {
// 尝试从document.cookie中提取使用scripting API
chrome.scripting.executeScript({
target: {tabId: tabs[0].id},
func: function() {
// 获取所有cookie
const cookies = document.cookie.split(';');
// 查找SESSION cookie
let sessionCookie = null;
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.toUpperCase().startsWith('SESSION=')) {
sessionCookie = cookie;
break;
}
}
return sessionCookie;
}
}).then(injectionResults => {
const result = injectionResults[0];
if (result && result.result) {
navigator.clipboard.writeText(result.result)
.then(() => {
resultDiv.textContent = '已复制: ' + result.result;
resultDiv.className = 'success';
})
.catch(err => {
resultDiv.textContent = '复制失败: ' + err;
resultDiv.className = 'error';
});
} else {
// 如果仍未找到尝试从HTTP头部中解析仅用于演示实际上扩展无法直接读取HTTP头
resultDiv.textContent = '没有找到SESSION cookie请确认网页包含此cookie';
resultDiv.className = 'error';
}
}).catch(err => {
resultDiv.textContent = '脚本执行失败: ' + err.message;
resultDiv.className = 'error';
});
}
});
});
});
// 复制HTTP头部格式的cookie值
copyAllButton.addEventListener('click', function() {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
const currentTab = tabs[0];
const url = new URL(currentTab.url);
const exactDomain = url.hostname;
// 检查是否是网易相关域名
const isNeteaseHost = exactDomain.includes('netease.com') || exactDomain.includes('breeze');
// 获取域名及其父域名
const domains = getDomainAndParents(exactDomain);
// 如果是网易域名,加入特殊的网易域名
if (isNeteaseHost) {
domains.push('netease.com');
domains.push('.netease.com');
domains.push('gameyw.netease.com');
domains.push('opd.netease.com');
domains.push('breeze.opd.netease.com');
domains.push('breeze.gameyw.netease.com');
}
// 为每个域名创建一个Promise获取该域名下的所有cookie
const cookiePromises = domains.map(domain => {
return new Promise((resolve) => {
chrome.cookies.getAll({domain: domain}, (cookies) => {
resolve(cookies || []);
});
});
});
// 使用注入脚本获取页面上的document.cookie
chrome.scripting.executeScript({
target: {tabId: tabs[0].id},
func: function() {
return document.cookie;
}
}).then(docCookieResult => {
const docCookies = docCookieResult[0].result ?
docCookieResult[0].result.split(';').map(cookie => cookie.trim()) : [];
// 等待所有cookie获取完成
Promise.all(cookiePromises).then(cookiesArrays => {
// 合并并去重所有cookie
const cookieMap = new Map();
// 处理Chrome API获取的cookie
cookiesArrays.forEach(cookies => {
cookies.forEach(cookie => {
cookieMap.set(cookie.name, cookie.value);
});
});
// 处理document.cookie获取的cookie
docCookies.forEach(cookieStr => {
const parts = cookieStr.split('=');
if (parts.length >= 2) {
const name = parts[0].trim();
const value = parts.slice(1).join('=');
cookieMap.set(name, value);
}
});
// 如果是网易域名确保包含SESSION等重要cookie
const importantCookieNames = [
'SESSION', 'sensorsdata2015jssdkcross', 'Hm_lvt_', '_ga', 'COSPREAD_SESSIONID',
'identity', 'csrftoken', 'accessToken', 'refreshToken', 'sessionid'
];
// 获取所有cookie项
let cookieStrings = [];
if (isNeteaseHost) {
// 网易域名特殊处理确保SESSION在结果的最前面
let sessionCookie = null;
let importantCookies = [];
let otherCookies = [];
// 分类处理cookie
for (const [name, value] of cookieMap.entries()) {
if (name.toUpperCase() === 'SESSION') {
sessionCookie = `${name}=${value}`;
} else if (importantCookieNames.some(key => name.includes(key))) {
importantCookies.push(`${name}=${value}`);
} else {
otherCookies.push(`${name}=${value}`);
}
}
// 按优先级组装cookie字符串
if (sessionCookie) {
cookieStrings.push(sessionCookie);
}
cookieStrings = cookieStrings.concat(importantCookies);
// 如果没有其他重要cookie考虑添加部分普通cookie
if (cookieStrings.length < 3 && otherCookies.length > 0) {
cookieStrings = cookieStrings.concat(otherCookies.slice(0, 5));
}
} else {
// 非网易域名使用所有cookie
cookieStrings = Array.from(cookieMap.entries()).map(([name, value]) => `${name}=${value}`);
}
// 格式化为HTTP头格式
const headerCookieFormat = cookieStrings.join('; ');
// 复制到剪贴板
navigator.clipboard.writeText(headerCookieFormat)
.then(() => {
resultDiv.textContent = '已复制Header格式Cookie';
resultDiv.className = 'success';
// 显示cookie数量
const cookieCount = cookieStrings.length;
resultDiv.textContent += ` (共${cookieCount}项)`;
// 预览
if (cookieStrings.length > 0) {
const preview = headerCookieFormat.length > 80 ?
headerCookieFormat.substring(0, 80) + '...' :
headerCookieFormat;
resultDiv.textContent += '\n预览: ' + preview;
}
})
.catch(err => {
resultDiv.textContent = '复制失败: ' + err;
resultDiv.className = 'error';
});
});
}).catch(err => {
resultDiv.textContent = '脚本执行失败: ' + err.message;
resultDiv.className = 'error';
});
});
});
// 辅助函数:获取域名及其父域名
// 例如breeze.opd.netease.com -> ['breeze.opd.netease.com', 'opd.netease.com', 'netease.com']
function getDomainAndParents(domain) {
const parts = domain.split('.');
const domains = [];
// 添加完整域名
domains.push(domain);
// 添加父域名
for (let i = 1; i < parts.length - 1; i++) {
domains.push(parts.slice(i).join('.'));
}
return domains;
}
});