使用python-binance连接币安测试网期货用户流无数据问题排查
币安期货测试网用户流WebSocket无消息问题排查与修复
问题描述
尝试使用python-binance库连接币安期货测试网的用户流WebSocket,监听账户变动(如提交、取消订单等操作),但运行代码后无任何输出,无法接收预期的用户流消息。
代码存在的核心问题
- 未完成用户流初始化流程:币安期货用户流需要先获取监听密钥(listenKey),并且必须定期发送心跳请求续期(每30分钟一次),原代码直接创建socket但跳过了这一关键步骤,导致服务器不会推送消息。
- 异步客户端初始化错误:
AsyncClient必须通过异步工厂方法AsyncClient.create()初始化,原代码直接调用构造函数无法完成客户端的异步初始化,导致连接无效。 - 全局单例设计不合理:全局共享
async_client和binance_socket_manager容易引发异步上下文冲突,且无必要。 - 异常类型不匹配:
HTTPException属于FastAPI框架的异常,此处未使用FastAPI,抛出该异常不符合场景。
修正后的完整代码
import asyncio from binance import AsyncClient, BinanceSocketManager from binance.exceptions import BinanceAPIException async def get_async_client(is_testnet: bool, api_key: str = 'YOUR_API_KEY', secret_key: str = 'YOUR_SECRET_KEY'): try: return await AsyncClient.create(api_key, secret_key, testnet=is_testnet) except BinanceAPIException as err: print(f"Binance API错误: {err}") raise except Exception as err: print(f"连接错误: {err}") raise async def keep_alive_listen_key(client, listen_key): # 每30分钟发送一次心跳续期 while True: await asyncio.sleep(30 * 60) try: await client.futures_stream_keepalive(listen_key) print("监听密钥已续期") except Exception as err: print(f"续期失败: {err}") break async def update_crypto_user_websocket(): async_client = await get_async_client(True) # 第一步:获取用户流监听密钥 listen_key = await async_client.futures_stream_get_listen_key() print(f"获取到监听密钥: {listen_key}") # 启动心跳续期任务 asyncio.create_task(keep_alive_listen_key(async_client, listen_key)) # 第二步:创建用户流socket socket_manager = BinanceSocketManager(async_client) user_stream = socket_manager.futures_user_socket(listen_key=listen_key) # 开始接收消息 async with user_stream as ts: while True: res = await ts.recv() if res: print("收到用户流消息:", res) async def main(): await update_crypto_user_websocket() if __name__ == "__main__": asyncio.run(main())
关键修复点说明
- 正确初始化异步客户端:使用
await AsyncClient.create()替代直接构造,确保客户端完成异步初始化。 - 添加用户流初始化流程:调用
futures_stream_get_listen_key()获取监听密钥,作为参数传入futures_user_socket()。 - 新增心跳续期任务:通过异步任务定期调用
futures_stream_keepalive(),避免监听密钥过期导致连接中断。 - 移除不合理的全局单例:每次创建独立的客户端和SocketManager,避免异步上下文冲突。
- 适配异常类型:使用
BinanceAPIException捕获币安API相关错误,异常处理更精准。
内容的提问来源于stack exchange,提问作者shahab valizade
相关产品推荐
相关产品推荐

