Web Socket Streams for Bitbank データをNodejsで取得する
BitBankが公開しているAPIを使用すれば、個人でも自動売買をすることができます。
今回自動売買するコードを書いてみてつまずいた点を備忘として書いておきます。
Bitbankが公開している、価格を取得するAPIは以前はPubNubが推奨されていましたが、WebSocketへ変更されています。
公式APIドキュメント(https://github.com/bitbankinc/bitbank-api-docs/blob/master/public-stream.md)ではwscatコマンドでのサンプルは提示してくれていますが、実際の使い方が書かれていません。
Pythonを使った方法は見つかったのですが、Javascriptでの実装方法が見当たらず困りました。
※PubNubの時にはサンプルコードがあったのに…
WebSocketをほとんど扱ったことがなく、やり方があってるかわかりませんが、一応レスポンスを得ることができたので書いておきます。
Pythonを使ったクライアント実装方法
https://qiita.com/yamazaki/items/a9b2d961e343195fe5e5
javascriptでの実装コードサンプル
事前にwsパッケージをインストールしておいてください。
$ npm init $ npm i --save ws
const WebSocket = require('ws');
const ws = new WebSocket('wss://stream.bitbank.cc/socket.io/?EIO=3&transport=websocket&join-room=ticker_btc_jpy');
ws.on('open', () => {
console.log('on open');
ws.send(`42["join-room", "ticker_btc_jpy"]`);
});
ws.on('message', (data) => {
console.log('on message');
console.log(data);
});
ws.on('close', () => {
console.log('on close');
});
ws.on('error', (error) => {
console.log('on error');
console.log(error);
});
ポイントはws.sendで送る内容です。
普通 [“join-room”, “ticker_btc_jpy”] で送ると思うじゃん!ってなりました。
wscatのサンプル、実は先頭の「42」も含めて送ってるみたいです。
42ってなんだ。
実行結果
$ node --version
v12.18.3
$ node index.js
on open
on message
0{"sid":"EiAGRFj_fL1xJ_odD8QB","upgrades":[],"pingInterval":25000,"pingTimeout":5000}
on message
40
on message
42["message",{"room_name":"ticker_btc_jpy","message":{"data":{"sell":"5150000","buy":"5149680","high":"5190000","low":"4600000","last":"5152545","vol":"1465.8788","timestamp":1614605553092}}}]
on message
42["message",{"room_name":"ticker_btc_jpy","message":{"data":{"sell":"5149992","buy":"5149680","high":"5190000","low":"4600000","last":"5152545","vol":"1465.8788","timestamp":1614605554097}}}]
on message
42["message",{"room_name":"ticker_btc_jpy","message":{"data":{"sell":"5149990","buy":"5149680","high":"5190000","low":"4600000","last":"5152545","vol":"1465.8788","timestamp":1614605555094}}}]
とりあえずデータは取れたので使えそう。
こんな感じでdataでやってきた先頭の数値を消してあげればjsonパースできる。
※macでバックスラッシュの入力は「option + ¥」で入力できるの初めて知った…
const jsonStr = data.replace(/^\d*/g, "");
if (jsonStr) {
const json = JSON.parse(jsonStr);
}
APIドキュメント
・bitabank-api-docs
https://github.com/bitbankinc/bitbank-api-docs/blob/master/public-stream.md