修改Chrome扩展程序的HTTP响应
是否可以创build一个修改HTTP响应主体的Chrome扩展?
我看了Chrome扩展API ,但我还没有find任何事情做到这一点。
一般来说,您不能使用标准的Chrome扩展API更改HTTP请求的响应正文。
此function正在请求104058:WebRequest API:允许扩展来编辑响应正文 。 明确问题以获取更新通知。
如果要编辑已知XMLHttpRequest的响应主体,请通过内容脚本注入代码,以使用自定义(全function)重写默认XMLHttpRequest构造函数,在触发真实事件之前重写响应。 确保您的XMLHttpRequest对象完全符合Chrome内置的XMLHttpRequest对象,否则AJAX大量的网站将会中断。 
 在其他情况下,您可以使用chrome.webRequest或chrome.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任何这一点。