Python如何与qxbroker的WebSocket服务完成握手及身份认证
问题原因分析
- 你对接的是Socket.IO v3协议的服务,不是原生裸WebSocket服务,Socket.IO在原生WebSocket之上封装了自有帧格式和握手逻辑,直接用原生websocket库连接会缺少初始的Socket.IO握手步骤,服务端会主动断连。
- 你发送认证数据的逻辑错误:你把已经是字符串格式的Socket.IO报文又用
json.dumps()转了一遍,会导致报文被额外加一层引号,服务端无法识别。 - 缺失必要的请求头:qxbroker的WebSocket接口会校验
Origin、User-Agent等请求头,没有合法请求头会直接被拦截断连。
修复方案
- 建议直接使用Socket.IO官方Python客户端库对接,不要手动用原生websocket封装Socket.IO逻辑,避免处理协议细节出错。先安装依赖:
pip install python-socketio==5.8.0 websocket-client
- 修复后的代码示例:
import socketio # 初始化Socket.IO客户端,指定EIO版本为3,匹配服务端要求 sio = socketio.Client(engineio_version=3) @sio.event def connect(): print("连接建立成功,开始发送认证信息") # 直接发送authorization事件,不需要手动加42前缀,socketio库会自动封装报文 sio.emit("authorization", {"session": "oZA1xa5d4DYvNJoe4kZhL911QxxxxxxxxxxsPCSTMO", "isDemo": 1}) @sio.event def connect_error(data): print("连接失败:", data) @sio.event def disconnect(): print("连接已断开") # 监听所有事件,打印服务端返回的所有消息 @sio.on('*') def catch_all(event, data): print(f"收到事件:{event},数据:{data}") if __name__ == '__main__': try: # 连接时添加合法的Origin请求头,匹配qxbroker站点域名 sio.connect( url="wss://ws.qxbroker.com", socketio_path="/socket.io", transports=["websocket"], headers={ "Origin": "https://qxbroker.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } ) sio.wait() except Exception as e: print("运行错误:", e)
额外注意事项
- 你使用的session值需要是从qxbroker站点登录后获取的有效session,过期或者无效的session也会导致认证失败被断连。
- 如果是测试环境,
isDemo字段填1即可,正式实盘环境需要改为0,同时对应实盘的session值。
内容的提问来源于stack exchange,提问作者regretter
相关产品推荐
相关产品推荐

