Quotex券商API开发:基于Session连接WebSocket发送订单问题求助
问题排查及修复方案
1. Socket.io协议适配错误
你对接的是Socket.io v3协议的WebSocket接口,不能直接用原生websocket库裸发数据,Socket.io有固定的报文规则:
- 连接建立后服务端会先返回
0开头的握手报文,你需要先响应握手,不能直接发鉴权请求 - 所有事件报文前缀
42是Socket.io的消息类型标识,要严格遵循报文结构,避免手动拼接出错
2. 鉴权请求格式错误
你当前手动拼接鉴权字符串的方式容易出现JSON语法错误,比如session值包含特殊字符时会导致整个报文无效,正确的构造方式应该是先组装数据结构,序列化后再加固定前缀:
import json auth_payload = ["authorization", {"session": session, "isDemo": 1}] auth_msg = "42" + json.dumps(auth_payload) ws.send(auth_msg)
3. 订单报文重复且错误
你定义的order已经是符合要求的42前缀事件报文,不需要再用json.dumps二次序列化,你发送的order2是把整个订单报文转成了转义后的JSON字符串,发送后服务端无法识别,直接删掉order2相关代码即可。
4. 时序逻辑错误
- 不需要循环发送3次鉴权请求,单次发送即可
- 必须在
on_message回调中收到鉴权成功的响应后,再发送订单请求,不能固定等待1秒就发订单,会出现鉴权还未完成就发单的问题
修复后最简示例代码
import json import websocket import time is_auth_success = False session = "替换为你从Selenium获取到的session值" def on_message(ws, message): global is_auth_success print("收到消息:", message) # 处理Socket.io握手 if message.startswith("0"): # 构造鉴权报文 auth_payload = ["authorization", {"session": session, "isDemo": 1}] ws.send("42" + json.dumps(auth_payload)) # 识别鉴权成功的响应,可根据服务端实际返回的字段调整判断逻辑 if "success" in message and "authorization" in message: is_auth_success = True # 鉴权成功后发订单 order_payload = ["orders/open", { "asset": "AUDCAD_otc", "amount": 6, "time": 1637893200, "action": "put", "isDemo": 1, "requestId": int(time.time()), "optionType": 1 }] order_msg = "42" + json.dumps(order_payload) ws.send(order_msg) print("订单已发送") def on_error(ws, error): print("错误:", error) def on_close(ws, close_status_code, close_msg): print("### 连接关闭 ###") def on_open(ws): print("### 连接已打开 ###") if __name__ == "__main__": urlsocket = "wss://ws.qxbroker.com/socket.io/?EIO=3&transport=websocket" ws = websocket.WebSocketApp( urlsocket, on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close ) ws.run_forever()
内容的提问来源于stack exchange,提问作者Popping The Beat
相关产品推荐
相关产品推荐

