我通过向DOM注入脚本,成功捕获了网站发出的所有HTTP请求和响应。根据您的需求和环境,有几种不同的方法可以实现这一功能,例如ManifestV3/V2。以下是我使用的方法:
inject.js:
var s = document.createElement('script');
s.src = chrome.runtime.getURL('injected.js');
s.onload = function() {
this.remove();
};
(document.head || document.documentElement).appendChild(s);
这将在匹配 manifest.json 中 "content_scripts" "matches" 的网站中注入 injected.js。在 "js" 中提到了 contentscript.js 和 inject.js。
请参见答案末尾的 manifest.json。
现在,injected.js 中实际捕获请求和响应的代码受到 如何使用 Chrome 扩展程序从网站选项卡中捕获 AJAX 请求 的启发。还请查看该文章的评论部分。
injected.js:
(function(xhr) {
var XHR = XMLHttpRequest.prototype;
var open = XHR.open;
var send = XHR.send;
var setRequestHeader = XHR.setRequestHeader;
XHR.open = function(method, url) {
this._method = method;
this._url = url;
this._requestHeaders = {};
this._startTime = (new Date()).toISOString();
return open.apply(this, arguments);
};
XHR.setRequestHeader = function(header, value) {
this._requestHeaders[header] = value;
return setRequestHeader.apply(this, arguments);
};
XHR.send = function(postData) {
this.addEventListener('load', function() {
var endTime = (new Date()).toISOString();
var myUrl = this._url ? this._url.toLowerCase() : this._url;
if(myUrl) {
if (postData) {
if (typeof postData === 'string') {
try {
this._requestHeaders = postData;
} catch(err) {
console.log('Request Header JSON decode failed, transfer_encoding field could be base64');
console.log(err);
}
} else if (typeof postData === 'object' || typeof postData === 'array' || typeof postData === 'number' || typeof postData === 'boolean') {
}
}
var responseHeaders = this.getAllResponseHeaders();
if ( this.responseType != 'blob' && this.responseText) {
try {
var arr = this.responseText;
console.log(this._url);
console.log(JSON.parse(this._requestHeaders));
console.log(responseHeaders);
console.log(JSON.parse(arr));
} catch(err) {
console.log("Error in responseType try catch");
console.log(err);
}
}
}
});
return send.apply(this, arguments);
};
})(XMLHttpRequest);
manifest.json:
{
"manifest_version": 3,
"name": "Extension Name",
"description": "Some Desc.",
"version": "1.1",
"content_scripts": [{
"matches": ["*://website.com/*"],
"run_at": "document_start",
"js": ["contentscript.js", "inject.js"]
}],
"web_accessible_resources": [{
"resources": ["injected.js"],
"matches": ["*://website.com/*"]
}]
}
对于MV2,最后一个块只需写成"web_accessible_resources": ["injected.js"]
image/x-png
为image/png
,因为Chrome不理解x-png
(早期的一个bug,仍未修复)。您是否成功创建了您的扩展程序?如果是,它能够满足我的需求吗? - kriegaex