使用Python实现Sony音频控制API WebSocket时遭遇403禁止错误
解决Python连接索尼Audio Control API WebSocket时的403 Forbidden问题
哦,这个问题我之前折腾过!索尼的那个Node.js示例看起来没做授权,但其实WebSocket握手阶段有隐藏的校验逻辑——它依赖特定的请求头,而Python的websocket-client库默认不会带上这些头,所以才会返回403。
问题原因
Node.js的ws库在发起WebSocket连接时,会自动带上一些符合设备预期的请求头(比如Origin和User-Agent),但Python的websocket-client默认没有这些配置,索尼的AV设备会因为缺少这些头拒绝连接。
修复步骤
你需要手动添加必要的请求头来模拟Node.js的请求:
- 首先确保导入
ssl模块(你的原代码里用到了但没导入,会报错) - 在
connect方法里添加header参数,带上Origin和User-Agent
修改后的代码如下:
import ssl from websocket_client import websocket ws = websocket.WebSocket() # 模拟Node.js请求的头信息,Origin要和设备IP对应 headers = { "Origin": "http://192.168.0.34:54480", "User-Agent": "Node.js/18.17.0" # 可以换成你Node.js示例使用的版本号 } try: ws.connect( "ws://192.168.0.34:54480/sony/avContent", sslopt={"cert_reqs": ssl.CERT_NONE}, header=headers ) print("连接成功!") except Exception as e: print(f"连接失败:{e}")
如果还是不行,建议用抓包工具(比如Wireshark)捕获Node.js示例的WebSocket握手请求,把里面所有的请求头都照搬过来——索尼的设备对某些头的校验可能更严格,完全复刻就能解决问题。
内容的提问来源于stack exchange,提问作者Eric Yu
相关产品推荐
相关产品推荐

