我正在撰写可以获取网站HTTP响应的Chrome扩展程序。我尝试使用调试器获取响应正文:
var gCurrentTab; chrome.debugger.onEvent.addListener(function (source, method, params) { if (gCurrentTab.id != source.tabId) { return; } if (method == "Network.loadingFinished") { var tabId = source.tabId; var requestId = params.requestId; chrome.debugger.sendCommand( source, "Network.getResponseBody", {"requestId": requestId}, function (body) { console.log(body); chrome.debugger.detach(source); }); } } ); chrome.webRequest.onBeforeRequest.addListener(function (details) { var url = details.url; if (url.indexOf('/mypage') >= 0) { chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) { gCurrentTab = tabs[0]; chrome.debugger.attach({ tabId: gCurrentTab.id }, "1.0", function () { chrome.debugger.sendCommand({ tabId: gCurrentTab.id }, "Network.enable"); }); }); } }, {urls: []}, ["requestBody", "blocking"]);
但我总是得到
运行debugger.sendCommand时未经检查的runtime.lastError:{“code”: - 32000,“message”:“找不到给定标识符的资源”} 在chrome-extension://ikphgobkghdkjkfplgokmapjlbdfeegl/background.js:11:29
错误,身体未定义。
有没有人知道为什么会这样?谢谢!
答案 0 :(得分:2)
这是因为网站发送了很多回复,这段代码会看到我想要的其他请求,然后分离调试器,这样我就无法得到结果。
要解决此问题,只需使用一个调试器,不要将其分离,或者只在安全的情况下分离。
var gAttached = false; var gRequests = []; var gObjects = []; chrome.debugger.onEvent.addListener(function (source, method, params) { if (method == "Network.requestWillBeSent") { // If we see a url need to be handled, push it into index queue var rUrl = params.request.url; if (getTarget(rUrl) >= 0) { gRequests.push(rUrl); } } if (method == "Network.responseReceived") { // We get its request id here, write it down to object queue var eUrl = params.response.url; var target = getTarget(eUrl); if (target >= 0) { gObjects.push({ requestId: params.requestId, target: target, url: eUrl }); } } if (method == "Network.loadingFinished" && gObjects.length > 0) { // Pop out the request object from both object queue and request queue var requestId = params.requestId; var object = null; for (var o in gObjects) { if (requestId == gObjects[o].requestId) { object = gObjects.splice(o, 1)[0]; break; } } // Usually loadingFinished will be immediately after responseReceived if (object == null) { console.log('Failed!!'); return; } gRequests.splice(gRequests.indexOf(object.url), 1); chrome.debugger.sendCommand( source, "Network.getResponseBody", {"requestId": requestId}, function (response) { if (response) { dispatch(source.tabId, object.target, JSON.parse(response.body)); } else { console.log("Empty response for " + object.url); } // If we don't have any request waiting for response, re-attach debugger // since without this step it will lead to memory leak. if (gRequests.length == 0) { chrome.debugger.detach({ tabId: source.tabId }, function () { chrome.debugger.attach({ tabId: source.tabId }, "1.0", function () { chrome.debugger.sendCommand({ tabId: source.tabId }, "Network.enable"); }); }); } }); } } ); var initialListener = function (details) { if (gAttached) return; // Only need once at the very first request, so block all following requests var tabId = details.tabId; if (tabId > 0) { gAttached = true; chrome.debugger.attach({ tabId: tabId }, "1.0", function () { chrome.debugger.sendCommand({ tabId: tabId }, "Network.enable"); }); // Remove self since the debugger is attached already chrome.webRequest.onBeforeRequest.removeListener(initialListener); } }; // Attach debugger on startup chrome.webRequest.onBeforeRequest.addListener(initialListener, {urls: [""]}, ["blocking"]); // Filter if the url is what we want function getTarget(url) { for (var i in TARGETS) { var target = TARGETS[i]; if (url.match(target.url)) { return i; } } return -1; } const TARGETS = [ {url: '/path1', desc: 'target1'}, {url: '/path2', desc: 'target2'} ]
答案 1 :(得分:0)
我面临类似的问题。我认为sendCommand没有立即执行。在发送“Network.enable”完成之前,我遇到了发送请求的问题。尝试添加
的完成chrome.debugger.sendCommand({
tabId: gCurrentTab.id
}, "Network.enable")