第14章 Zend_Gdata

目次

14.1. Gdata について
14.1.1. Google Data クライアント認証
14.1.2. 依存性
14.1.3. 新しい Gdata クライアントの作成
14.1.4. 共通のクエリパラメータ
14.1.5. フィードの取得
14.1.6. Google サーバへのエントリの送信
14.1.7. Google サーバからのデータの削除
14.2. AuthSub による認証
14.2.1. AuthSub 認証済みの Http クライアントの作成
14.2.2. AuthSub 認証の解除
14.3. ClientLogin による認証
14.3.1. ClientLogin 認証済みの Http クライアントの作成
14.3.2. Http クライアントの ClientLogin 認証の解除
14.4. Google Base の使用法
14.4.1. データの問い合わせ
14.4.2. Base のデータの更新
14.4.3. Base のメタデータの問い合わせ
14.5. Google Blogger の使用法
14.5.1. Blogger のバージョン間の互換性について理解する
14.5.2. blog の検索
14.5.3. 自分の blog への投稿
14.6. Google Calendar の使用法
14.6.1. Google Calendar への問い合わせ
14.6.2. Google Calendar への投稿
14.7. Google CodeSearch の使用法
14.8. Gdata Data Helper の使用法
14.9. Gdata の例外の捕捉

14.1. Gdata について

Google Data API は、Google のオンラインサービスに対するプログラマ向けのインターフェイスです。 クライアントアプリケーションは問い合わせ内容を HTTP 経由で送信し、その応答を取得します。 Zend_Gdata コンポーネントは PHP 5 用のインターフェイスで、Google Data に PHP からアクセスするためのものです。

Google Data API についての詳細な情報は http://code.google.com/apis/gdata/ を参照ください。

Zend_Gdata でアクセスできるサービスには次のようなものがあります。

  • Google Base は、仕事やイベント、個人広告などのエントリを検索するためのツールです。 さまざまな人たちが項目を投稿し、それに対して一般的な属性を付加します。

  • Google Blogger は人気のあるインターネットプロバイダで、 "ボタンひとつで簡単に" 記事を配信することができます。

  • Google Calendar は、オンラインでスケジュール管理をしたり共同作業をしたりするためのツールです。

  • Google CodeSearch を使用すると、さまざまなプロジェクトが公開しているソースコードを検索できます。

[注意] サポートしていないサービス

Google Data API は Google Spreadsheets もサポートしています。 しかし Zend_Gdata の今回のリリースでは、Spreadsheets 用のヘルパークラスを提供していません。

Zend_Gdata には、これら以外の Google のサービス (例えば検索、Gmail、翻訳、マップなど) に対するインターフェイスは含まれていません。 Google Data API をサポートしているサービスにのみ対応しています。

14.1.1. Google Data クライアント認証

ほとんどの Google Data サービスは、 個人データへのアクセスやデータの保存、削除の前に Google サーバに対する認証を要求します。 Google Data の認証用に提供される実装は AuthSub および ClientLogin の二種類があります。 Zend_Gdata ではこれら両方の方式に対するインターフェイスを用意しています。

Google Data サービスに対するその他大半の問い合わせは、 認証を必要としません。

14.1.2. 依存性

Zend_Gdata は Zend_Feed および Zend_Http_Client を用いてリクエストを google.com に送信し、結果を取得します。 ほとんどの Google Data リクエストに対する応答は Zend_Feed オブジェクトで返されます。その内容は Atom あるいは RSS 形式のフィードです。

Zend_Gdata は、PHP アプリケーションの稼動しているホストが インターネットに直接つながっていることを想定しています。 Zend_Gdata クライアントは Google Data サーバへの接続を行います。

14.1.3. 新しい Gdata クライアントの作成

Zend_Gdata クラス、 あるいはそのサブクラスのひとつのオブジェクトを作成します。 各サブクラスではサービス固有のヘルパーメソッドを提供します。

Zend_Gdata のコンストラクタに渡すオプションの引数は Zend_Http_Client のインスタンスです。このパラメータを渡さなかった場合は、 Zend_Gdata はデフォルトの Zend_Http_Client オブジェクトを作成します。 Zend_Http_Client オブジェクトを自分で指定すると、 クライアントオブジェクトに対する設定オプションを指定することができます。

<?php
require_once 'Zend/Gdata.php';
require_once 'Zend/Http/Client.php';

$client = new Zend_Http_Client();
$client->setConfig( ...オプション... );

$gdata = new Zend_Gdata($client);
?>

認証済みの Zend_Http_Client オブジェクトを作成する方法については、 認証のセクションも参照ください。

14.1.4. 共通のクエリパラメータ

