このシリーズではbitFlyer Lightning APIを使用することで、常に情報収集/テクニカル分析し、 ここだと思えるタイミングで自動売買を行えるシステム開発を目指します。
今回からはPrivate APIを触っていこうと思います。自動売買を行う上で避けて通れない認証と認証が成功しているか確認するために資産残高取得をしてみたいと思います。
-- 実行環境 --
Windows 10 64ビット版(1903)、python 3.7.4
API制限
bitFlyer API API Documentation より抜粋
HTTP API は、以下のとおり呼出回数を制限いたします。
Private API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。同一 IP アドレスからの API の呼出は 5 分間で 500 回を上限とします。上限に達すると呼出を一定時間ブロックします。また、ブロックの解除後も呼出の上限を一定時間引き下げます。
0.1 以下の数量の注文は、すべての板の合計で 1 分間で 100 回を上限とします。上限に達するとその後 1 時間は 1 分間で 10 回まで注文を制限します。システムに負荷をかける目的で注文を繰り返していると当社が判断した場合は、API の使用を制限することがあります。ご了承ください。
事前準備
Private API 前にbitFlyer にログインして、API KeyとSecretを発行しておく必要があります。下記サイトを参照して各キーを発行してください。
APIキーは漏洩してしまうとbitFlyerへのアクセスを許してしまい、キー発行時に指定した権限を行使することが出来てしまいます。本サイトのサンプルではプレーンテキストで管理していますが、実装する場合は暗号化して保管するなど検討して下さい。
また、APIキー発行時に設定する権限を最低限に絞ってください。(資産照会や売買は許可するが、資産送金は不可とするなど)
Private API の認証
bitFlyerで生成/取得したAPIキーとシークレットを使用して認証を行います。下記はAPI Documentationからの抜粋です。JavaScriptのサンプルと共に記載されています。
認証
Private API の呼び出しには認証が必要です。ログイン後、開発者ページにおいて発行したAPI KeyとAPI Secret を使用します。以下の情報をHTTPリクエストヘッダに含めます。
・ACCESS-KEY:開発者ページで発行したAPI Key
・ACCESS-TIMESTAMP:リクエスト時のUnix Timestamp
・ACCESS-SIGN:以下の方法でリクエストごとに生成した署名ACCESS-SIGNは、ACCESS-TIMESTAMP、HTTPメソッド、リクエストのパス、リクエストボディを文字列として連結したものを、API SecretでHMAC-SHA256署名を行った結果です。
bitFlyer API API Documentation より抜粋

いきなり難易度が上がりましたね...特にACCESS-SIGNが難しそうです。

全部を一から説明していると長くなるのでPrivate APIの認証→資産残高を取得するサンプルを紹介するよ。簡単に解説はするからあとは自習してみてね。
Private API 認証と資産残高取得サンプル
import requests
import json
import time
import hmac
import hashlib
# ********************************
# Private API用 認証
# ********************************
class PrivateApi:
def __init__( self, api_key, api_secret, api_endpoint):
self.api_key = api_key
self.api_secret = api_secret
self.api_endpoint = api_endpoint
def get_api_call( self, path):
method = 'GET'
timestamp = str( time.time())
text = timestamp + method + path
sign = hmac.new( bytes( self.api_secret.encode('ascii')), bytes(text.encode('ascii')), hashlib.sha256).hexdigest()
request_data=requests.get(
self.api_endpoint+path,headers = {
'ACCESS-KEY': self.api_key,
'ACCESS-TIMESTAMP': timestamp,
'ACCESS-SIGN': sign,
'Content-Type': 'application/json'
}
)
return request_data
# ********************************
# 資産情報取得
# ********************************
def fnc_get_asset( api_key, api_secret):
api = PrivateApi( format(api_key), format(api_secret), 'https://api.bitflyer.jp')
balances = api.get_api_call('/v1/me/getbalance').json()
for balance in balances:
if balance['currency_code'] == 'JPY':
jpy = balance['amount']
if balance['currency_code'] == 'BTC':
btc = balance['amount']
return jpy,btc
# ********************************
# メイン処理
# ********************************
def main ():
# API キー
api_key = "***(API Key)***"
api_secret = "***(API Secret)***"
# 資産情報取得
asset_jpy, asset_btc = fnc_get_asset( api_key, api_secret)
print( "日本円: ", asset_jpy)
print( "ビットコイン:", asset_btc)
if __name__ == '__main__':
main()
実行結果
実行結果とbitFlyer上のサイトで確認した資産状況です。正確に取得できていることが確認できました。



資産ないよ?嫁に怒られる系?

仮想通貨はハードウォレットだよ、やっぱり怖いからね。
解説
簡単ではありますが解説します。まず認証で問題なのが前項で紹介した「ACCESS-SIGN」です。API Documentationに記載の通り「ACCESS-TIMESTAMP、HTTPメソッド、リクエストのパス、リクエストボディを文字列として連結したもの」を「API SecretでHMAC-SHA256署名」がACCESS-SIGNになります。順に見ていきましょう。
ACCESS-TIMESTAMP
記載の通り Unix Timestamp ということで time.time() をセットしています。ここ結構人によりdatetime.datetime.today() の値引き渡していたりするケースも見受けられます。どちらでも正常動作するので重複しない形式であれば通るのかもしれません?
HTTPメソッド
今回は資産残高参照です。API Documentationを確認するとHTTPメソッドは GET と記載されています。

リクエストのパス
パスはAPI Documentationのサンプルを確認するとエンドポイントを含まない記載のようです。なので各処理の個別URL(上記画像のURL部)をそのままとなるので /v1/me/getbalance になります。
リクエストボディ
今回のリクエストでは特にパラメーターがないため不要。売買などを行う場合は、価格や数量などをここで設定しますが今回は ブランク になります。
下記結合したサンプルです。デリミタなど指定がないのでそのまま結合します。
1570901259.7483077GET/v1/me/getbalance
このデータをAPI secretでHMAC(Hash-based Message Authentication Code)SHA256 署名を行うことでようやく「ACCESS-SIGN」が出来上がります。署名はサンプルをご覧になってください。
まとめ
今回はPrivate APIの認証と資産残高参照を行いました。双方共に自動売買する上では必須の処理なのでこのサンプルをベースにプログラミングして頂ければ嬉しいです。
次回は現物マーケットでビットコインの新規注文と注文状況取得を行ってみたいと思います。
ご覧いただきありがとうございました。
コメント