javascript - 如何在谷歌浏览器中从 HTML 运行 python 脚本?

标签 javascript python selenium flask google-chrome-extension

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

最佳答案

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

方式nativeMessaging工作原理是在您的计算机上安装一个主机,并通过标准输入和标准输出与 Chrome 扩展进行通信。例如:

Python 中的主机

这就是您编写 nativeMessaging 的方式host 在 python 中,我已经从文档中包含了这个的完整示例,但是用更少的代码让它更容易理解。

主机.py

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

#!/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。

{
  "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" %*

安装主机.bat

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

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

Chrome 扩展

list .json

添加nativeMessing的权限

{
  "permissions": [
    "nativeMessaging"
  ]
}

通信.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

关于javascript - 如何在谷歌浏览器中从 HTML 运行 python 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53544104/

相关文章:

javascript - 检查某人的带宽并根据它加载内容

JavaScript 来自 Stoyan Stefanov 面向对象 JavaScript 的第 195 页

javascript - 如何使缩略图幻灯片仅显示缩略图图片

c# - 'ElementNotVisibleException :element not interactable' error locating Google Search button even though element was waited for on Google Home Page

python-3.x - 如何在 Python 3 中使用 Selenium 模块 (FireFox) 下载 PDF

javascript - 如何始终显示 AddThis 的共享计数器?

python - 为什么同行打印之间没有延迟?

python - PySpark 查找一列中的模式是否存在于另一列中

python - 为什么模型甚至不能预测正弦

selenium - 无法让 selenium 命令行运行 HTML 测试和记录输出,然后退出 w/status 反射(reflect)测试结果