1 Star 0 Fork 0

叶思杰/RequestTracker

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
background.js 4.74 KB
一键复制 编辑 原始数据 按行查看 历史
叶思杰 提交于 2025-02-06 15:45 +08:00 . 1
const MAX_HISTORY = 100;
let requestHistory = new Map();
// 初始化开关状态
let isPluginEnabled = false;
// 监听来自 panel.js 的开关状态消息
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === 'TOGGLE_PLUGIN') {
isPluginEnabled = message.enabled;
}
});
// 请求监听
chrome.webRequest.onCompleted.addListener(
async (details) => {
if (!isPluginEnabled || details.method !== 'POST') return;
try {
const maxRetries = 3;
let retries = 0;
let har;
while (retries < maxRetries) {
try {
await new Promise(resolve => setTimeout(resolve, 1000)); // 延迟 1 秒
const response = await new Promise((resolve, reject) => {
chrome.runtime.sendMessage({ type: 'GET_HAR', details }, (response) => {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve(response);
}
});
});
if (response && response.har) {
har = response.har;
break;
} else {
console.error('Received response without HAR data');
}
} catch (error) {
retries++;
if (retries === maxRetries) {
throw error;
}
}
}
if (har) {
const entry = har.entries.find(e =>
e._initiator.url === details.initiator &&
e.request.url === details.url
);
if (entry?.response?.content?.text) {
requestHistory.set(details.requestId, {
url: details.url,
response: entry.response.content.text.substring(0, 102400), // 限制100KB
cookies: parseCookies(details.responseHeaders)
});
cleanupHistory();
}
}
} catch (error) {
console.error('Tracking error:', error.message);
}
},
{ urls: ["<all_urls>"] },
["responseHeaders"]
);
function parseCookies(headers) {
return headers
?.filter(h => h.name.toLowerCase() === 'set-cookie')
.map(h => h.value.split(';')[0]) || [];
}
function cleanupHistory() {
if (requestHistory.size > MAX_HISTORY) {
Array.from(requestHistory.keys())
.slice(0, requestHistory.size - MAX_HISTORY)
.forEach(k => requestHistory.delete(k));
}
}
chrome.webRequest.onBeforeRequest.addListener(
(details) => {
if (!isPluginEnabled ||!details.requestBody) return;
const params = parseParameters(details);
const sources = traceParameters(params, details.url);
chrome.runtime.sendMessage({
type: 'PARAM_DATA',
parameters: sources
});
},
{ urls: ["<all_urls>"] },
["requestBody"]
);
function parseParameters(details) {
if (details.requestBody.formData) {
return Object.entries(details.requestBody.formData)
.reduce((acc, [key, values]) => {
acc[key] = values[0];
return acc;
}, {});
}
if (details.requestBody.raw) {
const rawData = details.requestBody.raw[0].bytes;
try {
return JSON.parse(String.fromCharCode.apply(null, new Uint8Array(rawData)));
} catch (error) {
console.error('JSON解析错误:', error);
return {};
}
}
return {};
}
function traceParameters(params, currentUrl) {
const results = [];
// 检查历史响应
requestHistory.forEach((history, id) => {
Object.entries(params).forEach(([key, value]) => {
if (history.response.includes(value)) {
results.push({
name: key,
value: value,
source: 'previous',
originUrl: history.url
});
}
});
});
// 检查Cookies
chrome.cookies.getAll({ url: currentUrl }, (cookies) => {
cookies.forEach(cookie => {
if (params[cookie.name]) {
results.push({
name: cookie.name,
value: cookie.value,
source: 'cookie'
});
}
});
});
return results;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/YetoloveLin/request-tracker.git
git@gitee.com:YetoloveLin/request-tracker.git
YetoloveLin
request-tracker
RequestTracker
master

搜索帮助