Chrome扩展程序:访问前阻止页面项

时间:2016-12-22 10:44:21

标签: javascript google-chrome block

我正在尝试在网页上执行阻止项目,但我想在加载之前执行此操作。所以,例如,我可以使用

chrome.webRequest.onBeforeRequest.addListener(...);

并重定向/取消请求。但我想检查请求的实际内容。我现在正在做的是,开始XMLHttpRequest自己加载url /对象,检查内容,并在必要时阻止它。 但是,主要问题是实际上没有多少对象被阻塞。这意味着,每个对象都被加载两次:一次用于"我的检查"有一次,在我说完之后,你可以加载它#34;。

如何拦截加载过程,以便我可以动态检查它并在允许的情况下传递数据字节?

希望你理解我的问题,谢谢: - )

我现在该怎么做的例子:

function shall_be_blocked(info){
  var xhr = new XMLHttpRequest();
  xhr.open("GET", file, false);
  //... #load the file and inspect the bytes
  if (xhr.responseText=="block it") {
     return true;
  }
  return false;
}

chrome.webRequest.onBeforeRequest.addListener(
  function(info) {
    ret = shall_be_blocked(info);
    if (ret ...){return {cancel:true};}//loads the file once, as it is getting blocked
    return {};//loads the file twice
  },
  {},["blocking"]
);

3 个答案:

答案 0 :(得分:4)

在返回原始ServiceWorker或新内容的内容之前,您可以使用Response阅读原始Response

if ("serviceWorker" in navigator) {
  navigator.serviceWorker.register("sw.js").then(function(reg) {
    console.log("register", reg);
  }).catch(function(err) {
    console.log("err", err);
  });
}

self.addEventListener("fetch", function(event) {
  if (event.request.url == "/path/to/fetched/resource/") {
    console.log("fetch", event);
    event.respondWith(
      fetch(event.request).then(function(response) {
        return response.text()
          .then(function(text) {
            if (text === "abc123") {
              return new Response("def456")
            } else {
              return new Response(text)
            }
          })
      })
    );
  }
});

plnkr https://plnkr.co/edit/MXGSZN1i3quvZhkI7fqe?p=preview

请参阅What happens when you read a response?

答案 1 :(得分:1)

我相信您可以使用arraybuffers实时读取内容。

以下是将文件/页面加载到缓冲区的示例;

var oReq = new XMLHttpRequest();
oReq.open("GET", "/myfile.png", true);
oReq.responseType = "arraybuffer";

oReq.onload = function (oEvent) {
  var arrayBuffer = oReq.response; // Note: not oReq.responseText
  if (arrayBuffer) {
    var byteArray = new Uint8Array(arrayBuffer);
    for (var i = 0; i < byteArray.byteLength; i++) {
      // do something with each byte in the array
    }
  }
};

oReq.send(null);

这是XMLHttpRequest文档页面上的一段代码。 Link

答案 2 :(得分:1)

我能够实现我想要做的事情。该解决方案不再需要扩展,但是为了设置代理,这可能是有用的。之后,解决方案(针对上面指定的问题)如下:

  • 使用chrome扩展程序来使用代理,在本例中为localhost
  • 设置proxyscript,例如使用python来路由所有流量(并且可能安装证书,因此也可以分析HTTP流量)
  • =&GT;建立中间人,分析流量并根据需要进行修改

是的,这实际上并不能解决制作Chrome扩展程序的问题,但目前尚不可行(请参阅https://bugs.chromium.org/p/chromium/issues/detail?id=104058)。

祝你好运, mutilis