#8 Python×ビットコイン自動売買 | 認証情報を設定して口座残高を取得してみよう!

  • URLをコピーしました!

こんにちは、はやたす(@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するときに、あわせて認証情報を送るようにしましょう。

公式ドキュメントを確認してみると、認証で必要なものが書かれています。

python-bitcoin-balance1

色々書いてあって難しいですが、結局必要になるのは以下の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を使うときも応用できます。そういう意味では勉強になったはずです。

次の記事では、いよいよプログラムからビットコインを購入してみます。

次回の実装ができれば、あとはロジックを組むだけで自動売買できるようになります。

だんだん難しくなっていきますが、ぜひ楽しみながら学習していきましょう!

あわせて読みたい
#9 Python×ビットコイン自動売買 | Pythonを使ってビットコインを指値注文しよう! こんにちは、はやたす(@hayatasuuu )です。 第9回目の本記事では、Pythonを使ってビットコインを指値注文してみたいと思います。 前回の記事 : #8 Python×ビットコイン...
SNSに投稿して読み返す
  • URLをコピーしました!
  • URLをコピーしました!
目次