💹

J-Quants API を GAS で使う (1) ID トークンの取得

2023/12/21に公開

少し前から JPX 総研さんが提供している J-Quants API という、個人投資家向けの日本株の情報取得 API を使って、自分用の株ノートの各種データを日次で自動更新しています。

これは本当に便利!!! 開発・運用されているチームの方々、本当にありがとうございます。

Python でちょっとしたスクリプトを書いて使うこともありますが、普段の使い方としては、この API を Google Apps Script のコード内で利用して Google Sheets のセルを更新するということをやっています。そういう情報はあまり見かけないように思うので、何回かに分けて簡単なコード例を紹介してみようと思います。

ちなみに、米株については同じようなサービスで polygon.io というのを使っていますが、もし機会があればこちらも紹介できたらいいかなと思っています。

第一回目のこの記事では、API コールに必要となる ID トークンの取得の実装例を紹介します。

ID トークン取得までの流れと GAS での利用

J-Quants API の API コールには「ID トークン」と呼ばれるトークン文字列を使用しますが、これを取得するには、その前段で「リフレッシュトークン」という別のトークンを取得する必要があります。

GAS の場合、トークンの類はスクリプトプロパティに保存しておきたいところですが、ID トークン、リフレッシュトークンは、それぞれ 24 時間、1 週間で期限切れとなる仕様のため、リフレッシュトークンだけをスクリプトプロパティに設定するようにしたとしても毎週手動での書き換えが必要となってしまいます。

また、私が知る限り GAS のスクリプトプロパティを何らかのコーディングによって更新する手段は提供されていないようなので、定期的にリフレッシュトークン、ID トークンを取得しておいて、可能な限りそれを使い回すといったことも難しそうです。

そのため、少し非効率ではあるのですが、現在の私の運用ではリフレッシュトークンを取得するためのログイン情報だけをスクリプトプロパティに保存して GAS のスクリプトを実行する度にリフレッシュトークン、ID トークンを発行するという実装で対応しています(もっとうまいやり方があったらぜひコメントで教えてください)。

それでは、その実装例について紹介します。

リフレッシュトークンの取得

実際のところ、ドキュメントを参照いただければ十分ではあるのですが、GAS でそのまま動くコードは以下のような感じになります。ポイントは、まぁスクリプトプロパティから必要な情報を持ってきているところ・・くらいですね。

// ログインに必要となるユーザー・パスワードはスクリプトプロパティにあらかじめ設定
const user = PropertiesService.getScriptProperties().getProperty("J_QUANTS_USER");
const password = PropertiesService.getScriptProperties().getProperty("J_QUANTS_PASSWORD");

// リフレッシュトークン取得用の API を呼び出してトークン文字列を変数に代入
const refreshTokenRequest = JSON.stringify({ 'mailaddress': user, 'password': password });
const refreshToken = JSON.parse(UrlFetchApp.fetch('https://api.jquants.com/v1/token/auth_user', {
  method: 'post',
  contentType: 'application/json',
  payload: refreshTokenRequest,
}).getContentText()).refreshToken;

ID トークンを取得

こちらもドキュメントのまんまではあるのですが、先ほど取得したリフレッシュトークンを使って ID トークンを取得します。

注意点として、こちらも先ほどと同様に POST リクエストなのですが、ボディではなく、クエリストリングにトークンを渡す仕様となっているため、そのように実装する必要があります。

const idToken = JSON.parse(UrlFetchApp.fetch(
  `https://api.jquants.com/v1/token/auth_refresh?refreshtoken=${refreshToken}`, {
  method: 'post',
}).getContentText()).idToken;

最終形

ID トークンは必ず必要となるので、私の実際の GAS では、他のスクリプトから利用できるように一連の処理を関数としてまとめています。console.log() の部分は邪魔であれば削除してもよいと思います。

function issueIdToken() {
  console.log("Retrieving an ID token...");
  // https://jpx.gitbook.io/j-quants-ja/api-reference/refreshtoken
  const user = PropertiesService.getScriptProperties().getProperty("J_QUANTS_USER");
  const password = PropertiesService.getScriptProperties().getProperty("J_QUANTS_PASSWORD");
  const refreshTokenRequest = JSON.stringify({ 'mailaddress': user, 'password': password });
  const refreshToken = JSON.parse(UrlFetchApp.fetch('https://api.jquants.com/v1/token/auth_user', {
    method: 'post',
    contentType: 'application/json',
    payload: refreshTokenRequest,
  }).getContentText()).refreshToken;

  // https://jpx.gitbook.io/j-quants-ja/api-reference/idtoken
  const idToken = JSON.parse(UrlFetchApp.fetch(
    `https://api.jquants.com/v1/token/auth_refresh?refreshtoken=${refreshToken}`, {
    method: 'post',
  }).getContentText()).idToken;
  console.log(`Got an idToken: ${idToken.substring(0, 30)}...`)
  return idToken;
}

以上、簡単ではありますが、まずは ID トークンを取得するところまでご紹介しました。

次回からは銘柄情報の取得とセルへの書き込みの例について、簡単に紹介していきたいと思います。

Discussion