2017-12-24 6 views
0

サイト用のHTTP応答を取得できるChrome拡張機能を作成しています。 Chrome拡張機能:Network.getResponseBodyを使用しようとすると「指定された識別子のリソースが見つかりません」

 
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を取得::私は、レスポンスボディを取得するためのデバッガを使用しようとしない{ "コード": - 32000、 "メッセージ": "いいえリソース指定された識別子が見つかりました」} chrome-extension://ikphgobkghdkjkfplgokmapjlbdfeegl/background.js:11:29

エラーです。本文は未定義です。

これはなぜ起こるのでしょうか?ありがとう!

答えて

0

ウェブサイトが多くの応答を送信したため、このコードでは別の要求が表示され、デバッガをデタッチして結果が得られなかったためです。

これを解決するには、ただ1つのデバッガを使用して、それを外したり、安全なときに切り離したりしないでください。

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

あなたはこれを黙示的に使用できますか? 私は同じ問題に直面しますが、それを修正する方法を見つけることができません – cen0r

+0

ここにあります。要は、正しい要求IDと同じデバッガを使用する必要があります。 –

0

私は同様の問題に直面しています。私はsendCommandがすぐに実行されていないと考えました。私は、 "Network.enable"を送信する前に送信された要求の問題に直面していました。完了の追加を試みてください

chrome.debugger.sendCommand({ 
         tabId: gCurrentTab.id 
        }, "Network.enable") 
関連する問題