如何从Chrome扩展程序中获取浏览器消耗的流量?

时间:2017-08-28 09:31:49

标签: javascript google-chrome google-chrome-extension

我尝试使用此API

https://developer.chrome.com/extensions/webRequest

并总结Content-Length字段,但它们似乎总是丢失。有没有可行的方法呢?

 chrome.webRequest.onCompleted.addListener(function(data) {
    console.log('Got request!', data);
    var size = 0;
    for (i = 0; i < data.responseHeaders.length; i++) {
        var header = data.responseHeaders[i];
        if (header.name === 'Content-Length') {
            size += parseInt(data.responseHeaders[i].value);
            break;
        }
    }
    if (size > 0) {
        chrome.runtime.sendMessage({
            msg: 'traffic',
            amount: size
        }, function(resp) {})
    }
}, {
    urls: ["<all_urls>"]
}, ["responseHeaders"]);

结果是Content-Length标头总是丢失。

谢谢!

1 个答案:

答案 0 :(得分:1)

很好的问题,但 webRequest API肯定不会提供此类信息。

事实上,大多数情况下,服务器只是在不事先告知内容有多大的情况下将内容推出,唯一可以获得该信息的地方是onCompleted事件。

快速查看the documentation表示没有此类信息。

通常,webRequest显示的内容比网络堆栈实际执行(消费)的内容更抽象。所以这不适合这份工作。

为了进一步推动这一点,这里是文档的引用,部分相关:

  

请注意,Web请求API会向扩展程序提供网络堆栈的抽象。在内部,一个URL请求可以分成几个HTTP请求(例如,从大文件中获取单个字节范围),或者可以由网络堆栈处理,而无需与网络通信。因此,API不提供发送到网络的最终HTTP标头。例如,与缓存相关的所有标头都对扩展名不可见。

     

目前未向onBeforeSendHeaders事件提供以下标头。此列表不保证完整也不稳定。

     
      
  • ...
  •   
  • 的Content-Length
  •   
  • ...
  •   

我认为没有任何合理的方法。 chrome://net-internals/#bandwidth显示数据,但不会通过API公开(并且您无法从扩展程序访问该页面) )。

可能可以通过Dev Tools扩展(可访问网络事件)或chrome.debugger API(通过不同接口的相同数据)获取特定页面的近似值。但它只会在“重新加载此页面以查看统计信息”方案中工作,并且再次比网络级别的实际情况更加抽象。