0

索尼的网站提供了一个使用 WebSockets 在 Node.js 中使用他们的 api 的示例

https://developer.sony.com/develop/audio-control-api/get-started/websocket-example#tutorial-step-3

它对我来说很好。但是当我试图在 Python 中实现它时,它似乎不起作用

我用websocket_client

import websocket

ws = websocket.WebSocket()
ws.connect("ws://192.168.0.34:54480/sony/avContent",sslopt={"cert_reqs": ssl.CERT_NONE})

websocket._exceptions.WebSocketBadStatusException: Handshake status 403 Forbidden

但在他们的示例代码中,没有任何类型的授权或身份验证

4

1 回答 1

1

我最近遇到了同样的问题。这是我发现的:

正常的 HTTP 响应可以包含Access-Control-Allow-Origin标头以明确允许其他网站请求数据。否则,Web 浏览器会阻止此类“跨域”请求,因为例如用户可以在那里登录。

这种“同源策略”显然不适用于 WebSocket,并且握手不能有这些标头。因此,任何网站都可以连接到您的索尼设备。您可能不希望某些网站将您的扬声器/接收器音量设置为 100%,或者上传有缺陷的固件,对吧?

这就是音频控制 API 检查Origin握手标头的原因。它始终包含请求来自的网站。

在您的情况下,您使用的 Python WebSocket 客户端http://192.168.0.34:54480/sony/avContent默认假定为源。但是,API 似乎忽略了Origin标头的内容,只是检查它是否存在。

WebSocket#connect方法有一个名为的参数suppress_origin,可用于排除Origin标头。

TL;博士

Sony 音频控制 API 不接受包含Origin标头的 WebSocket 握手。

你可以像这样修复它:

ws.connect("ws://192.168.0.34:54480/sony/avContent",
           sslopt={"cert_reqs": ssl.CERT_NONE},
           suppress_origin=True)
于 2020-09-03T23:32:50.617 回答