【问题标题】:Intercept HTTP request body from chrome extension拦截来自 chrome 扩展的 HTTP 请求正文
【发布时间】:2023-08-25 20:52:01
【问题描述】:

我知道chrome.webRequest.onBeforeRequest 允许拦截、分析和阻止请求,但它只允许访问请求标头,而不是请求正文(据我所知)。

示例用例:考虑拦截表单值。

似乎有一个 API 更改提案 here 正好表明了这一点。

还有其他方法可以实现吗?

谢谢。

【问题讨论】:

  • 目前无法使用内置的 Chrome API 拦截响应/请求正文。 relevant part of the latest source code 不包含任何此类功能的迹象。如果您不能没有该功能,您可以探索possibilitiesNPAPI plugins,或启动(本地)服务器,并将特定请求重定向到您的本地服务器。
  • 那是不幸的。 NPAPI 对我的需求来说似乎有点矫枉过正。不过感谢您的回答。

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

此功能现已添加到 API,请参阅 documentation

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

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

【讨论】:

  • 天啊,太棒了。感谢您的 ping。
  • 对我来说它总是返回未定义。也许只适用于测试频道?
  • @BeauCielBleu 可能没有请求正文。尝试记录 URL:console.log("url:"+details.url);
  • 不工作。只有“url”,没有“requestBody”可用。
  • @D09r,您阅读过文档吗? requestBody 属性是可选的,文档说明“仅在 extraInfoSpec 包含 'requestBody' 时提供”
【解决方案2】:

这就是我所做的

  1. 我使用requestBody 来获取帖子请求正文
  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"]
);

【讨论】:

    【解决方案3】:

    虽然您可能无法拦截,但您可以使用标准 AJAX 方法对其进行胶带处理。与其发出 href 请求,不如看看您是否可以进行异步调用并将其保存到未显示的 HTML 对象中。然后抓取/读取/解析/无论您的主体标准是什么,如果通过,则将该主体对象推回当前窗口/页面。

    将内容存储在被抑制的元素中,然后将相同的元素用于内容可以避免重复调用。缺点是您将获得最终不会使用的内容的完整内容。这可能是也可能不是带宽/速度性能问题。

    【讨论】:

      最近更新 更多