読者です 読者をやめる 読者になる 読者になる

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許可を求めるダイアログが表示されます。
https://cacoo.com/diagrams/kQ4hS36nYMpkO0Xt-8C511.png

「Authorize」を押すと、今度はCacooの認証ページにリダイレクトされます。
https://cacoo.com/diagrams/kQ4hS36nYMpkO0Xt-8F517.png

許可した後の実行結果は、以下のようになります。自分が閲覧することができる図の一覧が、スプレッドシートにじゃんじゃか張り付けられています。
https://cacoo.com/diagrams/kQ4hS36nYMpkO0Xt-455BE.png

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
デモ

以下の手順で、実際に試すことができます。

  1. デモ用スプレッドシートを開く
  2. [ファイル > コピーを作成]から、スプレッドシートをコピーする
  3. [ツール > スクリプト > 管理]から、"diagrams"を"run"する
    • GASやらCacooやらで何度か認証を聞かれるかもしれませんが、全部OKで続行してください

なお、上記の手順だと、今回私が用意したテスト用のOAuthアプリケーションにアクセスします。自分のアプリケーションを試したい方は、[ツール > スクリプト > スクリプトエディタ]から、(consumerKey / consumerSecret)を適宜変更してください。


理論的には、自分でOAuthのヘッダを組み立てれば、以前までのGASでもOAuth認証が必要なアプリケーションにもアクセスすることができました。しかし、今回紹介したOAuthServiceConfigを用いると、わずか数行のコードで実現できます。まだまだ怪しい箇所もあるのですが、GASはうまく使いこなすと便利そうですよね。

ついでに、Cacooもよろしくお願いします