.NET 应用程序与 Google Chrome 扩展程序的交互
Posted
技术标签:
【中文标题】.NET 应用程序与 Google Chrome 扩展程序的交互【英文标题】:Interaction from .NET application with a Google Chrome extension 【发布时间】:2014-03-25 13:30:33 【问题描述】:我有一个关于浏览器远程控制的问题。我的主要目标是从谷歌浏览器中读出所有打开的标签 URL,如果找到匹配的 URL 并重新加载当前页面,则还聚焦一个标签。所有这些东西都是从本机应用程序调用的(而不是从 Chrome 到本机应用程序。
目前,我尝试使用 Win32-API 的东西(FindWindowEx,...),新的 .NET 自动化的东西,但这只会给我任何东西(前者)或只有当前选项卡的 URL(后者)。
所以我认为 - 基于研究 - 编写一个 Google Chrome 扩展程序并以这种方式进行交互是最好的主意。可悲的是:不再支持 NPAPI 扩展,现在只支持 javascript 类的东西。
然后我尝试使用 nativeMessaging 进行通信,但我无法让事情正常工作(永远不会以某种方式执行)并且关于此的文档部分是 -censored-。
这让我想到事情是否可能,如果是,它们怎么可能?
宿主应用程序,在注册表中注册(Windows):
public static void Main(string[] args)
string message = "\"text\": \"My response\"";
byte[] length = BitConverter.GetBytes(message.Length);
foreach (byte b in length)
Console.Write((char)b);
Console.Write(message);
主机应用程序清单
"name": "My.ChromeHost",
"description": "This extension is used for browser interaction with My App.",
"version": "1.0",
"path": "C:\\Program Files (x86)\\My Company AG\\My Product\\My.ChromeHost.exe",
"type": "stdio",
"allowed_origins": [
"chrome-extension://bejoalmncckddamdhnfjafipbgflolmk"
]
扩展清单
"manifest_version": 2,
"name": "My App",
"description": "This extension is used for browser interaction with My App.",
"version": "1.0",
"background":
"scripts": [
"background.js"
],
"persistent": false
,
"permissions": [
"tabs",
"nativeMessaging"
]
background.js
// sending a message to the app (altough I need it vice versa)
var port = chrome.runtime.connectNative("My.ChromeHost");
port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnected);
port.postMessage( "text": "My request" );
function onNativeMessage(message)
alert("Received message: <b>" + JSON.stringify(message) + "</b>");
function onDisconnected()
alert("Failed to connect: " + chrome.runtime.lastError.message);
port = null;
【问题讨论】:
这方面有什么进展吗?我正在尝试相同的方法,遵循somewhat limited documentation。想知道是注册表设置不正确,还是manifest,或者app无法调用。很不清楚它无法连接的“哪里”。 一些relevant info on Chromium extensions Google Groups。 @StevenJeuris 是的,也不是。我设法建立了与我的本机应用程序的连接,但没有使用本机消息传递。我切换到 SignalR 进行通信。自托管 SignalR 主机正在我的应用程序中运行,扩展程序充当客户端,一旦启动就会注册。然后,IPC 可以从双方进行,这足以满足我的要求。 我可能最终也会这样做。我猜你在那种情况下使用了背景页面而不是event page? @StevenJeuris 正确,我使用的是背景页面。如果你也一样,我可以分享我的东西。 【参考方案1】:我设法建立了与我的本机应用程序的连接,但没有使用本机消息传递。我切换到 SignalR 进行通信。自托管 SignalR 主机正在我的应用程序中运行,扩展程序充当客户端,一旦启动就会注册。然后,IPC 可以从双方进行,这足以满足我的要求。
更新:根据要求,此处提供了一个小型示例应用程序:
http://tooldesign.ch/pub/SignalRChrome.zip
有关如何开发、打包和分发 Chrome 扩展程序的信息,请查看https://developer.chrome.com/extensions。由于私钥,这不包含在我的示例项目中。
【讨论】:
嘿,你能不能把你的项目压缩并发布到这里?我正在寻找与您所做的类似的事情,并想修改您的项目,看看它是否可以做我想做的事情? 我不允许上传原始项目,但我可以根据它制作一个示例应用程序。 感谢您这样做。有没有办法绕过你可以发送和接收多少的限制?它告诉我长度太大而无法发送。 我从来没有收到过这么大的消息,但是您是否在扩展程序或服务器中收到错误? 服务器页面说请求字符串太大。以上是关于.NET 应用程序与 Google Chrome 扩展程序的交互的主要内容,如果未能解决你的问题,请参考以下文章
将 jQuery 与 Google Chrome 应用程序而非 Chrome 扩展程序一起使用
我使用 Google chrome 加载资源失败:net::ERR_BLOCKED_BY_CLIENT
在 Google Chrome 浏览器中使用 Angular 7 和 ASP.Net Core 2.2 的 ERR_INVALID_HTTP_RESPONSE