2016-12-22 5 views
8

Я пытаюсь сделать элементы блока на веб-странице, но я хочу сделать это, прежде чем они будут загружены. Так, например, я мог бы использоватьРасширение Chrome: заблокировать элементы страницы перед доступом

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

И перенаправлять/отменить запрос. Но я хочу проверить фактическое содержание запроса. То, что я делаю прямо сейчас, начинается с XMLHttpRequest, чтобы загрузить URL-адрес, проверить содержимое и заблокировать его, если это необходимо. Однако основная проблема заключается в том, что на самом деле не так много объектов заблокировано. Это означает, что каждый объект загружается дважды: один раз для «моей проверки» и один раз, после того, как я сказал «хорошо, вы можете загрузить его».

Как перехватить процесс загрузки, чтобы я мог осмотреть его на лету и передать байты данных, если они разрешены?

Надеюсь, вы понимаете мой вопрос, спасибо :-)

Пример того, как я сделать это прямо сейчас:

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"] 
); 
+0

Вы пробовали использовать 'ServiceWorker'? – guest271314

ответ

0

мне удалось добиться того, что я пытался сделать. Решение не обязательно нуждается в расширениях, но для установки прокси-сервера это может быть полезно. После этого раствор (для указанной задачи выше) выглядит следующим образом:

  • Используйте расширение хрома, чтобы использовать прокси-сервер, в этом случае локального
  • настроить proxyscript, например с помощью питона, чтобы направлять весь трафик (и, возможно, установить сертификаты, так HTTPs трафика могут быть проанализированы, а)
  • => Человек-в-середине установлено, анализировать трафик и изменять при необходимости

Да, на самом деле это не решение проблемы создания хромового расширения, но это пока невозможно (см. https://bugs.chromium.org/p/chromium/issues/detail?id=104058).

С наилучшими пожеланиями, mutilis

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.

+0

Я знаю, как загрузить объект самостоятельно, но я хочу перехватить процесс загрузки хром. поэтому Chrome загружает javascript, например., я хочу посмотреть на него, и если все в порядке, я хочу сказать, что хром «да, вы можете отображать/использовать его. Но если его не все в порядке, я хочу его заблокировать. в моем вопросе (который загружает каждый «разрешенный» объект -twice-, что является проблемой) – mutilis

+0

Не делает ли этот код именно это? Я не пробовал, но похоже, что это вернет буфер * while * его загрузка.Другим вариантом будет создание 1 конечной точки, которая возвращает заблокированные элементы без содержимого и разблокированные элементы с содержимым? Таким образом, у вас будет только один вызов и все будет находиться на сервере (в случае, если вы используете PHP, он также будет сохранить загрузку приложения на сервере) –

+0

, но он фактически запрашивает файл/страницу. Я хочу, чтобы пользователь работал в Интернете, и когда он хочет загрузить страницу, я хочу перехватить загрузку, поэтому функция onload выглядит хорошо, но я не хочу запускать XMLHttpRequest, пользователь является sup на это. Должно быть так: пользователь посещает google.de. (...) загрузка сайта somescript.js -> расширение смотрит на байты -> если разрешено, то pass_on() else block_it() – mutilis

3

Вы можете использовать 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?

+0

К сожалению, это не работает для расширений. страницы расширения контролируются службой службы, но не для всех посещенных веб-сайтов. если это достаточно, этот ответ очень хорош, но не ради расширений для мониторинга посещаемых веб-сайтов :( – mutilis

+0

@mutilis Можете ли вы описать «но не все посещенные сайты»? И включить в вопрос или создать gist https: // gist .github.com/из всех соответствующих 'javascript'? – guest271314

+0

Я имею в виду, что страницы, используемые расширением, контролируются, но другие веб-сайты (например, мои вкладки) не проверяются службойWorker, поэтому это не работает для моей проблемы. Но, если вы посмотрите пример расширения: https://developer.chrome.com/extensions/examples/extensions/catblock.zip он демонстрирует способ перенаправления запросов. Что я хочу сделать, это отменить: true/false, если запрос загружает определенный контент. Например, если загруженный снимок содержит определенный массив байтов, он должен быть отменен. Что я могу сделать: ..... ...... (следующий комментарий) – mutilis

Смежные вопросы