¿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?
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 buclewhile 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 detext_length_bytes
:Este código verificará si
text_length_bytes
es una cadena vacía (es decir, sisys.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 asys.stdin.read()
para registrar el valor detext_length_bytes
.Finalmente, vale la pena señalar que el archivo
manifestAPP.json
incluye una claveallowed_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.