API Chrome Native Messaging chrome.runtime.connectNative не является функцией

8

Я ищу, чтобы манипулировать страницей контента, которая сейчас находится на вкладке в Chrome, и если это ниже не может сделать это, мне нужно найти способ сделать это!

Привет всем, я пытаюсь получить это новое расширение chrome, работающее с моей программой на С#, чтобы передавать сообщения туда и обратно. Я видел много демонстраций кода в stackoverflow и, в основном, то, что я делал, но кажется, что все примеры не работают на моем конце.

У меня возникает проблема: я получаю сообщение об ошибке:

Connecting to native messaging host com.google.chrome.example.echo
Uncaught TypeError: chrome.runtime.connectNative is not a function

Изображение 56043

Всякий раз, когда я пытаюсь "подключиться" к порту.

Не уверен, что я делаю неправильно, так как я следил за другими териториями здесь, и все они, похоже, утверждают, что это работает....

JS main.js:

var port = null;
var getKeys = function (obj) {
    var keys = [];
    for (var key in obj) {
        keys.push(key);
    }
    return keys;
}
function appendMessage(text) {
    document.getElementById('response').innerHTML += "<p>" + text + "</p>";
}
function updateUiState() {
    if (port) {
        document.getElementById('connect-button').style.display = 'none';
        document.getElementById('input-text').style.display = 'block';
        document.getElementById('send-message-button').style.display = 'block';
    } else {
        document.getElementById('connect-button').style.display = 'block';
        document.getElementById('input-text').style.display = 'none';
        document.getElementById('send-message-button').style.display = 'none';
    }
}
function sendNativeMessage() {
    message = { "text": document.getElementById('input-text').value };
    port.postMessage(message);
    appendMessage("Sent message: <b>" + JSON.stringify(message) + "</b>");
}
function onNativeMessage(message) {
    appendMessage("Received message: <b>" + JSON.stringify(message) + "</b>");
}
function onDisconnected() {
    appendMessage("Failed to connect: " + chrome.runtime.lastError.message);
    port = null;
    updateUiState();
}
function connect() {
    var hostName = "com.google.chrome.example.echo";
    appendMessage("Connecting to native messaging host <b>" + hostName + "</b>")
    console.log("Connecting to native messaging host " + hostName);
    port = chrome.runtime.connectNative(hostName);
    port.onMessage.addListener(onNativeMessage);
    port.onDisconnect.addListener(onDisconnected);
    updateUiState();
}
document.addEventListener('DOMContentLoaded', function () {
    document.getElementById('connect-button').addEventListener(
        'click', connect);
    document.getElementById('send-message-button').addEventListener(
        'click', sendNativeMessage);
    updateUiState();
});

манифест. json:

{
  // Extension ID: knldjmfmopnpolahpmmgbagdohdnhkik
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcBHwzDvyBQ6bDppkIs9MP4ksKqCMyXQ/A52JivHZKh4YO/9vJsT3oaYhSpDCE9RPocOEQvwsHsFReW2nUEc6OLLyoCFFxIb7KkLGsmfakkut/fFdNJYh0xOTbSN8YvLWcqph09XAY2Y/f0AL7vfO1cuCqtkMt8hFrBGWxDdf9CQIDAQAB",
  "name": "Native Messaging Example",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Send a message to a native application.",
  "app": {
    "launch": {
      "local_path": "main.html"
    }
  },
  "icons": {
    "128": "icon-128.png"
  },
  "permissions": [
    "nativeMessaging"
  ]
}

Реестр:

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo" /ve /t REG_SZ /d "%~dp0com.google.chrome.example.echo-win.json" /f

Код С#:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace talkWithChromeCSharp
{
    class Program
    {
        public static void Main(string[] args)
        {
            JObject data;
            while ((data = Read()) != null)
            {
                var processed = ProcessMessage(data);
                Write(processed);
                if (processed == "exit")
                {
                    return;
                }
            }
        }

        public static string ProcessMessage(JObject data)
        {
            var message = data["message"].Value<string>();
            switch (message)
            {
                case "test":
                    return "testing!";
                case "exit":
                    return "exit";
                default:
                    return "echo: " + message;
            }
        }

        public static JObject Read()
        {
            var stdin = Console.OpenStandardInput();
            var length = 0;

            var lengthBytes = new byte[4];
            stdin.Read(lengthBytes, 0, 4);
            length = BitConverter.ToInt32(lengthBytes, 0);

            var buffer = new char[length];
            using (var reader = new StreamReader(stdin))
            {
                while (reader.Peek() >= 0)
                {
                    reader.Read(buffer, 0, buffer.Length);
                }
            }

            return (JObject)JsonConvert.DeserializeObject<JObject>(new string(buffer))["data"];
        }

        public static void Write(JToken data)
        {
            var json = new JObject();
            json["data"] = data;

            var bytes = System.Text.Encoding.UTF8.GetBytes(json.ToString(Formatting.None));

            var stdout = Console.OpenStandardOutput();
            stdout.WriteByte((byte)((bytes.Length >> 0) & 0xFF));
            stdout.WriteByte((byte)((bytes.Length >> 8) & 0xFF));
            stdout.WriteByte((byte)((bytes.Length >> 16) & 0xFF));
            stdout.WriteByte((byte)((bytes.Length >> 24) & 0xFF));
            stdout.Write(bytes, 0, bytes.Length);
            stdout.Flush();
        }
    }
}

файл com.google.chrome.example.echo-win.json:

{
  "name": "com.google.chrome.example.echo",
  "description": "Chrome Native Messaging API Example Host",
  "path": "native-messaging-example-host.bat",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
  ]
}

