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パッケージをインストールしておいてください。
1 2 |
$ npm init $ npm i --save ws |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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ってなんだ。
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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 + ¥」で入力できるの初めて知った…
1 2 3 4 |
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