APIの仕様を確認する
今回利用するbitbank.ccのAPIのドキュメントをまずは確認してみましょう。
利用したいのは価格情報のみですので、「public-api_JP.md」を参照します。
すると、エンドポイント URLは「https://public.bitbank.cc」となっており、価格を取得するためのTickerは
GET /{pair}/ticker
で取得できることが分かります。
これはAPIの中でも最も簡単な取得方式であり、 https://public.bitbank.cc/{pair}/tickerの{pair}にbtc_jpy等の通貨ペアを入れて、ブラウザにURLを入力してアクセスするだけでGET通信を行いデータを取得することが可能です。
- 認証があるかないか
- 認証方式(パスワードを入れるだけかOAuthなどの特殊な認証方式か)
- 通信方式(GETかPOSTかWebsocketか)
といったAPIの仕様の違いによってコードの書き方が変わります。
APIについては以下の記事をご覧ください。
ライブラリをインポートする
import requests
Pythonのコードを書くときには、まず使用するライブラリのインポート文を記述します。
API取得時に使うライブラリ
APIによるデータを取得するとき(≒URLにアクセスするとき)には、外部ライブラリであるrequestsと標準ライブラリであるurllibの主に二種類が使われます。
requestsは非常に便利なので、一般的にはurllibではなくrequestsを利用することが多いです。そのため、今回解説するような簡単なプログラムの場合は、urllibを利用してもrequestsを利用しても大きな違いはありませんが、今回はrequestsライブラリを使用したコードを解説します。
外部ライブラリには、
- 別途インストールが必要(開発環境によっては煩雑な作業が必要)
- 一からライブラリの使い方を学習しなければならない(学習コストが高い)
- バグが多く含まれていたり更新が止まっている可能性がある
といったデメリットもあります。しかし、Pythonは外部ライブラリが充実していることも大きな利点ですし、今回使うRequestsのような非常に有名なライブラリでは2番目と3番目のデメリットはほとんど意識しなくても良いものです。
ほとんど解説記事がないようなマイナーなライブラリはよく考えて使用することが重要ですが、有名なライブラリはどんどん使っていきましょう。
ライブラリのインストール
外部ライブラリを使用する際には事前にインストールが必要となります。
インストール方法はローカル環境のコンソール(コマンドプロンプト)上で実行するのか、開発ソフト(IDE)内で実行するのか、サーバー上で実行するのかによって変わりますので、適宜確認してください。
ローカル環境のコンソール上で実行する場合は、
pip install requests
といったコマンドによりインストールする必要があります。
requestsライブラリの基本的な使い方
では早速プログラムのコードを書いていきましょう。requestsを利用してAPIを取得する場合には以下の三つの手順に細かく分かれます。
URLを設定する
import requests
url = "https://public.bitbank.cc/btc_jpy/ticker"
まずは取得先のURLを設定します。今回は試しにBTC/JPYのペアの価格情報を取得したいので、APIドキュメントをよく読んで変数にURLを代入します。
通信を行う
import requests
url = "https://public.bitbank.cc/btc_jpy/ticker"
r = requests.get(url, timeout=5)
4行目で通信を行います。今回はGET通信ですので、requests.get()により通信を行い第一引数に通信先のURLを指定します。第二引数のtimeout=は最大のタイムアウト時間(秒)です。タイムアウト時間の設定は任意ですが、設定しないと応答があるまでずっと待機し続けることになるので、必ず設定しておきましょう。
今回は認証なしのGET通信なので非常に簡潔な書き方で済みます。
例えば、仮にPOST通信で通貨ペアとAPIキーを設定しなければならない場合は、
url = "https://public.bitbank.cc/ticker"
params = {'pair': 'btc_jpy', 'apikey': 'api01234abcdefg'}
r = requests.post(url, data=params, timeout=5)
といったかたちに書くことができます。
jsonを辞書に変換する
import requests
url = "https://public.bitbank.cc/btc_jpy/ticker"
r = requests.get(url, timeout=5)
r = r.json()
APIから得られたデータはjson形式である場合がほとんどです。しかし、jsonは文字列でありそのままではPythonで扱いづらいため、requestsのjson()関数により辞書形式に変換します。
Pythonの標準ライブラリであるjsonライブラリと混同しないようにしましょう。
requestsのjson()はjsonライブラリのloads()と同じでjsonをデコードして辞書化することができます。
>>> print(r)
{success': 1, 'data': {'sell': '797071', 'buy': '797070', 'high': '819799', 'low': '786002', 'last': '797071', 'vol': '809.7289', 'timestamp': 1575288815285}}
試しに変数rをprint文により表示してみると辞書形式になっていることがわかります。
※print文による出力はjsonと辞書で一見変化はありません。
このようにprint文を利用すると変数の中身をチェックしてデバッグすることができます。
しかしデバッグのためにいちいちprint文を挿入するのは面倒であるため、多くの開発ソフト(IDE)では、デバッグのために一行ずつコードを実行したりその時のすべての変数の中身を確認できる機能があります。
当サイトではわかりやすくするために、変数の中身を見せるときにはprint文を使用しますが、実際に開発する際にはprint文にとらわれず、ご利用の開発ソフトに合わせてデバッグしてみてください。
なお、デバッグ以外にも、長時間または継続的にAPIと通信を行ったりスクレイピングを行ったりするとき、コンソール上に進捗状況等を表示したい場合などにprint文が利用されます。
ここまでで、requestsライブラリの役割は終わりです。
得られたデータの加工・表示
変数rの中身を見てわかるとおり、安値・高値・出来高等様々なデータが含まれていますが、今回必要なのは最新の価格情報だけなのでここからデータの加工を行います。
import requests
url = "https://public.bitbank.cc/btc_jpy/ticker"
r = requests.get(url, timeout=5)
r = r.json()
last = r['data']['last']
print("BTC価格は{}円です".format(last))
6行目で辞書の中の最新価格(キー'data'の中の辞書のキー'last'の値が最新価格)を参照し、変数lastに代入。
7行目でprint文とformat関数の組み合わせによりコンソール上にメッセージを表示します。
>>> print("BTC価格は{}円です".format(last))
BTC価格は802026円です
出力結果はこのようなかたちになります。
format関数は、
'任意の文字列{}任意の文字列'.format(変数)
というかたちで文字列中に変数を埋め込むことができます。
'任意の文字列{1}任意の{2}文字列'.format(変数1,変数2)
とすれば複数の変数を埋め込むこともできますし、変数の型が整数や浮動小数点であっても自動的に文字列に変換してくれるので便利です。
※
'任意の文字列' + 変数1 + '任意の文字列'
というかたちに文字列を結合することも可能ですが、この場合変数1の型が文字列でないとエラーが発生します。
これで単一の仮想通貨の価格を取得・表示する7行のプログラムが完成しました。