【问题标题】:Chrome Extensions: use chrome.webRequest to modify HTTP request equivalent of the `--data` arg of a cURL requestChrome 扩展:使用 chrome.webRequest 修改与 cURL 请求的 `--data` 参数等效的 HTTP 请求
【发布时间】:2017-10-17 17:17:51
【问题描述】:

深入研究我的第一个 chrome 扩展,并试图弄清楚如何修改 http 请求中的一些数据。

我在这里使用文档:https://developer.chrome.com/extensions/webRequest

我能够设置扩展程序来监听请求,但无法访问我想要的数据。

当我使用 chrome 开发工具时,在“网络”选项卡上,我右键单击要修改的特定请求并将其复制为 cURL。我要修改的数据显示在--data 之后。我想访问它并更改其中一个参数设置为的整数值。

我不确定这些 http 请求的等价物是什么,但我尝试了以下方法:

chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    var bkg = chrome.extension.getBackgroundPage();
    bkg.console.log("onBeforeRequest");
    bkg.console.log(JSON.stringify(details));
    blockingResponse = {};

    return blockingResponse;
  },
  {urls: [/*URL*/]},
  ['requestBody','blocking']
);

我可以在开发工具的“网络”选项卡中找到带有我正在查看的 url 的请求,因此我将能够解析它并确保我只修改我想要的请求,但是打印详细信息不会显示我实际想要修改的数据。知道如何获取与 cURL 请求的 --data 参数等效的 HTTP 请求吗?而且,好吧,修改它。

编辑:这是我取得的进展。

当我记录这些详细信息时,我会收到 ..."requestBody":{"raw":[{"bytes":{}}]},...

但是,如果我将 onBeforeRequest 更改为:

chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    var bkg = chrome.extension.getBackgroundPage();
    bkg.console.log("onBeforeRequest");
    bkg.console.log(JSON.stringify(details));
    var encodedData = getBase64FromArrayBuffer(details.requestBody.raw[0].bytes);
    bkg.console.log("unencoded data: " + details.requestBody.raw[0].bytes);
    bkg.console.log("encodedData: " + encodedData);
    blockingResponse = {};

    return blockingResponse;
  },
  {urls: ["*://*.facebook.com/*"], types: ["xmlhttprequest"]},
  ['requestBody','blocking']
);

function getBase64FromArrayBuffer(responseData) {
    var uInt8Array = new Uint8Array(responseData);
    var i = uInt8Array.length;
    var binaryString = new Array(i);
    while (i--)
    {
      binaryString[i] = String.fromCharCode(uInt8Array[i]);
    }
    var data = binaryString.join('');

    var base64 = window.btoa(data);

    return base64;
}

存在编码数据,显示一长串字符,尽管它是乱码。这是否意味着我将无法访问和修改这些数据?或者有没有办法解码这些数据?

【问题讨论】:

  • 如果你已经有base64,那么使用decodeURIComponent(atob(encodedData))解码
  • 我是个大傻瓜,没有意识到 base64 是它出现乱码的原因。我已成功将其转换为字符串并对其进行解析以修改我的数据。您是否有机会知道如何将其作为新数据发送? details.requesetBody.raw[0].bytes = <new array buffer>; 足够了吗,如果我用我的新字符串创建一个新的数组缓冲区,或者还有其他隐藏的东西我会丢失吗?
  • 我不确定,但看起来您无法发送修改后的正文。这取自文档:“onBeforeRequest 可用于取消或重定向请求”。
  • bugs.chromium.org/p/chromium/issues/detail?id=91191# 看来修改 POST 数据的能力即将到来,但是分配给他们的功能的人被转移到其他地方并在上面坐了 2 年,然后才发布它去年 12 月,没有人恢复过时的功能。唉,没有Thankful Reacts 只有Chrome 扩展可以将所有FB 喜欢变成Thankful Reacts。我想我现在要去学习如何构建 FireFox 扩展。

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


【解决方案1】:

chrome.webRequest API 允许您访问 POST 数据。但是,它不允许您修改 POST 数据。

您可以修改一些标头信息,但不能修改 POST 数据。

看起来修改 POST 数据的能力是有意为之,但 Google 的一位从事此工作的开发人员被转移到其他地方,并在两年后等待错误/功能请求,然后才将其发布给其他人几个月前可以捡起来。如果这是您感兴趣的功能,请前往 https://bugs.chromium.org/p/chromium/issues/detail?id=91191# 并为这个错误加注星标(需要 gmail 帐户),也许一些新的兴趣会导致有人完成该功能。

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2020-09-17
    • 2014-07-01
    相关资源
    最近更新 更多