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



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



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

942   4  

4 ответов:

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

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

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

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

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

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

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

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

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

как @Xan прокомментировал ниже, расширение взаимодействует через собственный обмен сообщениями со скриптом python, который расширяет mitmproxy.

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

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

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

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

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

одна из самых больших вещей о mitmproxy является то, что он также может изменить HTTPs связи. Так что у вас тоже есть:)

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

это решение было предложено комментарий к выпуску Chrome 487422:

для тех, кто хочет альтернативу, которая реально в данный момент, Вы можете использовать chrome.debugger в фоновом режиме / страница событий, чтобы прикрепите к определенной вкладке, которую вы хотите прослушать (или прикрепите ко всем вкладкам, если это возможно, не проверяли все вкладки лично), а затем используйте сетевой 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

Как сказал @Rob w, я переопределил XMLHttpRequest и это результат для модификации любых запросов XHR на любых сайтах (работает как прозрачный прокси-сервер модификации):

var _open = XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, URL) {
    var _onreadystatechange = this.onreadystatechange,
        _this = this;

    _this.onreadystatechange = function () {
        // catch only completed 'api/search/universal' requests
        if (_this.readyState === 4 && _this.status === 200 && ~URL.indexOf('api/search/universal')) {
            try {
                //////////////////////////////////////
                // THIS IS ACTIONS FOR YOUR REQUEST //
                //             EXAMPLE:             //
                //////////////////////////////////////
                var data = JSON.parse(_this.responseText); // {"fields": ["a","b"]}

                if (data.fields) {
                    data.fields.push('c','d');
                }

                // rewrite responseText
                Object.defineProperty(_this, 'responseText', {value: JSON.stringify(data)});
                /////////////// END //////////////////
            } catch (e) {}

            console.log('Caught! :)', method, URL/*, _this.responseText*/);
        }
        // call original callback
        if (_onreadystatechange) _onreadystatechange.apply(this, arguments);
    };

    // detect any onreadystatechange changing
    Object.defineProperty(this, "onreadystatechange", {
        get: function () {
            return _onreadystatechange;
        },
        set: function (value) {
            _onreadystatechange = value;
        }
    });

    return _open.apply(_this, arguments);
};

например этот код может быть успешно использован Tampermonkey для внесения любых изменений на любых сайтах:)

Comments

    Ничего не найдено.