.png)
これまでしばらくの間、n8nとGoogle Apps Script(GAS)を組み合わせてZaimの自動記帳を実現していました。動作自体は安定していたのですが、GASという外部プラットフォームに依存している点が、どうも気になっていました。フローの一部が完全に自分の管理下にないというのは、地味にストレスです。そこで今回、自分のOracle Cloud上にActivepiecesを導入し、そのCodeモジュールでGASの部分を置き換えることにしました。Zaimのような公式コネクタが用意されていないサービスを扱う場合、Activepiecesのほうが扱いやすいと感じています。
本記事では自動化フローの全体像は扱わず、一番つまずきやすい前段階の作業に絞って解説します。つまりZaimのAccess TokenとAccess Token Secretを取得する方法です。ここを一度きちんと済ませておけば、その後Activepiecesに接続する際、同じ認証情報を繰り返し使えるようになります。
なぜローカルでPythonを使って認証を一度通す必要があるのか
ZaimのAPIはOAuth 1.0aを採用しています。現在もっと一般的なOAuth 2.0とは違い、リクエストごとに4つの認証情報(Consumer Key、Consumer Secret、Access Token、Access Token Secret)を使ってその場で暗号署名を計算し、リクエストヘッダーに付与する必要があります。サーバー側はこの署名を検証してはじめて、本人からのリクエストだと認識します。
最初の2つ(Consumer Key / Secret)はアプリケーション登録時に発行される固定値です。一方、残りの2つ(Access Token / Secret)は、ブラウザでZaimにアクセスしてログインし、許可ボタンを押して認証コード(PIN)を受け取り、そのPINを使って最終的なトークンと交換する、という一連の認可フローを通さないと発行されません。この手順は省略できません。Zaim側が「このアプリケーションは本人が許可したものだ」と確認するための仕組みだからです。
幸い、このフローは一度だけで済みます。Access TokenとAccess Token Secretを取得した後は、APIを呼び出すたびにブラウザでの認可をやり直す必要はなく、そのまま使い続けられます。
ステップ1:Zaim開発者センターでアプリケーションを登録する
Zaimにログインした状態でhttps://dev.zaim.net/にアクセスし、「新しいアプリケーションを追加」をクリックして、以下のように入力します。
| 項目 | 入力の目安 |
|---|---|
| アプリケーション名 | 任意。例:MyLocalScript |
| 組織名 | 任意 |
| アプリケーションのウェブサイト | 任意。https://localhost でも構いません |
| アクセス権限 | 必要に応じて「読み込み」と「書き込み」にチェック。記帳には書き込み権限が必要 |
| 公開設定 | 「公開しない」を選択 |
登録が完了するとConsumer ID(Consumer Keyに相当)とConsumer Secretが発行されるので、手元に控えておきます。
ステップ2:必要なライブラリをインストールする
ここではZaim専用の第三者ライブラリには依存せず、汎用的なOAuthライブラリrequests-oauthlibを使って、Zaimの公式エンドポイントに直接アクセスします。依存関係が少なく、処理の流れも見通しやすいというメリットがあり、Activepieces側のCodeモジュールに移す際もこのRequirementを1つ書くだけで済みます。
pip install requests requests-oauthlibステップ3:スクリプトを実行し、ブラウザでの認可を通す
ZaimのOAuth 1.0aフローでは、以下の3つの固定エンドポイントを使います。
| 用途 | エンドポイント |
|---|---|
| 一時的なRequest Tokenの取得 | https://api.zaim.net/v2/auth/request |
| ブラウザでの認可ページ | https://auth.zaim.net/users/auth |
| 最終的なAccess Tokenとの交換 | https://api.zaim.net/v2/auth/access |
注意したいのは、認可ページのドメインがauth.zaim.netであり、前後のapi.zaim.netとは別のサブドメインだという点です。ここは書き間違いやすいので気をつけてください。get_token.pyのようなファイルを新規作成し、以下のコードを記述します。
from requests_oauthlib import OAuth1Session
CONSUMER_KEY = "あなたのConsumer ID"
CONSUMER_SECRET = "あなたのConsumer Secret"
REQUEST_TOKEN_URL = "https://api.zaim.net/v2/auth/request"
AUTHORIZE_URL = "https://auth.zaim.net/users/auth"
ACCESS_TOKEN_URL = "https://api.zaim.net/v2/auth/access"
oauth = OAuth1Session(CONSUMER_KEY, client_secret=CONSUMER_SECRET, callback_uri="oob")
# ステップ1:一時的なRequest Tokenを取得
fetch_response = oauth.fetch_request_token(REQUEST_TOKEN_URL)
resource_owner_key = fetch_response.get("oauth_token")
resource_owner_secret = fetch_response.get("oauth_token_secret")
print("以下のリンクをブラウザで開いて認可を完了してください:")
print(f"{AUTHORIZE_URL}?oauth_token={resource_owner_key}")
verifier = input("画面に表示されたPINコードを入力してください:")
# ステップ2:PINコードを使って最終的なAccess Tokenを取得
oauth = OAuth1Session(
CONSUMER_KEY,
client_secret=CONSUMER_SECRET,
resource_owner_key=resource_owner_key,
resource_owner_secret=resource_owner_secret,
verifier=verifier
)
oauth_tokens = oauth.fetch_access_token(ACCESS_TOKEN_URL)
print("access token:", oauth_tokens.get("oauth_token"))
print("access token secret:", oauth_tokens.get("oauth_token_secret"))実行すると、認可用のリンクが表示されます。これをブラウザで開き、Zaimにログインして許可をクリックすると、画面にPINコードが表示されます。このPINコードを先ほどのターミナルの入力プロンプトに貼り付けてEnterを押すと、最終的にAccess TokenとAccess Token Secretが表示されます。
この2つのトークンはパスワードと同じ重要度を持つ情報です。Gitリポジトリにアップロードされるようなコードファイルに直接書き込んだり、他人に教えたりしないようにしてください。
動作確認をしてみる
4つの認証情報がそろったら、Zaimの家計簿データ取得エンドポイントに実際にアクセスして、接続できるか確認してみます。
from requests_oauthlib import OAuth1Session
CONSUMER_KEY = "あなたのConsumer ID"
CONSUMER_SECRET = "あなたのConsumer Secret"
ACCESS_TOKEN = "取得したaccess token"
ACCESS_TOKEN_SECRET = "取得したaccess token secret"
oauth = OAuth1Session(
CONSUMER_KEY,
client_secret=CONSUMER_SECRET,
resource_owner_key=ACCESS_TOKEN,
resource_owner_secret=ACCESS_TOKEN_SECRET
)
response = oauth.get("https://api.zaim.net/v2/home/money", params={"mapping": 1, "limit": 5})
print(response.status_code)
print(response.json())ステータスコード200とJSONデータが正常に返ってくれば、この4つの認証情報はそのままHTTPリクエストを送れる任意の自動化プラットフォームで使えることが確認できたことになります。なお、Zaim APIで取得できるのは手入力されたデータのみで、クレジットカードや銀行口座から自動連携されたデータは取得できません。とはいえ、これは「Activepieces側から能動的に記帳データを送信する」という今回の用途とは矛盾せず、特に問題にはなりません。
なぜこの4つの認証情報があればActivepieces側でOAuth認可画面を回避できるのか
Activepiecesには現時点でZaimの公式コネクタが用意されていないため、「ボタンを1つ押せば認可画面に遷移する」という標準的な仕組みはそのままでは使えません。ただ、これは問題にはなりません。先ほど手動で済ませた一連の手順は、本質的には「ボタンを押して認可する」という作業を事前に終わらせておいたということだからです。手元にある4つの認証情報は、いわばすでにスタンプが押された通行証のようなもので、どのプラットフォーム、どの言語のスクリプトであっても、この通行証を持って直接データを取得しに行けばよく、ブラウザでのログインや認可画面をもう一度通す必要はありません。
まとめ
ZaimのAPIはOAuth 1.0aを採用しているため、ローカル環境(またはPythonを実行でき、ブラウザを開ける環境)で一度きちんと認可フローを通さなければ、長期的に使い回せるAccess TokenとAccess Token Secretは発行されません。この手順は一見手間に見えますが、必要なのは一度だけです。その後、自動化プラットフォームを乗り換えたり、GASからActivepiecesへ移行したり、自分でスクリプトを書いたりする場合も、同じ認証情報を使い続けられるので、毎回この手順をやり直す必要はありません。


