GASとZaimを連携して情報を取得する
はじめに
遅ればせながら家計簿管理の自動化をこれからやっていこうと思いたち[1]、二番煎じにも程がある GAS
環境構築の手順
GAS を実行したときに Zaim に連携している口座情報などを取得することを目標として取り組みました。大まかには以下の手順で情報を取得することができます。
- GAS にて取得用アプリケーションを作成し、デプロイする[2]
- Zaim アプリケーションを作成
- GAS にて取得用アプリケーションを実行 --> 情報の取得
各手順の詳細
GAS(デプロイ)
Google App Script(GAS)は様々な使用用途が可能な Google が提供しているサービスで、スプレッドシートやその他サービスなどと連携したりすることができます。将来的に今回作成した仕掛けを LINE などから参照したかったため[3]、Zaim から情報を取得するために GAS を使用することとしました。
情報の取得には GAS のデプロイが必要となります。GAS におけるデプロイとは、作成したスクリプト(アプリ、ツールの実装)を外部から実行するための URL を作成することを指します。
今回は、GitHubのサンプルを参考にして GAS を作成しました。Google github のサンプルは Twitter の情報取得用サンプルなので、こちらを Zaim 用に修正します。
- 各種エンドポイントを zaim のものに変更
-
method
をget
に変更
が今回サンプルを使用するに当たって必要な修正でした。また、CONSUMER_KEY
と CONSUMER_SECRET
は(ニワトリ卵なのですが)次の工程の Zaim アプリケーションの作成時に生成される情報です。そのためデプロイとアプリケーション作成の画面を何度か行き来することとなります。
var CONSUMER_KEY = '.........';
var CONSUMER_SECRET = '.........';
/**
* Authorizes and makes a request to the Twitter API.
*/
function run() {
var service = getService_();
if (service.hasAccess()) {
var url = 'https://api.zaim.net/v2/home/money';
var response = service.fetch(url, {
method: 'get'
});
var result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));
} else {
var authorizationUrl = service.authorize();
Logger.log('Open the following URL and re-run the script: %s',
authorizationUrl);
}
}
/**
* Reset the authorization state, so that it can be re-tested.
*/
function reset() {
var service = getService_();
service.reset();
}
/**
* Configures the service.
*/
function getService_() {
return OAuth1.createService('Twitter')
// Set the endpoint URLs.
.setAccessTokenUrl('https://api.zaim.net/v2/auth/access')
.setRequestTokenUrl('https://api.zaim.net/v2/auth/request')
.setAuthorizationUrl('https://auth.zaim.net/users/auth')
// Set the consumer key and secret.
.setConsumerKey(CONSUMER_KEY)
.setConsumerSecret(CONSUMER_SECRET)
// Set the name of the callback function in the script referenced
// above that should be invoked to complete the OAuth flow.
.setCallbackFunction('authCallback')
// Using a cache will reduce the need to read from
// the property store and may increase performance.
.setCache(CacheService.getUserCache())
// Set the property store where authorized tokens should be persisted.
.setPropertyStore(PropertiesService.getUserProperties());
}
/**
* Handles the OAuth callback.
*/
function authCallback(request) {
var service = getService_();
var authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied');
}
}
また、Zaim API を使用するためには、OAuth1.0a 認証が必要となるのですが[4]。GAS のための OAuth1 ライブラリとして
を使用することができ、README に従ってセットアップを行います。
OAuth1 ライブラリの追加
以上の設定が終わったタイミングで右上の「デプロイ」を押します。ウェブアプリケーションを選択、アクセスできるユーザーとして「全員」を選択してデプロイを押します。
Zaim
ここ2年ほどずっとお世話になっている家計簿アプリで[5]、UI が他のサービスよりも自分好みだったりします。
新しいアプリケーションを追加
Zaim の情報を取得するためには、アプリケーションを作成する必要があります。
ホーム画面の「新しいアプリケーションを追加」を選択後、各情報を入力します。このとき、サービス種とサービスのURLは以下に示した通りに設定しないとうまく動作しませんでしたのでご注意ください。
- 名称:任意
- サービス種:ブラウザアプリ
- 概要:任意
- 組織:任意
- サービスのURL:GASのデプロイURL
- アクセスレベル:任意
- アイコン画像:任意
GAS(実行)
GASのデプロイとZaim アプリケーションの作成が終われば、いよいよ GAS を実行して情報を取得することができます。
- 実行する関数として「run」を選択、実行
- すると実行ログに「Open the following URL and re-run the script: https://....」というメッセージが出るのでコピーしてアクセスします --> 「ログインして許可」を実行
- 認証されるので、再度 GAS の画面に戻り、「run」を実行すると情報が取得できます
感想
以上で Zaim と GAS を連携して情報を取得することができたので、この下地を元に LINE への連携や各種情報整形などに取り組んでみたいと思います。
Discussion