前回の記事で、API通信を行うための外部ライブラリ「requests」のインストールが完了し、開発環境が整いました。
今回からはいよいよ【システム実装検証】として、実際にPythonプログラムを記述してAPIと通信するテストを行っていきます。第一歩として、システムと証券口座を繋ぐ合言葉となる「APIトークン(認証キー)」の取得処理を実装します。
事前準備のおさらい(APIパスワード)
以前の記事(【環境構築検証④】)でも解説しましたが、プログラムからAPI通信を行うためには、前提としてkabuステーションのアプリケーション画面上で「APIパスワード」が設定されている必要があります。
このパスワードを使ってシステム側から証券会社へ「通信の許可」を求めに行くため必要になります。(設定はkabuステーションのシステム設定画面から行えます)
構成ファイル(config.py)の作成
セキュリティの観点から、APIパスワードなどの重要な機密情報は直接コードに書き込まず、別ファイル(config.py)に切り出して読み込む設計としています。
まずは実行するプログラムと同じフォルダに、以下のようなconfig.pyファイルを作成しておきます。
# config.py
# kabuステーション APIパスワード
KABU_API_PASSWORD = "ここに設定したAPIパスワードを入力"
# トークンを保存するテキストファイルのパス
KABU_TOKEN_PATH = "kabu_token.txt"
トークン取得用のPythonソースコード
以下が、前回インストールしたrequestsライブラリを使用して、APIトークンを取得しテキストファイルに保存する検証コードの一例です。(本コードでは、取得したトークンの中身や、エラー時の生データ(レスポンス全体)をそのままprintで出力しないように設計しています)
import requests
import config
def get_api_token():
"""kabuステーションAPIからトークンを取得し、ファイルに保存する"""
print("APIトークンを取得中...")
# 本番環境のポート(18080)を指定 ※検証環境の場合は 18081
url = 'http://localhost:18080/kabusapi/token'
# 送信するデータ(APIパスワードをJSON形式にセット)
payload = {'APIPassword': config.KABU_API_PASSWORD}
try:
# requestsライブラリを使用してPOSTリクエストを送信
response = requests.post(url, json=payload, timeout=5)
# HTTPエラー(401認証エラーなど)があれば例外を発生させる
response.raise_for_status()
# レスポンスデータを辞書型に変換してトークンを取り出す
content = response.json()
token = content.get('Token')
if token:
# 取得したトークンをテキストファイルに保存
with open(config.KABU_TOKEN_PATH, 'w', encoding='utf-8') as f:
f.write(token)
print("成功!トークンを取得しました: [HIDDEN]")
return token
else:
print("エラー: トークン取得失敗")
print("レスポンス:", content)
return None
except requests.exceptions.RequestException as e:
print(f"API通信エラーが発生しました: {e}")
return None
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}")
return None
if __name__ == "__main__":
get_api_token()
よくある失敗ポイント
このプログラムを実行してエラーになる場合、以下の3つの原因が非常に多いため確認が必要です。
- ポート番号の間違い
コード内のurl = 'http://localhost:18080/...'の部分です。kabuステーションAPIは、本番環境なら「18080」、検証(テスト)環境なら「18081」を使用します。ご自身のkabuステーションの起動状態と一致しているか確認が必要です。 - kabuステーションが起動していない
kabuステーションAPIはローカル(自分のPC内)のアプリに向かって通信を行います。そのため、大前提として「kabuステーションのアプリ自体が起動していること」、そして設定で「APIが有効になっていること」が必須となります。 - APIパスワードの勘違い
config.pyに入力するパスワードは、証券口座へログインするためのパスワードではなく、kabuステーション内で別途設定した「API専用のパスワード」です。ここを間違えると401認証エラーとなります。また、エラー時にはprint("レスポンス:", content)の記述によりターミナルに詳細な原因が出力されるよう設計しています。
【実行前の最終チェックリスト】
- kabuステーションアプリが起動しているか
- アプリ内で「API利用設定」がONになっているか
- 指定したポート番号(18080 または 18081)が一致しているか
- config.pyの「APIパスワード」は正しいか
- アプリを動かしているのと同じローカルPCで実行しているか
認証プロセスの自動化
kabuステーションのAPIトークンは有効期限があるため、システムを完全自動化するためには、これを毎朝、市場が開く前の決まった時間にWindowsのタスクスケジューラ等で単独実行させる必要があります。これにより、常に新鮮なトークンで1日の取引をスタートさせる「認証プロセスの自動化」が実現します。
無事にAPI通信の鍵となるトークンが取得できるようになりました。
次回は、この取得したトークンを使って「現在の口座残高(買付余力)」を取得するプログラムのテストを行います。当システムでは、残高確認自体は自動化せず、購入時に余力不足でエラーとなった場合にメールで通知を受け取る設計としていますが、API通信の基礎テストとして残高取得の挙動を確認していきます。