Google chrome extension 如何将数据从本机应用程序(ADIRC,IRC客户端)传递到我的Chrome扩展?

Google chrome extension 如何将数据从本机应用程序(ADIRC,IRC客户端)传递到我的Chrome扩展?,google-chrome-extension,chrome-native-messaging,Google Chrome Extension,Chrome Native Messaging,我在Windows10中使用Chrome79和NodeJS13 我还使用一个IRC客户端ADIRC连接到某个IRC通道。此程序可以通过其脚本语言(通过和)调用带有参数的外部程序 所以,我想做的是,可能使用本机消息,每当特定消息出现在IRC通道中时, 它将作为参数从ADIRC传递到我的Chrome扩展,最有可能的方式是:Run\path\to\some\u executable.exe%message 其中“some_executable.exe”将向扩展发送想要的消息数据(使用标准输出) 所以,

我在Windows10中使用Chrome79和NodeJS13

我还使用一个IRC客户端ADIRC连接到某个IRC通道。此程序可以通过其脚本语言(通过和)调用带有参数的外部程序

所以,我想做的是,可能使用本机消息,每当特定消息出现在IRC通道中时, 它将作为参数从ADIRC传递到我的Chrome扩展,最有可能的方式是:
Run\path\to\some\u executable.exe%message

其中“some_executable.exe”将向扩展发送想要的消息数据(使用标准输出)

所以,我的问题是,如何将数据从ADIRC传递到我的Chrome扩展?可能吗?
我是否完全忽略了一些关于本机消息传递的概念,因此,我想通过另一种方式做的事情是可能的

下面是我的努力,即我的Chrome扩展和本机消息主机

注:在谷歌的网站中,有一点是这样说的:

Chrome在单独的进程中启动每个本机消息传递主机,并 使用标准输入(stdin)和标准输出与it进行通信 (stdout)

所以,从我的理解来看, 为了能够在需要时将数据从ADIRC传递到我的扩展,我需要ADIRC手动启动
NativeMessaging.js的另一个实例
因此,为了测试我的理论,我在Chrome之外手动启动了
节点“C:\MDN\app\NativeMessaging.js”
(在Chrome中加载扩展名后),并尝试在其中输入随机测试文本,但不幸的是,在我扩展名的background.html页面|控制台中没有收到这些文本

background.js(我的Chrome扩展名):

var port=chrome.runtime.connectNative('my_messaging_host');
port.onMessage.addListener((消息)=>{
console.log(“接收:+消息”);
});

本机消息传递主机设置:

install-host.bat

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\my_messaging_host" /ve /t REG_SZ /d "%~dp0my_messaging_host.json" /f
my_messaging_host.json

{
  "name": "my_messaging_host",
  "description": "Example host for native messaging",
  "path": "C:\\MDN\\app\\my_messaging_host_win.bat",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://(my extension's hash)/"
  ]
}
my_messaging_host_win.bat

节点“C:\MDN\app\NativeMessaging.js”
NativeMessaging.js(NodeJS源代码)

#/usr/local/bin/node
process.stdin.on('readable',()=>{
var输入=[];
var组块;
while(chunk=process.stdin.read()){
input.push(块);
}
输入=Buffer.concat(输入);
var msgLen=input.readUInt32LE(0);
var dataLen=msgLen+4;
如果(input.length>=dataLen){
var content=input.slice(4,dataLen);
var json=json.parse(content.toString());
handleMessage(json);
}
});
函数sendMessage(msg){
var buffer=buffer.from(JSON.stringify(msg));
var头=Buffer.alloc(4);
header.writeUInt32LE(buffer.length,0);
var data=Buffer.concat([header,Buffer]);
进程.标准输出.写入(数据);
}
process.on('uncaughtException',(err)=>{
sendMessage({错误:err.toString()});
});
可能会添加到NativeMessaging.js,以防使用参数运行:
e、 g.通过
node NativeMessaging.js messageToSend

sendMessage(process.argv[2]);

nativeMessaging API当前的流程是,扩展始终是通信周期的发起方。你想要的东西目前正在开发中。同时,您最好编写一个简单的实用程序,从IRC收集数据,并通过XMLHttpRequest或fetch在某个TCP端口上侦听扩展的定期检查。或者您可以使用持久的webSocket连接。@wOxxOm谢谢您的详细回复!关于您建议的方法:不幸的是,它们似乎不适合我,主要是因为我想立即将数据从程序传递到我的扩展,即在相关IRC事件发生时,以及因为它们对我来说很难实现。因此,我似乎必须等待Chrome问题完成开发。我认为WebSocket连接将允许立即进行双向通信。@wOxxOm我认为这种方法不合适,因为它需要创建并连接到服务器,但是,似乎没有办法让AdiIRC充当服务器,也不要通过WebSocket直接连接AdiIRC和我的分机(=没有服务器)。在任何情况下,AdiIRC客户端都非常棒,我只想找到一种方法将它与我的扩展连接起来——我不想用一些独立的脚本(我将在NodeJS中与一些npm IRC包一起编写)来替换本机消息传递主机,这些脚本将连接到IRC通道并向我的扩展发送匹配的消息。