Chrome扩展程序 - 如何获取HTTP响应正文?

时间:2013-08-30 13:59:35

标签: javascript google-chrome-extension

这似乎是一个难题(或者不可能?)。 我想通过观看Chrome扩展程序后台脚本来获取并阅读由浏览器中的HTTP请求引起的HTTP响应。 我们可以用这种方式获取HTTP Request Body

chrome.webRequest.onBeforeRequest.addListener(function(data){
    // data contains request_body
},{'urls':[]},['requestBody']);

我还检查了这些stackoverflows

是否有任何聪明的方法可以在Chrome扩展程序中获取HTTP响应正文?

3 个答案:

答案 0 :(得分:20)

我找不到更好的方式然后这个anwser。

Chrome extension to read HTTP response

anwser告诉如何获取响应标题并显示在另一个页面中。但是响应obj中没有正文信息(请参阅event-responseReceived)。如果您想在没有其他页面的情况下获得 body 的回复,请尝试此操作。

var currentTab;
var version = "1.0";

chrome.tabs.query( //get current Tab
    {
        currentWindow: true,
        active: true
    },
    function(tabArray) {
        currentTab = tabArray[0];
        chrome.debugger.attach({ //debug at current tab
            tabId: currentTab.id
        }, version, onAttach.bind(null, currentTab.id));
    }
)


function onAttach(tabId) {

    chrome.debugger.sendCommand({ //first enable the Network
        tabId: tabId
    }, "Network.enable");

    chrome.debugger.onEvent.addListener(allEventHandler);

}


function allEventHandler(debuggeeId, message, params) {

    if (currentTab.id != debuggeeId.tabId) {
        return;
    }

    if (message == "Network.responseReceived") { //response return 
        chrome.debugger.sendCommand({
            tabId: debuggeeId.tabId
        }, "Network.getResponseBody", {
            "requestId": params.requestId
        }, function(response) {
            // you get the response body here!
            // you can close the debugger tips by:
            chrome.debugger.detach(debuggeeId);
        });
    }

}

我认为它对我来说足够有用,你可以使用chrome.debugger.detach(debuggeeId)关闭丑陋的小费。

抱歉,mabye没有帮助...... ^ ^

答案 1 :(得分:1)

这绝对不是Chrome扩展生态系统开箱即用提供的功能。但是,我可以找到几种方法来解决此问题,但是两种方法都有其自身的缺点。

第一种方式是:

  1. 使用内容脚本注入我们自己的自定义脚本。
  2. 使用自定义脚本扩展XHR的本机方法以读取响应。
  3. 将响应添加到网页的DOM中的隐藏元素(不是display: none)中。
  4. 使用内容脚本读取隐藏的响应。

第二种方式是创建一个 DevTools扩展,这是唯一提供用于读取每个请求的API的扩展。

我在博客文章here.

中详细介绍了这两种方法

让我知道您是否遇到任何问题! :)

答案 2 :(得分:-1)

Chrome开发者工具扩展中现在提供了一种方法,示例代码可在此处查看:blog post

简而言之,这是他的示例代码的改编:

chrome.devtools.network.onRequestFinished.addListener(request => {
  request.getContent((body) => {
    if (request.request && request.request.url) {
      if (request.request.url.includes('facebook.com')) {

         //continue with custom code
         var bodyObj = JSON.parse(body);//etc.
      }
}
});
});