我正在尝试编写一个扩展,它将修改来自 Chrome 的所有传出请求的用户代理。
对于 http://、https://、ftp://、file:// 或 chrome-extension://,我可以使用 chrome.webRequest API 和
onBeforeSendHeaders
。但是,这不适用于 ws:// 或 wss://。
是否有其他 API 允许我设置/修改这些请求的标头?
我在谷歌上搜索这个问题的答案,因为三年后的现在,这是可能的,我将在这里记录它。
根据 https://developer.chrome.com/extensions/webRequest,它应该可以在 Chrome 58 上运行。但是需要进行一些配置才能使其工作。
请记住,webRequest 只能在后台脚本中使用,而不能在内容脚本中使用。
示例(更改 Origin 标头,更改 User Agent 应该类似)
在manifest.json中:
"permissions": [
"storage",
"tabs",
"activeTab",
"webRequest",
"webRequestBlocking",
"webNavigation",
"debugger",
"https://*/",
"wss://*/"
],
在后台脚本中
// origin is defined somewhere above
chrome.webRequest.onBeforeSendHeaders.addListener((details) => {
if (origin) {
const headers = details.requestHeaders;
for (let i = 0; i < headers.length; i++) {
if (headers[i].name === 'Origin') {
headers[i].value = origin;
}
}
return { requestHeaders: headers };
}
}, { urls: ['wss://server.example.com/*', 'https://server.example.com/*'],
types: ['xmlhttprequest', 'websocket'] },
['requestHeaders', 'blocking']);
恐怕不行。现在可以使用请求标头,请参阅这个答案。
不过,这将是一个很好的功能请求。
如果有人使用新的
declarativeNetRequest
api 并想要阻止 websocket,您需要使用 wss://
协议提及 url,例如:urlFilter: "wss://augloop.office.com"
chrome.declarativeNetRequest.updateDynamicRules(
{
addRules: [
{
action: {
type: "block",
},
condition: {
urlFilter: 'wss://augloop.office.com/', //block this websocket
domains: ["example.com"], // on this domain
},
id: 2,
priority: 1,
},
],
},
() => {
console.log("block rule added");
}
);
对于清单版本 3: 需要在主机权限中声明WebSocket
"host_permissions": ["*://*/*", "wss://*/*"],