■週末が近づくたびにどこの美術館なりギャラリーに行こうかなとあちこちのスケジュールを調べるようなことをやっているのですが、チェック先が多いこともあって、ちょっと面倒。気がつくと終わり間近の企画展があることに気付いたりしてちょっと悔やむことも数知れず。
美術系ポータルでは各施設の企画展スケジュールを纏めてあったりするのですが一覧性が乏しいというか、自分の趣味と合わないものも当然多くあるのでS/N比が低い。自分の好みに合うところだけを抽出してスケジュールに纏められたらいいのに、と思ったので作ることにした。
Tokyo Art Beatでは各企画のスケジュールをRSSでフィードするインターフェースがあるので、それを使う。地域ごとにまとめたRSSをまとめて取得し、事前に指定した施設情報だけをフィルタしてグーグルカレンダーに流し込む(下図)。
Google APIの使い方はサンプルソースもドキュメントもあるのでとっつきやすいのだけど、ドキュメントの説明がoAuthのオンライン認証ベースになっていて、バックグラウンド処理で自動認証させたい場合がよく解らない。それと「デベロッパーキー」というのはAPI Keyのことでした。
自動認証にも2つ方法があって、1つはoAuthの認証画面を自動処理させるものと、もう1つは承認済みのキーを使いまわすもの。グーグルカレンダーへの登録処理はいわゆるバッチ処理なので、oAuthの認証画面のように、認証サーバーへリダイレクトされるような方法だと使えない。そのため承認済みキーを使う方法しかなく、この場合はrefreshTokenを使う、という。ただ、その具体的な使い方の説明が見当たらない。
とりあえずサンプルソースを動かすとセッション情報として$_SESSION['token']に認証キーが格納され、その中にrefreshTokenが含まれている。なので、一旦サンプルソースでオンライン認証を通してから$_SESSION['token'](あるいは $client->getAccessToken() )の情報を画面表示させてrefreshTokenの文字列を取得しました。
refreshTokenの使い方はapiCalendarServiceクラスのオブジェクトを獲得する前に、初期化に使うapiClientクラスオブジェクトの設定でsetAccessType()に"offline"、refreshToken()に先に表示したrefreshToken文字列を引数で与えて置く。refreshTokenによる認証方式ではoAuthサーバーでの認証が不要なので、画面遷移を意識した作りやコールバックURLを意識する必要がない。単純にapiClientオブジェクトを設定してから、apiCalendarServiceオブジェクトを作成しておき、RSSを読み込んで必要なデータを切り出した後に生成したEventオブジェクトを登録にまわせばいい。
ほかに考慮しておかなければならないのは、重複登録を避けるためにRSSでフィードされているアイテムのうち、どこまで読み込んだか、履歴を残しておく必要があることと、Tokyo Art BeatのRSSだと、場所や期間などの情報がdescriptionの中に全部押し込まれているので別途字句解析しなければならないことで、それほど難しい話ではなかったのですが、面倒くささの点で言えばoAuthの実装を調べることより上だったように思います。