
そんな初心者に向けてPythonでAPI認証を行う方法について詳しく解説しました。
ccxtは簡単で初心者は簡単に使えるようになっていますが裏で何をやっているのかよくわかりませんよね。
ビットコインバーゲンでは、APIキーを用いなければ使えない残高の確認を行う流れを紹介し、順番に解説していきます。
草猫店長の目次ノート
bitFlyerから残高を取得するコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import requests import datetime import json from pprint import pprint import hashlib import hmac api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" base = "https://api.bitflyer.jp" path = "/v1/me/getbalance" method = "GET" timestamp = str(datetime.datetime.today()) message = timestamp + method + path signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } res = requests.get(base + path, headers = headers) pprint(res.json()) |
上のコードを実行すると結果としてbitFlyerで現物保有している残高が返ってきます。
1 2 3 4 5 6 7 8 9 |
awakewalker:Python awakewalker$ python balance.py [{'amount': 64.0, 'available': 64.0, 'currency_code': 'JPY'}, {'amount': 2.63e-05, 'available': 2.63e-05, 'currency_code': 'BTC'}, {'amount': 0.0, 'available': 0.0, 'currency_code': 'BCH'}, {'amount': 0.0019, 'available': 0.0019, 'currency_code': 'ETH'}, {'amount': 0.0, 'available': 0.0, 'currency_code': 'ETC'}, {'amount': 0.0, 'available': 0.0, 'currency_code': 'LTC'}, {'amount': 0.0, 'available': 0.0, 'currency_code': 'MONA'}, {'amount': 0.0, 'available': 0.0, 'currency_code': 'LSK'}] |
順番に解説していきます。
使用しているライブラリ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import requests import datetime import json from pprint import pprint import hashlib import hmac api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" base = "https://api.bitflyer.jp" path = "/v1/me/getbalance" method = "GET" timestamp = str(datetime.datetime.today()) message = timestamp + method + path signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } res = requests.get(base + path, headers = headers) pprint(res.json()) |
データはJSON形式と呼ばれるものになり、残高データは個々人によるプライベートなものですのでAPIキーを使って本人確認ができればデータを取得することができます。
そのために必要なライブラリです。
・「import requests」は、GETメソッド、POSTメソッド(後ほど解説)などを利用するためのライブラリのことです。
・「import datetime」は日付を取得するためのライブラリのことです。
・「import json」はJSON文字列(よく利用されるデータの並べ方の規格)を扱うためのライブラリのことです。
・「from pprint import pprint」はターミナル(コマンドプロント)に出力されるデータをいい感じに開業させてくれるライブラリです。
(”from”はpprintライブラリの中にさらに入っているオブジェクトを指定するコードです。)
1 2 |
import hashlib import hmac |
これら二つのライブラリはAPIキー(APIシークレットキー)を暗号化して盗聴されないようにするためのライブラリです。
ここでの盗聴とは誰かがどのサーバー(Webサイト)へ命令を送る(ページの移動とか)をしたのかを追跡することです。
ccxtなどの便利なライブラリを利用していると勝手にやってくれていますがセキュリティ上はとても大切なことを行うライブラリになります。


必要な変数の準備
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import requests import datetime import json from pprint import pprint import hashlib import hmac api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" base = "https://api.bitflyer.jp" path = "/v1/me/getbalance" method = "GET" timestamp = str(datetime.datetime.today()) message = timestamp + method + path signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } res = requests.get(base + path, headers = headers) pprint(res.json()) |
“GET”とはそのまま日本語とほぼ変わらない意味です。「データを取得します」というAPIサーバーへ送る命令です。
そして認証するためにはいつ何時何分に認証したのかを知らせる必要があるためタイムスタンプ(時刻)も用意しておきます。
そして時刻とデータを入れて欲しいURLを組み合わせたmessage変数も準備しておきます。
message変数だけでは誰の命令か分からないので、APIキーをセットにかつ、盗聴されないために暗号化して送信する必要があります。
そのための変数「signature」も準備しましょう。
APIキー、ここに自分のAPIキー(シークレットキー)も入力しましょう。
1 2 |
api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" |
次にURL(URLの中にデータが入っているため)を指定します。
1 2 3 |
base = "https://api.bitflyer.jp" path = "/v1/me/getbalance" method = "GET" |

