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

如何通过自定义协议远程触发Chrome扩展打开指定URL?

问题分析与解决方案

你遇到的问题是因为没有在扩展中注册自定义协议处理程序,Chrome无法识别addonname://属于你的扩展,所以会默认当作搜索词处理。以下是具体的修复步骤:

1. 修改manifest.json,添加协议注册与后台脚本配置

在原配置中补充protocol_handlers(注册自定义协议)和background(后台服务脚本)字段,同时精简不必要的权限:

{
  "name": "Action API Demo",
  "version": "1.0",
  "manifest_version": 3,
  "action": {
    "default_title": "Default Title"
  },
  "permissions": [
    "windows", "tabs"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "protocol_handlers": [
    {
      "protocol": "addonname",
      "name": "Addon Protocol Handler",
      "url": "handler.html?url=%s"
    }
  ]
}
  • protocol_handlers:告诉Chromeaddonname://协议由当前扩展处理,%s会被替换为完整的协议URL(比如addonname://somemessage)。
  • background:注册后台服务脚本,用于处理窗口创建逻辑。

2. 创建后台脚本background.js

用于接收指令并创建新窗口:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.type === 'openWindow') {
    chrome.windows.create({url: "https://www.google.com", type: "normal"});
  }
});

3. 创建协议处理页面handler.html

当用户输入addonname://协议时,Chrome会打开这个页面,页面内的脚本触发后台逻辑:

<!DOCTYPE html>
<html>
<body>
<script>
// 触发后台脚本打开窗口
chrome.runtime.sendMessage({type: 'openWindow'}, () => {
  // 完成后自动关闭处理页面
  window.close();
});
</script>
</body>
</html>

为什么原方案不生效?

  • 原代码用chrome.runtime.onMessageExternal监听外部消息,但自定义协议的触发不会发送这类消息,必须通过protocol_handlers注册后,浏览器才会将协议请求导向你的扩展。
  • Content Script是注入到网页中的脚本,无法直接响应浏览器级别的协议触发事件,这类逻辑需要后台脚本或专门的处理页面来完成。

内容的提问来源于stack exchange,提问作者Itzik.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:00:08