4

Ich versuche eine PHP-Klasse zu erstellen, die mit Native Messaging über eine Chrome Extension kommunizieren kann.Chrome Native Messaging mit PHP

kann ich meinen Code verbinden, aber bei der Initiation Chrome sendet

chrome-extension://lkjcciocnocjjgpacggbaikjehbfedbl/ --parent-window=1837060 

Zu meiner PHP-Konsole app (The Host). Was antworte ich, damit die Verbindung funktioniert? Unter meinem PHP-Code. Ja, es ist dreckig, weil es ein POC-Projekt ist, und ich bin sehr neu in Chrome Extensions vor allem mit den aktuellen Updates.

function out($data = ""){ 
    $fp = fopen("php://stdout", "w"); 
    if($fp){ 
     $response = array("text" => "Ok"); 
     $message = json_encode($response); 
     fwrite($fp, $message); 
     fflush($fp); 
     slog("[OUTPUT] " . json_encode($response)); 
     fclose($fp); 
     exit(0); 
    }else{ 
     slog("Can't open output stream."); 
     exit(1); 
    } 
} 

function err($data){ 
    $fp = fopen("php://stderr", "w"); 
    if($fp){ 
     fwrite($fp, $data); 
     fflush($fp); 
     fclose($fp); 
    } 
    return; 
} 

function in(){ 
    $data = ""; 
    $fp = fopen("php://stdin", "r"); 
    if($fp){ 
     $data = fgets($fp); 
     fclose($fp);  
    }else{ 
     slog("Can't open input stream."); 
     exit(1); 
    } 
    slog("[INPUT]" . $data); 
    return $data; 
} 

function slog($data){ 
    if($data != ""){ 
     file_put_contents("./log.txt", date("r").": {$data}\r\n", FILE_APPEND); 
    } 
} 

slog("Entering"); 
while(true){ 
    if(($l = in()) !== ""){ 
     out($l); 
    }else{ 
     exit(0); 
    } 
} 
exit(0); 

Mein background.js Code. (Die Erweiterung)

var port = null; 
var hostName = "com.google.chrome.poc-extension"; 

function appendMessage(text) { 
    document.getElementById('response').innerHTML += "<p>" + text + "</p>"; 
} 

function updateUiState() { 
    if (port) { 
     document.getElementById('connect-button').style.display = 'none'; 
    }else{ 
     document.getElementById('connect-button').style.display = 'block'; 
    } 
} 

function sendNativeMessage() { 
    port = chrome.runtime.connectNative(hostName); 
    port.onMessage.addListener(onNativeMessage); 

    message = {"text": document.getElementById('input-text').value}; 
    port.postMessage(message); 
    appendMessage("Sent message: <b>" + JSON.stringify(message) + "</b>"); 
} 
function onNativeMessage(message) { 
    alert(message); 
    appendMessage("Received message: <b>" + JSON.stringify(message) + "</b>"); 
} 
function onDisconnected() { 
    appendMessage("Failed to connect: " + chrome.runtime.lastError.message); 
    console.log(chrome.runtime.lastError); 
    port = null; 
    updateUiState(); 
} 
function connect() { 
    appendMessage("Connecting to native messaging host <b>" + hostName + "</b>") 
    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(); 
}); 

Es gibt this Python Beispiel app, aber ich habe nicht wirklich das, was es genau funktioniert. Außerdem benutzt es das Tkinter-Plugin, das ich nicht will. Ich möchte eine saubere, einfache und einfache Erweiterung.

+0

Das erste Zitat ist nicht auf stdin gesendet, sind diejenigen Befehlszeilenparameter. Wenn Sie es in Ihrem PHP-Code sehen, dann stimmt etwas nicht. Wie beim Python-Beispiel ist der sinnvolle Teil send_message und read_thread_func. Das [Protokoll] (https://developer.chrome.com/extensions/nativeMessaging#native-messaging-host-protocol) ist einfach und in der Dokumentation beschrieben: ** 4 Byte Länge **, JSON-ified-Nachricht. – wOxxOm

+0

Klingt plausibel. Gonna überprüfen und bald antworten. –

+0

@wOxxOm chrome scheint stdin nicht richtig zu pipen. Ich verwende eine Windows .bat-Datei, wie die Python-Beispielanwendung. '' 'echo% * | php -f "% ~ dp0/native_host.php" '' ' –

Antwort

7

Native Messaging verwendet strukturierte Daten (längenformatiert) zum Lesen und Schreiben. Im Browser (JavaScript) wurde diese Struktur vom Browser verarbeitet. Wenn Sie mit Native Messaging kommunizieren möchten, müssen Sie dieser Struktur folgen. Read refference here

Jede Nachricht JSON serialisiert wird verwendet, UTF-8 codiert und wird mit 32-Bit-Nachrichtenlänge in nativer Bytereihenfolge voraus.

So müssen Sie Ihre Nachricht senden, wie: len(message) + [your message]

len (Nachricht) muss nach dem Protokoll verpackt werden.

Beispiel Funktionsausgabe senden:

function out($data = ""){ 
    $fp = fopen("php://stdout", "w"); 
    if($fp){ 
     $response = array("text" => "Ok"); 
     $message = json_encode($response); 
     //Send the length of data 
     fwrite($fp, pack('L', strlen($message))); 
     fwrite($fp, $message); 
     fflush($fp); 
     slog("[OUTPUT] " . json_encode($response)); 
     fclose($fp); 
     exit(0); 
    }else{ 
     slog("Can't open output stream."); 
     exit(1); 
    } 
} 

Eingang gelesen:

function in(){ 
    $data = ""; 
    $fp = fopen("php://stdin", "r"); 
    if($fp){ 
     //Read first 4 bytes as unsigned integer 
     $len = current(unpack('L', fread($fp, 4))); 
     $data = fread($fp, $len); 
     fclose($fp); 
    }else{ 
     slog("Can't open input stream."); 
     exit(1); 
    } 
    slog("[INPUT]" . $data); 
    return $data; 
} 
Verwandte Themen