Python×ビットコイン自動売買

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

python-bitcoin-balance

こんにちは、はやたす(@hayatasuuu )です。

前回の記事では、API Keyの取得と設定ファイルの準備をおこないました。

前回の記事はこちら

python-bitcoin-apikey
#7 Python×ビットコイン自動売買 | API Keyの取得と設定ファイルの準備をしよう!こんにちは、はやたす(@hayatasuuu )です。 前回までの記事で、色々なAPIにアクセスしてビットコインの各種情報を取得し...

今回はアクセスキーとシークレットキーを使って、APIにアクセスしていきたいと思います。

具体的には、APIにアクセスしてCoincheck口座の残高を取得していきます。
API Keyを必要とするアクセスは少し難しいですが、この記事を読めば問題なく実装できるようになります。

ぜひ一緒に頑張っていきましょう!

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)

 

python-bitcoin-trade6
#6 Python×ビットコイン自動売買 | Coincheck APIを使って板情報を取得しよう!こんにちは、はやたす(@hayatasuuu )です。 前回の記事では、ビットコインの全取引履歴を取得しました。 前回の記事...

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するときに、合わせて認証情報を送るようにしましょう。

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

python-bitcoin-balance1

色々書いてあって難しいのですが、簡略すると必要になるのは以下の3点です。

  • ACCESS KEY : すでに取得済です
  • ACCESS NONCE : これから作成します
  • ACCESS SIGNATURE : これから作成します

特に、ACCESS SIGNATUREは作成が難しいので、一緒に頑張っていきましょう。

STEP③ : API Keyの読み込み

まずは認証で必要になるアクセスキーとシークレットキーの読み込みをおこなっていきましょう。

と言っても、これは前回のレクチャーで作成しておいたので、コピペするだけで大丈夫です。

python-bitcoin-apikey
#7 Python×ビットコイン自動売買 | API Keyの取得と設定ファイルの準備をしよう!こんにちは、はやたす(@hayatasuuu )です。 前回までの記事で、色々なAPIにアクセスしてビットコインの各種情報を取得し...

つまり、コードとしては以下のようになります。

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年3月時点)

  • BTC : ビットコイン
  • ETC : イーサリアムクラシック
  • FCT : ファクトム
  • MONA : モナコイン

なので、色々な通貨情報を取得できますが、APIを使っていくなら上記4通貨だけ確認すれば良いのかなと思います。

まとめ : 認証情報を設定して口座残高を取得してみよう!

というわけで、今回は認証情報を作成して、自分の口座残高を取得していきました。

認証情報の作成は、少し難しかったかなと思います。
でも今回学んだことは、他のAPIを使うときにも応用できます。そういう意味では、かなり勉強になったはずです。

次回は、いよいよビットコインの購入をやっていきます。
ここまでできれば、あとはロジックを組むだけで自動売買できるようになります。

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

第9回目の記事はこちら

python-bitcoin-limit-order
#9 Python×ビットコイン自動売買 | Pythonを使ってビットコインを指値注文しよう!こんにちは、はやたす(@hayatasuuu )です。 前回の記事では、認証情報の設定と口座残高の取得をおこないました。 前...

トップページはこちら

python-bitcoin-auto-trade
Python×ビットコイン自動売買 | 初心者でも理解できる入門講義『Pythonを使ったビットコインの自動売買って、どうやって実装するんだろう...。分かりやすく書かれている入門記事はないかな〜。』このような悩みを解決する記事になっています。Pythonを使ったビットコインの自動売買を学んでみたい人は必見です。...
ABOUT ME
はやたす
たくさんPythonを紹介するYouTuberです(登録者1.94万人) | フリーランスで機械学習/分析案件も請けています(経験業界 : 金融, 情報通信, サービス) | 元プログラミングスクール講師