suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Wie führe ich ein Python-Skript aus HTML in Google Chrome aus?

Ich erstelle eine Chrome-Erweiterung und möchte ein Python-Skript von meinem PC aus ausführen, indem ich auf eine Schaltfläche in der Erweiterung klicke (im Wesentlichen HTML). Das Python-Skript verwendet den Selenium-Webtreiber, um die Daten von der Website zu extrahieren und in einer anderen Protokolldatei zu speichern.

P粉471207302P粉471207302436 Tage vor1097

Antworte allen(1)Ich werde antworten

  • P粉316110779

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

    您基本上使用nativeMessaging。它允许您在扩展程序和外部进程(例如 python)之间创建通信桥梁。

    nativeMessaging 的工作方式是在您的计算机,并通过 stdin 和 stdout 与 Chrome 扩展进行通信。例如:

    使用 Python 托管

    这就是您在 python 中编写 nativeMessaging 主机的方式,我已经包含了完整的示例来自文档,但使用更少的代码更容易理解。

    主机.py

    这基本上是一个回显服务器,尊重标准输入和标准输出,确保它作为二进制流发送。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

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

    主机.json

    这定义了通信 python 主机,确保扩展 guid 是您的扩展的 guid。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    {

      "name": "com.google.chrome.example.echo",

      "description": "Chrome Native Messaging API Example Host",

      "path": "host.bat",

      "type": "stdio",

      "allowed_origins": [

        "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"

      ]

    }

    主机.bat

    这将运行 python 可执行文件。

    1

    2

    @echo off

    python "%~dp0/host.py" %*

    安装主机.bat

    您运行一次,以在操作系统中注册您的主机。

    1

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

    Chrome 扩展程序

    manifest.json

    添加nativeMessing的权限

    1

    2

    3

    4

    5

    {

      "permissions": [

        "nativeMessaging"

      ]

    }

    通信.js

    为了连接到 python 主机,您需要执行以下操作:

    1

    2

    3

    4

    const hostName = "com.google.chrome.example.echo";

    let port = chrome.runtime.connectNative(hostName);

    port.onMessage.addListener(onNativeMessage);

    port.onDisconnect.addListener(onDisconnected);

    要向您的 python 主机发送消息,只需向端口发送一个 json 对象即可。

    1

    2

    3

    4

    const message = {"text": "Hello World"};

    if (port) {

        port.postMessage(message);

    }

    要知道断开连接时的错误:

    1

    2

    3

    4

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

    Antwort
    0
  • StornierenAntwort