Я создаю расширение Chrome, и я хочу запустить скрипт python, который находится на моем компьютере, при нажатии кнопки из расширения (которое в основном является HTML). Сценарий python использует веб-драйвер selenium для очистки данных с веб-сайта и сохранения их в другом файле журнала.
Не могли бы вы объяснить, как это сделать? Я не могу понять.
Изучите код демонстрационного расширения и демонстрационного хост-приложения в этой документации, я думаю, что это довольно тривиально. Или попробуйте найти учебник, который вам больше нравится.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы в основном используете nativeMessaging. Он позволяет вам создать коммуникационный мост между вашим расширением и внешним процессом (например, python).
nativeMessaging работает путем установки хозяин на вашем компьютере и обмена данными с расширением Chrome через stdin и stdout. Например:
Вот как вы пишете свой хост nativeMessaging на python, я включил полный пример этого из документации, но упростил понимание с меньшим количеством кода.
Это в основном эхо-сервер, уважающий stdin и stdout, проверяет, что он отправляет его как двоичный поток.
#!/usr/bin/env python
import struct
import sys
import os, msvcrt
# Set the I/O to O_BINARY to avoid modifications from input/output streams.
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
# Helper function that sends a message to the webapp.
def send_message(message):
# Write message size.
sys.stdout.write(struct.pack('I', len(message)))
# Write the message itself.
sys.stdout.write(message)
sys.stdout.flush()
# Thread that reads messages from the webapp.
def read_thread_func():
message_number = 0
while 1:
# Read the message length (first 4 bytes).
text_length_bytes = sys.stdin.read(4)
if len(text_length_bytes) == 0:
sys.exit(0)
# Unpack message length as 4 byte integer.
text_length = struct.unpack('i', text_length_bytes)[0]
# Read the text (JSON object) of the message.
text = sys.stdin.read(text_length).decode('utf-8')
send_message('{"echo": %s}' % text)
def Main():
read_thread_func()
sys.exit(0)
if __name__ == '__main__':
Main()
Это определяет коммуникационный хост python, убедитесь, что гид расширения является гидом вашего расширения.
{
"name": "com.google.chrome.example.echo",
"description": "Chrome Native Messaging API Example Host",
"path": "host.bat",
"type": "stdio",
"allowed_origins": [
"chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
]
}
Это запускает исполняемый файл python.
@echo off
python "%~dp0/host.py" %*
Вы запускаете это один раз, чтобы зарегистрировать свой хост в вашей ОС.
REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo" /ve /t REG_SZ /d "%~dp0host.json" /f
Добавьте разрешения для nativeMessing
{
"permissions": [
"nativeMessaging"
]
}
Чтобы подключиться к хосту python, вам необходимо сделать следующее:
const hostName = "com.google.chrome.example.echo";
let port = chrome.runtime.connectNative(hostName);
port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnected);
Чтобы отправить сообщение на ваш хост Python, просто отправьте объект json в порт.
const message = {"text": "Hello World"};
if (port) {
port.postMessage(message);
}
Чтобы узнать ошибку при отключении:
function onDisconnected() {
port = null;
console.error(`Failed to connect: "${chrome.runtime.lastError.message}"`);
}
Этот полный пример находится в документации, я просто переименовал некоторые вещи для ясности, доступен для Windows / Unix https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging
См. nativeMessaging.