Rom*_*'ai 2 javascript google-chrome google-chrome-extension
我正在编写一个可以为站点获取 HTTP 响应的 Chrome 扩展程序。我尝试使用调试器获取响应正文:
var gCurrentTab;
chrome.debugger.onEvent.addListener(function (source, method, params) {
如果(gCurrentTab.id != source.tabId){
返回;
}
如果(方法==“Network.loadingFinished”){
var tabId = source.tabId;
var requestId = params.requestId;
chrome.debugger.sendCommand(
来源,
"Network.getResponseBody",
{"requestId": requestId},
功能(主体){
控制台日志(正文);
chrome.debugger.detach(source);
});
}
}
);
chrome.webRequest.onBeforeRequest.addListener(function (details) {
var url = details.url;
if (url.indexOf('/mypage') >= 0) {
chrome.tabs.query({
当前窗口:真,
活动:真实
},功能(标签){
gCurrentTab = 标签 [0];
chrome.debugger.attach({
tabId: gCurrentTab.id
}, "1.0", 函数 () {
chrome.debugger.sendCommand({
tabId: gCurrentTab.id
}, "Network.enable");
});
});
}
},
{urls: []}, ["requestBody", "blocking"]);
但我总是得到
运行 debugger.sendCommand 时未检查 runtime.lastError: {"code":-32000,"message":"No resource with given identifier found"} at chrome-extension://ikphgobkghdkjkfplgokmapjlbdfeegl/background.js:11:29
错误,并且主体未定义。
有谁知道为什么会发生这种情况?谢谢!
那是因为网站发送了很多响应,这段代码会看到另一个我想要的请求,然后分离调试器,所以我无法得到结果。
要解决此问题,只需使用单个调试器并且不要分离它,或者仅在安全的情况下分离。
var gAttached = false;
var gRequests = [];
var gObjects = [];
chrome.debugger.onEvent.addListener(function (source, method, params) {
如果(方法==“Network.requestWillBeSent”){
// 如果我们看到需要处理的url,则将其推入索引队列
var rUrl = params.request.url;
如果(getTarget(rUrl)>= 0){
gRequests.push(rUrl);
}
}
如果(方法==“Network.responseReceived”){
// 我们在这里得到它的请求id,把它写到对象队列中
var eUrl = params.response.url;
var target = getTarget(eUrl);
如果(目标> = 0){
gObjects.push({
requestId: params.requestId,
目标:目标,
网址:eUrl
});
}
}
if (method == "Network.loadingFinished" && gObjects.length > 0) {
// 从对象队列和请求队列中弹出请求对象
var requestId = params.requestId;
var 对象 = 空;
for (var o in gObjects) {
if (requestId == gObjects[o].requestId) {
object = gObjects.splice(o, 1)[0];
休息;
}
}
// 通常loadingFinished 会在responseReceived 之后
如果(对象==空){
console.log('失败!!');
返回;
}
gRequests.splice(gRequests.indexOf(object.url), 1);
chrome.debugger.sendCommand(
来源,
"Network.getResponseBody",
{"requestId": requestId},
功能(响应){
如果(响应){
dispatch(source.tabId, object.target, JSON.parse(response.body));
} 别的 {
console.log("" + object.url 的响应为空);
}
// 如果我们没有任何等待响应的请求,重新附加调试器
// 因为没有这一步会导致内存泄漏。
如果(gRequests.length == 0){
chrome.debugger.detach({
tabId: source.tabId
}, 功能 () {
chrome.debugger.attach({
tabId: source.tabId
}, "1.0", 函数 () {
chrome.debugger.sendCommand({
tabId: source.tabId
}, "Network.enable");
});
});
}
});
}
}
);
var initialListener = 函数(详细信息){
如果(gAttached)返回;// 在第一个请求时只需要一次,所以阻止所有后续请求
var tabId = details.tabId;
如果(tabId > 0){
gAttached = true;
chrome.debugger.attach({
tabId:tabId
}, "1.0", 函数 () {
chrome.debugger.sendCommand({
tabId:tabId
}, "Network.enable");
});
// 删除 self 因为调试器已经附加
chrome.webRequest.onBeforeRequest.removeListener(initialListener);
}
};
// 启动时附加调试器
chrome.webRequest.onBeforeRequest.addListener(initialListener, {urls: [""]}, ["blocking"]);
// 过滤url是否是我们想要的
函数 getTarget(url) {
for (var i in TARGETS) {
var target = TARGETS[i];
如果(网址。匹配(目标。网址)){
返回我;
}
}
返回-1;
}
常量目标 = [
{url: '/path1', desc: 'target1'},
{url: '/path2', desc: 'target2'}
]
| 归档时间: |
|
| 查看次数: |
16408 次 |
| 最近记录: |