Web Socket Streams for Bitbank データをNodejsで取得する

2021年3月1日IT, 開発

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

2021年3月1日IT, 開発, Websocket, パブリックAPI