パラメータを指定することで、Zend_Gdata での問い合わせをカスタマイズすることができます。 中には特定の Google Data サービスにしか適用できないパラメータもありますが、 これらのパラメータについては後の各サービスの節で説明します。 複数の Google Data サービスで共通に使用できるパラメータについて、 以下で説明します。

  • alt パラメータはフィードの形式を指定します。 このパラメータには atomrssjson、 あるいは json-in-script のいずれかを指定します。 このパラメータを指定しなかった場合、デフォルトのフィードの形式は atom となります。

    このパラメータを設定するには setAlt() を使用します。

  • maxResults パラメータはフィード内のエントリ数を制限します。 整数値を指定します。返されるフィード内のエントリの数は、 この値を超えることはありません。

    このパラメータを設定するには setMaxResults() を使用します。

  • startIndex パラメータは、 フィードで返される最初のエントリの番号を指定します。 それ以前の番号のエントリは読み飛ばされます。

    このパラメータを設定するには setStartIndex() を使用します。

  • updatedMin パラメータおよび updatedMax パラメータは、エントリの日付の範囲を指定します。 updatedMin を指定すると、 それより前に更新されたエントリはフィードに含まれません。 同様に、updatedMax で指定した日付より後で更新されたエントリもフィードに含まれません。

    これらのパラメータには、タイムスタンプを表す数値を指定します。 あるいは 日付/時刻 を表す文字列を指定することもできます。

    これらのパラメータを設定するには setUpdatedMin() および setUpdatedMax() を使用します。

これらの set 関数に対応する get 関数もあります。

<?php
$gdata = new Zend_Gdata();
$gdata->setMaxResults(10);
echo $gdata->getMaxResults();   // 10 を返します
?>

Zend_Gdata クラスでは、 特別なゲッターメソッドおよびセッターメソッドも実装しています。 つまり、パラメータの名前をクラスの仮想的なメンバとして扱うことができます。 isset()unset() を使用して、これらの仮想メンバを扱うこともできます。

<?php
$gdata = new Zend_Gdata();
$gdata->maxResults = 10;
echo $gdata->maxResults;        // 10 を返します
echo isset($gdata->maxResults); // true を返します
unset($gdata->maxResults);      // パラメータを消去します
?>

すべてのパラメータを消去するには resetParameters() を使用します。複数のクエリで Zend_Gdata を使いまわす場合などに便利です。

<?php
$gdata = new Zend_Gdata();
$gdata->maxResults = 10;
// ...フィードを取得します...

$gdata->resetParameters();      // すべてのパラメータを消去します
// ...別のフィードを取得します...
?>

14.1.5. フィードの取得

getFeed() を使用して、指定した URI からフィードを取得します。 この関数は Zend_Feed クラスのオブジェクトを返します。

<?php
$gdata = new Zend_Gdata();
$gdata->setQuery('digital camera');
$gdata->setMaxResults(10);
$uri = 'http://www.google.com/base/feeds/snippets'
    . $gdata->getQueryString();
$feed = $gdata->getFeed($uri);
?>

このオブジェクトの使用法についての詳細は、 Zend_Feed のドキュメントを参照ください。

この後の節で、各 Google Data サービス用のヘルパークラス固有の関数について説明します。これらの関数により、 対応するサービスにあわせた適切な URI からフィードを取得できるようになります。

14.1.6. Google サーバへのエントリの送信

Zend_Gdata オブジェクトの関数 post() にアップロードしたいデータを指定し、 新しいエントリを Google Data サービスに保存します。

使用する Google Data サービスのエントリに対応する、 正しい構造の XML を作成する必要があります。これには、 たとえば DOM XML や SimpleXML などの PHP のライブラリを使用します。

<?php
$gdata = new Zend_Gdata($authenticatedHttpClient);

$xmlString = <<<XML
<entry xmlns='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'>
  <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/g/2005#event'></category>
  <title type='text'>Tennis with Beth</title>
  <content type='text'>Meet for a quick lesson.</content>
  <author>
    <name>Jo March</name>
    <email>jo@gmail.com</email>
  </author>
  <gd:transparency
    value='http://schemas.google.com/g/2005#event.opaque'>
  </gd:transparency>
  <gd:eventStatus
    value='http://schemas.google.com/g/2005#event.confirmed'>
  </gd:eventStatus>
  <gd:where valueString='Rolling Lawn Courts'></gd:where>
  <gd:when startTime='2006-04-17T15:00:00.000Z'
    endTime='2006-04-17T17:00:00.000Z'></gd:when>
</entry>
XML;

$xml = new SimpleXMLElement($xmlString);

$myCalendar = 'http://www.google.com/calendar/feeds/default/private/full';
$gdata->post($xml->asXML(), $myCalendar);
?>

エントリを送信するには、認証済みの Zend_Http_Client を使用する必要があります。これは、 Zend_Gdata_AuthSub クラスあるいは Zend_Gdata_ClientLogin クラスを使用して作成します。

14.1.7. Google サーバからのデータの削除

Zend_Gdata オブジェクトの関数 delete() に削除したいエントリを指定して、Google Data サービスからデータを削除します。 フィードエントリの <id> の値を delete() メソッドに渡します。

<?php
$gdata = new Zend_Gdata($authenticatedHttpClient);
// Google Data のフィード
$feedUri = ...;
$feed = $gdata->getFeed($feedUri);
foreach ($feed as $feedEntry) {
    // <id> 要素を抽出します
    $id = $feedEntry->id();
    $gdata->delete($id);
}
?>

フィードオブジェクトを用いずに delete() メソッドを使用することもできます。その場合は、 エントリを識別する正しい URI を指定します。

<?php
$gdata = new Zend_Gdata($authenticatedHttpClient);
$uri = 'http://www.google.com/calendar/feeds/default/private/entryID';
$gdata->delete($uri);
?>

上の例において、"entryID" の部分を実際に削除したいエントリの ID に変更します。

エントリを削除するには、認証済みの Zend_Http_Client を使用する必要があります。これは、 Zend_Gdata_AuthSub クラスあるいは Zend_Gdata_ClientLogin クラスを使用して作成します。