nodejs 和其他语言(比如 Python)连接 wss 的差异
同一个 wss,使用 Python 连接直接拒绝,提示 401/403 之类的,需要认证,但是网页上抓包可以看到是先连接再把 token 发送过去,同样的情况使用 nodejs 就可以,问了一下 ai,说是这是一个非常典型的 WebSocket / WSS 行为差异问题,不是 Node.js 和 Python “谁更宽松”,而是库默认行为不同 + 服务端校验时机不同导致的。
意思是 nodejs 和前端 js 连接 wss 的时候发送 token,实际上是在握手阶段完成的,Python 是先握手完成再发消息。
我的代码如下
复制
# Windows 上兼容老版本 websockets
if sys.platform == "win32":
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
import websockets
async def ws():
url = "wss://xxxxx/api/servers/xxxxx/ws"
async with websockets.connect(url) as websocket:
print("连接成功!发送 token...")
# 如果服务器要求连接后立即发送 token,可以直接发送
await websocket.send("<你的 Token 或 json 格式消息>")
# 接收服务器消息
async for message in websocket:
print("收到消息:", message)
if __name__ == '__main__':
asyncio.run(ws())

实际上都没连上,没机会发 token
复制
let token = await getToken();
if (!token) return;
const url = `wss://xxxx/api/servers/${server_uuid}/ws`;
ws = new WebSocket(url, {
headers: {
Origin: 'https://xxxx'
}
});
ws.on('open', () => {
console.log('WS 连接成功');
// 连接后立即发送 token
sendToken(token);
});
只摘了一部分

可以看到这个就没问题,连接、发送 token、正常通信。
好像 postman 也不能这么操作,目前用 nodejs 解决了这个问题,不知道大家遇到没有。
👍2