Maison  >  Questions et réponses  >  le corps du texte

Comment exécuter un script Python à partir de HTML dans Google Chrome ?

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粉471207302P粉471207302351 Il y a quelques jours1003

répondre à tous(1)je répondrai

  • P粉316110779

    P粉3161107792023-11-03 14:40:52

    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< /a>

    répondre
    0
  • Annulerrépondre