Как перехватывать HTTP-запросы в веб-расширении?
В этой статье мы поймем, как перехватывать HTTP-запросы, сделанные браузером, с помощью API веб-расширения.
Что такое перехват HTTP-запроса?
Перехват HTTP-запросов означает манипулирование HTTP-запросами, сделанными браузером через пользователя или через обработчики асинхронных событий. С помощью API веб-расширения вы можете перехватывать любые веб-запросы, которые выполняются в вашем браузере. Например, вы можете изменить структуру запроса или записать сведения о запросе в консоль.
Для перехвата HTTP-запросов используйте API webRequest . Этот API позволяет добавлять прослушиватели для различных этапов создания HTTP-запроса.
С помощью этих слушателей вы можете делать следующее:
- Получите доступ к заголовкам и телам запросов и заголовкам ответов.
- Отмена и перенаправление запросов.
- Измените заголовки запросов и ответов.
Шаги, которые необходимо выполнить, чтобы использовать этот API:
- Чтобы использовать этот API, вам необходимо предоставить специальное разрешение в файле manifest.json .
- Доступ к этому API возможен только с помощью фонового сценария, поэтому укажите поле фона в файле manifest.json .
Пример манифеста.json:
{ "name": "webRequest", "version": "1.0.0", "description": "webRequests", "manifest_version": 2, "permissions": [ "webRequest", "<all_urls>" ], "background": { "scripts": ["background.js"] } }
Разрешения для API webRequest:
- webRequest: чтобы получить доступ к объекту запроса
- webRequestBlocking: чтобы заблокировать текущий запрос
О мероприятии и слушателе:
webRequest.onBeforeRequest — это прослушиватель, используемый для получения доступа к HTTP-запросам.
Этот прослушиватель запускается, когда запрос собирается быть сделанным, и до того, как заголовки станут доступны.
onBeforeRequest имеет три функции:
1. addListener: благодаря этому мы можем добавить слушателя к этому событию.
Синтаксис:
browser.webRequest.onBeforeRequest.addListener( listener, filter, extraInfoSpec )
Где:
- слушатель: обратный вызов, который возвращает объект сведений
- filter: Фильтр, который ограничивает события, которые будут отправлены этому слушателю.
- extraInfoSpec: массив строк. Дополнительные опции для мероприятия. Вы можете передать любое из следующих значений:
- « блокировка »: сделайте запрос синхронным, чтобы вы могли отменить или перенаправить запрос
- « requestBody »: включить requestBody в объект деталей, переданный слушателю.
2. removeListener: с помощью этого метода мы можем перестать прослушивать это событие.
Синтаксис:
browser.webRequest.onBeforeRequest.removeListener(listener)
3. hasListener: с помощью этого метода мы можем проверить, зарегистрирован ли слушатель для этого события. Возвращает true, если прослушивается, иначе false.
Синтаксис:
browser.webRequest.onBeforeRequest.hasListener(listener)
Разберемся с помощью примеров.
Пример 1. В этом примере мы будем регистрировать сообщения запроса с помощью API webRequest.
шаги:
- загрузить расширение
- откройте фоновый скрипт и проверьте страницу
В приведенном ниже файле вы предоставляете доступ к API веб-расширения и помогаете своему браузеру загрузить расширение.
manifest.json
{ "description": "webRequests", "manifest_version": 2, "name": "webRequest", "version": "1.0", "permissions": [ "webRequest", "<all_urls>" ], "background": { "scripts": ["app.js"] } }
В приведенном ниже файле app.js вы регистрируете URL-адрес запроса перед запросом.
Javascript
// app.js function logURL(requestDetails) { console.log(`Loading: ${requestDetails.url}`); } browser.webRequest.onBeforeRequest.addListener( logURL, { urls: [ "<all_urls>" ] } ); |
Выход:
Пример 2. В этом примере мы заменим все изображения с https://media.geeksforgeeks.org/ на https://media.geeksforgeeks.org/wp-content/uploads/20220830173608/Screenshot20220830173552.png.
В приведенном ниже файле вы предоставляете доступ к API веб-расширения и помогаете своему браузеру загрузить расширение.
manifest.json
{ "description": "webRequests", "manifest_version": 2, "name": "webRequest", "version": "1.0", "permissions": [ "webRequest", "webRequestBlocking", "https://www.geeksforgeeks.org/","https://media.geeksforgeeks.org/" ], "background": { "scripts": ["app.js"] } }
В приведенном ниже файле вы меняете все изображения на https://media.geeksforgeeks.org/wp-content/uploads/20220830173608/Screenshot20220830173552.png.
app.js
Javascript
const targetUrl = function redirect(requestDetails) { console.log(`Redirecting: ${requestDetails.url}`); if (requestDetails.url === targetUrl) { return ; } return { redirectUrl: targetUrl }; } browser.webRequest.onBeforeRequest.addListener( redirect, { urls: [pattern], types: [ "image" , "imageset" , "media" ] }, [ "blocking" ] ); |
Выход: