Manifest V3扩展能否修改请求头实现三星固件下载?
问题解答:Manifest V3 Chrome扩展修改下载请求头
核心结论
完全可以实现,Chrome Manifest V3支持修改下载请求的头信息,但你的现有代码存在权限配置和监听参数的问题,导致webRequest事件未触发。另外,chrome.downloads.download本身不支持直接设置请求头,必须通过webRequest拦截或者后台fetch的方式实现。
问题分析(你的代码存在的问题)
缺失关键权限:
- Manifest V3中,
webRequest需要配合host_permissions才能生效,你当前的manifest.json没有配置这个字段,导致无法拦截跨域请求。 - 修改
User-Agent这类受保护的请求头,需要额外添加"extraHeaders"权限。
- Manifest V3中,
webRequest监听参数错误:
- 要修改请求头,必须在
addListener的第三个参数中加入"blocking"(Manifest V3中用数组形式),否则只能监听无法修改请求头。 - 针对受保护的头(如User-Agent),还需要加入
"extraHeaders"选项。
- 要修改请求头,必须在
解决方案
方案一:通过webRequest拦截修改请求头(适配chrome.downloads.download)
首先更新manifest.json,补充必要权限:
{ "name": "chrome.downloads", "version": "1.0", "manifest_version": 3, "permissions": [ "downloads", "downloads.open", "downloads.shelf", "storage", "webRequest", "tabs", "activeTab", "unlimitedStorage", "extraHeaders" // 新增:修改受保护头需要的权限 ], "host_permissions": [ // 新增:指定要拦截的域名,比如三星固件服务器域名,或者<all_urls> "<all_urls>" ], "background": { "service_worker": "background.js" }, "content_scripts": [ { "js": ["matches.js"], "matches": ["<all_urls>"] } ] }
然后修改background.js中的webRequest监听逻辑,正确添加拦截和修改逻辑:
console.log("background.js loaded"); // 拦截并修改请求头 chrome.webRequest.onBeforeSendHeaders.addListener( function(details) { console.log("onBeforeSendHeaders triggered:", details); // 查找并修改User-Agent let hasUserAgent = false; for (let i = 0; i < details.requestHeaders.length; ++i) { if (details.requestHeaders[i].name === 'User-Agent') { details.requestHeaders[i].value = "你的自定义User-Agent"; hasUserAgent = true; break; } } // 如果没有User-Agent则添加 if (!hasUserAgent) { details.requestHeaders.push({name: 'User-Agent', value: "你的自定义User-Agent"}); } // 添加Authorization头 details.requestHeaders.push({name: 'Authorization', value: "你的授权令牌"}); return {requestHeaders: details.requestHeaders}; }, {urls: ["<all_urls>"]}, // 匹配要拦截的请求域名 ["blocking", "requestHeaders", "extraHeaders"] // 必须包含blocking才能修改 ); // 接收消息触发下载 chrome.runtime.onMessage.addListener(function(details, sender) { console.log("Received message:", details); chrome.downloads.download({ filename: "固件文件名.zip", url: "三星固件的下载URL" }); });
方案二:后台用Fetch直接获取文件(绕开CORS,更直接)
由于扩展的Service Worker不受CORS限制,你可以直接在后台用fetch自定义请求头获取文件,再生成Blob URL调用下载,这种方式不需要依赖webRequest:
修改background.js中的消息监听逻辑:
chrome.runtime.onMessage.addListener(async function(details, sender) { try { // 用fetch自定义请求头获取文件 const response = await fetch("三星固件的下载URL", { headers: { "User-Agent": "你的自定义User-Agent", "Authorization": "你的授权令牌" } }); // 转换为Blob const blob = await response.blob(); // 生成Blob URL const blobUrl = URL.createObjectURL(blob); // 调用下载 chrome.downloads.download({ filename: "固件文件名.zip", url: blobUrl }, (downloadId) => { // 下载完成后释放Blob URL chrome.downloads.onChanged.addListener(function listener(delta) { if (delta.id === downloadId && delta.state?.current === "complete") { URL.revokeObjectURL(blobUrl); chrome.downloads.onChanged.removeListener(listener); } }); }); } catch (error) { console.error("下载失败:", error); } });
这种方案不需要配置webRequest相关权限,更简洁,也避免了webRequest的拦截限制。
验证方法
- 加载扩展时打开Chrome的扩展开发者工具(Service Worker的控制台),查看是否有
onBeforeSendHeaders triggered的日志(方案一)。 - 触发下载后,在Chrome的网络面板中查看请求头是否已被修改。
内容的提问来源于stack exchange,提问作者Kelison Bessa
相关产品推荐
相关产品推荐

