こんにちは、はやたす(@hayatasuuu )です。
第8回目の本記事では、認証情報を設定して口座残高を取得していきたいと思います。
前回の記事 : #7 Python×ビットコイン自動売買 | API Keyの取得と設定ファイルの準備をしよう!
前回取得しておいたアクセスキーとシークレットキーを使ったAPIへのアクセスは少し難しいです。
でもこの記事を読めば、問題なく実装できるようになります。ぜひ一緒に頑張っていきましょう!
※Coincheckアカウントを持っていないと、この先には進めません。もし学習を続ける場合には、口座開設(無料)をおこなった上で、取り組んでみてください!
»公式ページ : 仮想通貨取引所・販売所の口座開設|Coincheck(コインチェック)
認証情報を設定して口座残高を取得してみよう!
今回は第6回目の記事で使っていた、以下のコードを編集していきます。
from pprint import pprint
import requests
BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/order_books'
params = {
'limit': 1
}
r = requests.get(url, params=params)
r = r.json()
pprint(r)
STEP① : URLの変更
まずはアクセス先のURLを変更してきましょう。
口座残高を取得するためのエンドポイントは/api/accounts/balance
になります。
また、このAPIを使うにあたりparams
は必要ありません。削除しておきましょう。
コードとしては以下になります。
from pprint import pprint
import requests
BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/accounts/balance'
r = requests.get(url)
r = r.json()
pprint(r)
STEP② : 認証に必要な情報の確認
URLを設定したあとrequests
でアクセスする流れは、これまでと同じですね。
では、この状態でAPIにアクセスすると、どうなるのでしょうか。
API Keyが必要なことは分かっているのですが、いったんPythonファイルを実行してみましょう。
(env) (base) MacBookPro:PythonBitcoin hayato$ python main.py
{'error': 'invalid authentication', 'success': False}
このように「認証に失敗しました」とエラーが出力されます。やはり認証情報を送らないといけないわけですね。
というわけでrequests
するときに、あわせて認証情報を送るようにしましょう。
公式ドキュメントを確認してみると、認証で必要なものが書かれています。
色々書いてあって難しいですが、結局必要になるのは以下の3点です。
- ACCESS KEY : すでに取得済です
- ACCESS NONCE : これから作成します
- ACCESS SIGNATURE : これから作成します
“ACCESS SIGNATURE”は作成が難しいので、一緒に頑張っていきましょう。
STEP③ : API Keyの読み込み
まずは認証で必要になる「アクセスキー」と「シークレットキー」を読み込みます。
これは前回の記事で作成したのでコピペするだけです。
前回の記事 : #7 Python×ビットコイン自動売買 | API Keyの取得と設定ファイルの準備をしよう!
コード全体は以下のようになります。
from pprint import pprint
import configparser
import requests
conf = configparser.ConfigParser()
conf.read('config.ini')
ACCESS_KEY = conf['coincheck']['access_key']
SECRET_KEY = conf['coincheck']['secret_key']
BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/accounts/balance'
r = requests.get(url)
r = r.json()
pprint(r)
これでAPI Keyを読み込めました。
STEP④ : ACCESS NONCEの設定
次にACCESS NONCEを作成します。
「ACCESS NONCEとは何か」と言うと、それは公式ドキュメントで以下のように書かれています。
ACCESS-NONCE 毎リクエストごとに増加する必要のある正の整数。通常はUNIXタイムスタンプを用います。最大値は 9223372036854775807 です。APIキーごとに管理されます。
これでは何を言っているのか分かりません。
簡単に言うと、上記は「正の整数に変換したUNIXスタンプを、ACCESS NONCEにしてくれ」という意味です。
UNIXスタンプはtime
をインポートしてtime.time()
を使えば作成できます。
Pythonの対話シェルで確認してみましょう。
>>> import time
>>> time.time()
1613174040.209963
このように大きな数字が出力されるはずです。
今回は、このUNIXスタンプを「正の整数」にする必要があるので、int()
を使って型変換(キャスト)しましょう。
また”ACCESS SIGNATURE”でも使うので、さらにstr()
でキャストしておきます。
つまりコード全体としては以下になります。
import time
from pprint import pprint
import configparser
import requests
conf = configparser.ConfigParser()
conf.read('config.ini')
ACCESS_KEY = conf['coincheck']['access_key']
SECRET_KEY = conf['coincheck']['secret_key']
BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/accounts/balance'
nonce = str(int(time.time()))
r = requests.get(url)
r = r.json()
pprint(r)
これでACCESS NONCEの設定は完了です。
STEP⑤ : ACCESS SIGNATUREの作成
あとはACCESS SIGNATUREを作成するだけです。
公式ドキュメントを確認すると、ACCESS SIGNATUREは以下のように作成するよう言われています。
SIGNATUREは、ACCESS-NONCE, リクエスト先URL, リクエストのボディ を全て文字列にし連結したものを、HMAC-SHA256 hash形式でシークレットキーを使って署名した結果です。
いったん書かれていることを分解してみます。
- ①:ACCESS-NONCE, URL, リクエストボディを全て文字列で連結
- ②:①で作成した文字列をHMAC-SHA256 hash形式でシークレットキーを使って署名
①は「文字列を作成すれば良いのかな…」と、なんとなく理解できると思います。
問題は②です。これはもはや何を言っているのか分かりません!
このあたりは、かなり難しい内容になってきます。なのでACCESS SIGNATUREの作成は、あまり細かいことを気にせずコードで書いてみましょう。
まずは「ACCESS-NONCE / URL / リクエストボディを連結した文字列」を作成していきます。
そのためには以下のようにコードを書けば良いですね。
body = ''
message = nonce + url + body
body
はすぐに使わないので今は空で大丈夫です。
あとは作成した文字列を「HMAC-SHA256 hash形式でシークレットキーを使って署名」していきます。
これに関しては、先にコードを見てしまいましょう。
import hmac
import hashlib
signature = hmac.new(SECRET_KEY.encode(),
message.encode(),
hashlib.sha256).hexdigest()
このコードで「HMAC-SHA256 hash形式でシークレットキーを使って署名」しています。
この中身を理解するには、色々な周辺知識が必要になってきます。今は「このように書けば良いんだな〜」と把握しておきましょう。
コード全体を載せておくと、以下のようになります。
import hmac
import hashlib
import time
from pprint import pprint
import configparser
import requests
conf = configparser.ConfigParser()
conf.read('config.ini')
ACCESS_KEY = conf['coincheck']['access_key']
SECRET_KEY = conf['coincheck']['secret_key']
BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/accounts/balance'
nonce = str(int(time.time()))
body = ''
message = nonce + url + body
signature = hmac.new(SECRET_KEY.encode(),
message.encode(),
hashlib.sha256).hexdigest()
r = requests.get(url)
r = r.json()
pprint(r)
STEP⑥ : ヘッダー設定とAPIへのアクセス
最後に、ここまで作成した情報をリクエスト時に渡してあげましょう。
公式ドキュメントを確認してみると、これらの認証情報をHTTP Headerに渡せば良いことが分かります。
PythonでHTTP Headerを設定するには、requests.get()
のカッコ内で引数header
に辞書を渡すだけです。
コードに落とし込むと以下のようになります。
headers = {
'ACCESS-KEY': ACCESS_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature,
'Content-Type': 'application/json'
}
r = requests.get(url, headers=headers)
このように書くことで、認証情報を渡しつつリクエスト送信できます。
これでコードの作成は完了です。コード全体としては、以下のようになります。
import hmac
import hashlib
import time
from pprint import pprint
import configparser
import requests
conf = configparser.ConfigParser()
conf.read('config.ini')
ACCESS_KEY = conf['coincheck']['access_key']
SECRET_KEY = conf['coincheck']['secret_key']
BASE_URL = 'https://coincheck.com'
url = BASE_URL + '/api/accounts/balance'
nonce = str(int(time.time()))
body = ''
message = nonce + url + body
signature = hmac.new(SECRET_KEY.encode(),
message.encode(),
hashlib.sha256).hexdigest()
headers = {
'ACCESS-KEY': ACCESS_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature,
'Content-Type': 'application/json'
}
r = requests.get(url, headers=headers)
r = r.json()
pprint(r)
上記のコードが書かれたPythonファイルを実行すると、以下のように通貨ごとの残高を取得できます。
{'btc': '0',
'jpy': '0',
'success': True,}
‘btc’がビットコインで、’jpy’が日本円です。
Coincheckでは色々な通貨を取り扱っていますが、API経由で取引できる以下の4通貨だけです。(※2021年3月時点)
- BTC : ビットコイン
- ETC : イーサリアムクラシック
- FCT : ファクトム
- MONA : モナコイン
色々な通貨の残高を取得できますが、自動売買を実装するだけなら、上記の4通貨だけ確認すれば良いと思います。
まとめ : 認証情報を設定して口座残高を取得してみよう!
というわけで、今回は認証情報を作成して口座残高を取得しました。
認証情報の作成は少し難しかったと思います。
今回学んだことは、他のAPIを使うときも応用できます。そういう意味では勉強になったはずです。
次の記事では、いよいよプログラムからビットコインを購入してみます。
次回の実装ができれば、あとはロジックを組むだけで自動売買できるようになります。
だんだん難しくなっていきますが、ぜひ楽しみながら学習していきましょう!