Solución:
En general, tu no poder cambiar el cuerpo de respuesta de una solicitud HTTP utilizando las API de extensión estándar de Chrome.
Esta función se solicita en 104058: API WebRequest: permitir que la extensión edite el cuerpo de la respuesta. Destaca el problema para recibir notificaciones de actualizaciones.
Si desea editar el cuerpo de la respuesta para un conocido XMLHttpRequest
, inyectar código a través de un script de contenido para anular el valor predeterminado XMLHttpRequest
constructor con uno personalizado (con todas las funciones) que reescribe la respuesta antes de activar el evento real. Asegúrese de que su objeto XMLHttpRequest sea totalmente compatible con Chrome integrado XMLHttpRequest
objeto, o los sitios con mucho AJAX se romperán.
En otros casos, puede utilizar el chrome.webRequest
o chrome.declarativeWebRequest
API para redirigir la solicitud a un data:
-URI. A diferencia del enfoque XHR, no obtendrá el contenido original de la solicitud. En realidad, la solicitud nunca llegará al servidor porque la redirección solo se puede realizar antes de que se envíe la solicitud real. Y si redirige un main_frame
solicitud, el usuario verá el data:
-URI en lugar de la URL solicitada.
Acabo de lanzar una extensión de Devtools que hace precisamente eso 🙂
Se llama manipulación, se basa en mitmproxy y le permite ver todas las solicitudes realizadas por la pestaña actual, modificarlas y entregar la versión modificada la próxima vez que actualice.
Es una versión bastante temprana, pero debería ser compatible con OS X y Windows. Avísame si no te funciona.
Puedes conseguirlo aquí http://dutzi.github.io/tamper/
Como funciona esto
Como @Xan comentó a continuación, la extensión se comunica a través de la mensajería nativa con un script de Python que extiende mitmproxy.
La extensión enumera todas las solicitudes usando chrome.devtools.network.onRequestFinished
.
Cuando hace clic en una de las solicitudes, descarga su respuesta utilizando el objeto de solicitud. getContent()
y luego envía esa respuesta al script de Python que lo guarda localmente.
Luego abre el archivo en un editor (usando call
para OSX o subprocess.Popen
para ventanas).
El script de Python usa mitmproxy para escuchar toda la comunicación realizada a través de ese proxy, si detecta una solicitud de un archivo que se guardó, sirve el archivo que se guardó en su lugar.
Usé la API de proxy de Chrome (específicamente chrome.proxy.settings.set()
) para establecer un PAC como configuración de proxy. Ese archivo PAC redirige toda la comunicación al proxy del script de Python.
Una de las mejores cosas de mitmproxy es que también puede modificar la comunicación HTTP. Entonces tienes eso también 🙂
Si. Es posible con el chrome.debugger
API, que otorga acceso de extensión al protocolo Chrome DevTools, que admite la interceptación y modificación HTTP a través de su API de red.
Esta solución fue sugerida por un comentario sobre el problema de Chrome 487422:
Para cualquiera que desee una alternativa que sea factible en este momento, puede usar
chrome.debugger
en una página de fondo / evento para adjuntar a la pestaña específica que desea escuchar (o adjuntar a todas las pestañas si es posible, no he probado todas las pestañas personalmente), luego use la API de red del protocolo de depuración.El único problema con esto es que habrá la barra amarilla habitual en la parte superior de la ventana gráfica de la pestaña, a menos que el usuario la apague en
chrome://flags
.
Primero, adjunte un depurador al destino:
chrome.debugger.getTargets((targets) => {
let target = /* Find the target. */;
let debuggee = { targetId: target.id };
chrome.debugger.attach(debuggee, "1.2", () => {
// TODO
});
});
A continuación, envíe el Network.setRequestInterceptionEnabled
comando, que permitirá la interceptación de solicitudes de red:
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 ahora comenzará a enviar Network.requestIntercepted
eventos. Agregue un oyente para ellos:
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
}
});
});
En el oyente params.request
será el correspondiente Request
objeto.
Envía la respuesta con Network.continueInterceptedRequest
:
- Pase una codificación base64 de su respuesta HTTP sin procesar deseada (incluyendo línea de estado HTTP, encabezados, etc.) como
rawResponse
. - Aprobar
params.interceptionId
comointerceptionId
.
Tenga en cuenta que no he probado nada de esto, en absoluto.