Skip to content

nohikomiso/saxo-apy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Saxo-APY (OAuth & Session Client)

License Python OAuth AI-Ready

Saxo Bank OpenAPI の複雑な OAuth 2.0 認証とセッション管理を、Python から「手間いらず」で行うための軽量クライアントライブラリです。

本プロジェクトは、オリジナルの toanalien/saxo-openapi-client-python をベースに、最新の実行環境への対応と 2026 年時点での最適化を施したフォーク・バージョンです。


🙏 謝辞 (Acknowledgments)

本ライブラリの根幹である OAuth 認証フローや、Flask を用いた自動コールバック処理の鮮やかな実装は、元々 toanalien (GitHub) 氏によって考案・提供されました。

開発の現場で「最も頭を悩ませる」認証部分を、これほどまでにシンプルかつ使いやすくまとめ上げた氏の創意工夫と多大な努力に対し、心から最大の敬意と感謝を表します。氏の貢献なくして、この「認証の自動化」は実現し得ませんでした。


✨ 主な特徴

  • OAuth 2.0 Code Grant の完全自動化: Saxo SSO との連携を最小限のコードで実現。
  • 自動コールバックサーバー: Flask を内蔵しており、認証後のリダイレクトを自動でキャッチ。
  • セッション維持能力: asyncio を利用したバックグラウンドでのトークンリフレッシュ機能を搭載。
  • 強力な連携: 取得したアクセストークンは、そのまま Saxo-OpenAPI (エンジン) で使用可能です。
  • SIM / LIVE 環境両対応: 環境の切り替えも設定一つでスムーズに行えます。
  • Jupyter Notebook 対応: インタラクティブな環境での認証・実験に最適化されています。

🚀 導入と設定

インストール

pip を使用する場合

pip install git+https://github.com/nohikomiso/saxo-apy.git

uv を使用する場合

uv add git+https://github.com/nohikomiso/saxo-apy.git

準備:Developer Portal での設定

本ライブラリを使用するには、Saxo Developer Portal でアプリケーションを登録し、以下の設定を行う必要があります。

  1. Grant Type: Code を選択。
  2. Redirect URL: http://localhost:12321/redirect 等の localhost アドレスを少なくとも一つ登録してください。

📖 使い方

認証を行い、現在のユーザー情報を取得する最小限の例です。

from saxo_apy import SaxoOpenAPIClient

# アプリ設定(Developer Portal からコピーしたオブジェクト)
config = {
    "AppName": "Your App",
    "AppKey": "...",
    "AuthorizationEndpoint": "...",
    "TokenEndpoint": "...",
    "GrantType": "Code",
    "OpenApiBaseUrl": "...",
    "RedirectUrls": ["http://localhost:12321/redirect"],
    "AppSecret": "..."
}

client = SaxoOpenAPIClient(config)

# 認証開始(ブラウザが開きます)
client.login()

# ユーザー情報の取得(GETリクエスト例)
me = client.get("/port/v1/users/me")
print(f"Logged in as: {me['ClientKey']}")

🛠 プロフェッショナルな認証運用パターン

単発のスクリプトを超えて、サービスやアプリケーションとして 24 時間安定稼働させるための設計指針を以下にまとめます。

1. トークンの永続化とブートストラップ

認証のたびにブラウザを開くのではなく、取得した TokenData を JSON ファイル等に保存し、起動時に再利用するパターンです。

  • 起動時に保存済みトークンを読み込み、client._token_data にセット。
  • client.refresh_token_valid でリフレッシュが可能か確認。
  • 可能であれば client.refresh() を実行してセッションを復元し、不可(期限切れ)の場合のみ新規ログインを要求します。

2. バックグラウンドでの自動リフレッシュ

access_token の有効期限(通常 20 分〜 1 時間程度)が切れる前に、バックグラウンドで自動的に更新をかけ続ける設計です。

  • client.access_token_expiry を監視し、期限の 3 分〜 5 分前(余裕を持って)に client.refresh() を実行。
  • 本ライブラリ内蔵の async_refresh() を利用するか、専用の監視サービスを常駐させることで、外部サービスとの接続を永続化できます。

3. ヘッドレス環境での認証

GUI(ブラウザ)が利用できないサーバー環境では、launch_browser=False を指定して認証 URL を生成し、手動または別の経路で認証コードを流し込むフローを構築します。


⚠️ 注意事項:ストリーミング機能について

本ライブラリ(Saxo-APY)および samples/ 内に含まれるストリーミング関連のコードは、あくまでプロトタイプ・学習用の「レガシーな実装」です。

  • 接続の維持、再接続ロジック、大量のメッセージ処理などは十分に考慮されていません。
  • 実運用(特に本番環境でのリアルタイムトレード)に使用する場合は、本ライブラリに頼らず、独自の堅牢なストリーミング実装を構築することを強く推奨します。

📂 ディレクトリ構成

  • saxo_apy/: ライブラリ本体。認証フローの中核プログラム群。
  • samples/: [推奨] 認証から取引までを網羅した Jupyter Notebook サンプル。
  • tests/: ライブラリの統合テスト群。

🧪 実践的なサンプル

samples/ ディレクトリ配下にある以下の Notebooks を活用してください:

  1. 01_get_started.ipynb - 最初のセットアップとログイン
  2. 02_advanced_login.ipynb - 高度な認証オプションの解説

これらのサンプルは、本ライブラリ(Saxo-APY)で作成した認証済みのセッションを、さらに高度な操作が可能な saxo_openapi 側へ受け渡して使用する方法についても触れています。


⚖️ ライセンス

MIT License (オリジナルのライセンスを継承)。詳細は LICENSE を参照してください。

About

Saxo Bank OpenAPI の OAuth 2.0 認証とセッション管理を自動化する Python 軽量クライアント。

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages