You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

寻求最简方案:为现有Chrome JS扩展添加接收本地Windows应用短消息功能

嘿,要实现Chrome扩展接收本地Windows应用的短字符串消息,最简且靠谱的方案就是用Chrome官方支持的Native Messaging啦!不需要折腾额外的服务器或者复杂协议,下面给你一步步拆解实现步骤:

一、核心方案:Chrome Native Messaging

Native Messaging是Chrome提供的扩展与本地应用双向通信的官方机制,专门解决这类跨环境消息传递需求,稳定性和兼容性都有保障。

1. Chrome扩展端实现

首先准备扩展的核心文件:

manifest.json(扩展配置文件)

需要声明nativeMessaging权限,同时指定后台服务脚本:

{
  "manifest_version": 3,
  "name": "本地消息接收器",
  "version": "1.0",
  "permissions": ["nativeMessaging"],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html"
  }
}

background.js(后台监听脚本)

负责建立与本地应用的连接,并接收消息:

// 连接到本地应用(注意这里的主机名要和后面本地应用的manifest一致)
const port = chrome.runtime.connectNative('com.yourteam.localmsgapp');

// 监听本地应用发来的消息
port.onMessage.addListener((message) => {
  console.log('收到本地消息:', message.content);
  // 这里可以根据需求处理消息,比如弹窗提示、存储到本地等
});

// 处理连接异常
port.onDisconnect.addListener(() => {
  if (chrome.runtime.lastError) {
    console.error('连接本地应用失败:', chrome.runtime.lastError.message);
  }
});

如果需要在扩展弹窗里展示收到的消息,可以加个简单的页面:

<!DOCTYPE html>
<html>
<body>
  <h3>收到的本地消息:</h3>
  <div id="messageDisplay"></div>
  <script src="popup.js"></script>
</body>
</html>

对应的popup.js可以从后台获取消息并展示:

chrome.runtime.sendMessage({getLatestMessage: true}, (response) => {
  if (response?.message) {
    document.getElementById('messageDisplay').textContent = response.message;
  }
});

2. Windows本地应用实现(最简版用Python)

用Python写个轻量脚本就能完成消息发送,不需要编译成exe,调试和修改都很方便:

import sys
import json
import struct

def send_to_chrome(message_str):
    # Native Messaging要求消息以4字节小端序的长度前缀开头
    message = {"content": message_str}
    encoded_msg = json.dumps(message).encode('utf-8')
    # 打包消息长度
    length_prefix = struct.pack('<I', len(encoded_msg))
    # 写入标准输出(Chrome会监听本地应用的stdout)
    sys.stdout.buffer.write(length_prefix)
    sys.stdout.buffer.write(encoded_msg)
    sys.stdout.buffer.flush()

# 测试发送短字符串
send_to_chrome("Hello from Windows本地应用!")

# 如果需要持续发送消息,可以加个循环
# while True:
#     input_str = input("请输入要发送的消息:")
#     send_to_chrome(input_str)

3. 注册本地应用到Chrome

Windows下需要通过注册表让Chrome识别你的本地应用,步骤如下:

第一步:创建本地应用的manifest文件(命名为native-manifest.json)

注意替换其中的路径和扩展ID:

{
  "name": "com.yourteam.localmsgapp",
  "description": "给Chrome扩展发消息的本地应用",
  "path": "C:\\Users\\YourName\\Desktop\\local_msg_app.py",  // 你的Python脚本绝对路径
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://abcdefghijklmnopqrstuvwxyzabcdef/"  // 替换成你的Chrome扩展ID
  ]
}

怎么看扩展ID?打开Chrome扩展页面,开启「开发者模式」,就能看到已加载扩展的ID。

第二步:注册注册表项

打开注册表编辑器(Win+R输入regedit),导航到:
HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts\com.yourteam.localmsgapp
设置默认值为native-manifest.json的绝对路径,比如C:\\Users\\YourName\\Desktop\\native-manifest.json

或者用批处理脚本一键注册(更方便):

@echo off
REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.yourteam.localmsgapp" /ve /t REG_SZ /d "C:\Users\YourName\Desktop\native-manifest.json" /f

4. 测试流程

  1. 把扩展加载到Chrome:扩展页面→加载已解压的扩展→选择你的扩展文件夹。
  2. 运行Python脚本,打开Chrome扩展的后台控制台(扩展图标→管理扩展→背景页面),就能看到收到的消息了!
二、更偷懒的替代方案(适合临时需求)

如果觉得Native Messaging的注册步骤有点繁琐,还有个极简但有局限的方法:剪贴板监听。本地应用把字符串复制到剪贴板,扩展定期读取剪贴板内容。

扩展端代码(background.js)

let lastClipboardContent = "";

// 每秒轮询一次剪贴板
setInterval(async () => {
  try {
    const currentContent = await navigator.clipboard.readText();
    if (currentContent && currentContent !== lastClipboardContent) {
      console.log('从剪贴板收到消息:', currentContent);
      lastClipboardContent = currentContent;
    }
  } catch (err) {
    console.error('读取剪贴板失败:', err);
  }
}, 1000);

本地应用代码(Python)

import pyperclip
pyperclip.copy("这是来自本地应用的剪贴板消息")

注意:这个方法容易被其他程序的剪贴板操作干扰,且只能被动轮询,不适合正式场景,但临时测试非常方便。

内容的提问来源于stack exchange,提问作者vitaliy-zh

火山引擎 最新活动