仮想通貨 API 解説編 その2 ー bitFlyerのAPIを使って情報を取得する
前回 からの続きで、仮想通貨の取引所系のサーバーからも価格などの情報がAPIキーなしで取得できますので、将来仮想通貨で自動売買する日に備え、日本でも取引できる取引所の中からbitFlyer社のAPIを使ってみました。
bitFlyer APIの使い方
前提はbitFlyerにアカウント登録をしているわけではありませんので、APIキーなしでアクセスできるエンドポイントについて確認してみました。
マニュアルを解読
CoinGeckoの時と同様にAPIの解説ページに行ってみます。
残念ながらマニュアル自体は英語のみになります。
bitFlyer Lightning Palygroudへ行くと、どんな戻り値が返ってくるか確認できるようになっていますので、非常に便利です。
bitFlyer Lightning API Playground
API KeyとAPI Secretを入力するフィールドがありますがPublic APIの場合は何も入力しなくてもレスポンスが表示されます。
HTTP API
URL、制限事項、認証方法などについての説明がされていますが、
エンドポイントのURLは"https://api.bitflyer.com/v1/"で、呼び出し回数制限は同じIPアドレスから5分で500回(平均で0.6秒に一回)までです。
制限を超えると一時的にリミットがさらに厳しくなります。(1時間の間1分間に10回までに制限)
HTTP Public API
APIキーなしにアクセスできるエンドポイントを大きく分けると、
- Market List (マーケット情報の取得)
- Order Book (オーダーブックの取得)
- Ticker (ティッカー情報の取得)
- Execution History (取引履歴の取得)
- Orderbook Status (オーダーブックの状態)
- Exchange Status (サーバーの状態)
- Chat(チャットの取得)
"/usa"や”/eu"は地域に依存しているエンドポイントですが、"get…"がつくのとつかないのでどう違うかよくわかりませんので、確認しながら試していきたいと思います。
サンプルプログラム
今回も情報を取得するだけなので、例外処理は気にせずに作成してみます。
Market List - GET /v1/getmarkets, GET /v1/markets
商品の種類を取得。
import requests import json URL = "https://api.bitflyer.com/v1/" #Markets endpoint = "getmarkets" url = URL + endpoint response = requests.request("GET", url) r = response.json() print("getあり :") print(json.dumps(r, indent=2)) endpoint = "markets" url = URL + endpoint response = requests.request("GET", url) r = response.json() print("getなし :") print(json.dumps(r, indent=2))
戻り値
getあり : [ { "product_code": "BTC_JPY", "market_type": "Spot" }, { "product_code": "XRP_JPY", "market_type": "Spot" }, { "product_code": "ETH_JPY", "market_type": "Spot" }, { "product_code": "XLM_JPY", "market_type": "Spot" }, { "product_code": "MONA_JPY", "market_type": "Spot" }, { "product_code": "ETH_BTC", "market_type": "Spot" }, { "product_code": "BCH_BTC", "market_type": "Spot" }, { "product_code": "FX_BTC_JPY", "market_type": "FX" }, { "product_code": "BTCJPY02APR2021", "alias": "BTCJPY_MAT1WK", "market_type": "Futures" }, { "product_code": "BTCJPY09APR2021", "alias": "BTCJPY_MAT2WK", "market_type": "Futures" }, { "product_code": "BTCJPY25JUN2021", "alias": "BTCJPY_MAT3M", "market_type": "Futures" } ] getなし : [ { "product_code": "BTC_JPY", "market_type": "Spot" }, { "product_code": "XRP_JPY", "market_type": "Spot" }, { "product_code": "ETH_JPY", "market_type": "Spot" }, { "product_code": "XLM_JPY", "market_type": "Spot" }, { "product_code": "MONA_JPY", "market_type": "Spot" }, { "product_code": "ETH_BTC", "market_type": "Spot" }, { "product_code": "BCH_BTC", "market_type": "Spot" }, { "product_code": "FX_BTC_JPY", "market_type": "FX" }, { "product_code": "BTCJPY02APR2021", "alias": "BTCJPY_MAT1WK", "market_type": "Futures" }, { "product_code": "BTCJPY09APR2021", "alias": "BTCJPY_MAT2WK", "market_type": "Futures" }, { "product_code": "BTCJPY25JUN2021", "alias": "BTCJPY_MAT3M", "market_type": "Futures" } ]
"getmarkets"も"markets"も同じ内容でした。APIで使える商品種類は少なそうです。
Ticker - GET /v1/getticker, GET /v1/ticker
価格情報の取得。
import requests import json URL = "https://api.bitflyer.com/v1/" #Ticker endpoint = "getticker" url = URL + endpoint params = {"product_code" : "BTC_JPY"} response = requests.request("GET", url, params=params) r = response.json() print("getあり :") print(json.dumps(r, indent=2)) endpoint = "ticker" url = URL + endpoint response = requests.request("GET", url, params=params) r = response.json() print("getなし :") print(json.dumps(r, indent=2))
戻り値
getあり : { "product_code": "BTC_JPY", "state": "RUNNING", "timestamp": "2021-04-01T14:00:59.94", "tick_id": 440187, "best_bid": 6514541.0, "best_ask": 6516896.0, "best_bid_size": 0.001, "best_ask_size": 0.04992769, "total_bid_depth": 729.40490557, "total_ask_depth": 665.21456183, "market_bid_size": 0.0, "market_ask_size": 0.0, "ltp": 6516896.0, "volume": 7517.65030598, "volume_by_product": 4531.72444335 } getなし : { "product_code": "BTC_JPY", "state": "RUNNING", "timestamp": "2021-04-01T14:00:59.973", "tick_id": 440190, "best_bid": 6514541.0, "best_ask": 6516896.0, "best_bid_size": 0.001, "best_ask_size": 0.04992769, "total_bid_depth": 729.47490557, "total_ask_depth": 665.26456183, "market_bid_size": 0.0, "market_ask_size": 0.0, "ltp": 6516896.0, "volume": 7517.68030598, "volume_by_product": 4531.72444335 }
Market Listエンドポイントと同様"getticker"も"ticker"も同じ内容でした。
Order Book - GET /v1/getboard, GET /v1/board
オーダーブック情報の取得。
import requests URL = "https://api.bitflyer.com/v1/" #Order Book endpoint = "getboard" url = URL + endpoint params = {"product_code" : "BTC_JPY"} response = requests.request("GET", url, params=params) r = response.json() print("mid_price: %s" %r['mid_price']) print("bids: %s" %r['bids'][0]) print("asks: %s" %r['asks'][0])
戻り値
mid_price: 6513768.0 bids: {'price': 6513305.0, 'size': 0.05094774} asks: {'price': 6514231.0, 'size': 0.035}
すべて出力すると多すぎましたので、"getboard"のみでかつ最初のデータだけ表示するようにしてあります。
他にもチャットの取得も出来るようですが、利用方法がよくわからないのでここまでにしておきます。
まとめ
公開されているAPIから情報を取得するだけであればとても簡単ですね。
指定できる引数は少ないですが、その分シンプルでわかりやすいです。
Realtime APIという事でレート情報などをストリーミングで取得する事も可能です。
他の取引所でもPublic APIという事でAPIキーなしのエンドポイントが提供されていますので、興味のある方はいろいろ試してみてください。
例えばコインチェックやLiquidのAPIのマニュアルはすべて日本語で書かれていますので、英語を読むのが面倒くさい人向けです。
coincheck.com
document.liquid.com