如何从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:安装与测试
- 编译Go脚本为对应系统的可执行文件
- 将Native Messaging清单文件放到对应系统目录,确保路径无误
- 开启Chrome开发者模式,加载已解压的扩展(选择你的扩展文件夹)
- 点击扩展图标,查看Chrome后台页面控制台的日志,同时验证Go脚本的执行结果
额外注意事项
- Windows系统中,清单文件的路径需使用双反斜杠或正斜杠
- macOS/Linux需给Go可执行文件添加执行权限:
chmod +x 你的可执行文件名 - 扩展ID可在Chrome扩展管理页面(开发者模式下)查看
内容的提问来源于stack exchange,提问作者Tomer
相关产品推荐
相关产品推荐

