我想用Chrome扩展截取HTTP请求,然后将其转发,可能会有新的/不同的HTTP头,我该如何做?
注: 我是Requestly的作者 - 一款Chrome/Firefox浏览器扩展程序,可以修改HTTP请求和响应。
在OP提出问题时这是不可能实现的,但现在您可以使用Manifest V2中的WebRequest API和Manifest V3中的DeclarativeNetRequest API编写自己的扩展程序来修改请求和响应头部信息。
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
);
谷歌Chrome正在Manifest V3中淘汰webRequest Blocking API。根据谷歌于2022年9月28日的官方声明,从2023年6月开始,所有使用Manifest v2的扩展程序将无法在Chrome上运行。以下是一种使用Manifest v3修改请求和响应标头的方法- https://github.com/requestly/modify-headers-manifest-v3
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,
}
},
];
import rules from './rules';
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: rules.map((rule) => rule.id), // remove existing rules
addRules: rules
});
完整的源代码可以在GitHub存储库中找到- https://github.com/requestly/modify-headers-manifest-v3
如果您想使用现有的Chrome/Firefox/Edge扩展程序,您可以使用Requestly,它允许您修改请求和响应头。看一下这个快照:
对于使用清单版本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/
请记住,从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']
);
如需更多信息,请查阅文档 文档截图 https://developer.chrome.com/extensions/webRequest#life_cycle_footnote
您来到了正确的地方,但是拦截HTTP请求目前还不存在,不过扩展团队已经意识到这是一个广受欢迎的需求,并计划在不久的将来实现它。
您可以使用已经过时的WebRequest API来修改请求/响应头。 您可以将您的扩展升级到Manifest V3,以便能够使用DeclativeNetRequest,它也支持修改请求/响应头。
或者您可以安装Inssman Chrome扩展程序。 它允许您修改HTTP(S)请求/响应头,重定向和阻止请求,返回自定义数据,如HTML/CSS/JS/JSON等等。 而且它是一个开源项目。