使用Node及ws包调用币安用户数据流获取账户信息遇阻求助
搞定币安用户数据流收不到账户信息的问题
兄弟,我之前踩过这个坑!币安的用户数据流是被动推送的,不是你发指令就能要到数据的,你之前执行ws.send('outboundAccountInfo')完全是搞错逻辑了,下面一步步帮你梳理解决:
先搞懂核心逻辑:不是你请求,是币安主动推
币安的用户数据流不会因为你发送消息就返回账户信息,只有两种场景会推送outboundAccountInfo:
- 你刚成功建立WS连接时,服务器会主动推送一次当前的账户快照
- 你的账户发生变动时(比如余额更新、订单成交),实时推送最新的账户状态
所以outboundAccountInfo是服务器推送给你的消息类型,不是你要发送的请求指令!
检查你的连接流程是否正确
必须严格按以下步骤操作:
- 通过REST API的POST请求
/api/v3/userDataStream(带上你的API密钥请求头)获取有效的listenKey - 使用ws包连接到WS地址:
wss://stream.binance.com:9443/ws/<你的listenKey>,注意是WS协议地址,不是REST接口地址 - 连接成功后,无需主动发送任何消息,只需要监听
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
相关产品推荐
相关产品推荐

