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

如何从Google Chrome扩展启动外部Go可执行脚本并传递当前标签URL?

实现Chrome扩展调用本地Go脚本的方案

核心逻辑

Chrome扩展无法直接调用本地可执行文件,必须通过Native Messaging机制实现——这是Chrome官方提供的扩展与本地程序通信的标准方式。

步骤1:配置Native Messaging清单文件

创建JSON格式的清单文件(例如my_go_script.json),放置到系统指定目录:

  • Windows:C:\Program Files\MyGoScript\ 或用户目录下的AppData文件夹
  • macOS:~/Library/Application Support/Google/Chrome/NativeMessagingHosts/
  • Linux:~/.config/google-chrome/NativeMessagingHosts/

清单内容示例:

{
  "name": "com.mycompany.mygoscript",
  "description": "调用本地Go脚本",
  "path": "/绝对路径/到/你的/go可执行文件",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://你的扩展ID/"
  ]
}

关键注意点:

  • name需用反向域名格式保证唯一性
  • path必须填Go可执行文件的绝对路径
  • allowed_origins里的扩展ID,后续生成扩展后再替换

步骤2:编写Chrome扩展

2.1 扩展清单文件(manifest.json)

{
  "manifest_version": 3,
  "name": "URL传至本地脚本",
  "version": "1.0",
  "permissions": ["activeTab", "nativeMessaging"],
  "action": {
    "default_title": "把当前URL传给本地脚本"
  },
  "background": {
    "service_worker": "background.js"
  }
}

2.2 后台脚本(background.js)

监听扩展图标点击事件,获取当前标签URL并通过Native Messaging发送给本地程序:

chrome.action.onClicked.addListener(async (tab) => {
  const port = chrome.runtime.connectNative('com.mycompany.mygoscript');
  port.postMessage({url: tab.url});
  
  port.onMessage.addListener((response) => {
    console.log('本地脚本响应:', response);
  });
  
  port.onDisconnect.addListener(() => {
    if (chrome.runtime.lastError) {
      console.error('通信出错:', chrome.runtime.lastError.message);
    }
  });
});

步骤3:修改Go脚本适配Native Messaging协议

Chrome的Native Messaging要求通信遵循固定格式:

  • 每个消息前先发送4字节小端序整数,代表消息JSON的长度
  • 随后发送JSON格式的消息内容

修改你的Go脚本以适配该协议:

package main

import (
  "encoding/binary"
  "encoding/json"
  "fmt"
  "os"
)

type Message struct {
  URL string `json:"url"`
}

func main() {
  // 读取Chrome发送的消息长度
  var length uint32
  err := binary.Read(os.Stdin, binary.LittleEndian, &length)
  if err != nil {
    panic(err)
  }

  // 读取消息内容
  msgBytes := make([]byte, length)
  _, err = os.Stdin.Read(msgBytes)
  if err != nil {
    panic(err)
  }

  var msg Message
  err = json.Unmarshal(msgBytes, &msg)
  if err != nil {
    panic(err)
  }

  // 这里写入你原脚本的逻辑,使用msg.URL即可
  fmt.Printf("收到的URL: %s\n", msg.URL)

  // 可选:给Chrome返回响应
  response := map[string]string{"status": "success", "received_url": msg.URL}
  responseBytes, _ := json.Marshal(response)
  binary.Write(os.Stdout, binary.LittleEndian, uint32(len(responseBytes)))
  os.Stdout.Write(responseBytes)
}

步骤4:安装与测试

  1. 编译Go脚本为对应系统的可执行文件
  2. 将Native Messaging清单文件放到对应系统目录,确保路径无误
  3. 开启Chrome开发者模式,加载已解压的扩展(选择你的扩展文件夹)
  4. 点击扩展图标,查看Chrome后台页面控制台的日志,同时验证Go脚本的执行结果

额外注意事项

  • Windows系统中,清单文件的路径需使用双反斜杠或正斜杠
  • macOS/Linux需给Go可执行文件添加执行权限:chmod +x 你的可执行文件名
  • 扩展ID可在Chrome扩展管理页面(开发者模式下)查看

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:40:36