Расширение Chrome: Native Messaging APIJavascript

Форум по Javascript
Ответить
Anonymous
 Расширение Chrome: Native Messaging API

Сообщение Anonymous »

Задача: реализовать 2 команды управления удаленным браузером: Opentab - Открытие новой вкладки и executustcript - выполнение скрипта на конкретной вкладке (и возвращение результата). Я решил попробовать API Native Messaging Message, но столкнулся с проблемой. Одна команда выполняется успешно, вторая - нет. Точнее, ответ от нативного хоста не достигает обслуживания.

Код: Выделить всё

const tabsObserver = new Map()

chrome.tabs.onUpdated.addListener(function (updatedTabId, changeInfo) {

if (changeInfo.status === "complete" && tabsObserver.has(updatedTabId)) {
resolveCallback = tabsObserver.get(updatedTabId);
resolveCallback();
}
});

var port = chrome.runtime.connectNative('com.example.native_messaging');
port.onMessage.addListener(async function (message) {

if (message.command === "openTab") {

const tab = await new Promise((resolve) => chrome.tabs.create({ url: message.url }, resolve));

let resolveCallback;
const promise = new Promise((resolve) => {
resolveCallback = resolve;
});
tabsObserver.set(tab.id, resolveCallback);
await promise;
tabsObserver.delete(tab.id);
port.postMessage({ tabId: tab.id });
}
else if (message.command === "executeScript") {

let resolveCallback;
const promise = new Promise((resolve) => {
resolveCallback = resolve;
});

// port.postMessage({ command: "test" });

chrome.tabs.sendMessage(message.tabId, message, (response) => {
resolveCallback(response);
});

port.postMessage(await promise);
}
});
код собственного хоста для тестирования (Python):

Код: Выделить всё

import sys
import json
import struct
import os
import ctypes

MessageBox = ctypes.windll.user32.MessageBoxW

if os.name == "nt":
import msvcrt
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

def send_message(message):
message_str = json.dumps(message)
sys.stdout.buffer.write(struct.pack("I", len(message_str)))
sys.stdout.buffer.write(message_str.encode("utf-8"))
sys.stdout.flush()

def read_message():
raw_length = sys.stdin.buffer.read(4)
if not raw_length:
return None
message_length = struct.unpack("I", raw_length)[0]
message_str = sys.stdin.buffer.read(message_length).decode("utf-8")
return json.loads(message_str)

if __name__ == "__main__":
send_message({ "command": "openTab", "url": "https://example.com" })
response = read_message()

send_message({ "command": "executeScript", "tabId": response["tabId"], "script": "document.title" })
try:
while True:
response = read_message()
if response is not None:
MessageBox(None, 'Extension response: ' + str(response), 'Native host', 0)
except:
MessageBox(None, 'Error on read message', 'Native Host', 0)
В результате вкладка открывается, данное код выполняется, результат правильно достигает службы, но в момент: port.postmessage (waw awat wromity); - происходит ошибка, утверждая, что порт закрыт. В то же время, если вы называете Port.postmessage , прежде чем await promise , то ответ от нативного хоста прибывает (как показано в комментарии). Можно предположить, что сам нативный хост закрывает соединение/сбои из-за какой-то ошибки в нужный момент, но я сделал петлю в конце и завернул его в блоке попытки. Возможно, обслуживающий работник выгружен браузером из -за неактивности в ожидании, и порт закрывается. Но я не совсем понимаю, как это работает. Если обслуживающий работник разгружается, то ошибка не должна происходить, потому что не будет продолжения выполнения кода. < /P>
В целом, мне не важно использовать нативные сообщения. Мне просто нужно найти надежный способ организовать взаимодействие между расширением и настольным приложением. Я рассмотрел сервер WebSocket, но обнаружил информацию, что он может быть приостановлен браузером, несмотря на использование Ping. Кроме того, манифестная версия для меня не критична (в настоящее время использует v3).

Подробнее здесь: https://stackoverflow.com/questions/794 ... saging-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»