我该如何使用C#与Chrome(Chrome扩展程序)进行通信?

7
我希望创建一个可以在我的C#应用程序和扩展之间通信的桥梁。
这是我实际想要的解释: 我已经创建了一个扩展,它将获取HTML元素的详细信息。但每次我启动Chrome时都会启动扩展。是否有任何方法可以向我的Chrome扩展发送消息以获取HTML元素的详细信息,然后将其发送回C#应用程序? 我能够使用“XMLHttpRequest”将信息传递给C#,但问题是它在我的页面加载时启动。 让我向您解释一下我想要的内容:
  1. 当我打开Chrome时,我的扩展将自动启动,并且我的background.cs(后台页面)也将启动。(在这里我想要一些客户端-服务器通信)

  2. 使用我的C#应用程序,我将向Chrome扩展程序发送一些数据(例如StartFetchingDocument)。

  3. 一旦我的扩展程序接收到此消息(即StartFetchingDocument),则应将contect-sctipt.js注入到所选选项卡中。

我知道剩下的需要将数据发送回C#,但是我在这个阶段被卡住了,就是如何从C#发送数据到我的扩展程序(后台页面)。
3个回答

12

嗯...可能有更好的方法,但一个简单的方法是在你的c#应用程序中打开一个HttpListener,并像这样从扩展程序与其通信:

var listener = "http://localhost:60024/";

function getCommand(){

    var postData = { 
        "action": "getCommand" 
    };

    $.post( listener, postData, function(response){
        //Parse response and do whatever c# wants
    });
}

function send(data){

    var postData = {
        "action" : "send",
        "data": data
    };

    $.post(listener, postData);
}


setInterval(getCommand, 1000);

在这个例子中,我使用的是jQuery.post,它可以添加到扩展上下文中,但如果你更喜欢,你也可以使用XMLHttpRequest。在C#方面:

在我的示例中,我使用了jQuery.post,它可以被添加到扩展上下文中,但如果您更偏好,也可以使用XMLHttpRequest。在C#方面:

using System;
using System.Net;


namespace HttpListenerTEst
{
    class Program
    {
        private static HttpListener _listener;

        static void Main(string[] args)
        {
            _listener = new HttpListener();
            _listener.Prefixes.Add("http://localhost:60024/");
            _listener.Start();
            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);

            Console.ReadLine();
        }

        static void ProcessRequest(IAsyncResult result)
        {
            HttpListenerContext context = _listener.EndGetContext(result);
            HttpListenerRequest request = context.Request;

            //Answer getCommand/get post data/do whatever

            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);
        }
    }
}

在 ProcessRequest 函数中,您可以读取 POST 数据或发送回应。

读取 POST 数据:

        string postData;
        using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
        {
            postData = reader.ReadToEnd();
            //use your favourite json parser here
        }

并发送一些东西回来:

        string responseString           = "This could be json to be parsed by the extension";

        HttpListenerResponse response   = context.Response;
        response.ContentType            = "text/html";

        byte[] buffer                   = System.Text.Encoding.UTF8.GetBytes(responseString);
        response.ContentLength64        = buffer.Length;
        Stream output                   = response.OutputStream;

        output.Write(buffer, 0, buffer.Length);
        output.Close();

只是一些快速的头脑风暴,期待更好的想法 :)


setInterval(poll, 1000); <- 这并不完全是轮询 :) 轮询是当您发送一个请求,直到必要时才会返回响应,但这个问题很好 :) - povilasp
1
将其更改为中性 setInterval(getCommand, 1000),@povilasp。干杯 :) - cviejo
你能否给我一些例子吗?因为我对这个非常新。 - Sanket Shah
@SanketShah,上面的代码已经是一个完全可用的示例。只需创建一个扩展或使用现有的扩展,并将js代码粘贴到一个文件中即可。对于c#部分也是一样,它是一个可用的控制台应用程序。或者您可以简单地将代码粘贴到您的应用程序中以启动HttpListener和回调函数,这非常简单明了。 - cviejo

0

如果您在远程调试中以调试模式启动Chrome,然后通过指定的端口连接到它,那么您可能可以做到这一点,但这有点麻烦。

您可以尝试调查Adobe Brackets是如何实现的,但我觉得它使用的是相同的方法。


你能否给我更多关于此的信息,因为我对它非常陌生? - Sanket Shah
基本上,在我给你的链接中,你会找到如何在特定端口上启动 Chrome 调试模式的信息。有了这些信息,你可以打开 http:\localhost:<portYouSpecified> 或者一个连接到该端口的套接字,然后你就可以直接与 Chrome 建立联系了。我不确定你如何访问扩展程序,但是你可以打开页面和其他类似的东西。关于如何做到这一点的更多信息,你可以在 Chrome 的支持论坛上找到,因为这与 C# 没有关系。 - dutzu

0

大多数 Google Chrome 扩展都是用 HTML、CSS 或 Javascript 编写的。然后,将您的扩展目录打包成一个 .crx Chrome 扩展文件就像运行一个简短的 Python 脚本 一样简单。但是,C# 可以被转换为 Javascript,您可以为您的扩展编写自己的业务逻辑。看看 Script#


并不是这样,我想创建一个自动化工具,可以记录某些HTML事件,比如填写表单,并相应地播放。我已经用C#为Internet Explorer编写了所有内容,但对于Chrome,我真的没有任何选项该怎么做? - Sanket Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接