Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome扩展-如何获取HTTP响应正文?_Javascript_Google Chrome Extension - Fatal编程技术网

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

Javascript Chrome扩展-如何获取HTTP响应正文?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,这似乎是一个难题(或不可能??)。 我想在查看Chrome扩展后台脚本的情况下,获取并读取由浏览器中的HTTP请求引起的HTTP响应。 我们可以通过这种方式获得HTTP请求体 chrome.webRequest.onBeforeRequest.addListener(function(data){ // data contains request_body },{'urls':[]},['requestBody']); 我还检查了这些堆栈溢出 在Chrome扩展中有没有什么聪明

这似乎是一个难题(或不可能??)。 我想在查看Chrome扩展后台脚本的情况下,获取并读取由浏览器中的HTTP请求引起的HTTP响应。 我们可以通过这种方式获得HTTP请求体

chrome.webRequest.onBeforeRequest.addListener(function(data){
    // data contains request_body
},{'urls':[]},['requestBody']);
我还检查了这些堆栈溢出


在Chrome扩展中有没有什么聪明的方法来获取HTTP响应正文?

我找不到比这个更好的方法了

答案告诉我们如何获取响应标题并显示在另一个页面中。但是响应对象中没有正文信息(请参阅)。如果您想在没有其他页面的情况下获得响应正文,请尝试此操作

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(debuggeid)
来关闭这个丑陋的提示


对不起,可能没什么帮助…^^

这绝对不是Chrome扩展生态系统提供的现成功能。但是,我可以找到一些方法来解决这个问题,但两者都有各自的缺点

第一种方法是:

  • 使用内容脚本注入我们自己的自定义脚本
  • 使用自定义脚本扩展XHR的本机方法来读取响应
  • 将响应添加到隐藏(非
    display:none
    )元素中的网页DOM中
  • 使用内容脚本读取隐藏的响应
  • 第二种方法是创建一个DevTools扩展,它是唯一一个提供API来读取每个请求的扩展

    我在一篇博客文章中详细地记录了这两种方法


    如果您遇到任何问题,请告诉我!:)

    现在Chrome开发者工具扩展中有了一种方法,可以在这里看到示例代码:

    简而言之,以下是对其示例代码的改编:

    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.
          }
    }
    });
    });
    

    没有通用的方法。这只适用于特定的用例。使用
    --静默调试器扩展api
    命令行切换到浏览器要去除黄条,它必须是浏览器的第一个实例。我从上面的代码制作了一个内容脚本,并在响应体部分添加了console.log和alert,但什么都没有发生。代码应该放在哪里?我收到了无法“附加”到的错误chrome://url. 不管怎样,只附加到特定的url?这是从后台脚本运行还是从内容脚本运行?@evanjmg如果在
    manifest.json
    的权限数组中放置“选项卡”,则可以查询url。在
    chrome.tabs.query
    中,使用
    函数(tabArray){currentTab=tabArray[0];if(!currentTab.url.startsWith(“chrome:”){chrome.debugger.attach({//debug at current tab.id},version,onAttach.bind(null,currentTab.id));}}
    您的文章没有说明如何将响应发送到后台页面,因为注入“chrome.runtime.sendMessage”无效。@Andrew我会检查一下,这篇文章只是为了阅读响应正文。我可以问一下您在哪里使用“chrome.runtime.sendMessage”吗?我试图在注入的内容脚本中使用它,但它(显然)不起作用。文章提到“您可以传递到BG”,所以最好知道如何传递。@Andrew您可以在内容脚本中使用
    chrome.runtime.sendMessage
    。可能还有其他问题。您不能像本文使用自运行函数注入脚本那样在注入脚本中使用chrome消息api。该脚本和扩展之间没有消息传递。从文章本身来看:这种方法的缺点是我们必须始终保持Chrome DevTools打开,因为DevTools扩展只有在DevTools打开时才被激活。