Код: Выделить всё
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);
}
});
Код: Выделить всё
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)
В целом, мне не важно использовать нативные сообщения. Мне просто нужно найти надежный способ организовать взаимодействие между расширением и настольным приложением. Я рассмотрел сервер WebSocket, но обнаружил информацию, что он может быть приостановлен браузером, несмотря на использование Ping. Кроме того, манифестная версия для меня не критична (в настоящее время использует v3).
Подробнее здесь: https://stackoverflow.com/questions/794 ... saging-api
Мобильная версия