Пример расширения Firefox для Native-Messaging «ping_pong» не работает из-за TypeError - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать native-сообщения в расширении Firefox.Я попытался построить пример из этого https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_messaging

Я скопировал / вставил весь код и настроил его так, как описано на странице, и он отправляет «Ping», но не получает «Pong»назад.В консоли браузера указано TypeError: требуется байтоподобный объект, а не строка 17 в приложении python.Что я могу сделать?

Я использую windows 7 и python 3.x Веб-расширение отправляет объект json в приложение, которое затем проверяет длину и struct.unpacks сообщение.Если сообщение «ping», оно пытается создать struct.pack и json.dumps «pong» ответа, который веб-расширение получает в качестве ответа.Оба сообщения и любые ошибки записываются в console.log.

, в котором говорится в примере:

Обратите внимание, что для запуска Windows требуется Python с флагом -u,

, чтобы гарантировать, что stdin и stdout открываются в двоичном режиме, а не

, а не в текстовом режиме.

И я настроил стартовый скрипт .bat для включения флага -u,но похоже, что python все еще читает stdin как строку, которая затем выдает TypeError при попытке struct.unpack.

web-расширение background.js для отправки ping:

/*
On startup, connect to the "ping_pong" app.
*/
var port = browser.runtime.connectNative("ping_pong");

/*
Listen for messages from the app.
*/
port.onMessage.addListener((response) => {
  console.log("Received: " + response);
});

/*
On a click on the browser action, send the app a message.
*/
browser.browserAction.onClicked.addListener(() => {
  console.log("Sending:  ping");
  port.postMessage("ping");
});

pythonприложение для получения ping и отправки pong:

#!/usr/bin/python -u

# Note that running python with the `-u` flag is required on Windows,
# in order to ensure that stdin and stdout are opened in binary, rather
# than text, mode.

import json
import sys
import struct


# Read a message from stdin and decode it.
def get_message():
    raw_length = sys.stdin.read(4)
    if not raw_length:
        sys.exit(0)
    message_length = struct.unpack('=I', raw_length)[0]
    message = sys.stdin.read(message_length)
    return json.loads(message)


# Encode a message for transmission, given its content.
def encode_message(message_content):
    encoded_content = json.dumps(message_content)
    encoded_length = struct.pack('=I', len(encoded_content))
    return {'length': encoded_length, 'content': encoded_content}


# Send an encoded message to stdout.
def send_message(encoded_message):
    sys.stdout.write(encoded_message['length'])
    sys.stdout.write(encoded_message['content'])
    sys.stdout.flush()


while True:
    message = get_message()
    if message == "ping":
        send_message(encode_message("pong"))

Это строка, которая выдает ошибку TypeError:

message_length = struct.unpack('=I', raw_length)[0]

В журнале должно быть указано: Отправка: ping Получено: pong

В журнале фактически написано: Отправка: ping

stderr output from native app ping_pong: Traceback (most recent call last):
stderr output from native app ping_pong:   File "C:\\Users\\ping_pong\\ping_pong.py", line 37, in <module>
stderr output from native app ping_pong:     message = get_message()
stderr output from native app ping_pong:   File "C:\\Users\\ping_pong\\ping_pong.py", line 17, in get_message
stderr output from native app ping_pong:     message_length = struct.unpack('=I', raw_length)[0]
stderr output from native app ping_pong: TypeError: a bytes-like object is required, not 'str'
...