HTML main.html:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <script src='main.js'></script>
</head>
<body>
    <button id='connect-button'>Connect</button>
    <input id='input-text' type='text' />
    <button id='send-message-button'>Send</button>
    <div id='response'></div>
</body>
</html>

Моя структура каталогов в Visual Studio:

C:\Users\t||||||\Documents\Visual Studio 2012\Projects\talkWithChromeCSharp\talkWithChromeCSharp
   -APP
     |-icon-128.png
     |-main.html
     |-main.js
     |-manifest.json
   -bin
     |-Debug
        |-Newtonsoft.Json.dll
        |-talkWithChromeCSharp.exe
        |-etc etc...
     |-Release
   -obj
   -Properties
   -regs
     |-com.google.chrome.example.echo-win.json
     |-install_host.bat
     |-etc etc...

После запуска VS debug я устанавливаю плагин и загружаю файл main.html в браузере Chrome и нажимаю кнопку "connect". Это когда я получаю эту ошибку.

Что мне не хватает?

UPDATE

Это правильный идентификатор для него. Я сохранил это так, так как я предполагаю, что "КЛЮЧ" - это то, что определяет идентификатор.

Изображение 56044 Изображение 56045

  • 0
    "" allow_origins ": [" chrome-extension: // knldjmfmopnpolahpmmgbagdohdnhkik / "]" -> это копия, вставленная со страницы примера ... каков ваш идентификатор расширения? попробуйте использовать правильный
  • 0
    @DanielBatkilin это неверно. Это правильный идентификатор для этого ключа.
Показать ещё 6 комментариев
Теги:
google-chrome
google-chrome-app
chrome-native-messaging

4 ответа

6

Слишком много путаниц и не совсем понятно, что действительно сработало для меня. Поэтому здесь я пытаюсь сделать документ `` idiot proof`. (Пожалуйста, улучшите эту версию)

Цель: ОС Windows, Google chrome до версии 50, протестированы, общаются с родным приложением


Шаг 1:


Скачать: https://developer.chrome.com/extensions/examples/api/nativeMessaging/app.zip

Шаг 2:


Загрузите загруженное приложение в Google Chrome

Изображение 148695

Шаг 3:


a) добавить раздел реестра

REG ADD "HKLM\Software\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo" /ve /t REG_SZ /d "C:\\run-my-exe\\manifest.json" /f

Изображение 148696

b) Чтобы создать пользовательский chrome-исполнитель, скопируйте следующее в C:\run-my-exe\run-chrome.bat:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable--native-messaging --native-messaging-hosts="com.google.chrome.example.echo=C:\\run-my-exe\\manifest.json"

Шаг 4: Хост


a) введите следующий код в C:\run-my-exe\manifest.json

{
  "name": "com.google.chrome.example.echo",
  "description": "Chrome Native Messaging API Example Host",
  "path": "native-messaging-example-host.bat",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
  ]
}

b) введите следующую команду в C:\run-my-exe\native-messaging-example-host.bat

@echo off
cd %windir%\system32
start calc.exe

Шаг 5: Как мне его запустить?


a) открыть хром с этим script: C:\\run-my-exe\\run-chrome.bat

b) в хроме перейдите к chrome://apps

c) запуск

с помощью значка

Изображение 148697

не ниже:

Изображение 148698

Конечный результат:

Изображение 148699

  • 0
    Спасибо за эти инструкции. Сначала это не работало для меня, но сейчас. Ранее я пробовал приложение и имел тот же ключ реестра в текущем пользователе, а также на локальном компьютере. Текущий ключ пользователя недействителен. После удаления и повторного запуска у меня выскакивает калькулятор. Один вопрос, есть ли способ вызвать exe с параметром?
  • 2
    @YumYumYum, но подождите , не собирается ли Google удалить приложения Chrome из Chrome к 2018 году? См. Blog.chromium.org/2016/08/from-chrome-apps-to-web.html, иными словами, это больше не сработает в будущем? Я отправил запрос на docs.google.com/forms/d/e/…, чтобы запросить его для включения в будущем, но нам нужно больше людей, сообщающих команде Chrome, что важен собственный обмен сообщениями.
Показать ещё 6 комментариев
2

Вы не должны открывать main.html напрямую, а скорее из приложения Chrome App Launcher на chrome://apps/

  • 1
    ДА - запуск из chrome://apps/ все заработало. Но как я могу запустить его как http://localhost или https://myserver.com/sameapp и подключиться таким же образом?
  • 1
    Я не совсем уверен, но я думаю, что вы добавляете приложение в Chrome Web Store, и люди устанавливают его локально.
Показать ещё 1 комментарий
1

Поскольку вы используете проект С#, который генерирует в качестве вывода файл exe, файл native-messaging-example-host.bat не должен выглядеть как оригинальный пример, который был следующим:

python "%~dp0/native-messaging-example-host" %*

Вместо этого командный файл должен измениться следующим образом:

@echo off
Pushd C:\Users\h.aghajani\Desktop\host  /*Path directory of your exe*/
start native-messaging-example-host.exe /*Name of the execution file*/
1

Остерегайтесь копирования-вставки!

https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging/app/manifest.json

Я бы предположил, что там, где вы получили свой манифест. Замените "ключ" соответствующим

а в "allowed_origins" используйте ваш фактический идентификатор расширения вместо одного из примера

https://developer.chrome.com/apps/manifest/key

Там может быть больше ошибок, но это только те, которые я поймаю в первый раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню