修改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任何这一点。