火幣 websocket 獲取 k 線數據,和其它數據 API

火幣 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就順利的接入了

clipboard.png

火幣 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) {
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章