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

使用Node及ws包调用币安用户数据流获取账户信息遇阻求助

搞定币安用户数据流收不到账户信息的问题

兄弟,我之前踩过这个坑!币安的用户数据流是被动推送的,不是你发指令就能要到数据的,你之前执行ws.send('outboundAccountInfo')完全是搞错逻辑了,下面一步步帮你梳理解决:

先搞懂核心逻辑:不是你请求,是币安主动推

币安的用户数据流不会因为你发送消息就返回账户信息,只有两种场景会推送outboundAccountInfo:

  • 你刚成功建立WS连接时,服务器会主动推送一次当前的账户快照
  • 你的账户发生变动时(比如余额更新、订单成交),实时推送最新的账户状态

所以outboundAccountInfo是服务器推送给你的消息类型,不是你要发送的请求指令!

检查你的连接流程是否正确

必须严格按以下步骤操作:

  1. 通过REST API的POST请求/api/v3/userDataStream(带上你的API密钥请求头)获取有效的listenKey
  2. 使用ws包连接到WS地址:wss://stream.binance.com:9443/ws/<你的listenKey>,注意是WS协议地址,不是REST接口地址
  3. 连接成功后,无需主动发送任何消息,只需要监听message事件等待服务器推送即可

一定要维护listenKey的心跳!

listenKey的有效期只有60分钟,必须每30分钟发送一次PUT请求/api/v3/userDataStream(带上listenKey和API密钥)进行续期,否则连接会直接断开,你将收不到任何推送数据。

给你一份能正常运行的修正版代码

const WebSocket = require('ws');
const axios = require('axios');

// 替换成你的币安API密钥
const API_KEY = '你的API密钥';

// 获取listenKey
async function fetchListenKey() {
  try {
    const res = await axios.post('https://api.binance.com/api/v3/userDataStream', {}, {
      headers: { 'X-MBX-APIKEY': API_KEY }
    });
    return res.data.listenKey;
  } catch (err) {
    console.error('获取listenKey失败:', err.response.data);
    throw err;
  }
}

// 建立用户数据流连接
async function startUserDataStream() {
  const listenKey = await fetchListenKey();
  const ws = new WebSocket(`wss://stream.binance.com:9443/ws/${listenKey}`);

  // 监听推送消息
  ws.on('message', (rawData) => {
    const data = JSON.parse(rawData);
    console.log('收到推送:', data);
    
    // 处理账户信息
    if (data.e === 'outboundAccountInfo') {
      console.log('当前可用余额:', data.balances.filter(b => parseFloat(b.free) > 0));
    }
  });

  // 处理连接错误
  ws.on('error', (err) => {
    console.error('连接出错:', err);
  });

  // 连接关闭后自动重连
  ws.on('close', () => {
    console.log('连接断开,3秒后重新连接...');
    setTimeout(startUserDataStream, 3000);
  });

  // 每30分钟续期listenKey
  setInterval(async () => {
    try {
      await axios.put('https://api.binance.com/api/v3/userDataStream', {}, {
        headers: { 'X-MBX-APIKEY': API_KEY },
        params: { listenKey }
      });
      console.log('listenKey已续期');
    } catch (err) {
      console.error('续期失败:', err.response.data);
    }
  }, 30 * 60 * 1000);
}

// 启动数据流
startUserDataStream();

测试小技巧

如果连接后没立刻收到账户信息,可以手动触发一次账户变动(比如转少量资金到币币账户,或者下一个小额测试订单),此时服务器会立刻推送最新的outboundAccountInfo给你。

最后排查几个常见坑

  • 确认你的API密钥已经开启读取账户信息的权限(去币安API设置页面检查),权限不足会导致无法获取数据
  • 测试网络是否能正常访问币安的WS地址:可以用wscat工具执行wscat -c wss://stream.binance.com:9443/ws/<你的listenKey>,看是否能收到消息
  • 检查是否有防火墙或代理拦截了WS连接,这也会导致收不到推送

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:12:11