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)
| 归档时间: |
|
| 查看次数: |
551 次 |
| 最近记录: |