es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo enviar/recibir mensajes de texto a través de nativeMessaging en Chrome?

Estoy tratando de enviar la URL de la pestaña activa actualmente a un script de Python. Mi extensión ya comienza a ejecutar el script e intenta enviar la URL. Sin embargo, hasta ahora no he tenido éxito en recibir la URL con el script en ejecución.

popup.js:

dlvideo.addEventListener("click", async () => {
    chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
        // Obtener la URL actual
        url = tabs[0].url;

        // Conectar con el script de Python
        port = chrome.runtime.connectNative('com.ytdlp.batdlvideo');
        port.onDisconnect.addListener(function() {
            console.log("Desconectado");
        });
        port.onMessage.addListener(function(msg) {
            console.log("Recibido" + msg);
        });

        // Enviar la URL al script
        port.postMessage({ text: url });
    });
});

dlvideo.py (el código parece quedarse atascado aquí al comienzo del bucle while):

import sys

if sys.platform == "win32":
    import os, msvcrt
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

url = None
while True:
    # El bucle parece quedarse atascado aquí:
    text_length_bytes = sys.stdin.read(4)

    if len(text_length_bytes) == 0:
        print("test.py: sys.exit0")
        sys.exit(0)

    text_length = struct.unpack('i', text_length_bytes)[0]
    text = sys.stdin.read(text_length).decode('utf-8')
    if text.startswith('http'):
        url = text
        print(str(url))
        break
    else:
        print(text)

Otros archivos probablemente no sean relevantes, pero los colocaré aquí por si acaso:
yt_dlp.bat:

@echo off
start cmd /k python "%~dp0/dlvideo.py" %*

manifestAPP.json:

{
    "name": "com.ytdlp.batdlvideo",
    "description": "Youtube-dlp",
    "path": "C:\\Users\\.....\\native-apps\\dlvideo\\yt_dlp.bat",
    "type": "stdio",
    "allowed_origins": [
        "chrome-extension://-extensionid-/"
    ]
}

¿Alguien puede ayudar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema puede residir en la implementación del script dlvideo.py. Específicamente, el script parece quedarse atrapado en el bucle while True y puede que no pueda recibir el mensaje enviado por la extensión de Chrome.

    Una posible solución podría ser añadir un tiempo de espera a la llamada de la función sys.stdin.read(), lo cual podría evitar que el script quede atrapado en el bucle. Por ejemplo, podrías intentar añadir la siguiente línea después de la asignación de text_length_bytes:

    text_length_bytes = sys.stdin.read(4)
    if not text_length_bytes:
        continue
    

    Este código verificará si text_length_bytes es una cadena vacía (es decir, si sys.stdin.read() se agotó el tiempo de espera) y, en caso afirmativo, omitirá el resto del bucle.

    Además, puede ser útil añadir algunas declaraciones de registro en el script dlvideo.py para ayudar a diagnosticar cualquier problema. Por ejemplo, podrías añadir una instrucción de imprimir después de la llamada a sys.stdin.read() para registrar el valor de text_length_bytes.

    Finalmente, vale la pena señalar que el archivo manifestAPP.json incluye una clave allowed_origins que especifica el único dominio que tiene permitido conectarse a tu host de mensajería nativa. Asegúrate de que has especificado correctamente el ID de la extensión en esta clave.

Comments are closed.