■目次
概要
マニュアル
サンプルソース
解説
参考書籍
カテゴリのトップページへ



■概要

ZendのZend_Gdataに含まれるカレンダー操作API群を使うと、比較的簡単にgoogle calendarの操作が出来ます。
PC向けのgoogle calendarはAjaxで実装されているので、Operaなど一部のブラウザではgoogle calendarが利用できないのですが、APIがあるので自分の環境にあったAjaxアプリを構築してしまえばよいのです。

▲ページ先頭へ戻る▲


■マニュアル

例によってZendの公式マニュアルが参考になります。
  • 16.2. AuthSub による認証
    Zend_Gdataの認証にはいくつかの方法があります。
    ここでは、ウェブアプリケーションが実装する上でもっとも安全とされているAuthSubによる認証を使いますので、あらかじめ理解しておきましょう。
  • 16.4. Google Calendar の使用法

▲ページ先頭へ戻る▲


■サンプルソース


<?php

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_Calendar');
Zend_Loader::loadClass('Zend_Http_Client');

/** 現在の URL を取得し、AuthSub サーバに
 * 認証後のリダイレクト先を伝えられるようにします
 */
function getCurrentUrl()
{
    global $_SERVER;

    // php_self をフィルタリングし、セキュリティを確保します
    $php_request_uri = htmlentities(substr($_SERVER['REQUEST_URI'], 0, strcspn($_SERVER['REQUEST_URI'], "\n\r")), ENT_QUOTES);

    if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') {
        $protocol = 'https://';
    } else {
        $protocol = 'http://';
    }
    $host = $_SERVER['HTTP_HOST'];
    if ($_SERVER['HTTP_PORT'] != '' &&
        (($protocol == 'http://' && $_SERVER['HTTP_PORT'] != '80') ||
        ($protocol == 'https://' && $_SERVER['HTTP_PORT'] != '443'))) {
        $port = ':' . $_SERVER['HTTP_PORT'];
    } else {
        $port = '';
    }
    return $protocol . $host . $port . $php_request_uri;
}

/** AuthSub 認証済みの HTTP クライアントを作成し、ログインが必要なら
 *  ユーザを AuthSub サーバにリダイレクトします
 */
function getAuthSubHttpClient()
{
    global $_SESSION, $_GET;

    // AuthSub セッションあるいはワンタイムトークンがなければ、
    // AuthSub サーバにリダイレクトします
    if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
        // AuthSub サーバへのパラメータ
        $next = getCurrentUrl();
        $scope = "http://www.google.com/calendar/feeds/";
        $secure = false;
        $session = true;

        // ユーザを AuthSub サーバにリダイレクトします

        $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure, $session);
         header("HTTP/1.0 307 Temporary redirect");

         header("Location: " . $authSubUrl);

         exit();
    }

    // AuthSub のワンタイムトークンを、必要に応じてセッショントークンに変換します
    if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
		try{
			$_SESSION['sessionToken'] =
				Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
		} catch (Zend_Gdata_App_Exception $e) {
			// 念のため
			return(0);
		}
    }

    // この時点で AuthSub による認証がすんでいるので、
    // 認証済みの HTTP クライアントのインスタンスを作成することができます

    // 認証済みの HTTP クライアントを作成します
	$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
    return $client;
}

// -> スクリプトの実行はここから始まります <-

// http://code.google.com/apis/gdata/reference.html#Queries
// でユーザが有効なセッションを保持していることを確認し、
// AuthSub セッショントークンを記録します
session_start();

// Calendar サービスのインスタンスを作成し、
// 必要に応じてユーザを AuthSub サーバにリダイレクトします
if(!$client=getAuthSubHttpClient()){
	print "お使いのブラウザでのリロードボタンは使用できません。<br>\n";
	print "クライアント認証に失敗しました。<br>処理を中断します。<br>画面上部のリロードリンクでリロードしてね<br>\n";
}
else {
	$service = new Zend_Gdata_Calendar($client);

	if(!$service){
		print "認証できません・・・<br>\n";
	}
	else {
		$query = $service->newEventQuery();
		$query->setUser('default');
// MagicCookie 認証の場合は $query->setVisibility('private-magicCookieValue') とします
		$query->setVisibility('private');
		$query->setProjection('full');
		$query->setOrderby('starttime');
		$query->setFutureevents('true');

// カレンダーサーバからイベントの一覧を取得します
		try {
			$eventFeed = $service->getCalendarEventFeed($query);
		} catch (Zend_Gdata_App_Exception $e) {
			echo "エラー: " . $e->getResponse();
		}


// リストの内容を順に取得し、HTML のリストとして出力します
		print "■カレンダー名:" . $eventFeed->title->text . "<br>\n";
		print "■最終更新:" . $eventFeed->updated->text . "<br>\n";
		print "■所有者情報<br>\n";
		echo "<ul>";
		foreach($eventFeed->author as $author){
			echo "<li>" . $author->name->text . " (mail address: " . $author->email->text . ")</li>";
		}
		echo "</ul>";
		print "■カレンダーエントリ<br>\n";
		echo "<ul>";
		foreach ($eventFeed->entry as $event) {
			$event_url = $event->id->text;
			echo "<li>" . $event->title->text . " (<a target=\"_blank\" href=\"{$event_url}\">イベント情報XMLをダウンロード</a>)</li>";
		}
		echo "</ul>";
	}
}

?>

▲ページ先頭へ戻る▲


■解説

Google WX320K Calendarが動作サンプルとなっていますので、動きが確認できます。
基本的にはZendのマニュアルページで16.4. Google Calendar の使用法紹介されているサンプルを加工したものです。
ただし、データ表示処理に一部誤りがあったり、エラー処理に抜けがあったりするので、そのあたりを変更・追加してみました。
ポイントとしては、「絶対にあるはずがない」ってことは考えない方がいい、ということ。
まあ、プログラムを作る上での基本です。

サンプルですが、
  • パーソナルスケジュールの一覧表示(タイトル、場所(地図リンク付き)、時間)
  • 新規予定追加(日時指定、リマインダ自動設定)
という仕様で作ってみました。
リマインダ設定しているので、対象メールをWX320Kに自動転送するようにしておけば、なお便利です。
WX320Kで使いたかったのでシンプルな仕様にしてみましたが、PC専用のリッチなAjaxアプリに組み込んだりすることももちろん簡単に出来ます。

蛇足ですが、WX320Kで使用する場合は、スモールスクリーンまたはフルスクリーンモードでないとAuthSub認証が行えないので、ケータイモードでは使えません。

▲ページ先頭へ戻る▲


■参考書籍

(データ提供:Amazon.co.jp)

▲ページ先頭へ戻る▲





■お知らせと連絡先

このウェブサイトで取り上げて欲しい話題や分かりにくい点などありましたら、
以下のメールアドレス宛にメッセージをいただければ、参考にさせていただきます。

メールアドレスは、work_komiあっとまーくyahoo.co.jpです。
(「あっとまーく」は、半角英数のあっとまーくに変換してね。)

また、XBOXをお使いの方は、ゲーマータグ(akbox)にてフレンドリクエストを受け付けています。