[Python Websocket JSON-RPC] aiohttp websocket-client での bitFlyer Realtime API 受信コード

これはなに?

aiohttpを使ってWebsocket(JSON-RPC)の受信ができるらしいと聞いて『適当に』作ったサンプル。ググっても出てこなかったので作った(半分自分のメモ

どっちの処理が速いかとか、標準のwebsocket-clientと比較してのメリデメとかは知らない

noaさんがサンプル公開されているとのことなので追記


注意事項

・例外処理してない
・aiohttp, asyncio に詳しくないので変な書き方してるかも
・損失出ても知りません


確認環境

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14    # Mojave
BuildVersion:	18A391

$ pyenv --version
pyenv 1.1.5

$ python --version
Python 3.6.2 :: Anaconda, Inc.

$ pip show aiohttp
Name: aiohttp
Version: 3.0.1


コード

前述の通り適当です。
公式リファレンス見ると msg = await ws.receive() でやってるから、そっち使っても良いかも。

import json
import asyncio
import aiohttp

SYMBOL_BTC_FX = 'FX_BTC_JPY'
URL = "wss://ws.lightstream.bitflyer.com/json-rpc"
BOARD_SS_FX = "lightning_board_snapshot_" + SYMBOL_BTC_FX
BOARD_FX = "lightning_board_" + SYMBOL_BTC_FX
EXEC_FX = "lightning_executions_" + SYMBOL_BTC_FX
TICKER_FX = "lightning_ticker_" + SYMBOL_BTC_FX
RCV_CHS = [BOARD_SS_FX, BOARD_FX] # ここ変えれば受信チャンネル変更できる

async def main():
  session = aiohttp.ClientSession()
  async with session.ws_connect(URL) as ws:

    for ch in RCV_CHS:
      output_json = json.dumps(
        {'method' : 'subscribe',
        'params' : {'channel' : ch}
        }
      )
      await ws.send_str(output_json)

    async for msg in ws:
      print(msg)
      if msg.type in (aiohttp.WSMsgType.CLOSED,
                      aiohttp.WSMsgType.ERROR):
        break

if __name__ == '__main__':
  loop = asyncio.get_event_loop()
  loop.run_until_complete(main())


実行結果

スナップショットは長いので後略

WSMessage(type=<WSMsgType.TEXT: 1>, data='{"jsonrpc":"2.0","method":"channelMessage","params":{"channel":"lightning_board_FX_BTC_JPY","message":{"mid_price":773675,"bids":[{"price":773559,"size":0.01},{"price":773580,"size":0.2820925}],"asks":[{"price":773937,"size":0},{"price":774016,"size":0.02},{"price":773929,"size":0.41}]}}}', extra='')
WSMessage(type=<WSMsgType.TEXT: 1>, data='{"jsonrpc":"2.0","method":"channelMessage","params":{"channel":"lightning_board_FX_BTC_JPY","message":{"mid_price":773729,"bids":[],"asks":[{"price":773682,"size":0},{"price":773683,"size":0},{"price":773684,"size":0},{"price":773685,"size":0},{"price":773686,"size":0},{"price":773687,"size":0},{"price":773688,"size":0},{"price":773689,"size":0},{"price":773690,"size":0},{"price":773691,"size":0},{"price":773693,"size":0},{"price":773694,"size":0},{"price":773695,"size":0},{"price":773696,"size":0},{"price":773698,"size":0},...


参考サイト


APIドキュメント


おわりに

有料(¥100)にしてるけど、これで内容は全部です。募金してくれる人がいれば、ジュース代としていただけると嬉しい。コードは、インデントくずれが起きたりするようなので、コピペ時には注意してください。


マガジン


コメント用note(未購入者向け)


干し芋


ここから先は

0字

¥ 100

サポート頂けると励みになります BTC,BCH: 39kcicufyycWVf8gcGxgsFn2B8Nd7reNUA LTC: LUFGHgdx1qqashDw4WxDcSYQPzd9w9f3iL MONA: MJXExiB7T7FFXKYf9SLqykrtGYDFn3gnaM