如何在谷歌chrome中从HTML运行python脚本



我正在构建一个chrome扩展,我想在我的PC中运行一个python脚本,只需点击扩展中的按钮(基本上是HTML(。python脚本使用selenium web驱动程序从网站抓取数据,并将其存储在另一个日志文件中。

您基本上使用本机消息。它允许您在扩展和外部进程(如python(之间创建一个通信桥梁。

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

Python中的主机

这就是你在python中编写原生测试主机的方式,我在文档中包含了完整的例子,但用更少的代码更容易理解。

主机.py

这基本上是一个echo服务器,尊重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()

host.json

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

{
"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可执行文件。

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

install_host.bat

您运行此操作一次,即可在操作系统中注册主机。

REG ADD "HKCUSoftwareGoogleChromeNativeMessagingHostscom.google.chrome.example.echo" /ve /t REG_SZ /d "%~dp0host.json" /f

Chrome扩展

manifest.json

添加nativeMessing的权限

{
"permissions": [
"nativeMessaging"
]
}

communication.js

为了连接到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

最新更新