Chrome扩展Native Messaging:Python主机向扩展发消息失败求助
核心问题:stdout被重定向导致浏览器无法接收主机消息
你的run.sh脚本把Python进程的标准输出(stdout)重定向到了hello文件,而Chrome Native Messaging依赖主机通过stdout发送消息给浏览器,这直接导致浏览器收不到任何来自主机的消息,自然触发不了port.onMessage回调。
修复步骤
1. 修改run.sh,移除stdout重定向
将脚本改为仅保留stderr重定向用于错误排查,stdout必须留给Native Messaging与浏览器通信:
#!/bin/sh python3 main.py 2>> err_file
2. 确保Native Messaging配置与扩展连接名一致
你的background.js中使用chrome.runtime.connectNative("com.google.chrome.uniphore")连接主机,但配置文件com.google.chrome.echo.json的name字段是com.google.chrome.echo,两者不匹配会导致连接失败。需将配置文件的name改为com.google.chrome.uniphore,或修改background里的连接参数为com.google.chrome.echo,确保两者完全一致。
3. 修复主机代码的异常输出问题
getMessage和sendMessage里的print("Error", x)会输出到stdout,破坏Native Messaging的消息格式(要求为「4字节长度前缀+JSON内容」的结构),应将错误输出到stderr:
# 替换原print语句 sys.stderr.write(f"Error: {x}\n")
4. 验证消息格式(可选)
你的encodeMessage代码生成的格式符合Chrome要求:4字节本机字节序无符号整数作为长度前缀,后跟UTF-8编码的JSON字符串,这部分无需修改。修复上述问题后,可测试扩展发"ping"时,主机是否能返回正确格式的"pong"。
测试验证
- 重启Chrome并重新加载扩展
- 打开扩展后台页面控制台(chrome://extensions/ → 目标扩展 → 「背景页」)
- 触发通信后,查看控制台是否输出
Receivedpong
内容的提问来源于stack exchange,提问作者pvnarula

