chrome浏览器拓展插件捕获页面的响应体内容
chrome.webRequest
chrome
插件提供有chrome.webRequest
这么个API,这是一个系列API,允许开发者对请求的多个阶段进行事件监听。可是先告诉你这个方式行不通。不要用了,文后会有真正获取方式。
但比较可惜的是这个API能力比较有限,你不能通过它直接获取到响应内容。
onBeforeRequest
(可选同步)
在请求即将发生时触发。此事件在建立任何 TCP 连接之前发送,可以 用于取消或重定向请求。
onBeforeSendHeaders
(可选同步)
在请求即将发生且初始标头准备就绪时触发。该事件为 旨在允许扩展程序添加、修改和删除请求标头 (*)。通过 onBeforeSendHeaders
事件传递到所有订阅者,因此不同的订阅者可能会尝试 修改请求;请参阅实现详情部分,了解具体方法。此活动 可用于取消请求。
onSendHeaders
在所有扩展程序都有机会修改请求标头后触发,并显示最终版本 (*) 版本。该事件在标头发送到广告网络之前触发。此活动是 信息丰富,并异步处理。不允许修改或取消请求。
onHeadersReceived
(可选同步)
每次收到 HTTP(S) 响应标头时触发。由于重定向和身份验证的原因 请求,每个请求可能会发生多次请求此事件旨在让扩展程序 添加、修改和删除响应标头,例如传入的 Content-Type 标头。缓存 指令会在此事件触发之前进行处理,因此修改 Cache-Control 等标头 对浏览器的缓存没有影响。还可以取消或重定向请求。
onAuthRequired
(可选同步)
在请求需要对用户进行身份验证时触发。该事件可以同步处理, 提供身份验证凭据。请注意,扩展程序可能会提供无效的凭据。照顾好自己 避免因反复提供无效凭据而进入无限循环。这也可用于 取消请求。
onBeforeRedirect
即将执行重定向时触发。重定向可由 HTTP 响应触发 代码或扩展程序此事件提供信息,并会异步处理。不允许 以修改或取消请求。
onResponseStarted
收到响应正文的第一个字节时触发。对于 HTTP 请求,这意味着 提供状态行和响应标头。此活动仅供参考,且已处理 异步执行。不允许修改或取消请求。
onCompleted
成功处理请求时触发。
onErrorOccurred
无法成功处理请求时触发。
Web 请求 API 可保证对于每个请求,onCompleted
或 onErrorOccurred
作为最终事件触发,但有一个例外情况:如果请求被重定向到data://
网址, onBeforeRedirect
是最后报告的事件。
* 请注意,网络请求 API 将网络堆栈的抽象呈现给扩展程序。 在内部,一个网址请求可拆分为多个 HTTP 请求(例如,抓取单个网址) 字节范围),也可以由网络堆栈处理,无需与 。因此,API 不会提供发送到 。例如,与缓存相关的所有标头对扩展程序来说都是不可见的。
解决方法
替换页面中的请求方法没用,很多网站自己会重写XMLHttpRequest,所以唯一的办法就是使用vconsole这个依赖库实现,通过修改这个vconsole源码来实现,vconsole是一个开源项目:https://github.com/Tencent/vConsole
使用的时候记得用在content里面:
简单来说就是,content_scripts
和目标页面是运行在一块的,DOM这些是共用一套,但是Javascript
执行环境是隔离的。这也就解释了为啥上面替换没生效,因为上面的脚本换掉的是自己执行环境中的XMLHttpRequest
,而不是目标页面的。
那么,能不能让注入代码的执行环境和目标页面的执行环境不隔离呢?
这是个好问题。答案是可以的,chrome插件提供了一个叫world的配置项,它有两个值:ISOLATED
(默认值)和MAIN
。前者指明content_scripts
是在隔离的环境中执行的,后者指明content_scripts
和目标页面在一个环境中执行。