Подтвердить что ты не робот

Изменение ответов HTTP с расширения Chrome

Возможно ли создать расширение Chrome, которое изменяет тела ответа HTTP?

Я просмотрел API расширений Chrome, но я ничего не нашел для этого.

4b9b3361

Ответ 1

В общем случае вы не можете изменить тело ответа HTTP-запроса, используя стандартные API расширений Chrome.

Эта функция запрашивается у 104058: API WebRequest: разрешить расширение для редактирования тела ответа. Возьмите вопрос, чтобы получать уведомления об обновлениях.

Если вы хотите отредактировать тело ответа для известного XMLHttpRequest, кода с помощью содержимого script, чтобы переопределить конструктор XMLHttpRequest по умолчанию (полнофункциональный), который перезаписывает ответ перед запуском реального события. Убедитесь, что ваш объект XMLHttpRequest полностью совместим с встроенным объектом XMLHttpRequest, или AJAX-тяжелые сайты будут разбиты.

В других случаях вы можете использовать chrome.webRequest или chrome.declarativeWebRequest API для перенаправления запроса на data: -URI. В отличие от XHR-подхода, вы не получите исходное содержимое запроса. Фактически, запрос никогда не попадет на сервер, потому что перенаправление может быть выполнено только до отправки фактического запроса. И если вы перенаправите запрос main_frame, пользователь увидит data: -URI вместо запрошенного URL.

Ответ 2

Я только что выпустил расширение Devtools, которое делает именно это:)

Он называется tamper, он основан на mitmproxy, и он позволяет вам видеть все запросы, сделанные с помощью текущей вкладки, изменять их и в следующий раз обслуживать измененную версию вы обновляете.

Это довольно ранняя версия, но она должна быть совместима с OS X и Windows. Дайте мне знать, если это не сработает для вас.

Вы можете получить его здесь http://dutzi.github.io/tamper/

Как это работает

Как уже отмечалось в @Xan, расширение связывается через Native Messaging с помощью python script, который расширяет mitmproxy.

В расширении перечислены все запросы с помощью chrome.devtools.network.onRequestFinished.

Когда вы нажимаете на запросы, он загружает свой ответ с использованием метода запроса getContent(), а затем отправляет этот ответ на python script, который сохраняет его локально.

Затем он открывает файл в редакторе (используя call для OSX или subprocess.Popen для окон).

python script использует mitmproxy для прослушивания всех сообщений, сделанных через этот прокси, если он обнаруживает запрос на сохраненный файл, он служит для сохранения файла.

Я использовал API прокси-сервера Chrome (в частности chrome.proxy.settings.set()), чтобы установить PAC как настройку прокси-сервера. Этот файл PAC перенаправляет все сообщения на прокси-сервер python script.

Одна из самых важных вещей в mitmproxy заключается в том, что она также может изменять связь с HTTP. Итак, у вас есть и это:)

Ответ 3

Да. Это возможно с помощью chrome.debugger API, который предоставляет доступ к расширению Протокол Chrome DevTools, который поддерживает HTTP-перехват и модификацию через Сетевой API.

Это решение было предложено комментарий к Chrome Issue 487422:

Для тех, кто хочет альтернативу, которая выполнима на данный момент, вы можете использовать chrome.debugger на странице фона/события для присоединения к конкретной вкладке, которую вы хотите прослушать (или присоединить ко всем вкладкам, если это возможно, t проверил все вкладки лично), затем используйте сетевой API протокола отладки.

Единственная проблема заключается в том, что в верхней части окна просмотра вкладок будет обычная желтая полоска, если пользователь не отключит ее в chrome://flags.

Сначала присоедините отладчик к цели:

chrome.debugger.getTargets((targets) => {
    let target = /* Find the target. */;
    let debuggee = { targetId: target.id };

    chrome.debugger.attach(debuggee, "1.2", () => {
        // TODO
    });
});

Затем отправьте команду Network.setRequestInterceptionEnabled, которая позволит перехватить сетевые запросы:

chrome.debugger.getTargets((targets) => {
    let target = /* Find the target. */;
    let debuggee = { targetId: target.id };

    chrome.debugger.attach(debuggee, "1.2", () => {
        chrome.debugger.sendCommand(debuggee, "Network.setRequestInterceptionEnabled", { enabled: true });
    });
});

Теперь Chrome начнет отправлять Network.requestIntercepted события. Добавьте к ним слушателя:

chrome.debugger.getTargets((targets) => {
    let target = /* Find the target. */;
    let debuggee = { targetId: target.id };

    chrome.debugger.attach(debuggee, "1.2", () => {
        chrome.debugger.sendCommand(debuggee, "Network.setRequestInterceptionEnabled", { enabled: true });
    });

    chrome.debugger.onEvent.addListener((source, method, params) => {
        if(source.targetId === target.id && method === "Network.requestIntercepted") {
            // TODO
        }
    });
});

В слушателе params.request будет соответствовать Request.

Отправьте ответ с Network.continueInterceptedRequest:

  • Передайте кодировку base64 требуемого HTTP-ответа (, включая строку состояния HTTP, заголовки и т.д.), как rawResponse.
  • Pass params.interceptionId как interceptionId.

Обратите внимание, что я вообще ничего не тестировал.