如何通过Chrome nativeMessaging收发消息并将当前标签页URL传递到Python脚本
问题根源
你遇到的卡死问题由3个核心错误共同导致:
- 批处理脚本使用
start命令新开独立进程,导致Chrome和本地程序通信依赖的stdin/stdout管道断裂,Python进程无法收到Chrome发送的任何数据 - Python脚本缺少必要依赖导入,且未正确解析Chrome发送的JSON格式消息
- 直接使用
print输出内容到stdout,会破坏Chrome原生消息的通信协议,导致连接被强制断开
修复步骤
1. 重写yt_dlp.bat
删掉start相关逻辑,直接运行Python脚本保留通信管道,如果需要保留调试窗口可以把日志输出到stderr或者本地文件:
@echo off python "%~dp0/dlvideo.py" %*
如果你确实需要弹出独立cmd窗口显示运行日志,可以将脚本输出重定向到stderr(Chrome不会拦截stderr内容),同时保持stdout用于通信。
2. 修复dlvideo.py代码
补全依赖导入,增加JSON解析逻辑,避免直接操作stdout:
import sys import struct import json 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: text_length_bytes = sys.stdin.read(4) if len(text_length_bytes) == 0: # 调试输出走stderr,不占用通信管道 sys.stderr.write("test.py: sys.exit0\n") sys.stderr.flush() sys.exit(0) text_length = struct.unpack('<i', text_length_bytes)[0] # 明确指定小端序,兼容不同平台 text = sys.stdin.read(text_length).decode('utf-8') # 解析Chrome发送的JSON消息 try: msg = json.loads(text) if 'text' in msg and msg['text'].startswith('http'): url = msg['text'] sys.stderr.write(f"收到URL: {url}\n") sys.stderr.flush() break except json.JSONDecodeError: sys.stderr.write(f"收到非JSON消息: {text}\n") sys.stderr.flush() # 如果需要给Chrome返回响应,必须按照原生消息格式发送 # 示例:返回成功消息给扩展 resp_text = json.dumps({"status": "success", "url": url}) resp_bytes = resp_text.encode('utf-8') sys.stdout.write(struct.pack('<i', len(resp_bytes))) sys.stdout.write(resp_bytes) sys.stdout.flush()
3. 可选优化popup.js
增加错误捕获逻辑,方便定位问题:
dlvideo.addEventListener("click", async () => { chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => { const url = tabs[0].url; const port = chrome.runtime.connectNative('com.ytdlp.batdlvideo'); port.onDisconnect.addListener(function() { console.log("Disconnected,错误信息:", chrome.runtime.lastError); }); port.onMessage.addListener(function(msg) { console.log("收到本地程序返回:", msg); }); port.postMessage({ text: url }); }); });
修改完成后重启扩展和Chrome,点击按钮即可看到Python正常收到URL,不会再卡死。
内容的提问来源于stack exchange,提问作者Kachelstacktus
相关产品推荐
相关产品推荐

