技巧: 使用 PHP 操纵 del.icio.us 书签

摘自: IBM developerWorks China  被阅读次数: 351


yangyi 于 2008-03-20 19:23:07 提供


2008 年 2 月 04 日

del.icio.us 服务允许用户在线收集和分享书签。利用与 del.icio.us 的 REST API 接口交互的 PEAR Services_Delicious 包操纵书签并构建定制的 PHP 应用程序。

简介

如果经常上网冲浪,很可能已经知道 del.icio.us 是什么了:对感兴趣的网站添加书签并和其他用户分享的一种免费在线服务。该服务还允许用户用关键字 “标记” 书签,随时查看最受欢迎的书签。

del.icio.us 最棒的特性之一是能够通过基于 REST 的 API 访问书签列表,并把这个列表结合到您自己的支持 XML 的应用程序中。多数情况下,需要编写应用程序级的代码与 del.icio.us REST API 通信、发送请求和解析响应。但如果是 PHP 应用程序,使用 Services_Delicious 可以节省不少工作,这个包来自 PHP 扩展和应用程序资料库(PHP Extension and Application Repository,PEAR)。

Services_Delicious 包提供了和 del.icio.us REST API 通信、创建和传输请求、解析和解码 XML 响应的 API。因而提供了一种从 PHP 应用程序查看、添加、编辑或删除 del.icio.us 书签的健壮而易用的小部件。本文简要介绍了该包,并通过代码示例说明如何完成上述这些基本任务。





回页首


安装

Services_Delicious 包由 Stephan Schmidt 和 Tatsuya Tsuruoka 维护,以 PHP 许可发布在 PHP 社区。最简单的安装办法是用自动化的 PEAR 安装程序,应该包含在默认的 PHP 安装包中。安装只需在 shell 提示符下输入下列命令:

shell> pear install Services_Delicious

PEAR 安装程序连接到 PEAR 包服务器并下载程序包,然后安装到系统的适当位置。本文使用了 Services_Delicious V0.5.0。

如果手工安装,可以访问主页并下源代码压缩包,然后手工解压到指定位置。需要注意的是手工安装必须对 PEAR 程序包的组织结构有所了解。

Services_Delicious 依赖另外两个 PEAR 包:HTTP_Request 和 XML_Serializer。可以使用 PEAR 自动安装程序按照前面的说明安装这些包,本文 参考资料 部分提供了有关的链接。值得注意的是,在开发过程中我发现 HTTP_Request 包有时候在 Windows® 上不能正确运行,因此本文假设使用 *NIX 开发环境。

Services_Delicious 还需要在 PHP 开发环境中安装 PHP OpenSSL 和 OpenSSL 扩展。在 *NIX 环境下,可能需要在这些扩展的支持下重新编译 PHP。OpenSSL 网站的链接以及激活 PHP OpenSSL 扩展的详细信息请参阅 参考资料

最后,本文中的例子假设您已经拥有 del.icio.us 的帐号,也许还添加了几个书签。否则应该签署服务协议 — 免费的 — 并在账户中输入必要的信息。可以在本文的 参考资料 小节找到签署服务的链接。





回页首


检索书签

讨论 Services_Delicious 之前,关于 del.icio.us API 首先说几句。和所有的基于 REST 的服务一样,这种 API 也通过 HTTP 工作,授权访问之前使用 HTTP Basic 身份验证检查用户凭证。其中包括添加和删除书签、检索用户书签列表和检索(或者重命名)用户标记的方法。

要了解这种 API 的工作情况,请在任何浏览器中访问 URL https://api.del.icio.us/v1/posts/recent。该 REST 方法将返回用户最近提交的列表。可能要求您输入 del.icio.us 用户凭证,然后就能看到该方法的原始 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>
 

图 1 显示了 Mozilla Firefox 中的输出:


图 1. 在 Mozilla Firefox 中显示的 del.icio.us 的 XML 响应包
在 Mozilla Firefox 中显示的 del.icio.us 的 XML 响应包

清单 2 示范了如何利用 Services_Delicious 在 PHP 应用程序中完成同样的动作:


清单 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 文档
显示从 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 文档
显示 del.icio.us 检索的标记的 HTML 文档

得到标记列表后,使用 getPosts() 方法可返回和一个或多个标记匹配的书签列表,只需要在第一个参数中传递标记名称数组。清单 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() 传递类似的标记名数组作为第一个参数。





回页首


添加和删除书签

Services_Delicious 也可在 PHP 应用程序中添加和删除 del.icio.us 帐户的书签,需要使用 addPost()deletePost() 方法。清单 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() 方法有六个参数,只有前两个是必需的。按照出现顺序,这些参数分别是:

  • URL
  • URL 链接的描述
  • URL 链接的详细描述
  • 链接标记
  • 提交 URL 的日期和时间
  • 该项是否为私有

addPost() 返回一个 Boolean 值,从而很容易检查是否成功提交了项并向用户显示适当的信息。

如果需要删除不再感兴趣的书签,清单 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 使用了前面讲过的两个方法:

  • getRecentPosts() 方法,列出最新添加的书签
  • addPost() 方法,从提交的表单接收数据并相应地更新书签列表

图 4 显示了应用程序的主页:


图 4. 添加新的 del.icio.us 书签的 HTML 表单
添加新的 del.icio.us 书签的 HTML 表单

图 5 显示了添加新书签后更新了的主页:


图 5. 添加书签之后的 del.icio.us 新书签列表
添加书签之后的 del.icio.us 新书签列表
分享这篇文章……

digg 提交到 Digg
del.icio.us 发布到 del.icio.us
Slashdot Slashdot 一下!

通过这些例子表明,Services_Delicious 包为 del.icio.us REST API 提供了一种干净的 PHP 包装器。如果需要将 del.icio.us 数据与其他 Web 服务的数据结合起来,或者为 del.icio.us 建立自定义界面,这是一种非常有用的工具。试一试吧,看看能做什么!



参考资料

学习

获得产品和技术
  • Services_Delicious 包:下载这种基于 REST 的 del.icio.us 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 下载。


讨论


关于作者

Vikram Vaswani 是 Melonfire 的创始人和 CEO,该公司是一家专门研究开源工具和技术的咨询服务公司。他还著有 PHP Programming Solutions How to do Everything with PHP and MySQL 等著作。




原文链接: http://www.ibm.com/developerworks/cn/xml/x-tipdelicious/index.html