Chrome原生消息-手动执行主机

pcww981p  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(109)

我正在尝试创建一个使用本地消息传递的Web扩展,它可以与Web API交互。因此,这个想法是当有人通过API发送消息时,扩展也会接收它。
我按照firefox example的步骤操作。到目前为止一切顺利,我能够在主机和扩展之间进行通信。
下面是我的主机代码,使用的是flask框架:

import json
import sys
import struct
import threading
import os
from flask import Flask, request, jsonify, Response, abort

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

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

thread = threading.Thread(target=get_message_background)
thread.daemon = True
thread.start()

app = Flask(__name__)

@app.route("/test", methods=['GET'])
def test():
    send_message(encode_message('testing'))
    return 'testing'

app.run('localhost', 5001, debug=True)

有了这个代码,我收到一个ping和回应一个pong。
问题是当我试图在终端上运行代码时,本地消息传递通过stdio进行通信,当我在终端上运行脚本时,终端变成了标准的输入和输出。
如果我只是加载扩展, flask 不启动。
有人解决了这个问题吗?
PS:对不起我的英语

vh0rcniy

vh0rcniy1#

stdout重定向到脚本开头的文件,就在导入之后:

sys.stdout = open("log.txt", "a")

send_message()中,将stdout重定向到原始stdout,然后返回到文件:

def send_message(encoded_message):
    sys.stdout = sys.__stdout__ # to original stdout
    sys.stdout.write(encoded_message['length'])
    sys.stdout.write(encoded_message['content'])
    sys.stdout.flush()
    sys.stdout = open("log.txt", "a") # back to file

我通过向Flask服务器发送GET请求来切换Firefox标签页。

相关问题