You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:06:02