You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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())

关键修复点说明

  1. 正确初始化异步客户端:使用await AsyncClient.create()替代直接构造,确保客户端完成异步初始化。
  2. 添加用户流初始化流程:调用futures_stream_get_listen_key()获取监听密钥,作为参数传入futures_user_socket()。
  3. 新增心跳续期任务:通过异步任务定期调用futures_stream_keepalive(),避免监听密钥过期导致连接中断。
  4. 移除不合理的全局单例:每次创建独立的客户端和SocketManager,避免异步上下文冲突。
  5. 适配异常类型:使用BinanceAPIException捕获币安API相关错误,异常处理更精准。

内容的提问来源于stack exchange,提问作者shahab valizade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:52:51