【初心者向け】Zaif API×Pythonでプチフィンテック11 現物取引API利用の流れ

前回、HTTPリクエスト概要の説明が終わったところで、今回はプログラム内で現物取引APIを利用する際の流れを説明していきます。

前半で流れを日本語で説明した後、後半では第9回目に紹介したサンプルコードを元に具体的な処理を説明しますので、前半の説明でイメージが掴みづらい場合は後半も併せて見てみて下さい。

<スポンサーリンク>

現物取引API利用の流れ

①パラメータ設定

現物取引APIには現物公開APIと同様に複数のAPIが含まれていますが、それぞれのAPI利用時には、「どのAPIを利用するか」と「API毎に決められた情報」をサーバ側に渡す必要があります。

これらサーバに渡す情報のことを「パラメータ」と呼びますが、まずはこのパラメータの設定を行います。

なお、この時点ではパラメータ設定形式に特段の制約はないのですが、ここでは取り扱いの容易さという観点から、Pythonの「ディクショナリ」という形式で設定します。

ディクショナリとは、「{キー1:値1, キー2:値2, … , キーn:値n}」という形式で、キー毎に値を保存するためのデータ構造です

以下がディクショナリの例です。

# 果物の購入数量を表すディクショナリ
{
    'りんご' : 3,
    'みかん' : 2,
    'バナナ' : 5
}

このディクショナリでは、りんごが3個、みかんが2個、バナナが5個というように、果物(キー)毎の数量(値)を表しています。

②URLエンコード

パラメータの設定ができたところで次に行うべき処理ですが、設定したパラメータをサーバに渡す際には、専用の形式に変換する必要があります。この専用形式への変換のことを「URLエンコード」と呼びます

例えば、前述の果物の購入数量の例ですと、

「りんご=3&みかん=2&バナナ=5」という形式に変換することになります。

③エンコードデータへの署名

続いて、URLエンコードを行ったパラメータへ、secretを用いて署名します。

「署名」とは、パラメータが本当に本人により作成されたことを証明するため、本人しか知りえない情報(=secret)を用いてパラメータを加工することです

紙の契約書等に直筆で署名して、確かに本人が契約を結んだことを証明することと同じですね。そういった点から署名と呼ばれます。

④ヘッダデータの作成

次に、HTTPリクエストヘッダを作成します。

現物取引APIを利用する際には、keyと③で作成した署名データ(を少し加工したもの)の2つからヘッダを作成します。

⑤HTTPリクエストの送信

最後に、HTTPリクエストを作成してサーバへ送信します。

リクエストには、ヘッダとして④で作成したデータを、そして、メッセージボディとして②で作成したエンコード済みパラメータを含めて、POSTメソッドにより送信します。

現物取引APIの利用手順は以上です。

上記の手順はやや複雑なものとなっていますが、これらは「HMAC認証」と呼ばれる認証手順に則ったものであり、この手順を採用することで、なりすましと送信データの改ざんを防止することが可能になっています。

HMAC認証の詳細については「初心者向け」の域を超えてしまいますので、本記事では説明を避けますが、ご興味のある方はWebで調べてみて頂ければと思います。

ここでは、「なりすましとデータ改ざんを防ぐため、このような複雑な手順を踏む必要がある」という点だけ押さえておけば十分です。

参考まで、①~⑤の流れを図示したものが下図です。

プログラムとの対比

それでは、今回紹介した手順と第9回目に掲載したサンプルコードがどのように結びつくのか、順を追って見ていきたいと思います。

前回の記事でAPIキーを取得することにより、現物取引APIを利用できる準備が整いました。 そこで今回は早速、現物取引APIを利用してみ...

まずは、第9回目に掲載したコードを再掲載します。

import requests
from urllib.parse import urlencode
import hashlib
import hmac
from time import time

KEY = "XXX" #前回取得した「key」を「"」で括って記述
SECRET = "XXX" #前回取得した「secret」を「"」で括って記述

#①
params = {
    'method': 'get_info2',
    'nonce': time()
}
#②
encoded_params = urlencode(params)

#③
signature = hmac.new(bytearray(SECRET.encode('utf-8')), encoded_params.encode('utf-8'), digestmod=hashlib.sha512)

