こんにちは、はやたす(@hayatasuuu )です。
前回の記事では、API Keyの取得と設定ファイルの準備をおこなっていきました。
»前回の記事 : #7 Python×ビットコイン自動売買 | API Keyの取得と設定ファイルの準備をしよう!
今回は、以前取得したアクセスキーとシークレットキーを使って、APIにアクセスしていきたいと思います。
具体的には、Coincheck口座の残高を取得していきます。
API Keyを必要とするアクセスは少し難しいのですが、この記事を読めばしっかりと実装できるようになりますよ!
※Coincheckアカウントを持っていないと、この先には進めません。もし学習を続ける場合には、口座開設(無料)をおこなった上で、取り組んでみてください!
»公式ページ : 仮想通貨取引所・販売所の口座開設|Coincheck(コインチェック)
Contents
認証情報を設定して口座残高を取得してみよう!
今回は、第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)
»参考記事 : #6 Python×ビットコイン自動売買 | Coincheck APIを使って板情報を取得しよう!
STEP① : URLの変更
まずはいつもどおり、アクセス先のURLを変更してきましょう。
口座残高を取得するためのエンドポイントは、/api/accounts/balance
になっています。
また、こちらのエンドポイントを使うにあたって、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 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()
で呼び出せば作成できます。
実際に確認してみましょう。
>>> import time
>>> time.time()
# 出力結果 --> 1613174040.209963
このように、非常に大きな数字が出力されるかと思います。
今回はこのUNIXスタンプを、正の整数で送る必要があるのでint()
を使ってキャストしましょう。
また、ACCESS SIGNATUREの作成でも使う関係上、さらにstr()
でキャストしておきます。
つまり、以下のコードを追加してあげればOKです。
import time
nonce = str(int(time.time()))
全体では、以下のようになっているかと思います。
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)
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
に辞書を渡してあげるだけです。
つまり、Pythonのコードに落とし込むと、以下のように書けるかと思います。
headers = {
'ACCESS-KEY': ACCESS_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature,
'Content-Type': 'application/json'
}
r = requests.get(url, headers=headers)
上記のように書くことで、認証情報を渡しつつリクエスト送信できます。
ここまで書ければ、コードの作成は完了です。あとは、出力結果を確認したいので、pprint()
を使ってあげましょう。
コード全体としては、以下のようになります。
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年2月時点)
- BTC : ビットコイン
- ETC : イーサリアムクラシック
- FCT : ファクトム
- MONA : モナコイン
なので、色々な通貨情報を取得できますが、APIを使っていくなら上記4通貨だけ確認すれば良いのかなと思います。
まとめ : 認証情報を設定して口座残高を取得してみよう!
というわけで、今回は認証情報を作成して、自分の口座残高を取得していきました。
認証情報の作成は、少し難しかったかなと思います。
でも、今回学んだことは、他のAPIを使うときにも応用できます。そういった意味では、かなり勉強になったはずです。
次回は、いよいよビットコインの購入をやっていきます。ここまでできれば、あとはロジックを組むだけで自動売買できるようになります。
だんだん難しくなっていきますが、ぜひ楽しみながら学習していきましょう!