火币 websocket 获取 k 线数据,和其它数据 API

火币官方文档地址: https://huobiapi.github.io/do...
pako(解压gzip): https://github.com/nodeca/pako

坑死,接火币 websocket 地址 wss://api.huobi.pro/ws 的时候接到怀疑人生,怎么都无法建立连接,一度以为自己没有像其它 get/post 接口那样传入该传的参数,又以为是 wss 走的是 SSL 通道,所以才没能建立连接,还以为是需要服务端转接一下。

但,最后的最后,竟然发现是因为地址的问题,这个地址根本接入不了,至少我这边是接入不进去。

后来换这个地址: wss://api.hadax.com/ws就顺利的接入了

火币 websocket 规则

  1. 先建立连接
  2. 发送订阅请求,这个官方文档有说明
  3. 火币服务器返回订阅成功与否的回馈信息
  4. 如果成功就定时发送 gzip 压缩后的数据,解压 gzip 你需要 pako https://github.com/nodeca/pako
  5. 我们自己客户端这边接收数据,并解压数据,才能获取到真正的 json 数据
  6. 自己做前端该做的相应操作,压入数据,展示数据什么的。

但,在这个期间,还有一个动作需要执行,火币服务器会每隔 5 秒,向客户端发送一条 ping 数据,客户端接收到这种信息的时候,需要 send 一条对应的 pong 数据,内容是 ping 的数据体(相应的数据格式如下),如果服务器在发送两条 ping 数据后没有收到 客户端返回的 pong 数据,火币服务器就会关闭连接。

关于其它信息的获取,查看官方文档关于 websocket 的说明就可以了。

// 服务器发送的 ping 数据{ ping: 1562741680416 }// 客户端返回服务器的 pong 数据{ pong: 1562741680416 }

执行代码

// K 线相关let hburl = 'wss://api.huobipro.com/ws';  // 实时币种价格let haurl = 'wss://api.hadax.com/ws';let requestK = { // 请求对应信息的数据    req: "market.bchusdt.kline.1min",    id: "bchusdt",    from: Math.round(new Date().getTime()/1000) - 60,    to: Math.round(new Date().getTime()/1000)};let subK = { // 订阅数据    sub: "market.bchusdt.kline.1min",    id: "bchusdt"};let socketK = new WebSocket(haurl);socketK.onopen = function () {    console.log("connection establish");    socketK.send(JSON.stringify(subK));    socketK.send(JSON.stringify(requestK));};socketK.onmessage = function (event) {    let blob = event.data;    let reader = new FileReader();    reader.onload = function (e) {        let ploydata = new Uint8Array(e.target.result);        let msg = pako.inflate(ploydata, {to: 'string'});        handleData(msg);    };    reader.readAsArrayBuffer(blob, "utf-8");};socketK.onclose = function () {    console.log('connection closed');};// 处理接收到的信息function handleData(msg) {    let data = JSON.parse(msg);    if (data.ping) {        // 如果是 ping 消息        sendHeartMessage(data.ping);    } else if (data.status === 'ok') {        // 响应数据        handleReponseData(data);    } else {        // 数据体        console.log(data)    }}// 发送响应信息function sendHeartMessage(ping) {    socketK.send(JSON.stringify({"pong": ping}));}function handleReponseData(data) {}