Google バズは 2010年 2月にサービスを開始して以来、まさにバズ (評判) となっています。Google バズでは単純な近況アップデートを投稿できるだけでなく、ユーザー同士で動画や写真などのリッチなコンテンツを共有できることから、Google バズは瞬く間に Google で最も人気のあるサービスの 1 つに躍り出ました。Gmail と密接に統合されていることもその人気の一端です。
Web 開発者が Google バズに夢中になる理由はさらにあります。それは、Google バズには他の多くの Google サービスと同じように開発者用の API が用意されているため、直にこのサービスを操作して、Google バズをベースとした独自のマッシュアップを作成できることです。しかも、この API は REST を使用することから、ほとんどのプログラミング・ツールキットと簡単に統合することができます。もちろん、私が最もよく使用している PHP もその 1 つです。
この記事では Google Buzz API を紹介し、Google バズのコンテンツを PHP アプリケーションに統合して使用する方法を説明します。それでは早速、本題に入りましょう。
Google バズを使用したアプリケーションの開発に取り掛かる前に、Google バズがどのように機能するのかを理解しておく必要があります。REST をベースとしたサービスの例に洩れず、一連の動作は、指定のリソースに対する HTTP リクエストによって開始されます。この HTTP リクエストには 1 つ以上の入力パラメーターが設定されたクエリーが含まれます。サーバーはこのクエリーに対し、Atom または JSON フィードで応答します。リクエストで使用する HTTP の「動詞」(読み取りの GET、書き込みの POST と PUT、削除の DELETE) が必要なアクションのタイプを指示し、サーバーから返される HTTP ステータス・コードが、そのアクションが成功したかどうかを示します。
この動作を確かめるには、Google アカウントにログインして、任意の Web ブラウザーで URL https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@public を指定することでリクエストを送信してみてください。URL の「YOUR_ID」ストリングはご使用の Google ID に置き換えることをお忘れなく。この ID は、Google アカウントの設定ページに表示される Google プロフィールの URL から取得することができます。このリクエストに対するレスポンス (結果として表示されるページのソース・コードで確認することができます) には、Google バズの最近の投稿のリストが表示されます。リスト 1 に、その一例を記載します。
リスト 1. Google バズのフィードの例
<?xml version="1.0" encoding="UTF-8"?>
<feed gd:kind="buzz#activityFeed"
xmlns="http://www.w3.org/2005/Atom"
xmlns:activity="http://activitystrea.ms/spec/1.0/"
xmlns:buzz="http://schemas.google.com/buzz/2010"
xmlns:crosspost="http://purl.org/syndication/cross-posting"
xmlns:gd="http://schemas.google.com/g/2005"
xmlns:georss="http://www.georss.org/georss"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:poco="http://portablecontacts.net/ns/1.0"
xmlns:thr="http://purl.org/syndication/thread/1.0">
<link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
<link
href="https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@public?alt=atom"
rel="self" type="application/atom+xml"/>
<title type="text">Google Buzz Public Feed</title>
<updated>2010-06-24T18:16:47.108Z</updated>
<id>tag:google.com,2010:buzz-feed:public:posted:YOUR_ID</id>
<generator uri="http://www.google.com/buzz">Google Buzz</generator>
<entry gd:kind="buzz#activity">
<title>Watching it rain and planning tomorrow's shopping</title>
<published>2010-06-18T14:13:51.000Z</published>
<updated>2010-06-18T14:13:51.400Z</updated>
<id>tag:google.com,2010:buzz:s12ard75xvreh35</id>
<link href="http://www.google.com/buzz/YOUR_ID/fqFn7S27Va4" rel="alternate"
type="text/html"/>
<link href="https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@self/
tag:google.com,2010:buzz:s12ard75xvreh35?alt=atom" rel="self"
type="application/atom+xml"/>
<link href="https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@self/
tag:google.com,2010:buzz:s12ard75xvreh35/@comments?alt=atom" rel="replies"
thr:count="0" thr:updated="2010-06-18T14:13:51.400Z"
type="application/atom+xml"/>
<author>
<poco:id>YOUR_ID</poco:id>
<poco:photoUrl/>
<name>Vikram Vaswani (Melonfire)</name>
<uri>http://www.google.com/profiles/YOUR_ID</uri>
<link href="" rel="photo" type="image/jpeg"/>
<activity:object-type>http://activitystrea.ms/schema/1.0/
person</activity:object-type>
</author>
<content type="text/html">Watching it rain and planning
tomorrow's shopping</content>
<activity:verb>http://activitystrea.ms/schema/1.0/post
</activity:verb>
<activity:object>
<activity:object-type>http://activitystrea.ms/schema/1.0/note
</activity:object-type>
<content type="text/html">Watching it rain and planning
tomorrow's shopping</content>
<buzz:original-content type="text"/>
<link href="http://www.google.com/buzz/YOUR_ID/fqFn7S27Va4"
rel="alternate" type="text/html"/>
</activity:object>
<source>
<activity:service>
<title>Buzz</title>
</activity:service>
</source>
<buzz:visibility>
<buzz:aclentry type="group">
<poco:id>tag:google.com,2010:buzz-group:@me:@public</poco:id>
<uri>https://www.googleapis.com/buzz/v1/people/@me/
@groups/@public?alt=atom</uri>
<poco:name>Public</poco:name>
</buzz:aclentry>
</buzz:visibility>
<link buzz:count="0" href="https://www.googleapis.com/buzz/v1/
activities/YOUR_ID/@self/tag:google.com,2010:buzz:s12ard75xvreh35/
@liked?alt=atom" rel="http://schemas.google.com/buzz/2010#liked"
type="application/poco+xml"/>
</entry>
<entry>
...
</entry>
</feed>
|
Google Buzz API は REST リクエストに対し、要求されたデータを含めた Atom または JSON フィードで応答します。Google バズが提供する多くの興味深いフィードには以下のものが含まれます。
- ユーザーごとのアクティビティー・フィード: これには、特定のユーザーによるすべての一般公開投稿が含まれます。
- グローバル・アクティビティー・フィード: Google バズで行われたすべての一般公開投稿が含まれます。
- アクティビティーごとのコメント・フィード: 特定のアクティビティーに対するユーザー・コメントのリストが含まれます。
- ユーザーごとのパーソナル・フィード: 特定のユーザーがフォローしているユーザー、そしてその特定のユーザーをフォローしているユーザーのリストが含まれます。
これらのフィードのなかには、どのユーザーでもアクセスおよび検索できるように一般公開されているものもあれば、アクセスおよび検索が、認証に成功したフィード購読者だけに制限されるものもあります。ほとんどのフィードは、認証付きの読み取り操作と書き込み操作をサポートします。つまり、認証済みユーザーは、プログラムによって新しいコンテンツをパブリック・アクティビティー・フィードに投稿することも、Google Buzz API を使って他のユーザーのパブリック・フィードにコメントを書き込むこともできるということです。
フィード自体は標準的な Atom フィードです。具体的には、最も外側にある <feed> 要素には、結果セットの現在のページの URL (そして、次のページや前のページがある場合には、次のページの URL や前のページの URL) が含まれる <link> 要素と、1 つひとつが Google バズの投稿を表す <entry> 要素が 1 つ以上あります。投稿を表す各エントリーに含まれるのは、投稿の ID、タイトル、作成者、公開日、URL などを記述するメタデータです。各 <entry> にはさらに、投稿作成者のプロフィール ID、プロフィール の URL、写真の URL、名前などを提供する <author> 要素、そして投稿に対するコメントのフィードへの URL リンクや「Good!」ボタンによるフィードへの URL リンクを提供する <link> 要素も含まれます。
ここで触れておく価値があるのは、Google バズのアクティビティーに関する特定の情報を提供する <activity:> 名前空間要素です。<activity:verb> 要素はアクティビティーのタイプを指定し、<activity:object> 要素はアクティビティーのコンテンツを指定します。
この先の説明を読む前に注意しておく点として、Google バズのコンテンツをサード・パーティー・アプリケーションで使用する場合には、Google バズの「使用条件 (Terms of Service)」が適用されます。したがって、Google バズのコンテンツを使用して開発するアプリケーションは、Google バズの「開発者向けポリシー (Developer Policies)」および「ブランドの取り扱いガイドライン」に従っていなければなりません。要求されるすべてのルールに確実に準拠するには、開発に取り掛かる前に、これらの資料をよく読むことが重要です。これら 3 つの資料へのリンクは、「参考文献」に記載されています。
一般公開用 REST API を使用して Google バズのアクティビティー・フィードにアクセスする方法がわかったところで、これと同じことを PHP アプリケーションの内部から行う方法について検討します。1 つの方法はもちろん、PHP の組み込み XML 処理拡張機能 (SimpleXML、DOM、または XMLReader) を使用して、Google バズから返された Atom フィードを構文解析し、関連する情報のフラグメントを抽出することです。けれどもサイズの大きなフィードや、名前空間が指定された大量の情報を処理するとなると、この方法ではかなり面倒な作業になりかねません。
それよりも便利な方法として、以下の 2 つがあります。
- Zend Framework の Zend_Rest_Client コンポーネントは、PHP アプリケーションと REST ベースの Web サービスの統合に取り組む開発者のために設計されたライブラリーです。2 つの方法のうちの 1 つは、このクライアントを利用して、REST サービス・エンドポイントに対して GET、POST、PUT、および DELETE リクエストを実行するというものです。REST レスポンスは Zend_Rest_Client_Response オブジェクトのインスタンスとして返されるので、個々のレスポンス・プロパティーに容易にアクセスすることができます。
- もう 1 つの方法は、Google バズのフィード専用に設計されたオープンソースのクライアント・ライブラリー、Google Buzz PHP Client Library を使用することです。このライブラリーも Google バズのフィードをネイティブ PHP オブジェクトとして返し、データ・アクセスを単純化します。
Google Buzz PHP Client Library を使用するには、開発した Web アプリケーションを Google に登録して、OAuth 認証に必要な OAuth コンシューマー・シークレットを入手する必要もあります。この 2 つのライブラリーのダウンロード・リンクと使い方の説明については、「参考文献」を参照してください。また、ライブラリーをインストールした後に、忘れずに PHP の include_path を更新して、そのインストール・ロケーションを反映させてください。
この 2 つの選択肢のどちらが望ましいかと言えば、今のところ Google Buzz PHP Client Library に軍配が上がります。その理由は、このライブラリーには OAuth 認証サポートも組み込まれているところにあります。このサポートは、認証済みリクエストを Google バズ・サービスに送信する際の手間を大幅に省くためです。熟練開発者であれば Zend_Rest_Client ライブラリーと Zend_Oauth コンポーネントを組み合わせて同じ結果をもたらすことも可能ですが、そのプロセスは多少複雑になります。したがって、この記事の例では Google Buzz PHP Client Library を使用することにしますが、いくつかの例では認証済みリクエストに Zend_Rest_Client ライブラリーを使用する場合の方法も説明します。
リスト 2 に、Google Buzz PHP Client Library を使用してユーザーのパブリック・アクティビティー・フィード (リスト 1 に記載したフィードと同じフィード) を取得し、構文解析する方法を説明します。
リスト 2. Buzz PHP クライアントで一般公開投稿のリストを表示する
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->getPosts('@public', '@me');
// iterate through feed data
echo '<h1>' . $result->title . '</h1>';
echo count($result->posts) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
echo isset($post->links['alternate'][0]->href) ?
'<a href="' . $post->links['alternate'][0]->href .
'">' . $post->title . '</a>' : $post->title;
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
リスト 2 では、まずソース・ファイルをインクルードし、それから新規 buzz オブジェクトを作成しています。この buzz オブジェクトが、Google バズのデータにアクセスするための各種メソッドを公開する Google Buzz API と通信する際の中心点としての役割を果たします。オブジェクトを初期化するには、コンストラクターに以下の 2 つの引数を渡します。
- 適切に構成された
buzzStorageオブジェクト: これは、ローカル・キャッシングの方法を指定するオブジェクトです。Google Buzz PHP Client Library がサポートするのは APC (Alternative PHP Cache)、memcached、およびファイル・ベースのキャッシングで、それぞれbuzzApcStorageクラス、buzzMemcacheStorageクラス、buzzFileStorageクラスで表されます。 - 適切に構成された
buzzOAuthオブジェクト: このオブジェクトは、静的メソッドbuzzOAuth::performOAuthLogin()によって生成されます。メソッドが取る引数は、buzzStorageオブジェクトとローカル・ユーザー ID です。buzzOAuth::performOAuthLogin()はこの 2 つの引数を受け取った後、Google サーバーを使って OAuth 認証を行います。そして、Google バズのデータへのアクセスをアプリケーションに対して許可するのか、それとも拒否するのかに応じた適切なプロンプトをユーザーに表示し、必要なリダイレクトを行います。
中心となる buzz オブジェクトを作成した後は、そのオブジェクトの getPosts() メソッドを使用して、ユーザーのアクティビティー・フィードにアクセスすることができます。このメソッドが取る引数は、フィード・タイプとユーザー ID、そしてフィード結果に含めるコメント数、「Good!」評価の数、投稿数の 5 つです。メソッドの戻り値は一連のネストされた PHP オブジェクトです。そのそれぞれのオブジェクトが、Atom 結果フィードに含めるエントリーを表します。このオブジェクトのコレクションが返された後は、ごく簡単にコレクションを繰り返し処理し、標準的な object->property 表記を使用して表示対象の関連情報を抽出することができます。その結果は、図 1 に示すとおりです。
図 1. 一般公開投稿のリスト
ここで、フィードのタイプについて簡単に説明しておきます。Google Buzz API には以下の 3 つのタイプのフィードが用意されています。
- ユーザーの「パブリック (public)」フィード: ユーザー自身が一般公開している投稿が含まれます。このフィードは
@publicとして参照され、通常は https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@public にあります。 - ユーザーの「コンサンプション (consumption)」フィード: そのユーザーがフォローしているユーザーからの投稿が含まれます。このフィードは、
@cunsumptionとして参照され、通常は https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@consumption にあります。 - ユーザーの「パーソナル (personal)」フィード: ユーザー自身が一般公開および限定公開している投稿が含まれます。このフィードは
@personalとして参照され、通常は https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@personal にあります。
コンサンプション・フィードとパーソナル・フィードには認証が必要ですが、パブリック・フィードには必要ありません。数値による Google ID を使用する代わりに、「現在認証済みのユーザー」を指す @me という特殊なユーザー ID ストリングを便利なショートカットとして使用することもできます。
リスト 3 ではリスト 2 と同じ結果を、今度は Zend_Rest_Client ライブラリーを使用して生成します。
リスト 3. Zend REST クライアントで一般公開投稿のリストを表示する
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
try {
// get feed of user public activities
$client = new Zend_Rest_Client('https://www.googleapis.com/buzz/v1/
activities/YOUR_ID_HERE/@public');
$result = $client->get();
// iterate through returned feed
echo '<h1>' . $result->title . '</h1>';
echo count($result->entry) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->entry as $entry) {
echo '<li>';
echo isset($entry->link[0][@href]) ? '<a href="' .
$entry->link[0][@href] . '">' . $entry->content .
'</a>' : $entry->content;
echo ' (' . date("d M Y h:i", strtotime($entry->published)) . ')';
echo '</li>';
}
echo "</ol>";
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
リスト 3 では、まず Zend クラス・ライブラリーをロードし、それから Zend_Rest_Client クラスのインスタンスを初期化しています。このクライアントを使用して、リスト 1 で行ったようにユーザーのパブリック・フィードに対する非認証 GET リクエストを初期化します。この場合のフィード URL にはユーザーの Google プロフィール ID が含まれていなければならないことに注意してください。Atom フィードが返されると、構文解析されて Zend_Rest_Client_Response オブジェクトに変換されます。Buzz PHP クライアントの場合と同じく、あとは極めて簡単に、オブジェクトのコレクションを繰り返し処理し、特定の投稿の詳細を抽出することができます。
Google Buzz API が検索機能を組み込んでいないとしたら、実に例外的なことと言えるでしょうが、そこは Google のことです。もちろん Google Buzz API にも一般公開投稿検索フィードが用意されています。このフィードを使用して、すべてのユーザーによるすべての一般公開投稿を検索し、指定した検索語と一致する投稿を返すことができます。この一般公開投稿検索フィードを利用するには https://www.googleapis.com/buzz/v1/activities/search を指定します。
Google Buzz PHP Client Library を使用する場合には、search() メソッドを呼び出して検索語を渡すだけで一般公開投稿を検索することができます。リスト 4 にその方法を示します。
リスト 4. Buzz PHP クライアントで投稿を検索する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching public activity feeds</title>
<style>
body {
font-family: Verdana;
}
li {
border-bottom: solid black 1px;
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post"
action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->search($_POST['q']);
// iterate through feed data
echo '<h1>' . $result->title . '</h1>';
echo count($result->posts) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
echo isset($post->links['alternate'][0]->href) ?
'<a href="' . $post->links['alternate'][0]->href .
'">' . $post->title . '</a><br/>' :
$post->title . '<br/>';
echo $post->person->name . ' (' .
date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
リスト 4 は、ユーザーが 1 つ以上の検索語を入力するための Web フォームを表示するところから始まっています。このフォームが送信されると、スクリプトは新規 buzz オブジェクトを作成し、このオブジェクトの search() メソッドに検索語を渡します。すると、このメソッドによって、Google Buzz API に対する必要な REST リクエストが生成され、結果のフィードを buzzPost オブジェクトのコレクションに変換します。あとは、コレクションをループ処理して、それぞれのオブジェクトのコンテンツ、作成者、公開日を出力するだけです。
図 2 に、”chocolate” を検索した結果を示します。
図 2. Google バズの検索結果
検索フィードはパブリック・フィードであるため、認証されていない任意の HTTP クライアントを使ってこのフィードによる検索を行うことができます。リスト 5 に、今度は Zend_Rest_Client ライブラリーを使用して検索フィードの URL を直接リクエストし、レスポンスを処理する例を示します
リスト 5. Zend REST クライアントで投稿を検索する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching public activity feeds</title>
<style>
body {
font-family: Verdana;
}
li {
border-bottom: solid black 1px;
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
try {
if (empty($_POST['q'])) {
throw new Exception('No search term provided');
}
// search all feeds
$url = 'https://www.googleapis.com/buzz/v1/activities/search?q=' .
urlencode($_POST['q']);
$client = new Zend_Rest_Client($url);
$result = $client->get();
// iterate through returned feed
// display results
echo '<h1>' . $result->title . '</h1>';
echo count($result->entry) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->entry as $entry) {
echo '<li>';
echo '<a href="' . $entry->link[0][@href] . '">' .
$entry->content . '</a><br/>';
echo $entry->author->name;
echo ' (' . date("d M Y h:i", strtotime($entry->published)) . ')';
echo '</li>';
}
echo "</ol>";
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
リスト 5 では新規 REST クライアントを初期化し、初期化後のクライアントを使用して非認証 GET リクエストを公開検索フィードに送信しています。ユーザーが指定した検索パラメーターは URL にエンコードされてから、特殊な q パラメーターによってリクエストに追加されます。結果のオブジェクト・コレクションをリスト 3 と同じく foreach() ループを使用して繰り返し処理すると、リスト 4 に相当する出力が生成されます。
他の Google フィードと同じく、Google Buzz API では以下のパラメーターのいくつかを REST クエリーに追加することで、簡単に出力をカスタマイズすることができます。
altパラメーター: フィードのフォーマット (「atom」または「json」) を指定します。max-resultsパラメーター: 取得するエントリーの最大数を指定します。max-commentsパラメーター: エントリーごとに取得するコメントの最大数を指定します。latおよびlonパラメーター: 検索結果に適用する地理によるフィルターを指定します。
さらに、リクエスト URL に高度な検索クエリー演算子を追加することも可能です。すべての演算子を網羅したリストと例については、「Google Buzz API Developers Guide」(「参考文献」にリンクを記載) を調べてください。
ここまでのところで、投稿をリストアップしたり、検索したりしたので、今度は投稿を追加、編集、削除する方法を学びます。
REST 対応の API である Google Buzz API では、必要なアクションのタイプを指定する際に通常の HTTP 動詞を使用することができます。したがって、新しい投稿を追加するとしたら、単純に投稿のコンテンツをリクエスト本体に追加して、認証済み POST リクエストをフィードの URL に送信すればよいのです。投稿を編集または削除する場合にしても同様に、投稿の ID を含めた認証済み PUT または DELETE リクエストをフィードの URL に送信します。
開発者の作業を楽にすることを目的に、Google Buzz PHP Client Library は updatePost() と deletePost() というメソッドにそれぞれ編集タスク、削除タスクをカプセル化しています。この仕組みを説明するために、リスト 6 に、新しい Google バズの投稿を PHP によって追加する方法を示します。
リスト 6. 投稿を追加する
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// add a new post
$object = new buzzObject('Adding this post through the Buzz API...woohoo!');
$post = buzzPost::createPost($object);
$result = $buzz->updatePost($post);
echo 'Added new post with ID: ' . $result->id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
何よりもまず必要な作業は、新しい buzz インスタンスを作成することです。続いて、buzzObject インスタンスを新規に作成して、投稿するコンテンツでそのインスタンスを初期化します。その後はこの buzzObject を buzzPost::createPost() メソッドによって Google バズのエントリーに変換し、updatePost() メソッドを使ってリクエスト・パケットごと Google バズ・サーバーに POST 送信します。新しい投稿が作成されると、サーバーはステータス・コード 201 (Created) と併せて新しく追加された投稿を表す <entry> フラグメント全体を返します。
図 3. 新規 Google バズ投稿を追加した結果
投稿を編集する方法は、投稿を追加する場合とは多少異なります。投稿を編集するには、最初に新しい投稿を作成した後、その新規投稿の ID を置換対象とする投稿の ID に設定します。リスト 7 にその方法を示します。
リスト 7. 投稿を変更する
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// edit a post
$object = new buzzObject('Updating this post through the Buzz API...yeehaw!');
$post = buzzPost::createPost($object);
$post->id = 'tag:google.com,2010:buzz:z133';
$result = $buzz->updatePost($post);
echo 'Updated post with ID: ' . $result->id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
リスト 7 のコードは、新規 buzzPost オブジェクトを正しいコンテンツで初期化した後、そのオブジェクトの ID を編集対象の投稿の ID に設定します。次に updatePost() メソッドで、PUT リクエストと一緒に変更済みのエントリーを Google バズ・サーバーに送信します。リクエストが成功すると、サーバーは 201 (OK) ステータス・コードと更新後の <entry> で応答します。出力は図 4 のようになります。
図 4. Google バズの投稿を編集した結果
投稿を削除するのは比較的簡単な作業です。投稿の ID を deletePost() メソッドに渡すと、Google Buzz PHP Client Library が DELETE リクエストを作成して REST API に送信します。このプロセスは、リスト 8 に示すとおりです。
リスト 8. 投稿を削除する
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// delete a post
$id = 'tag:google.com,2010:buzz:z13';
$buzz->deletePost($id);
echo 'Deleted post with ID: ' . $id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
図 5 に出力を示します。
図 5. Google バズの投稿を削除した結果
Google Buzz API ではキーワード検索だけでなく、名前によるユーザーの検索も行うことができます。名前でユーザーを検索するには、目的の検索語を追加した HTTP GET リクエストを URL https://www.googleapis.com/buzz/v1/people/search に送信します。このリクエストに対するレスポンスは、検出されたユーザーとその名前および Google ID をリストにした Atom または JSON フィードです。
リスト 9 に、Google Buzz PHP Client Library を使ってユーザーを検索する方法を示します。
リスト 9. Buzz PHP クライアントでユーザーを検索する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching for people</title>
<style>
table {
border-collapse: yes;
}
tr {
border-bottom: solid black 1px;
}
td {
vertical-align: top;
border: solid black 1px;
}
li {
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for people: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->searchPeople($_POST['q']);
// iterate through feed data
echo '<h1>Search Results</h1>';
echo '<table>';
foreach ($result as $person) {
echo '<tr>';
// display user full name and photo
echo '<td><img src="' . $person->thumbnailUrl .
'" /><br/>';
echo '<strong>' . $person->name .
'</strong></td><td>';
// fetch user's public feed
$result = $buzz->getPosts('@public',
$person->id, false, false, 3);
// iterate through feed data
echo 'Recent updates: <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
$url = isset($post->links->self[0]->href) ?
$post->links->self[0]->href : '#';
echo '<a href="' . $url . '">' . $post->title . '</a>';
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol></td>';
echo '</tr>';
}
echo '</table>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
リスト 9 では、まずユーザーに対し、検索フォームに検索対象のユーザーの名前を入力するように求めます。続いて、入力した名前と一致するユーザーを取得するために searchPeople() メソッドを使って Google Buzz API に対してクエリーを実行します。このメソッドの戻り値は、buzzPerson オブジェクトのコレクションです。これらのオブジェクトのそれぞれに、ユーザーの氏名、Google ID、Google プロフィールの URL、写真の URL、およびその他の個人情報などのユーザー情報が含まれます。リスト 9 ではこの情報を抽出した後、Google ID と getPosts() メソッドを使ってユーザーの最新の投稿も 3 件取得します。この情報のすべてが、読みやすく整形された図 6 のような Web ページに表示されます。
図 6. Google バズ・ユーザーの検索結果
リスト 10 に、リスト 9 に代わる検索の方法として、今度は Zend_Rest_Client ライブラリーを使用して同じ結果を得る方法を示します。
リスト 10. Zend REST クライアントでユーザーを検索する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching for people</title>
<style>
table {
border-collapse: yes;
}
tr {
border-bottom: solid black 1px;
}
td {
vertical-align: top;
border: solid black 1px;
}
li {
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for people: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
try {
if (empty($_POST['q'])) {
throw new Exception('No search term provided');
}
// search people feed
$client = new Zend_Rest_Client('https://www.googleapis.com/buzz/v1/
people/search?q=' . urlencode($_POST['q']));
$result = $client->get();
// iterate through returned feed
// for each result, display user name and photo
echo '<h1>Search Results</h1>';
echo '<table>';
foreach ($result->entry as $entry) {
echo '<tr>';
echo '<td><img src="' . $entry->thumbnailUrl .
'" /><br/>';
echo $entry->displayName . '</td><td>';
// get feed of user's three most recent public posts
$client2 = new Zend_Rest_Client('https://www.googleapis.com/buzz/
v1/activities/' . $entry->id . '/@public?max-results=3');
$result2 = $client2->get();
echo 'Recent updates: <br/>';
echo '<ol>';
foreach ($result2->entry as $entry2) {
echo '<li>';
echo '<a href="' . $entry2->link[0][@href] . '">' .
$entry2->content . '</a>';
echo ' (' . date("d M Y h:i", strtotime($entry2->published)) . ')';
echo '</li>';
}
echo "</ol></td>";
echo '</tr>';
}
echo '</table>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
リスト 10 では Zend_Rest_Client ライブラリーを使用してユーザー検索サービス用の REST エンドポイントに直接アクセスし、Atom フィードのオブジェクト表現を返します。このオブジェクトのコレクションは、関連情報を抽出するために必要に応じて使用することができます。ただしこの場合、検索語は手動で URL エンコードしなければならないことに注意してくだい。
Google バズではユーザー同士が「フォロー」し合うことができます。あるユーザーをフォローすると、そのフォロー対象のユーザーからの投稿が自動的にそのフォロワーのコンサンプション・フィードに含まれるようになります。Google Buzz API を使えばこの情報を、https://www.googleapis.com/buzz/v1/people/YOUR_ID/@groups/@followers のフォロワー・フィード、https://www.googleapis.com/buzz/v1/people/YOUR_ID/@groups/@following のフォロー対象フィードから入手することができます。
この情報を Google Buzz PHP Client Library を使用して取得するには、followers() および following() メソッドを使用します。これらのメソッドは、そのユーザーのフォロワー、そしてそのユーザーがフォローしているユーザーをそれぞれに表す buzzPerson オブジェクトのコレクションを返します。リスト 11 に、一例を示します。
リスト 11. フォロワーおよびフォロー対象をリストアップする
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// get followers
$followers = $buzz->followers('@me');
echo '<h1>Currently being followed by:</h1>';
foreach ($followers as $person) {
displayUserBlock($person);
}
// get following
$following = $buzz->following('@me');
echo '<h1>Currently following:</h1>';
foreach ($following as $person) {
displayUserBlock($person);
}
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
// render user block
function displayUserBlock($person) {
// get object from global scope
global $buzz;
// display user full name
echo '<strong>' . $person->name . '</strong><br/>';
// fetch user's public feed
$result = $buzz->getPosts('@public', $person->id, false, false, 3);
// iterate through feed data
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
$url = isset($post->links->self[0]->href) ?
$post->links->self[0]->href : '#';
echo '<a href="' . $url . '">' . $post->title .
'</a>';
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol>';
}
?>
|
リスト 11 ではまず、認証済みユーザーのフォロワーのリストを取得する followers() メソッドを使用しています。このメソッドの戻り値は buzzPerson オブジェクトのコレクションで、それぞれのオブジェクトがユーザー定義の displayUserBlock() メソッドに渡されます。すると、このユーザー定義メソッドが各フォロワーの名前と ID を取得し、さらに取得した ID を使用して、今度は getPosts() メソッドによって 2 番目のリクエストを行い、フォロワーの最新の投稿を 3 件取得します。この情報が整形されて表示されるという仕組みです。
上記のリストでは続いて following() メソッドを使用し、認証済みユーザーが現在フォローしているユーザーの一覧を取得しています。このメソッドで返されるコレクションもフォロワーのリストと同じように処理されます。
Google Buzz API では、プログラムによって特定のユーザーのフォロー、あるいはフォローの解除をすることも可能です。これらの API メソッドは、バズ・オブジェクトの follow() および unfollow() メソッドに反映されています。どちらのメソッドもユーザー ID を引数に取り、認証済みユーザーのフォロー・キューに対してそのユーザーの追加、および削除をそれぞれ行います。
これまでの説明から、Google Buzz API がどのように機能するかについて多少の知識は得られたはずです。そこで、最後に単純な Web アプリケーションを作成して、この API をインタラクティブに使用する具体的な例を紹介します。リスト 12 はリスト 2 を更新したもので、Add フォームを作成し、各投稿の Delete リンクを追加しています。これらの追加によって、認証済みユーザーが公開フィードを表示して、インタラクティブに新しい投稿を追加したり、あるいは既存の投稿を削除したりできるようになります。しかも、これらの操作に Google バズのインターフェースを使用することは一切ありません。
リスト 12. ユーザーの投稿を一覧表示する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<style>
body {
font-family: Verdana;
}
li {
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<h1>Add New Post</h1>
<form method="post" action="add.php">
Message: <br/>
<textarea name="buzz" cols="60" rows="5"></textarea><br/>
<input type="submit" name="submit" value="Post!" />
</form>
<h1>Recent Posts</h1>
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->getPosts('@public', '@me');
// iterate through feed data
echo count($result->posts) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
echo isset($post->links['alternate'][0]->href) ?
'<a href="' . $post->links['alternate'][0]->href .
'">' . $post->title . '</a>' : $post->title;
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ') ';
echo '<a href="delete.php?id=' . $post->id . '">[Delete this post]</a>';
echo '</li>';
}
echo '</ol>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
</body>
</html>
|
リスト 12 は、2 つの部分に分かれています。
- 一方の部分では
buzzオブジェクトを初期化し、そのgetPosts()メソッドを使用してユーザーの公開フィードを取得します。各投稿には、ユーザーがその投稿を削除するためのリンクが付いており、ユーザーはそのリンクを利用することで delete.php スクリプトによって投稿を削除することができます。delete.php スクリプトには、投稿の ID が標準の GET パラメーターとして渡されます。 - もう一方の部分には HTML フォームが含まれています。このフォームには、ユーザーが新しい投稿を入力するための入力フィールドがあります。フォームから送信されたデータは、POST リクエストによって add.php スクリプトに転送されます。
リスト 13 に add.php スクリプトを記載します。このスクリプトが POST リクエストからの入力データを受け取り、そのデータを buzzPost オブジェクトに変換します。変換されたオブジェクトは、前に説明した updatePost() メソッドにより、POST リクエストとして Google バズ・サービスに送信されます。リスト 13 のコードを見てください。
リスト 13. 新規投稿を追加する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
<?php
if (!isset($_POST['buzz'])) {
die('ERROR: Please enter some Buzz content!');
}
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// add a new post
$object = new buzzObject($_POST['buzz']);
$post = buzzPost::createPost($object);
$result = $buzz->updatePost($post);
echo 'Added new post with ID: ' . $result->id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
</body>
</html>
|
リスト 14 に記載する delete.php スクリプトは、削除する投稿の ID を受け取り、その ID を deletePost() メソッドに渡します。このメソッドが DELETE リクエストを作成して Google Buzz API に渡すと、削除が実行されます。コードは以下のとおりです。
リスト 14. 投稿を削除する
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
<?php
if (!isset($_GET['id'])) {
die('ERROR: Please provide a valid Buzz ID for deletion');
}
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// delete a post
$buzz->deletePost($_GET['id']);
echo 'Deleted post with ID: ' . $id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
</body>
</html>
|
図 7 に、リスト 12 による出力を示します。
図 7. Google バズと対話するための Web フォーム
この記事の例からわかるように、Google Buzz API と PHP Client Library によって、バズの投稿とアクティビティー・ストリームを直接 PHP アプリケーションに統合することができます。記事の例は、Google バズという氷山の一角に触れたに過ぎません。このサービスには、ここで紹介した機能の他にも、以下を含めた数多くの機能が用意されています。
- 専用アクティビティーの作成
- 投稿のブロック、ブロック解除、および投稿への「Good!」の評価
- コメントの作成および編集
- 高度な検索クエリーの作成
この記事を執筆している時点では、Google Buzz API の開発はまだ進んでいます。つまり、この先、さらに多くの優れた機能を期待できるということです。
要するに Google Buzz API は開発者にとって、公開バズのコンテンツを Web アプリケーションに統合するために使用できる、フォーマットに依存しない高度なメカニズムです。Google Buzz API はマッシュアップにも、Google バズとの独自のカスタム・インターフェースを作成するにも素晴らしい手段となります。ぜひ一度試して、その成果を自分の目で確かめてください!
学ぶために
- Google バズの「使用条件 (Terms of Service)」: Google バズのコンテンツをサード・パーティー・アプリケーションで使用する場合には、ここに記載されている使用条件に従ってください。
- Google バズの「開発者向けポリシー (Developer Policies)」および「ブランドの取り扱いガイドライン」: Google バズの利用方法を読んで、アプリケーションをこれらのポリシーとガイドラインに準拠させてください。
- Google アカウント: 無料のアカウントを登録して早速使い始めてください。
- Developer's Guide および REST リファレンス: Google Buzz API について、そして RESTful な呼び出しスタイルに従って Atom または JSON データ構造体にアクセスする API の共通機能について詳しく調べてください。
- Google OAuth 認証: Google による OAuth プロトコル実装によって、Web アプリケーションのリクエストに対し、ユーザーのデータへのアクセスを許可してください。
- Google 認証サービス: Web アプリケーションを無料で登録できます。
- Google Buzz PHP Client Library のインストールおよび使用方法: このクライアント・ライブラリーを使用して、Web サーバーから Google バズのデータを操作する方法を理解してください。
- Google Buzz API Developer Forum: Google Buzz API 開発に関するディスカッションに参加してください。
- Google Social Web Blog: Google バズに関する最新ニュースを入手できます。
- Programmer's Reference Guide: Zend_Rest_Client ライブラリーの詳しい説明を読んでください。
- 「Writing a REST Web Service and Client With Zend_Controller」(Jon Lebensold 著、Zendcasts、2009年4月): このスクリーンキャスト (38 分 50 秒) で REST Web サービスとクライアントを作成する方法を学んでください。
- developerWorks の XML エリア: XML 分野でのスキルを磨くための資料を入手してください。
- My developerWorks: developerWorks のエクスペリエンスを自分流にカスタマイズしてください。
- IBM XML 認定: XML や関連技術の IBM 認定技術者になる方法について調べてください。
- XML technical library: 広範な技術に関する記事とヒント、チュートリアル、標準、そして IBM Redbooks については、developerWorks XML ゾーンを参照してください。また、XML に関するヒントを読んでください。
- developerWorks の Technical events and webcasts: これらのセッションで最新情報を入手してください。
- Twitter での developerWorks: 今すぐ登録して developerWorks のツイートをフォローしてください。
- developerWorks podcasts: ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
- developerWorks オンデマンド・デモ: 初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
製品や技術を入手するために
- Google Buzz PHP Client Library: ご使用のサーバーにこのクライアント・ライブラリーをダウンロードして、Google バズのデータを操作してください。これに最適な言語は PHP です。
- Zend Framework: Zend Framework をダウンロードして、よりセキュアで信頼性に優れ、幅広く利用可能な API を備えた最新の Web 2.0 アプリケーションおよび Web サービスを構築してください。
- IBM 製品の評価版: DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を体験するには、評価版をダウンロードするか、IBM SOA Sandbox のオンライン試用版を試してみてください。
議論するために
- XML ゾーンのディスカッション・フォーラム: XML 関連のフォーラムに参加してください。
- developerWorks blogs: これらのブログを調べて、ブログに参加してください。

Vikram Vaswani は、オープンソースのツールと技術を専門とするコンサルティング・サービス会社、Melonfire の創業者で、現在 CEO を務めています。彼は、『Zend Framework: A Beginners Guide』および『PHP: A Beginners Guide』の著者でもあります。