Comment exécuter un script Python à partir de HTML dans Google Chrome ?
P粉471207302
P粉471207302 2023-11-02 23:34:24
0
1
1072

Je construis une extension Chrome et je souhaite exécuter un script Python depuis mon PC en cliquant sur un bouton de l'extension (essentiellement HTML). Le script Python utilise le pilote Web Selenium pour récupérer les données du site Web et les stocker dans un autre fichier journal.

P粉471207302
P粉471207302

répondre à tous(1)
P粉316110779

Vous utilisez essentiellement nativeMessaging. Il vous permet de créer un pont de communication entre votre extension et un processus externe (comme python).

nativeMessaging fonctionne sur votre ordinateur et communique avec l'extension Chrome via stdin et stdout. Par exemple :

Hébergement avec Python

C'est ainsi que vous écrivez un hôte nativeMessaging en python, j'ai inclus l'exemple complet de la documentation mais c'est plus facile à comprendre avec moins de code.

host.py

Il s'agit essentiellement d'un serveur d'écho qui respecte stdin et stdout, garantissant qu'il est envoyé sous forme de flux binaire.

#!/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()

host.json

Cela définit l'hôte de communication python, en vous assurant que le guid de l'extension est le guid de votre extension.

{
  "name": "com.google.chrome.example.echo",
  "description": "Chrome Native Messaging API Example Host",
  "path": "host.bat",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
  ]
}

Hôte.bat

Cela exécutera l'exécutable python.

@echo off
python "%~dp0/host.py" %*

Installer host.bat

Vous exécutez ceci une fois pour enregistrer votre hôte auprès du système d'exploitation.

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo" /ve /t REG_SZ /d "%~dp0host.json" /f

Extensions Chrome

manifest.json

Ajouter nativeMessing autorisations

{
  "permissions": [
    "nativeMessaging"
  ]
}

communication.js

Pour vous connecter à l'hôte python, vous devez procéder comme suit :

const hostName = "com.google.chrome.example.echo";
let port = chrome.runtime.connectNative(hostName);
port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnected);

Pour envoyer un message à votre hôte python, envoyez simplement un objet json au port.

const message = {"text": "Hello World"};
if (port) {
    port.postMessage(message);
}

Pour connaître l'erreur lors de la déconnexion :

function onDisconnected() {
  port = null;
  console.error(`Failed to connect: "${chrome.runtime.lastError.message}"`);
}

L'exemple complet est dans la documentation, j'ai juste renommé certains éléments pour plus de clarté, fonctionne sous Windows/Unix https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions /docs/examples /api/nativeMessaging

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal