我可以使用Chrome扩展修改传出请求标题吗?

nvbavucw  于 2022-12-06  发布在  Go
关注(0)|答案(6)|浏览(238)

我在Developer's Guide中看不到这个问题的答案,尽管可能我找的地方不对。
我想使用Chrome扩展拦截HTTP请求,然后转发它,可能会使用新的/不同的HTTP头-我该如何做到这一点?

icomxhvb

icomxhvb1#

PS:我是Requestly作者,所以你可以为任何你不喜欢的事情责怪我:)

当OP提出这个问题的时候,这当然是不可能的,但是不久之后Chrome发布了一个实验性的WebRequest API。但是现在它们已经被正式包含在Chrome扩展中。你可以用它来修改Chrome中的请求和响应头。

清单V2代码

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders.splice(i, 1);
        break;
      }
    }
    return { requestHeaders: details.requestHeaders };
  },
  {urls: ['<all_urls>']},
  ['blocking', 'requestHeaders' /* , 'extraHeaders' */]
  // uncomment 'extraHeaders' above in case of special headers since Chrome 72
  // see https://developer.chrome.com/extensions/webRequest#life_cycle_footnote
);

Google Chrome将在Manifest V3中弃用webRequest Blocking API。根据Google于2022年9月28日发布的official statement,所有带有Manifest v2的扩展从2023年6月起将无法在Chrome上运行。以下是使用Manifest v3 -https://github.com/requestly/modify-headers-manifest-v3修改请求和响应头的方法

清单V3代码:

规则.ts

const allResourceTypes = 
    Object.values(chrome.declarativeNetRequest.ResourceType);

export default [
  {
    id: 1,
    priority: 1,
    action: {
      type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
      requestHeaders: [
        {
          operation: chrome.declarativeNetRequest.HeaderOperation.SET,
          header: 'x-test-request-header',
          value: 'test-value',
        },
      ]
    },
    condition: {
      urlFilter: '/returnHeaders',
      resourceTypes: allResourceTypes,
    }
  },
  {
    id: 2,
    priority: 1,
    action: {
      type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
      responseHeaders: [
        {
          operation: chrome.declarativeNetRequest.HeaderOperation.SET,
          header: 'x-test-response-header',
          value: 'test-value',
        },
      ]
    },
    condition: {
      urlFilter: 'https://testheaders.com/exampleAPI',
      resourceTypes: allResourceTypes,
    }
  },
];

背景.ts

import rules from './rules';

chrome.declarativeNetRequest.updateDynamicRules({
  removeRuleIds: rules.map((rule) => rule.id), // remove existing rules
  addRules: rules
});

完整的源代码可以在GitHub repo -https://github.com/requestly/modify-headers-manifest-v3中找到
如果你想使用Chrome/Firefox扩展,你可以使用Requestly,它允许你根据需要修改请求和响应头。

xnifntxz

xnifntxz3#

您找对了地方,但是拦截HTTP请求还不存在,但是扩展团队知道这是一个流行的请求,并且希望在不久的将来得到它。

euoag5mw

euoag5mw4#

请记住,从chrome 72开始,除非您在opt_extraInfoSpec中添加了extraHeaders,否则不允许使用某些头文件。因此,@sachinjain024的答案中的上述示例将类似于:

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders.splice(i, 1);
        break;
      }
    }
    return { requestHeaders: details.requestHeaders };
  },
  {urls: ['<all_urls>']},
  [ 'blocking', 'requestHeaders', 'extraHeaders']
);

有关详细信息,请查看文档Screenshot from the documentation https://developer.chrome.com/extensions/webRequest#life_cycle_footnote

3j86kqsm

3j86kqsm5#

您可以安装ModHeader扩展并添加头文件:

fjnneemd

fjnneemd6#

对于使用manifest版本3的扩展,不能再使用chrome.webRequest.onBeforeSendHeaders.*。替代项是chrome.declarativeNetRequest
manifest.json中进行以下更改:

{
  ...
  "manifest_version": 3,
  "background": {
    "service_worker": "background.js"
  },
  "host_permissions": ["<all_urls>"],
  "permissions": [
    "declarativeNetRequest"
  ],
  ...
}
  • 💡"<all_urls>"用于修改所有传出url的标头。请根据您的工作范围限制此操作

background.js中进行以下更改:

// ...

const MY_CUSTOM_RULE_ID = 1

chrome.declarativeNetRequest.updateDynamicRules({
    removeRuleIds: [MY_CUSTOM_RULE_ID],
    addRules: [
        {
            id: MY_CUSTOM_RULE_ID,
            priority: 1,
            action: {
                type: "modifyHeaders",
                requestHeaders: [
                    {
                        operation: "set",
                        header: "my-custom-header",
                        value: "my custom header value"
                    }
                ]
            },
            condition: {
                "resourceTypes": ["main_frame", "sub_frame"]
            },
        }
    ],
});

测试结果

阅读文档https://developer.chrome.com/docs/extensions/reference/declarativeNetRequest/

相关问题