特に初心者に難しいと思われるのはsignature変数の内容だと思います。
1 |
signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() |
hamcはライブラリとしてimportしたものでした。そのhmacをhmac.new()という形で中に変数を入れて使います。(インスタンスとして利用)
hmac(Hash-Based Message Authentication Code)とは、ハッシュ関数と呼ばれる暗号処理を使ってメッセージを暗号化したコードの略称です。
hmacを使うことで、APIキーや、メッセージ(ここでは欲しいデータを受け取るURLとタイムスタンプ)を送信時に誰かに盗聴されないようにしつつ暗号化してくれます。
最近のWebAPIではスタンダードの一つとなっています。
試しにsignatureの中のデータをprint()で出力してみます。
1 2 3 |
message = timestamp + method + path signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() print(signature) |
すると結果として以下のようなハッシュ値(ハッシュ関数を通した後の結果)が取得できます。
1 |
e81720cb8ebb85474bd4acfebfed4f7156e3bd4ff404d1de25fdedc7c1a11b9a |
hmacの中ではSHA256と呼ばれるハッシュ関数を使って暗号化します(hashlib.sha256の部分)。ブロックチェーンについて調べた人であれば聞いたことがあるハッシュ関数だと思います。
中のデータが1文字でも異なると全く違うハッシュ値が生成されるのがハッシュ関数の特徴です。
途中のbytearray()はコンピューターが読める文字(バイナリデータ)に変換する処理です。
終わりのhexdigest()ではデータの連結を行なっています。
ヘッダー情報の準備
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import requests import datetime import json from pprint import pprint import hashlib import hmac api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" base = "https://api.bitflyer.jp" path = "/v1/me/getbalance" method = "GET" timestamp = str(datetime.datetime.today()) message = timestamp + method + path signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } res = requests.get(base + path, headers = headers) pprint(res.json()) |
先ほど準備した変数を設定してあげます。
1 2 3 4 5 6 |
headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } |
全てのWebページのサーバー操作にヘッダー情報がマストな訳ではなく、ある程度は自動でサーバー側が処理してくれますがそれで正しくブラウザ側が表示される保証はありません。
また、APIを使った操作に関してはheader情報はマストです。
‘Content-Type’ = ‘application/json’となっていますが、これはJSON文字列のことですね。
APIサーバーへリクエスト(データを取得するための命令)を投げる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import requests import datetime import json from pprint import pprint import hashlib import hmac api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" base = "https://api.bitflyer.jp" path = "/v1/me/getbalance" method = "GET" timestamp = str(datetime.datetime.today()) message = timestamp + method + path signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } res = requests.get(base + path, headers = headers) pprint(res.json()) |
requests.get(base + path, headers = headers)で取得して、結果をres変数に代入します。
そしてpprint()を使っていい感じに改行しながら出力させます。
res.json()と書かれていますが、res変数をJSON形式で出力しますという意味ですね。
GETとPOSTの違いを知っておこう

今回は説明をカンタンにするためにGETでデータを取得しました。
1 |
method = "GET" |
ですが実際に自動売買を行う際に頻繁に利用するのはPOSTの方になります。
POSTを説明する前にこのGETやらPOSTってそもそも一体何かと言えば、サーバーとのやり取りを行うための規格、HTTP(HTTPメソッド)の一種になります。
POSTとGETはサーバーへの呼びかけ方(命令)が異なります
GET→データをちょうだい〜
POST→データを送るよ〜
この違いだけです。GETはシンプルなので、データをAPIサーバーへ要求するだけで済みます。
しかしPOSTはデータを送るため、当たり前ですがこちら側でデータを準備しないといけません。
次の項でparams変数にデータを入れて実際にPOSTして見ましょう。
POSTメソッドを使って指値注文を入れてみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import requests import datetime import json from pprint import pprint import hashlib import hmac api_key = "あなたのAPIキー" api_secret = "あなたのAPIシークレットキー" base = "https://api.bitflyer.jp" path = "/v1/me/sendchildorder" method = "POST" timestamp = str(datetime.datetime.today()) param = { "product_code" : "FX_BTC_JPY", "child_order_type" : "LIMIT", "side" : "BUY", "price" : 1200000, "size" : 0.01, } body = json.dumps(param) message = timestamp + method + path + body signature = hmac.new(bytearray(api_secret.encode('utf-8')), message.encode('utf-8'), digestmod = hashlib.sha256 ).hexdigest() headers = { 'ACCESS-KEY' : api_key, 'ACCESS-TIMESTAMP' : timestamp, 'ACCESS-SIGN' : signature, 'Content-Type' : 'application/json' } res = requests.post( base + path, data = body, headers = headers) print(res.json()) |
注文を行うためにpath変数のURLを変え、APIサーバーへ送るデータとしてparam変数を用意しました。
json.dumpsはparam変数をサーバーが読み取れるJSON形式へ変換(エンコード)しています。
1 |
res = requests.post( base + path, data = body, headers = headers) |
res変数の中身に、「data = body」が追記されています。POSTに送りたいデータをdata変数に格納しているという意味ですね。
実際に実行して見る
1 2 |
Python awakewalker$ python test-order.py {'child_order_acceptance_id': 'JRF20190709-133449-183882'} |
最初はbitFlyerライトニングのページを見ながら発注して見てください。数秒後に反映されるはずです。
ccxtを使わずにPythonでAPI認証をbitFlyerで行う方法 まとめ

API認証はややこしいものが多いです。しかしWebサービスのAPIを使っていくのであればなんどもぶつかると思われるので少しでも理解できれば今後にも応用できます。
今回の記事とは逆にccxtを使ってPythonで注文を行うのは【 コピペ 】 Pythonを使って仮想通貨(ビットコイン)で売買注文する方法を読んでみてください。
もしもこの記事を読んでプログラミングってなんか面倒臭いなあ、と思ったら、プログラミング知識が不要な【 簡単◎ 】 スマホからビットコインで自動売買 【 iPhone・Android 】を読んでみてください。
良かったらシェアしてね♪ /