Corredor

ウェブ、プログラミングの勉強メモ。

Python から BitFlyer API を叩く : pybitflyer を使ってみた

BitFlyer は、BitFlyer Lightning API という API を公開している。

今回は pybitflyer というライブラリを併用して、Python から BitFlyer API をコールしてみる。

BitFlyer Lightning API とは

BitFlyer Lightning API は、認証不要でマーケット情報や為替レートなどを取得できる他、自身の BitFlyer アカウントから発行した API キーを使用すれば、資産残高を見たり、API からトレードを行ったりもできる。

今回は認証不要で実行できる API を利用し、為替レートを取得してみることにする。

上のドキュメントを参考に、軽く叩いてみる。

  • マーケット一覧
    • ココで取れる product_code の文字列が、以降の API で指定できる文言となる
$ curl -sS https://api.bitflyer.com/v1/markets | jq '.'
[
  {
    "product_code": "BTC_JPY"
  },
  {
    "product_code": "FX_BTC_JPY"
  },
  {
    "product_code": "ETH_BTC"
  },
  {
    "product_code": "BCH_BTC"
  },
  {
    "product_code": "ETH_JPY"
  },
  {
    "product_code": "BTCJPY27MAR2020",
    "alias": "BTCJPY_MAT3M"
  },
  {
    "product_code": "BTCJPY31JAN2020",
    "alias": "BTCJPY_MAT1WK"
  },
  {
    "product_code": "BTCJPY07FEB2020",
    "alias": "BTCJPY_MAT2WK"
  }
]
  • 板情報
    • ?product_code= で先程のマーケットを指定している。BitCoin ではなくイーサリアムと日本円の為替レートを見たければ ?product_code=ETH_JPY と入力すれば良い
    • Bid は売値、Ask は買値。自分が持っている BitCoin を日本円に換金しよう、という時は「Bid」の値を見れば良い
$ curl -sS https://api.bitflyer.com/v1/board?product_code=BTC_JPY | jq '.'
{
  "mid_price": 985963,
  "bids": [
    {
      "price": 985830,
      "size": 0.9
    },
    {
      "price": 985633,
      "size": 0.4476
    },
    {
      "price": 985632,
      "size": 0.25001151
    },
    // 省略…
  ],
  "asks": [
    {
      "price": 986097,
      "size": 0.00264637
    },
    {
      "price": 986100,
      "size": 3.51
    },
    {
      "price": 986488,
      "size": 0.30000013
    },
    // 省略…
  ]
}
  • Ticker
    • 上の「板情報」は、指定通貨と日本円との売り買いの履歴がズラッと取得できるるが、この「ティッカー」はもうちょいサマリ的な情報が取れる
    • best_bid が売り価格
$ curl -sS https://api.bitflyer.com/v1/ticker?product_code=BTC_JPY | jq '.'
{
  "product_code": "BTC_JPY",
  "timestamp": "2020-01-28T07:53:39.843",  // UTC
  "tick_id": 27975501,
  "best_bid": 985836,
  "best_ask": 986419,
  "best_bid_size": 0.2,
  "best_ask_size": 0.05,
  "total_bid_depth": 2025.31970209,
  "total_ask_depth": 2185.18469304,
  "ltp": 986105,  // 最終取引価格
  "volume": 155749.30425403,
  "volume_by_product": 6572.12508333
}

認証が必要な API も軽く叩いてみる

ついでに、API キーによる認証が必要な API も、ちょっとだけ叩いてみる。

↑のページにログインし、API Key と API Secret を発行する。このとき、その API キーで実行できる操作を指定できるので、「資産残高を取得」にチェックを入れておこう (あまり余計な操作まで有効にしておくと悪用された時にリスクになる)。

上のページにあるサンプルコードを利用して、以下のようにコードを作っていく。

# 作業用ディレクトリを作る
$ mkdir practice-bitflyer-api && cd $_
$ npm init -y

# 依存モジュールをインストールする
$ npm install -D request crypto

$ touch index.js
  • index.js : 次のように実装する
/** Node.js で BitFlyer API をコールする */

const request = require('request');
const crypto  = require('crypto');

const key    = '【API Key】';
const secret = '【API Secret】';

const timestamp = Date.now().toString();
const method = 'GET';
const path = '/v1/me/getbalance';  // コールする API のパス
// GET メソッドで、リクエストボディが不要な場合は、body を使用しない
//const body = JSON.stringify({});

const text = timestamp + method + path;  // body を付与する場合はさらに `+ body;` とする
const sign = crypto.createHmac('sha256', secret).update(text).digest('hex');

const options = {
  url: 'https://api.bitflyer.com' + path,
  method: method,
  // body を指定する場合は以下を有効にする
  //body: body,
  headers: {
    'ACCESS-KEY': key,
    'ACCESS-TIMESTAMP': timestamp,
    'ACCESS-SIGN': sign,
    'Content-Type': 'application/json'
  }
};

request(options, (error, response, payload) => {
  console.log(payload);
});

変数 path/v1/me/getbalance を指定したので、自分の資産状況 (保有する仮想通貨) の情報が取得できる。実際に実行してみよう。

# 資産状況 (/v1/me/getbalance) を確認する
$ node index.js | jq '.'
[
  {
    "currency_code": "JPY",
    "amount": 0,
    "available": 0
  },
  {
    "currency_code": "BTC",
    "amount": 0.0313149,
    "available": 0.0313149
  },
  {
    "currency_code": "BCH",
    "amount": 0,
    "available": 0
  },
  {
    "currency_code": "ETH",
    "amount": 0.299,
    "available": 0.299
  },
  {
    "currency_code": "ETC",
    "amount": 0,
    "available": 0
  },
  {
    "currency_code": "LTC",
    "amount": 0,
    "available": 0
  },
  {
    "currency_code": "MONA",
    "amount": 0,
    "available": 0
  },
  {
    "currency_code": "LSK",
    "amount": 0,
    "available": 0
  },
  {
    "currency_code": "XRP",
    "amount": 0,
    "available": 0
  }
]

こんな感じ。

pybitflyer を使ってみる

公式で紹介している Node.js のサンプルコードは、リクエストヘッダなどを自分で組み立てていてなかなかしんどい。Node.js という言語自体の実行速度も気になるし、JavaScript は浮動小数点数の誤差が気になるので、Decimal を使った計算をするため Python で実装してみたい。

そこで調べてみると、pybitflyer というライブラリが、BitFlyer Lightning API のラッパーになっていたので、コレを使うことにした。

インストールは以下のように。

$ pipenv install pybitflyer

コードは以下のように書いていく。

  • practice.py
import pybitflyer

# BitFlyer API を用意する
bit_flyer_api = pybitflyer.API()

# Ticker を取得する
ticker = bit_flyer_api.ticker(product_code = 'BTC_JPY')

# 取得した JSON から売り価格を取得する
bid = ticker['best_bid']
print(bid)

とっても簡単だ。

API キーを使用する場合は…

API キーを使用する場合は、次のように API() 関数の引数に API Key と API Secret を渡してやれば良い。

import pybitflyer

# BitFlyer API を用意する
bit_flyer_api = pybitflyer.API(api_key = '【API Key】', api_secret = '【API Secret】')

# 資産残高を取得する
balance = bit_flyer_api.getbalance()
print(balance)

楽ちん楽ちん。

以上

今回紹介した pybitflyer を Flask 経由で実行し、フロントエンドに Vue.js を使用したサンプルプロジェクトを作った。

github.com

コレで仮想通貨の為替レートを確認したり、BitFlyer にある自分の資産を参照・操作できるだろう。