Chrome 扩展程序:尝试 Network.getResponseBody 时“找不到具有给定标识符的资源”

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

错误,并且主体未定义。

有谁知道为什么会发生这种情况?谢谢!

Rom*_*'ai 5

那是因为网站发送了很多响应,这段代码会看到另一个我想要的请求,然后分离调试器,所以我无法得到结果。

要解决此问题,只需使用单个调试器并且不要分离它,或者仅在安全的情况下分离。

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'}
]