使用PHP进行Chrome原生消息传递

Dig*_*man 5 javascript php google-chrome-extension chrome-native-messaging

我正在尝试构建一个可以通过Native Messaging与Chrome Extention进行通信的PHP类.

我可以连接到我的代码,但在启动时Chrome会发送

chrome-extension://lkjcciocnocjjgpacggbaikjehbfedbl/ --parent-window=1837060
Run Code Online (Sandbox Code Playgroud)

到我的PHP控制台应用程序(主机).我该怎么回复才能使连接正常工作?在我的PHP代码下面.是的,它很脏,因为它是一个POC项目,我对Chrome Extensions很新,特别是当前的更新.

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);
Run Code Online (Sandbox Code Playgroud)

我的background.js代码.(延伸)

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();
});
Run Code Online (Sandbox Code Playgroud)

这个Python示例应用程序,但我并没有真正得到它的确切做法.除此之外,它还使用了我不想要的Tkinter插件.我想要一个干净,简单和简单的扩展.

Moc*_*fin 10

Native Messaging使用结构化数据(长度格式化)进行读写.在浏览器(JavaScript)中,该结构已由浏览器处理.如果要与Native Messaging通信,则需要遵循该结构. 在这里阅读refference

每条消息都使用JSON,UTF-8编码进行序列化,并以本机字节顺序的32位消息长度开头.

所以你需要发送你的消息: len(message) + [your message]

必须按照协议打包len(message).

发送输出的示例函数:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

读输入:

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;
}
Run Code Online (Sandbox Code Playgroud)