You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manifest V3扩展能否修改请求头实现三星固件下载?

问题解答:Manifest V3 Chrome扩展修改下载请求头

核心结论

完全可以实现,Chrome Manifest V3支持修改下载请求的头信息,但你的现有代码存在权限配置和监听参数的问题,导致webRequest事件未触发。另外,chrome.downloads.download本身不支持直接设置请求头,必须通过webRequest拦截或者后台fetch的方式实现。

问题分析(你的代码存在的问题)

  1. 缺失关键权限:

    • Manifest V3中,webRequest需要配合host_permissions才能生效,你当前的manifest.json没有配置这个字段,导致无法拦截跨域请求。
    • 修改User-Agent这类受保护的请求头,需要额外添加"extraHeaders"权限。
  2. 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的拦截限制。

验证方法

  1. 加载扩展时打开Chrome的扩展开发者工具(Service Worker的控制台),查看是否有onBeforeSendHeaders triggered的日志(方案一)。
  2. 触发下载后,在Chrome的网络面板中查看请求头是否已被修改。

内容的提问来源于stack exchange,提问作者Kelison Bessa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:05:03