#④
headers = {
    'key': KEY,
    'sign': signature.hexdigest()
}

#⑤
response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)

print(response.text)

プログラム中の①~⑤と、前半の流れにおける①~⑤は対応しています。

では、順に内容を見て行きましょう。

①パラメータ設定

前述の通り、「どのAPIを利用するか」と「API毎に決められた情報」の2つをディクショナリ形式で記述しています。

ここで、「どのAPIを利用するか」に対応するものが、「’method’: ‘get_info2’」という箇所であり、「‘method’: ‘使いたいAPI名称’」という形式で指定します。

今回は、「get_info2」という、自分の資産状況を表示するためのAPIを指定しています。

ちなみに、「get_info」という似たようなAPIもありますが、今回使っている「get_info2」は「get_info」の軽量版です。

さて、もう一方の「API毎に決められた情報」ですが、「get_info2」では、「nonce」というパラメータを指定する必要があります。

この「nonce」には任意の数値データを指定するのですが、1点制約があります。それは、APIを利用する都度、前回利用時よりも大きな数値を指定する必要があるという制約です。例えば、前回「1」を指定したのであれば、今回は「2」など、1より大きい数字を指定する必要があります。

nonceについて理論的な説明は省略しますが、通信データの盗聴によるなりすましアクセスを防止するためにこのような方法が用いられています。

さて、APIを利用する度に、前回API利用時より大きな数字を指定する方法はいくつかありますが、比較的簡便な方法が、現在時刻を数値化した情報を使うという方法です。

ここでは、timeというPythonのメソッドを使って、現在時刻の数値化情報を取得し、それをnonceに設定しています。

②URLエンコード

続く、URLエンコードですが、Pythonには「urlencode」という便利なメソッドがあります。

これは、ディクショナリ形式で与えたデータをURLエンコードしてくれるものです。

ですので、「encoded_params = urlencode(params)」という記述により、①で指定したパラメータが、「method=get_info2&nonce=現在時刻の数値情報」という形式に変換され、変数「encoded_params」に格納されます。

③エンコードデータへの署名

続いて、②で作成したデータに対し、secretを用いて署名を行います。

ここも詳述は避けますが、ざっとだけ流れを書きますと、

  • secretの文字コードをutf-8というものに変換し、
  • それをbytearrayという形式に変換し、
  • さらにそれを用いて②でエンコードしたパラメータに対しSHA512という方式で署名し、
  • そのデータをsignatureという変数に格納する

という処理を行っています。

④ヘッダデータの作成

次に、HTTPリクエストを送信するために必要なヘッダデータを作成します。

ヘッダデータは前述の通り、keyと③で作成した署名済みエンコードパラメータの2つから構成します。これら2つの情報はディクショナリ形式で指定します。

なお、署名済みエンコードパラメータをヘッダに指定する際、「ハッシュ」というデータ形式に変換する必要がありますが、それをhexdigestというメソッドにより行っています。

⑤HTTPリクエストの送信

最後にヘッダとメッセージボディをまとめて、HTTPリクエストをサーバへ送り、その返信結果をresponse変数に格納します。

ヘッダとボディの指定方法ですが、

requests.post(リクエスト先, data=メッセージボディ, headers=ヘッダ)

という形で指定します。

なお、現物公開API利用時とは異なり、GETではなくPOSTメソッドを用いていることに注意して下さい。

現物取引API利用の流れは以上ですが、①~⑤の処理を行うために必要なモジュールをプログラム冒頭でインポートする必要があることにご注意下さい。

終わりに

今回の記事は以上ですが、なかなか難しかったのではないでしょうか?

ただ、難しい認証周りの処理は各現物取引API間で共通ですので、他のAPIを利用する場合には基本的に掲載したサンプルコードをコピーし、API毎に異なるパラメータ部分を中心にカスタマイズしていけば自動売買の運用はできると思います。

その上で、もしも興味が湧くようであれば、「HMAC認証」というキーワードでググってみると、多くの情報が得られますので調べてみて下さい。

さて、次回はこれまで説明してきた内容を踏まえて、いよいよ売買処理を行うためのAPIの使い方を紹介したいと思います。

カテゴリ:フィンテック
<スポンサーリンク>

シェアする

フォローする