« 松山 | トップページ | 動物園 »

2014年11月19日 (水)

Google Calendar API v3

やりたくなくても過去の遺産のメンテナンスが必要なこともあるもので。

以前、管理画面作るのが面倒なので、Google Calendar を使ってちょっとした予定を入れて貰って、それを XML読み込みして JSON にして社内システムに表示する、ってのを作った。さっきデータ見たら2006年ぐらいの送別会とか入ってたから思えば遠くへ来たものだ。
やっつけ仕事だったので、XMLを取ってJSONに、という部分は PHP で書いていたのだけど、その会社の人からメールが来て「カレンダーが表示されません」と。

んご?と思って調べたら

This API is a subject to the Deprecation Policy and will be shutdown on November 17, 2014. Please use APIv3 instead.

ドンピシャですね。

今まではカレンダーの設定画面からキーの付いたXMLを発行すれば、そこにアクセスするだけでRSSぽくデータを取れたのだけど、何か認証が必要になったらしい。それも、PublicじゃないカレンダーデータにはAPI Key じゃなくて OAuth 使えと。
これが色々探してもドキュメントが少ないのよねぇ。Web サービス系で、一旦Googleに認証を振ってからリダイレクトで戻ってきてToken貰って…というのはあるんだけど、サーバから取りに行く、みたいなのがあんまない。オイラの探し方が悪いのか。

Google Calendar API - Google Calendar API — Google Developers
Google APIs Client Library for PHP — Google Developers

とりあえず、Google Developers Console なるものにアクセスして APIs で Calendar API を ON に、Credentials で OAuth の Client ID を作って p12 ファイル(key_file)を保存しておく。

んで、サンプルの OAuth 2.0 Service Account Authentication って奴を手がかりに認証部分を組むんだけど、メールアドレス入れるところがあって、そこにカレンダーのオーナーの GMail アドレス入れたらダメで、ここは Developers Console で Client ID 作ったときに吐き出される長ったらしいメールアドレスだった。

次にイベント一覧取るぜ、ってことで Events: list - Google Calendar API — Google Developers ここのサンプルに従ってやったら空のリストが帰って来た。calendar_id を primary にしてあるのがマズいのかな、と思って、カレンダーオーナの GMail アドレスを入れたら「そんなの無い」だかのエラー。前は calendar_id ってオーナーの GMail アドレスだったんだけどな。ここでかなりハマった。

結局、オイラの勘違いかも知れないんだけど、飽くまで primary っていうのは認証時に入れた長ったらしいメールアドレスに紐付いたカレンダーの primary であって、Developers Console にログインしたユーザに紐付くカレンダーでは無いみたいだ。どういうロジックか分からん。
とりあえず、イベント取りたいカレンダーにログインして、共有設定で長ったらしいアドレスでも見えるようにして、calendar_id を見せたいカレンダーのオーナーの GMail アドレスにしたらやっと取れましたよ。

半日かかった。まぁでも管理画面やDBやら作る代わりに8年に一度半日ぐらい仕事するならいいとしよう。Google様々。

$client = new Google_Client();
$client->setClientId('Developers Console で作ったID');
$client->setApplicationName("適当な名前");
$key = file_get_contents("p12 ファイルへのパス");

$cred = new Google_Auth_AssertionCredentials(      "長ったらしいメアド",
           array('https://www.googleapis.com/auth/calendar.readonly'),      $key      );
$client->setAssertionCredentials($cred);

$service = new Google_Service_Calendar($client);

// 日付絡み省略
$max = date(DATE_ATOM, mktime(0,0,0,$m,$d+32,$y));
$min = date(DATE_ATOM, mktime(0,0,0,$m,$d,$y));

$opt = array('orderBy'=>'startTime', 'timeMax'=>$max, 'timeMin'=>$min, 'singleEvents'=>true);

$events = $service->events->listEvents($calendar_id, $opt);
//後は好きにする

|

« 松山 | トップページ | 動物園 »

てっく」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/232324/58032428

この記事へのトラックバック一覧です: Google Calendar API v3:

« 松山 | トップページ | 動物園 »