8

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

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

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

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

enter image description here

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

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

В 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(); 
}); 

manifest.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 

C# код:

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 отладки установить плагин и загрузить файл main.html на хромированной браузере и нажмите кнопку «Connect». Вот когда я получаю эту ошибку.

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

UPDATE

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

enter image description here enter image description here

+0

" "allowed_origins": [ "хром-расширение: // knldjmfmopnpolahpmmgbagdohdnhkik /" ] "-> это скопировать копию с примера страницы .. wha t - ваш идентификатор расширения? попробуйте использовать правильный – DannyZB

+0

@ DanielBatkilin thats wrong. Его правильный идентификатор для этого ключа. – StealthRT

+0

@Teepeemm Я изменил тег. Спасибо что подметил это. – StealthRT

ответ

2

Вы не должны открывать main.html непосредственно, а из Хрома App Launcher в хроме: // Приложения/

+1

ДА - запуск с 'chrome: // apps /' работал. Но как я могу запустить его, как 'http: // localhost' или' https: // myserver.com/sameapp' и подключиться одинаково? – YumYumYum

+1

Я не совсем уверен, но я думаю, что вы добавляете приложение в Интернет-магазин Chrome, и люди устанавливают его локально. – Chet

+0

Смотрите, что проблема, никогда не было хорошо документировано, как использовать ее с http: // или https: //. Мне нужно использовать его, не используя хром: // концепция приложений. – YumYumYum

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

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

1

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

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*/ 
6

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

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


Шаг 1:


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

Шаг 2:


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

enter image description here

Шаг 3:


а) добавить ключ реестра

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

enter image description here

б) Чтобы сделать оригинальный хром исполнителя, скопируйте следующий код в C: \ Run-My-ех \ Run-хром.Летучая мышь:

"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: Хост


а) положить следующее C: \ Run-My-ех \ 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-examp ле-host.bat

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

Шаг 5: Как я теперь запустить?


а) открыт хром с помощью этого сценария: C:\\run-my-exe\\run-chrome.bat

б) в хроме пойти chrome://apps

с) запуск

через иконку

enter image description here

не ниже:

enter image description here

Окончательный выход:

enter image description here

+0

Спасибо за эти инструкции. Сначала это не работало для меня, но сейчас. Я ранее пробовал приложение и имел тот же раздел реестра как у текущего пользователя, так и на локальной машине. Текущий ключ пользователя недействителен. После удаления и повторного запуска у меня появляется всплывающее окно. Один вопрос, есть ли способ вызвать exe с параметром? – JustAspMe

+2

@YumYumYum, ** Но подождите **, разве Google не собирается удалять Chrome Apps из Chrome к 2018 году? См. Https://blog.chromium.org/2016/08/from-chrome-apps-to-web.html, другими словами, это больше не будет работать в будущем? Я отправил запрос на https://docs.google.com/forms/d/e/1FAIpQLSenHdpA8_eqKiVOrWDjWe_KTfJmoSBEqFIh6SMwQ-NRDJnx1Q/viewform, чтобы запросить его для включения в будущем, но нам нужно больше людей, сообщающих команде Chrome, что собственные сообщения Важный. – Pacerier

+0

НЕТ - позволяет закрыть приложения Chrome из Google Chrome, они пугают планету, так как сообществу мы должны править Google хром, а Google Chrome не должен нас править. – YumYumYum