从Chrome扩展程序拦截HTTP请求正文

25
我知道chrome.webRequest.onBeforeRequest允许拦截、分析和阻止请求,但它只允许访问请求头,无法访问请求正文(就我所知)。
示例用例:考虑拦截表单值。
似乎有一个API更改提案在这里恰好提出了这个问题。
是否有其他方法可以实现这个目标?
谢谢。

2
使用内置的Chrome API目前无法拦截响应/请求正文。最新源代码的相关部分不包含任何此类功能的迹象。如果您不能没有此功能,可以探索NPAPI插件的可能性,或启动(本地)服务器,并将特定请求重定向到您的本地服务器。 - Rob W
很不幸。NPAPI 对我的需求来说似乎有些过头了。不过还是谢谢你的回答。 - p3drosola
3个回答

24

现在API已经添加了此功能,请查看文档

要访问正文,您需要执行以下操作:

chrome.webRequest.onBeforeRequest.addListener(
    function(details)
    {
        console.log(details.requestBody);
    },
    {urls: ["https://myurlhere.com/*"]},
    ['requestBody']
);

哇,太棒了。谢谢你的提醒。 - p3drosola
1
对我来说,它总是返回未定义。也许只有在beta频道中? - BeauCielBleu
1
@BeauCielBleu 可能没有请求体。 请尝试记录URL而不是: console.log("url:"+details.url); - georgiecasey
无法工作。只有'url',没有'requestBody'可用。 - D09r
@D09r,你有阅读文档吗?requestBody属性是可选的,文档中指出:“仅在extraInfoSpec包含'requestBody'时提供”。 - Marmoy

17

这是我所做的:

  1. 使用 requestBody 获取 POST 请求体。
  2. 使用 decoder 将请求体解析成字符串。

这是一个例子:

chrome.webRequest.onBeforeRequest.addListener(
    function(details) {
        if(details.method == "POST")
        // Use this to decode the body of your post
            var postedString = decodeURIComponent(String.fromCharCode.apply(null,
                                      new Uint8Array(details.requestBody.raw[0].bytes)));
           console.log(postedString)

    },
    {urls: ["<all_urls>"]},
    ["blocking", "requestBody"]
);

可以使用 console.log(JSON.parse(postedString)) 将字符串解析为 JSON。 - Rob Hoff

2
虽然您可能无法拦截,但可以使用标准的AJAX方法来解决它。与其发起href请求,不如进行异步调用并将其保存到未呈现的HTML对象中。然后根据您的正文条件进行爬取/读取/解析等操作,如果通过,则将该正文对象推送回当前窗口/页面。
将内容存储在抑制元素中,然后将该元素用于内容,可以避免重复调用。缺点是您将获得您最终不会使用的所有内容。这可能会影响带宽/速度性能,也可能不会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接