カレンダー連係でGoogleカレンダーAPI V3に対応

森を走ろう!で管理しているオリエンテーリング&ロゲインのイベント日程カレンダー、2012年からGoogleのカレンダーに連係して公開してきました。
  https://www.asobox.com/o/modules/wordpress/?p=124

カレンダーは、個人パソコン上で管理して、それをサーバ上のデータベース(MySQL)に反映し、さらにそのデータベースからGoogleカレンダーに反映させてましたが、そのGoogleカレンダーに反映させる部分のプログラムが、この11月から動かなくなりました。なんで動かないのか調べているうちに、Googleが公開しているプログラム接続の方法の旧バージョン(ver.2)の公開をやめたというのが判りました。大分苦労したのですが、最新バージョン(ver.3)に合うようにプログラムを修正できました。

1.詳細

(1)従来の方法
Googleカレンダーに連係する方法として、PHP言語使用をを前提として、検索したところ見つかったのがZendFrameworkのインターフェイスでした。それをそのまま使ったので、Google自体のインターフェイスがどうなっているかは全く調べていませんでした。ver.2の打ち切りも随分前に予告されていたようですが、それも知らず。対応方法を検索してわかったのですが、動かなくなって慌てている人は沢山いるようです。

(2)新しい方法
PHP言語で直接Googleのインターフェイスver.3を呼び出すように変更しました。最初、ZendFrameworkをver.3対応に置き換えるというお手軽な方法で出来ないかと探したのですが、そういう方法は見つかりませんでした。

従来はカレンダーのメールアドレスとパスワードをプログラムに埋め込んでおいて動かすことができました。しかしネット上の問題が多くなってきているので、それに呼応して、ver.3では認証の方法がだいぶ厄介になり、ここの仕組みの理解に随分時間が掛ってしまいました。簡単なメモを残しておきます。

(2.1)APIライブラリーの準備
Google Calendar API の PHP用ライブラリーをプログラムを動かすサーバにダウンロードしておく。PHPプログラム中で上記ライブラリーを読み込むよう設定。
  https://developers.google.com/google-apps/calendar/setup

(2.2)プロジェクト登録
Google Developer Console でカレンダー(orienteering、rogainingの夫々)のアカウントにログインしてAPIを使うためのプロジェクトを登録。
  https://console.developers.google.com/

(2.3)クライアント登録
次にそのプロジェクトで、沢山あるGoogleAPIのうち、どのAPIを使うのかを指定する画面で Calendar API を選択。認証情報の「新しいクライアントIDを作成」でウェブアプリケーション用クライアントIDを選択し、実行時に認証が行われた後に呼び出されるURI(承認済みのリダイレクトURI)を指定。このURIではカレンダー連係を行うプログラムを呼び出すように指定。

(2.4)プログラムをZendFramework用からGoogleCalendarAPI用に修正
今回、CalendarAPIを見て分かったのですが、あらかじめ同期を行うための仕組みも含まれていました。しかし、従来からのイベントID(イベント説明の部分に入れたリンク中に含まれる)と更新日の情報を元にしてデータベースとマッチングして同期する方法を踏襲するのが容易だったので、今回もそうしました。

(2.5)次の手順でカレンダー同期を実行
  WEBでプログラムを呼び出してGoogleの認証を依頼
  =>該当のプロジェクトのアカウントでログインして認証
  =>カレンダーの同期を処理するプログラムが呼び出される(リダイレクトURI)

(2.6)操作を簡便化する
(2.5)で使えるのですが、自分の普段使っているGoogleのアカウントと、orienteeringおよびrogainingのアカウントが別なので、ログアウト&ログインを繰り返さないといけないのが面倒です。違うブラウザを使うという方法もあるけど、やはり面倒。そこで、orienteeringとrogainingの夫々のアカウントのプロジェクトの権限画面で、普段使っている自分のアカウントをオーナーとして追加してやり、ログアウト&ログインをしないで済むようにしました。最初は、カレンダーの属性画面で変更権限を付与したのですが、これはあくまでもカレンダー画面での権限のみで、API経由での権限は含まれてませんでした。

2.覚書き

(1)OAuth2.0
ここの理解で大分苦労しました。良く「Twitterでログイン」とか「Facebookでログイン」とか出てきますが、そのような仕組みの事。以下を参考にしました。
RFCとなった「OAuth 2.0」――その要点は?
  http://www.atmarkit.co.jp/ait/articles/1209/10/news105.html
Using OAuth 2.0 to Access Google APIs
  https://developers.google.com/accounts/docs/OAuth2

(2)Eventをupdateする部分のドキュメントが間違い?
以下ページの例にある「$event->getId()」の戻りが空で、違う方法で指定した
  https://developers.google.com/google-apps/calendar/v3/reference/events/update

(3)イベントの終了日は+1日する必要あり
終日イベントの期間が2014-12-01から2014-12-02だとしたら、終了日はAPI上では2014-12-03にする必要あり

(4)期間指定でイベントを抽出する部分のドキュメントが間違っている
「timeMaxがstart time、timeMinがend time」となっているが、逆が正しい。
  https://developers.google.com/google-apps/calendar/v3/reference/events/list

(5)認証の部分で最初にはまった処
日常的にプログラムしている人ならはまらないんでしょうが、以下のページのPHPの例で、はまってしまいました。サーバ上のコンソールにログインして実行する場合のサンプルなんですね。WEBで動かして STDIN がエラーになりました。
  https://developers.google.com/google-apps/calendar/instantiate

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください