GASからCacoo API にアクセスする
Java OAuth ライブラリを使って Cacoo API にアクセスする(oauth-signpost バージョン) - @ikikko のはてなダイアリーに引き続いて、今度はGoogle Apps Script(GAS)からCacoo APIにアクセスします。
ちなみに、今回取り上げたのはCacoo APIですが、もちろん他のOAuthを使ったサービス、例えばTwitterとかでも同じ手順でアクセスできます。公式ドキュメントのサンプルコードはTwitterにアクセスするコードですしね。
いつのタイミングか忘れましたが、Google Apps ScriptのUrlFetchAppクラスにOAuthをサポートするメソッドが追加されています。こちらを使って、Cacoo APIにアクセスしてみましょう。
前準備
まずは、CacooのOAuthアプリケーション登録ページから、アプリケーションを登録しておきましょう。大体通常の登録手順ですが、↓の辺だけ注意。
- アプリケーションの種別:ブラウザ
- コールバックURL:任意(空白で構わない)
GASからのOAuthの流れが分からなかったので、最初クライアントアプリとして試していたのですが、それだとスクリプト実行時にエラーが出るんですよね。しかも、「予期せぬエラーが出ました」という、まったく役に立たないメッセージががが...><
OAuthServiceConfigの設定
ここからはGAS上の話。最初に、OAuthConfigというクラスを取得して、適宜必要な情報をセットしていきます。
function getOptions_() { var oAuthServiceName = "cacoo"; // OAuthServiceConfigの設定 var oAuthConfig = UrlFetchApp.addOAuthService(oAuthServiceName); oAuthConfig.setAccessTokenUrl("https://cacoo.com/oauth/access_token"); oAuthConfig.setRequestTokenUrl("https://cacoo.com/oauth/request_token"); oAuthConfig.setAuthorizationUrl("https://cacoo.com/oauth/authorize"); oAuthConfig.setConsumerKey(ScriptProperties.getProperty("cacooConsumerKey")); oAuthConfig.setConsumerSecret(ScriptProperties.getProperty("cacooConsumerSecret")); // UrlFetchAppに渡すオプションの設定 var options = { "oAuthServiceName" : oAuthServiceName, "oAuthUseToken" : "always", }; return options; }
Cacoo APIの実行
↑のOAuthServiceConfigを用いて、Cacooの図一覧を取得してみます。
function diagrams() { // Cacoo APIの実行 var response = UrlFetchApp.fetch("https://cacoo.com/api/v1/diagrams.json", getOptions_()); var diagrams = Utilities.jsonParse(response.getContentText()); // スプレッドシートにAPI実行結果を書き出す var fields = {'url':true, 'title':true, 'ownerName':true}; var doc = SpreadsheetApp.getActiveSpreadsheet(); var cell = doc.getRange('a2'); var index = 0; for (var i in diagrams.result) { var row = diagrams.result[i]; var col = 0; for (var j in row) { if (fields[j]) { cell.offset(index, col).setValue(row[j]); col++; } } index++; } }
スクリプト実行
初回実行時は、以下のようにOAuth許可を求めるダイアログが表示されます。
「Authorize」を押すと、今度はCacooの認証ページにリダイレクトされます。
許可した後の実行結果は、以下のようになります。自分が閲覧することができる図の一覧が、スプレッドシートにじゃんじゃか張り付けられています。
Google Apps Scriptの内部動作
ところで、上記のコードでAccess TokenとAccess Token Secretが出てきていないのにお気づきでしょうか?どうやら、この辺の処理はGASがよしなにやってくれるみたいです。
詳しくは、以下のスレッド中のGoogleの中の人の発言を参考にしてください。
sorry for missing the point of the earlier question - the oauth token and secret are stored "deep inside Google". They're not directly accessible via script.
We'll look at the twitter post case -- we have someone internally who started on it, so I'll reach out to him and ask him to post here,
Google Groups
デモ
以下の手順で、実際に試すことができます。
- デモ用スプレッドシートを開く
- [ファイル > コピーを作成]から、スプレッドシートをコピーする
- [ツール > スクリプト > 管理]から、"diagrams"を"run"する
- GASやらCacooやらで何度か認証を聞かれるかもしれませんが、全部OKで続行してください
なお、上記の手順だと、今回私が用意したテスト用のOAuthアプリケーションにアクセスします。自分のアプリケーションを試したい方は、[ツール > スクリプト > スクリプトエディタ]から、(consumerKey / consumerSecret)を適宜変更してください。
理論的には、自分でOAuthのヘッダを組み立てれば、以前までのGASでもOAuth認証が必要なアプリケーションにもアクセスすることができました。しかし、今回紹介したOAuthServiceConfigを用いると、わずか数行のコードで実現できます。まだまだ怪しい箇所もあるのですが、GASはうまく使いこなすと便利そうですよね。
ついでに、Cacooもよろしくお願いします