是的。可以使用chrome.debugger API,它授予对Chrome DevTools Protocol 的扩展访问权限,它通过其Network API 支持HTTP 拦截和修改。
这个解决方案是a comment on Chrome Issue 487422建议的:
对于任何想要目前可行的替代方案的人,您可以在背景/事件页面中使用chrome.debugger 附加到您想要收听的特定选项卡(或者如果可能,请附加到所有选项卡) t 亲自测试所有选项卡),然后使用调试协议的网络 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 对象。
使用Network.continueInterceptedRequest发送回复:
- 将所需 HTTP 原始响应(包括 HTTP 状态行、标头等!)的 base64 编码作为
rawResponse 传递。
- 将
params.interceptionId 传递为interceptionId。
请注意,我根本没有测试过这些。