レベル: 中級 Vikram Vaswani, Founder, Melonfire
2008年 1月 22日 del.icio.us サービスでは、ユーザーがオンラインでブックマークを収集して共有できるようになっています。これらのブックマークを del.icio.us の REST API とインターフェースを取る PEAR の Services_Delicious パッケージで操作して、カスタマイズした PHP アプリケーションを作成してください。
はじめに
ある程度の頻度で Web をサーフィンしていれば、del.icio.us が何であるかはすでにご存知のはずでしょう。del.icio.us は興味のある Web サイトにブックマークを付けて他のユーザーと共有できるようにする無料のオンライン・サービスです。このサービスでは、ユーザーがブックマークにキーワードで「タグ」を付けたり、その時点で最も人気のあるブックマークを表示したりすることもできます。
del.icio.us の優れた機能の 1 つは、REST ベースの API を使ってブックマークのリストにアクセスし、このリストをユーザー固有の XML 対応アプリケーションに統合できることです。それにはほとんどの場合、del.icio.us の REST API と通信し、リクエストを送信し、そしてレスポンスを解析するアプリケーション・レベルのコードが必要になりますが、使用しているアプリケーションが PHP アプリケーションの場合、PEAR (PHP Extension and Application Repository) のパッケージ、Services_Delicious を使用すれば、このプロセスの作業は少なくなります。
Services_Delicious パッケージには、del.icio.us REST API との通信、リクエストの作成と送信、そして XML レスポンスの解析とデコードを行うための API が用意されています。そんな役目を持つパッケージは、PHP アプリケーションから del.icio.us ブックマークを表示、追加、編集、あるいは削除できる堅牢で使いやすいウィジェットを提供しています。このヒントでは、これらの基本的なタスクを実現するコード例を用いて、このパッケージの概要を説明します。
インストール
Services_Delicious パッケージは Stephan Schmidt と鶴岡達也の両氏によって管理され、PHP ライセンスの元で PHP コミュニティーにリリースされています。このパッケージをインストールするのに最も簡単な方法は、PHP ビルドにデフォルトで含まれている自動 PEAR インストーラーを使うことです。この場合、以下のコマンドをシェル・プロンプトで実行するだけでインストールすることができます。
shell> pear install Services_Delicious
上記のコマンドを実行すると、PEAR インストーラーが PEAR パッケージ・サーバーに接続し、パッケージをダウンロードしてシステムの適切な場所にインストールしてくれます。このヒントで使用するのは、Services_Delicious V0.5.0 です。
パッケージを手作業でインストールするには、PEAR のホーム・ページにアクセスしてソース・コード・アーカイブをダウンロードし、ファイルを目的の場所に解凍してください。手動インストールのプロセスでは、PEAR のパッケージ編成構造についての知識があることが前提となります。
Services_Delicious は他の 2 つの PEAR パッケージ、HTTP_Request パッケージと XML_Serializer パッケージに依存します。PEAR の自動インストーラーを使用すれば、この 2 つのパッケージを前述のようにインストールすることができます。自動インストーラーを使わない場合には、このヒントの「参考文献」にパッケージ・ファイルへのリンクを記載しているので参照してください。開発中に気付いた注目すべき点として、HTTP_Request パッケージは Windows® では正しく機能しないことがあります。そのため、このチュートリアルの例では *NIX 開発環境を前提としています。
Services_Delicious を使うには、PHP 開発環境に OpenSSL、および PHP の OpenSSL 拡張機能をインストールする必要もあります。*NIX 環境では、この OpenSSL 拡張機能のサポートによって PHP の再コンパイルが必要になることがあります。OpenSSL Web サイトへのリンクならびに PHP の OpenSSL 拡張機能を有効にするための詳細については「参考文献」を参照してください。
最後に、このヒントの例では del.icio.us にアカウントを持っていることを前提としています。アカウントには、できればブックマークをいくつか追加しておいてください。アカウントがない場合は、この del.icio.us サービスにサインアップし (無料です)、必要な情報を入力してアカウントを取得する必要があります。このサービスのサインアップ・ページへのリンクは、このヒントの「参考文献」セクションに記載されています。
ブックマークの取得
Services_Delicious の詳細を掘り下げる前に、del.icio.us API について順序立てて簡単に説明します。REST をベースとしたサービスの常として、この API は HTTP 上で動作し、ユーザーにアクセスを許可する前に HTTP 基本認証を使ってユーザーのクレデンシャルを検証します。API に組み込まれているメソッドは、ブックマークの追加と削除、ユーザーのブックマーク・リストの取得、そしてユーザーのタグの取得 (または名前変更) です。
API が実際に動作する様子を見るには、お好みの Web ブラウザーで URL、https://api.del.icio.us/v1/posts/recent にアクセスしてください。この REST メソッドは、ユーザーが最近行った投稿のリストを返してくれます。要求に従って del.icio.us のユーザー・クレデンシャルでサインインすると、このメソッドに対するXML レスポンスが XML のまま表示され、そこに最近のブックマークのリストが含まれています。このレスポンスはリスト 1 のようになっているはずです。
リスト 1. del.icio.us からの XML レスポンス・パケット
<?xml version='1.0' standalone='yes'?>
<posts tag="" user="someuser">
<post href="http://www.kernel.org/" description="The Linux Kernel Archives"
hash="7dae6d24e3f8c6c3c3aa1b05ce5bfe94" tag="linux kernel opensource"
time="2007-12-04T09:03:25Z" />
<post href="http://www.everythingphpmysql.com/" description="How to
do Everything with PHP & MySQL - Vikram Vaswani"
hash="8c9c6572c70cb3de3fa93b87269a8d79"
tag="book development php mysql web beginner" time="2007-12-04T09:02:47Z" />
<post href="http://www.mysql-tcr.com/" description="MySQL: The Complete
Reference - Vikram Vaswani" hash="c8d99b00cfb9a1af9d59bbc6c46848cd"
tag="mysql php book" time="2007-12-04T09:02:21Z" />
...
</posts>
|
上記の出力は、Mozilla Firefox では図 1 のように表示されます。
図 1. Mozilla Firefox に表示された del.icio.us からの XML レスポンス・パケット
PHP アプリケーションの場合、この動作を Services_Delicious で再現するとリスト 2 のようになります。
リスト 2. ブックマークの取得
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get recent posts from del.icio.us
print_r($sdObj->getRecentPosts());
?>
|
上記のリストを含め、以降のリストではダミーのユーザー名とパスワードを使っているので、忘れずに実際の値に置き換えてください。
リスト 2 では、PHP の Services_Delicious パッケージを使ってdel.icio.us Web サービスに接続し、最近の投稿のリストを取得します。そのためにこのコードで最初に行っているのは、Services_Delicious クラス・ファイルを読み込んで Services_Delicious クラスのオブジェクト・インスタンスを初期化することです。ユーザーの del.icio.us ユーザー名とパスワードがオブジェクト・コンストラクターに渡され、HTTP 認証のために使用されます。続いてオブジェクトの getRecentPosts() メソッドによって最も最近ユーザーが送信したブックマークが取得され、XML レスポンスが構文解析されて一連のネストされた PHP の配列に変換されます。
リスト 3 に、getRecentPosts() によって返される配列の例を記載します。
リスト 3. 取得されたブックマークが含まれる PHP 配列の例
Array
(
[0] => Array
(
[href] => http://www.kernel.org/
[description] => The Linux Kernel Archives
[hash] => 7dae6d24e3f8c6c3c3aa1b05ce5bfe94
[tag] => Array
(
[0] => linux
[1] => kernel
[2] => opensource
)
[time] => 2007-12-04T09:03:25Z
)
[1] => Array
(
[href] => http://www.everythingphpmysql.com/
...
)
)
|
PHP の foreach() ループを使うと、この配列を HTML での表示用に再フォーマットしやすくなります。リスト 4 に、このプロセスを示します。
リスト 4. 取得したブックマークの HTML ページへの再フォーマット
<html>
<head></head>
<body>
<h2>My Bookmarks</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get recent posts from del.icio.us
// print as bulleted list
$posts = $sdObj->getRecentPosts();
echo "<ul>\n";
foreach ($posts as $p) {
echo " <li>\n";
echo " <a href=\"" . $p['href'] . "\">" . $p['description'] . "</a><br />\n";
echo " <span style=\"color:red\">" . implode(' ', $p['tag']) . "</span>\n";
echo " </li>\n";
}
echo "</ul>\n";
?>
</body>
</html>
|
リスト 4 は getRecentPosts() によって返された配列を繰り返し処理し、各要素を黒丸付きリスト項目として出力し、それぞれの項目の下に対応するタグを掲載します。この出力は図 2 のようになります。
図 2. del.icio.us から取得したブックマークを表示する HTML 文書
タグの操作
getTags() メソッドは、del.icio.us アカウントで使用されたすべてのタグのリストを、各タグの使用回数と併せて返します。リスト 5 に、このメソッドを示します。
リスト 5. ユーザー・タグの取得
<html>
<head></head>
<body>
<h2>My Tags</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get tags from del.icio.us
// print as table
$tags = $sdObj->getTags();
echo "<table border=\"1\">\n";
foreach ($tags as $tag => $count) {
echo " <tr>\n";
echo " <td>$tag</td>\n";
echo " <td>$count</td>\n";
echo " </tr>\n";
}
echo "</table>\n";
?>
</body>
</html>
|
図 3 は、このメソッドによる出力例です。
図 3. del.icio.us から取得したタグを表示する HTML 文書
タグのリストを取得したら、これらのタグの 1 つ以上に対応するすべてのブックマークを取得するために、 getPosts() メソッドにタグ名の配列を 1 番目の引数として渡してください。リスト 6 では、book というキーワードのタグが付いたブックマークのみが返されるようにしています。
リスト 6. タグによるブックマークのフィルタリング
<html>
<head></head>
<body>
<h2>My Bookmarks</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// get recent posts from del.icio.us
// tagged with 'book'
// print as bulleted list
$posts = $sdObj->getPosts(array('book'));
echo "<ul>\n";
foreach ($posts as $p) {
echo " <li>\n";
echo " <a href=\"" . $p['href'] . "\">" . $p['description'] . "</a><br />\n";
echo " <span style=\"color:red\">" . implode(' ', $p['tag']) . "</span>\n";
echo " </li>\n";
}
echo "</ul>\n";
?>
</body>
</html>
|
ちなみに、getRecentPosts() にも同じようなタグ名の配列を 1 番目の引数として渡すことができます。
ブックマークの追加と削除
Services_Delicious の addPost() および deletePost() メソッドを使うと、PHP アプリケーション内から del.icio.us アカウントに対するブックマークの追加と削除を行うこともできます。その方法を説明する例として、リスト 7 では新しいブックマークを追加しています。
リスト 7. ブックマークの追加
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// add a bookmark to del.icio.us
$ret = $sdObj->addPost('http://www.google.com/', 'My fav search engine',
null, 'search web cool', null, null);
if ($ret === true) {
echo 'Bookmark added.';
} else {
echo 'Bookmark could not be added.';
}
?>
|
addPost() メソッドは 6 つのパラメーターを受け入れますが、そのうち最初の 2 つだけが必須パラメーターです。以下に、この 6 つのパラメーターを表示順にリストします。
- URL
- URL リンクの説明
- URL リンクの詳細説明
- リンクのタグ
- URL が送信された日時
- その項目を公開するかどうか
addPost() の戻り値はブール値なので、項目が正常に投稿されたかどうかをチェックするのも、適切なメッセージをユーザーに表示するのも簡単です。
一方、お気に入りから外れたブックマークを削除する場合に必要なコードはリスト 8 のとおりです。
リスト 8. ブックマークの削除
<?php
// include class file
include_once 'Services/Delicious.php';
// initialize object
$sdObj = new Services_Delicious('someuser', 'somepass');
// remove a bookmark from del.icio.us
$ret = $sdObj->deletePost('http://www.google.com/');
if ($ret === true) {
echo 'Bookmark removed.';
} else {
echo 'Bookmark could not be removed.';
}
?>
|
ブックマークを削除するのは追加するよりもさらに簡単で、deletePost() に該当する URL を指定するだけの話です。
単純なアプリケーション
Services_Delicious の機能を理解できたところで、実際的な例でこのパッケージを試してみましょう。リスト 9 は、PHP ベースの del.icio.us ブックマーク・マネージャーです。このブックマーク・マネージャーはこれまでのセクションで説明したメソッドを使って、ユーザーが対話形式でブックマークを表示、追加できるようにしています。
リスト 9. 対話型ブックマーク・マネージャー
<html>
<head></head>
<body>
<h2>My Bookmarks</h2>
<?php
// include class file
include_once 'Services/Delicious.php';
// use form submission
// to add new bookmark
if (isset($_POST['submit'])) {
$url = trim($_POST['url']);
$desc = trim($_POST['desc']);
$tags = trim($_POST['tags']);
$sdObj = new Services_Delicious('someuser', 'somepass');
$ret = $sdObj->addPost($url, $desc, null, $tags, null, null);
if ($ret === true) {
echo 'Bookmark saved!';
} else {
echo 'Bookmark not saved!';
}
unset($sdObj);
}
// get recent posts from del.icio.us
// print as bulleted list
$sdObj = new Services_Delicious('someuser', 'somepass');
$posts = $sdObj->getRecentPosts();
echo "<ul>\n";
foreach ($posts as $p) {
echo "<li>\n";
echo "<a href=\"" . $p['href'] . "\">" . $p['description'] . "</a><br />\n";
echo "<span style=\"color:red\">" . implode(' ', $p['tag']) . "</span>\n";
echo "</li>\n";
}
echo "</ul>\n";
?>
<h2>Add New Bookmark</h2>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
URL *: <br /> <input type="text" name="url" size="30" /> <br />
Description *: <br /> <input type="text" name="desc" size="30" /> <br />
Tags: <br /> <input type="text" name="tags" size="30" /> <br />
<input type="submit" name="submit" value="Save" />
</form>
</body>
</html>
|
リスト 9 では、前述の 2 つのメソッドを以下のように利用しています。
-
getRecentPosts() メソッドは、最近追加されたブックマークのリストを作成します。
-
addPost() メソッドは、送信されたフォームからデータを受け取り、そのデータに応じてブックマーク・リストを更新します。
図 4 は、このアプリケーションのメイン・ページです。
図 4. del.icio.us に新しいブックマークを追加するための HTML フォーム
新しいブックマークを追加すると、メイン・ページは図 5 のように更新されます。
図 5. ブックマーク追加後の del.icio.us の新規ブックマーク・リスト
以上の例からわかるように、del.icio.us REST API の簡潔な PHP ラッパーとなる Services_Delicious パッケージは、del.icio.us のデータを他の Web サービスのデータとマッシュアップしたり、del.icio.us サービス用にカスタマイズしたインターフェースを作成する場合に大活躍します。ぜひ、実際に試してみてください。
参考文献 学ぶために
製品や技術を入手するために
-
Services_Delicious パッケージ: del.icio.us の REST をベースとした Web サービス用のクライアントをダウンロードして、サイトのコレクションを簡単に追加、分類、共有してください。
-
XML_Serializer パッケージ: このクラスをダウンロードすると、DOM を使わずに XML 文書を作成できます。
-
HTTP_Request パッケージ: GET/POST/HEAD/TRACE/PUT/DELETE、基本認証、プロキシー、プロキシー認証、SSL、そしてファイル・アップロードのためのこのツールをダウンロードしてください。
-
OpenSSL パッケージ: Secure Sockets Layer (SSL v2/v3) および Transport Layer Security (TLS v1) プロトコルを実装したツールキットをダウンロードしてください。このツールキットには、汎用暗号方式ライブラリーも含まれています。
-
IBM トライアル・ソフトウェア: developerWorks から直接ダウンロードできるトライアル・ソフトウェアで、次の開発プロジェクトを構築してください。
議論するために
著者について
記事の評価
|