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

Chrome扩展Manifest V3中chrome.scripting.executeScript执行失败求助

问题原因

你遇到的CSP错误核心原因:使用chrome.scripting.executeScript的func参数时,Chrome会自动将函数序列化为内联脚本注入目标页面,而你的http://localhost:3001/cv页面的CSP规则禁止内联脚本,所以即便你没手动写内联代码,也会触发这个报错。

解决方案

推荐采用「独立脚本文件+消息传递」的方式彻底规避内联脚本的CSP限制,具体步骤如下:

1. 提取函数到独立脚本文件

创建post-data.js文件,把postJson函数和消息监听逻辑移进去:

function postJson(url, jsonData) {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', url, true);
  xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
  xhr.send(JSON.stringify(jsonData));
  
  xhr.onreadystatechange = function () {
    if (xhr.readyState === XMLHttpRequest.DONE) {
      if (xhr.status === 200) {
        console.log('XHR POST请求成功:', xhr.responseText);
      } else {
        console.error('XHR POST请求失败:', xhr.statusText);
      }
    }
  }
}

// 监听扩展发来的消息,执行请求逻辑
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.action === 'submitCvData') {
    postJson(message.url, message.jsonData);
    sendResponse({status: '请求已执行'});
  }
});

2. 修改扩展注入逻辑

替换openTabAndPostData函数,先注入独立脚本,再通过消息传递数据:

async function openTabAndPostData(jsonData) {
  const tab = await chrome.tabs.create({url: CV_URL});
  
  // 注入独立脚本文件(非内联,符合CSP规则)
  await chrome.scripting.executeScript({
    target: {tabId: tab.id},
    files: ['post-data.js']
  });
  
  // 通过消息传递数据给注入的脚本
  chrome.tabs.sendMessage(tab.id, {
    action: 'submitCvData',
    url: tab.url,
    jsonData: jsonData
  }, (response) => {
    if (chrome.runtime.lastError) {
      console.error('发送数据失败:', chrome.runtime.lastError);
    } else {
      console.log('数据发送成功');
    }
  });
}

3. 修正Manifest配置错误

你的Manifest里把background.js放到了content_scripts的js数组中,这是错误的——background.js是Service Worker,不能作为内容脚本注入页面。请移除这一项:

"content_scripts": [
  {
    "matches": [
      "https://www.linkedin.com/in/*"
    ],
    "js": [
      "content.js",
      // 移除此行 → "background.js",
      "static/js/main.[HASH].js"
    ]
  }
]

可选:添加资源访问声明

如果注入脚本时出现权限问题,可在Manifest中添加web_accessible_resources,允许目标页面访问你的脚本:

"web_accessible_resources": [
  {
    "resources": ["post-data.js"],
    "matches": ["http://localhost:3001/*"]
  }
]
其他临时方案(不推荐)

如果你有权修改目标页面(localhost:3001/cv)的CSP,可以临时添加'unsafe-inline'或者报错提示的哈希值,但这种做法会降低页面安全性,仅适合测试环境:

  • 在页面CSP头中添加:script-src 'self' 'wasm-unsafe-eval' 'inline-speculation-rules' 'unsafe-inline';
  • 或者使用报错中的哈希:script-src 'self' 'wasm-unsafe-eval' 'inline-speculation-rules' 'sha256-l0EBls9+5sHTJ5FqNSzs3FP1dCE2sL/MgTgPGh29hSg=';

内容的提问来源于stack exchange,提问作者Zied Hamdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:33:09