修改Chrome扩展程序的HTTP响应

是否可以创build一个修改HTTP响应主体的Chrome扩展?

我看了Chrome扩展API ,但我还没有find任何事情做到这一点。

一般来说,您不能使用标准的Chrome扩展API更改HTTP请求的响应正文。

此function正在请求104058:WebRequest API:允许扩展来编辑响应正文 。 明确问题以获取更新通知。

如果要编辑已知XMLHttpRequest的响应主体,请通过内容脚本注入代码,以使用自定义(全function)重写默认XMLHttpRequest构造函数,在触发真实事件之前重写响应。 确保您的XMLHttpRequest对象完全符合Chrome内置的XMLHttpRequest对象,否则AJAX大量的网站将会中断。

在其他情况下,您可以使用chrome.webRequestchrome.declarativeWebRequest API将请求redirect到data: -URI。 与XHR方法不同,您不会得到请求的原始内容。 实际上,请求永远不会到达服务器,因为redirect只能在发送实际请求之前完成。 如果你redirect一个main_frame请求,用户将看到data: -URI而不是请求的URL。

我刚刚发布了一个Devtools扩展,只是这样做:)

它被称为篡改,它基于mitmproxy ,它允许您查看当前选项卡所做的所有请求,修改它们并在下次刷新时提供修改的版本。

这是一个相当早的版本,但它应该与OS X和Windows兼容。 让我知道如果它不适合你。

你可以在这里http://dutzi.github.io/tamper/

这是如何工作的

正如@Xan在下面评论的那样,该扩展通过本地消息传递与扩展mitmproxy的python脚本进行通信 。

扩展名使用chrome.devtools.network.onRequestFinished列出所有请求。

当你点击这些请求时,它使用请求对象的getContent()方法下载它的响应,然后将该响应发送到本地保存的python脚本。

然后在编辑器中打开文件(使用call OSX或subprocess.Popen的窗口)。

python脚本使用mitmproxy来监听通过该代理进行的所有通信,如果它检测到对已保存的文件的请求,则它会提供保存的文件。

我使用Chrome的代理API(特别是chrome.proxy.settings.set() )将PAC设置为代理设置。 PAC文件将所有通信redirect到python脚本的代理。

关于mitmproxy最重要的事情之一是它也可以修改HTTP通信。 所以你也有:)

是。 使用chrome.debugger API可以实现扩展访问Chrome DevTools协议 ,该协议支持通过networkingAPI进行HTTP拦截和修改。

Chrome问题487422对此解决scheme提出了build议:

对于任何想要现在可行的替代scheme的人来说,您可以在后台/活动页面中使用chrome.debugger来附加到您要收听的特定选项卡(或者,如果可能的话,附加到所有选项卡,没有testing过个人标签),然后使用debugging协议的networkingAPI。

唯一的问题是,除非用户在chrome://flags中将其closures,否则标签视口顶部会出现通常的黄色条。

首先,将debugging器附加到目标上:

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

接下来,发送Network.setRequestInterceptionEnabled命令,这将启用拦截networking请求:

 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发送响应:

  • rawResponse传递所需HTTP原始响应的base64编码( 包括HTTP状态行,标题等! )。
  • 通过params.interceptionId作为interceptionId

请注意,我还没有testing任何这一点。