【システム実装検証①】PythonとrequestsでkabuステーションAPIの認証トークンを取得する

前回の記事で、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つの原因が非常に多いため確認が必要です。

  1. ポート番号の間違い
    コード内の url = 'http://localhost:18080/...' の部分です。kabuステーションAPIは、本番環境なら「18080」、検証(テスト)環境なら「18081」を使用します。ご自身のkabuステーションの起動状態と一致しているか確認が必要です。
  2. kabuステーションが起動していない
    kabuステーションAPIはローカル(自分のPC内)のアプリに向かって通信を行います。そのため、大前提として「kabuステーションのアプリ自体が起動していること」、そして設定で「APIが有効になっていること」が必須となります。
  3. APIパスワードの勘違い
    config.py に入力するパスワードは、証券口座へログインするためのパスワードではなく、kabuステーション内で別途設定した「API専用のパスワード」です。ここを間違えると401認証エラーとなります。また、エラー時にはprint("レスポンス:", content)の記述によりターミナルに詳細な原因が出力されるよう設計しています。

【実行前の最終チェックリスト】

  • kabuステーションアプリが起動しているか
  • アプリ内で「API利用設定」がONになっているか
  • 指定したポート番号(18080 または 18081)が一致しているか
  • config.pyの「APIパスワード」は正しいか
  • アプリを動かしているのと同じローカルPCで実行しているか

認証プロセスの自動化

kabuステーションのAPIトークンは有効期限があるため、システムを完全自動化するためには、これを毎朝、市場が開く前の決まった時間にWindowsのタスクスケジューラ等で単独実行させる必要があります。これにより、常に新鮮なトークンで1日の取引をスタートさせる「認証プロセスの自動化」が実現します。

無事にAPI通信の鍵となるトークンが取得できるようになりました。
次回は、この取得したトークンを使って「現在の口座残高(買付余力)」を取得するプログラムのテストを行います。当システムでは、残高確認自体は自動化せず、購入時に余力不足でエラーとなった場合にメールで通知を受け取る設計としていますが、API通信の基礎テストとして残高取得の挙動を確認していきます。