.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扩展程序与安全网站交互

我使用 Google chrome 加载资源失败:net::ERR_BLOCKED_BY_CLIENT

在 Google Chrome 浏览器中使用 Angular 7 和 ASP.Net Core 2.2 的 ERR_INVALID_HTTP_RESPONSE

基于chrome内核的.NET开发资源

XBAP 应用程序,这些可以在 Google Chrome 中运行吗?