使用带有 Identi.ca 的 PHP,第 1 部分

通过 PHP 和 StatusNet API 列出、搜索和发布 Identi.ca 的微博更新

Identi.ca 是一种很受欢迎的免费微博服务,它允许用户发布状态消息和新闻。Web 应用程序开发人员能够通过 Identi.ca API 创建、访问和搜索这些消息。本文由两部分组成,将介绍 Identi.ca API,并说明如何将它与 PHP 结合使用来创建动态 Web 应用程序。

Vikram Vaswani, 创始人, Melonfire

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



2011 年 7 月 12 日

简介

常用缩略语

  • API:应用程序编程接口
  • GNU GPL2:GNU 通用公共许可证
  • HTML:超文本标记语言
  • HTTP:超文本传输协议
  • JSON:JavaScript 对象符号
  • REST:具象状态传输
  • RSS:简易信息聚合
  • URL:统一资源定位符
  • XML:可扩展标记语言

只要涉及到微博,大多数人都会直奔 Twitter,这是当今世界最流行的微博网站。但是 Twitter 并不是唯一的微博网站: 有许多其他类似的服务,包括 Google Buzz、Pownce、Tumblr、Plurk、Yammer 和 Identi.ca。所有这些服务都提供了类似的功能集,最明显的是能够发布短的状态消息,并接收来自使用相同服务的其他人的状态更新。此外,这些服务中很多都提供 Web API,使开发人员可以通过预定义的 API 访问用户内容,并使用这些内容创建自定义 Web 应用程序。

本文将专门重点介绍 Identi.ca,它是在易用性方面可与 Twitter 相媲美的流行的微博服务。Identi.ca 非常有趣,因为它在 StatusNet 上运行,所以 StatusNet 是一种开源 PHP 产品,提供适用于微博的完整平台。StatusNet 的开源特性意味着用户可以免费下载和使用该平台,无论是在公共 Internet 上还是在专用网络内,您还可以通过自定义插件和扩展应用对其进行扩展。

此外,StatusNet 支持的站点(如 Identi.ca)通过 Web 服务 API 提供所有内容,允许应用程序开发人员搜索和检索用户创建的内容,并将这些内容集成到自定义应用程序中。该 API 能够以各种常见格式返回数据,包括 XML 和 JSON,因此,可通过支持这些格式的编程语言使用,也可以通过社区开发的 PHP、Perl 和 Java™ 技术客户端库使用。

这篇由两部分组成的文章向您介绍了 Identi.ca API,展示了如何使用它检索和发布用户状态更新,访问好友和追随者名单,搜索网络以寻找匹配特定搜索关键字的更新。它包括使用各种属性搜索数据的示例以及在系统中添加、更新和删除数据的示例。


了解 API

在开始使用 Identi.ca 开发应用程序之前,需要了解 API 的工作原理。与所有 Web 服务相同,首先需要向指定的 API 端点发送一个 HTTP 请求。该 HTTP 请求可能包含一个或多个用于 API 方法的输入参数,以及一个指示所需的响应格式(XML、JSON、RSS 等)的标识符。服务器使用所请求的指定格式的数据集来响应查询;然后可以对此响应进行分析和处理,并对其进行渲染以显示它。

要查看 Identi.ca 的工作方式,请在您喜爱的 Web 浏览器访问 URL http://identi.ca/api/statuses/public_timeline.xml。该请求以 XML 格式返回 Identi.ca 上最新发布的状态消息列表。用这种方法返回的 XML 格式的数据(可以在结果页面的源代码中查看)包含关于每条消息的详细消息,如 清单 1 所示。

清单 1. API feed 示例
<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array" xmlns:statusnet="http://status.net/schema/api/1/">
 <status>
  <text>A loving postmodernist Manet-style marine cast 
    steel sculpture expressing coldness.</text>
  <truncated>false</truncated>
  <created_at>Fri Jun 24 05:43:11 +0000 2011</created_at>
  <in_reply_to_status_id></in_reply_to_status_id>
  <id>[removed]</id>
  <in_reply_to_user_id></in_reply_to_user_id>
  <in_reply_to_screen_name></in_reply_to_screen_name>
  <geo></geo>
  <favorited>false</favorited>
  <user>
   <id>[removed]</id>

   <name>Random Artwork Microblogger</name>
   <screen_name>[removed]</screen_name>
   <location>The Internet</location>
   <description>A web service generating random artwork descriptions. 
    If there is a problem with me, contact [removed].</description>
   <profile_image_url>http://avatar.identi.ca/[removed]</profile_image_url>
   <url>[removed]/</url>

   <protected>false</protected>
   <followers_count>98</followers_count>
   <profile_background_color></profile_background_color>
   <profile_text_color></profile_text_color>
   <profile_link_color></profile_link_color>
   <profile_sidebar_fill_color></profile_sidebar_fill_color>
   <profile_sidebar_border_color></profile_sidebar_border_color>
   <friends_count>1</friends_count>

   <created_at>Sun Dec 20 14:57:18 +0000 2009</created_at>
   <favourites_count>0</favourites_count>
   <utc_offset>0</utc_offset>
   <time_zone>UTC</time_zone>
   <profile_background_image_url></profile_background_image_url>
   <profile_background_tile>false</profile_background_tile>

   <statuses_count>12021</statuses_count>
   <following>false</following>
   <statusnet:blocking>false</statusnet:blocking>
   <notifications>false</notifications>
   <statusnet:profile_url>http://identi.ca/[removed]</statusnet:profile_url>
  </user>
  <statusnet:html>A loving postmodernist Manet-style marine 
    cast steel sculpture expressing coldness.</statusnet:html>
 </status>
 <status>
 ...
 </status>
</statuses>

清单 1 所示,对 API 调用的响应是 XML 编码的状态消息列表,按时间顺序排列,最新的消息排列在最上面。该列表就是所谓的 Identi.ca 公共时间表,您还可以在 Identi.ca 的主页上查看它。

最外面的 <statuses> 元素包含一个或多个 <status> 元素,每个元素代表用户发布的一条状态消息。每个条目包含各种信息,包括文本消息、发布消息的时间、发布消息的地点。<user> 子元素添加了更多关于用户发布消息的信息,包括用户唯一的标识符、屏幕名称、真实姓名、个人资料 URL、追随者数量以及发布数量。

注意这些关于 API 的重要信息:

  • StatusNet 支持的网站(如 Identi.ca)实际提供两个不同版本的 API:
    • 其中一个版本与 Twitter 兼容,支持 XML 和 JSON 响应格式
    • StatusNet 专用的 REST API 返回 AtomPub 格式的响应

    本文的大多数示例使用与 Twitter 兼容的 API,不过也包含使用基于 AtomPub 的 API 的示例,以实现完整性。

  • 清单 1 中的 API 响应是用 XML 进行编码的,但是与使用 JSON 接收该响应一样简单。如果查看用来生成 清单 1 的 URL,就会看到响应格式是在 API 端点的结尾指定的。因此,获得 JSON 响应与将请求 URL 更改为 http://identi.ca/api/statuses/public_timeline.json一样简单。
  • API 支持 HTTP 基本认证和 OAuth 认证。本系列文章使用的大多数 API 方法不要求进行认证,但是某些操作,例如通过 API 发布新的状态消息,则需要进行身份验证。在本系列文章的不同地方,您将看到一些 HTTP Basic 身份验证所起作用的示例。
  • Identi.ca API 目前不包括任何速率限制或配额。这种限制将来可能会有所变化,因此,在构建应用程序时需要查看最新的文档版本。您需要谨记的是,在您的应用程序中缓存尽可能多的数据,以避免主机服务过载。

为开发做准备

避开这些背景信息,查看 Identi.ca 数据与 PHP 应用程序的集成。有两种不同的方式执行该操作:

  • 使用 Zend Framework 以及 PHP 的 XML 扩展等工作为具手动创建并解析 API 请求和响应
  • 使用 identica-php 等工具预先构建的 PHP 库

第一种方法使您能够更好地控制如何传输和处理请求,但是需要一些花费额外的精力。第二种方法更简单也更容易,但会损害灵活性;它限制您只能使用库目前支持的那些 API 调用。

本系列文章的某些示例使用尚未包含在 identica-php 库的 Identi.ca 方法中,因此大多数代码清单使用的是第一种技术。然而,为了全面介绍 Identi.ca,本文还提供了一些使用 identica-php 库的示例来说明 Identi.ca 的优势和独特之处。

确保您拥有以下各项,然后再继续执行后续操作:

  • 带有最新版的 Zend Framework 的、能够正常运行的 Apache 或 PHP 安装。Zend Framework 可作为一个独立软件包下载;请参阅 参考资料,以获得安装指南的链接。此库不仅为您的应用程序提供可靠的、经过社区测试的代码库,而且使用此库还使您能够将精力重点放在核心应用程序的功能上,而不是放在导航 XML 树或处理自定义命名空间的详细信息上。
  • Identi.ca 的用户账户。注册是免费的,可以在本文的 参考资料 中找到链接。请记下您的用户名和密码,因为在使用 API 时会需要它们。进入网站后,还可以通过账户发布几个状态更新,这样就拥有一些可以使用的基本数据。
  • Twitter API 文档副本。不,这不是一个打字错误:与 Twitter 兼容的 API 的 Identi.ca API 文档仍处于开发阶段,因此,使用与 Twitter 兼容的 API 时,最佳参考可能是 Twitter 本身的 API 文档。您可以在本文的 参考资料 中找到该文档的链接。

检索公共时间表

假设您拥有所有必要的软件,下面我们将从一个简单的示例开始介绍。清单 2 尝试访问 清单 1 中所示的 Identi.ca 公共时间表,对 XML 响应进行解析,并使用 PHP 将其作为 HTML 页面显示。

清单 2. 使用 XML 编码的 API 响应来检索公共时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em; 
    } 
    </style>
  </head>
  <body>
  <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Http_Client');

    // load public timeline
    try {
      $client = 
        new Zend_Http_Client('http://identi.ca/api/statuses/public_timeline.xml');
      $response = $client->request('GET');
      $xml = simplexml_load_string($response->getBody());
    } catch (Exception $e) {
      echo "Failed to read API response: " . $e->getMessage();
      exit();
    }

    // parse and display status messages
    echo '<h2>Recent public timeline updates</h2>';
    foreach ($xml->status as $entry) {        
      echo '<div class="item">';
      echo $entry->text . '<br/>';
      echo 'By: <em>' . $entry->user->name . 
        '</em> on ' . date('d M Y h:i', strtotime($entry->created_at)) . 
        '</div>';
    }
  ?>
  </body>
</html>

清单 2 首先初始化了一个 Zend_Http_Client 对象实例,这提供了发送 HTTP 请求和接收相应响应的接口。对象构造函数被用来传递所请求的 API 端点,而 request() 方法将该请求传输到 Identi.ca API。XML 响应是通过 simplexml_load_string() 方法传递的,该方法将其转换为一个 SimpleXML 对象。

现在可以使用标准对象符号访问响应的各个元素。例如,foreach() 循环在响应中的 <status> 元素集上进行迭代,输出每条消息的文字、发布该消息的用户的姓名以及发布消息的日期和时间。图 1 展示了结果(其中一些数据是经过修订的,以保护用户隐私)。

图 1. 列出 Identi.ca 公共时间表的 Web 页面
列处 Identi.ca 的公共时间表的多个消息的 Web 页面的屏幕截图

如果您想使用 JSON 结果,清单 3 说明了如何在 API 请求中使用 .json 后缀并通过 PHP 的 json_decode() 函数来传递输出结果。

清单 3. 使用 JSON 编码的 API 响应检索公共时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }
    </style>
  </head>
  <body>
  <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Http_Client');

    // load public timeline
    try {
      $client = 
        new Zend_Http_Client('http://identi.ca/api/statuses/public_timeline.json');
      $response = $client->request('GET');
      $json = json_decode($response->getBody());
    } catch (Exception $e) {
      echo "Failed to read API response: " . $e->getMessage();
      exit();
    }

    // parse and display status messages
    echo '<h2>Recent public timeline updates</h2>';
    foreach ($json as $entry) {        
      echo '<div class="item">';
      echo $entry->text . '<br/>';
      echo 'By: <em>' . $entry->user->name . '</em> on ' . 
        date('d M Y h:i', strtotime($entry->created_at)) . '</div>';
    }
  ?>
  </body>
</html>

检索用户时间表

除了允许开发人员访问公共时间表,Identi.ca API 还允许检索特定用户发布的消息列表,即所谓的用户时间表 (user timeline)。在默认情况下,API 为返回通过身份验证的用户的时间表,但是也可以将另一个用户的屏幕名称传递给 API 作为一个可选参数。清单 4 说明了必需的代码。

清单 4. 检索用户时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }
    .img {
      float:left;
      margin-right:1em; 
      padding-bottom: 10px;
      height: 48px;
      width: 48px;
    }
    </style>
  </head>
  <body>
  <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Http_Client');

    // specify user credentials
    $username = 'your-username';
    $password = 'your-password';

    // load user timeline
    try {
      $client = 
        new Zend_Http_Client('http://identi.ca/api/statuses/user_timeline.xml');
      $client->setAuth($username, $password);
      $response = $client->request('GET');
      $xml = simplexml_load_string($response->getBody());
    } catch (Exception $e) {
      echo "Failed to read API response: " . $e->getMessage();
      exit();
    }

    if (count($xml->status) > 0) {
      echo '<h2>Recent status updates</h2>';
      foreach ($xml->status as $entry) {       
        echo '<div class="item"><img src="' . 
          $entry->user->profile_image_url . '" class="img" />';
        echo $entry->user->name . ' (@' . 
          $entry->user->screen_name . ')<br/>';
        $status = (trim($entry->text) != '') ? 
          $entry->text : 'No status information';
        echo '<em>' . $status . '</em></div>';      
      }
    }
  ?>
  </body>
</html>

清单 4清单 2 类似,只是它需要不同的资源:用户时间表。注意:在本示例中,使用 Zend_Http_Client 对象的 setAuth() 方法来设置 HTTP Basic 身份验证的证书,通过这种方式发送经过身份验证的请求。与公共时间表相同,对该请求的响应是包含选定用户发布的一系列状态消息的 XML 文档。通过 SimpleXML 可以轻松解析和处理该数据。图 2 展示了一个输出结果示例。

图 2. 列出用户时间表的 Web 页面
列处用户时间表的 Web 页面的屏幕截图

清单 5清单 4 互动性更强的版本。它包含一个用来输入 Identi.ca 用户名的 Web 窗体,它还检索该用户发布的最新消息。

清单 5. 检索用户时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }
    .img {
      float:left;
      margin-right:1em;
      padding-bottom: 10px;
      height: 48px;
      width: 48px;
    }    
    </style>
  </head>
  <body>
    <h2>Find updates</h2>
    <form method="get">
      Get recent updates for: 
      <input type="text" name="user" />
    </form> 
    <?php
    if (isset($_GET['user'])) {
      // load Zend Gdata libraries
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Http_Client');

      // select user
      $user = $_GET['user'];

      // load user timeline
      try {
        $client = 
          new Zend_Http_Client('http://identi.ca/api/statuses/user_timeline.xml
          ?screen_name='.$user);
        $response = $client->request('GET');
        $xml = simplexml_load_string($response->getBody());
      } catch (Exception $e) {
        echo "Failed to read API response: " . $e->getMessage();
        exit();
      }

      if (count($xml->status) > 0) {
        echo '<h2>Recent status updates</h2>';
        foreach ($xml->status as $entry) {       
          echo '<div class="item"><img src="' . 
            $entry->user->profile_image_url . '" class="img" />';
          echo $entry->user->name . ' (@' . 
            $entry->user->screen_name . ')<br/>';
          $status = (trim($entry->text) != '') 
            ? $entry->text : 'No status information';
          echo '<em>' . $status . '</em></div>';      
        }
      }
    }
  ?>
  </body>
</html>

图 3 展示了正在运行的 清单 5

图 3. 寻找并显示用户时间表的交互式 Web 窗体
寻找和显示用户时间表的 Web 窗体的屏幕截图

与好友和追随者协作合

与 Twitter 和其他微博服务相同,Identi.ca 使您能够密切关注其他用户,也允许其他用户密切关注您。Identi.ca API 提供了检索用户的好友和追随者以及其当前状态的方法。默认情况下,API 为当前通过身份验证的用户检索此信息;但是,也可以在不经过身份验证的情况下使用它。为了说明这一点,请参见 清单 6,其中展示了如何检索和显示通过身份验证的用户的好友。

清单 6. 检索用户的好友
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;  
    }
    .img {
      float:left;
      margin-right:1em; 
      padding-bottom: 10px;
      height: 48px;
      width: 48px;
    }
    </style>
  </head>
  <body>
  <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Http_Client');

    // select user
    $username = 'your-username';
    $password = 'your-password';

    try {
      // load selected user's friends
      $client = new Zend_Http_Client('http://identi.ca/api/statuses/friends.xml');
      $client->setAuth($username, $password);
      $response = $client->request('GET');
      $friends = simplexml_load_string($response->getBody());      
    } catch (Exception $e) {
      echo "Failed to read API response: " . $e->getMessage();
      exit();
    }

    if (count((array)$friends->user) > 0) {
      echo '<h2>Friends</h2>';
      foreach ($friends->user as $user) {
          echo '<div class="item"><img src="' . 
            $user->profile_image_url . '" class="img" />';
          echo $user->name . ' (@' . $user->screen_name . ')<br/>';
          $status = (trim($user->status->text) != '') 
            ? $user->status->text : 'No status information';
          echo '<em>' . $status . '</em></div>';
      }
    }
  ?>
  </body>
</html>

清单 6中,XML 响应包含条目列表,每个条目都代表当前用户的一个好友。每个用户条目都包含详细的用户个人资料,包括用户的真实姓名、屏幕名称、简介的图片、位置、当前状态以及各种其他属性。这些信息可以通过 SimpleXML 进行提取,并转换成 Web 页面。

也可以获得其他用户的此类信息。参见 清单 7,它对 清单 6 进行了修改,生成了用于好友和追随者列表检索的互动工具。只需输入有效的用户名(假设用户的隐私设置允许),API 便会返回该用户的好友和追随者列表。

清单 7. 检索用户的好友和追随者
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }
    .img {
      float:left;
      margin-right:1em;
      padding-bottom: 10px;
      height: 48px;
      width: 48px;
    } 
    </style>
  </head>
  <body>
    <h2>Find Friends and Followers</h2>
    <form method="get">
      Find friends and followers of: 
      <input type="text" name="user" />
    </form> 

    <?php
    if (isset($_GET['user'])) {
      // load Zend Gdata libraries
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Http_Client');

      // select user
      $user = $_GET['user'];

      try {
        // load selected user's friends
        $client = 
          new Zend_Http_Client('http://identi.ca/api/statuses/friends.xml
          ?screen_name=' . $user);
        $response = $client->request('GET');
        $friends = simplexml_load_string($response->getBody());

        // load selected user's followers
        $client->setUri('http://identi.ca/api/statuses/followers.xml
          ?screen_name=' . $user);
        $response = $client->request('GET');
        $followers = simplexml_load_string($response->getBody());
      } catch (Exception $e) {
        echo "Failed to read API response: " . $e->getMessage();
        exit();
      }

      if (count((array)$friends->user) > 0) {
        echo '<h2>Friends</h2>';
        foreach ($friends->user as $user) {
            echo '<div class="item"><img src="' . 
              $user->profile_image_url . '" class="img" />';
            echo $user->name . ' (@' . $user->screen_name . ')<br/>';
            $status = (trim($user->status->text) != '') 
              ? $user->status->text : 'No status information';
            echo '<em>' . $status . '</em></div>';
        }
      }

      if (count((array)$followers->user) > 0) {
        echo '<h2>Followers</h2>';
        foreach ($followers->user as $user) {
            echo '<div class="item"><img src="' . 
              $user->profile_image_url . '" class="img" />';
            echo $user->name . ' (@' . $user->screen_name . ')<br/>';
            $status = (trim($user->status->text) != '') 
              ? $user->status->text : 'No status information';
            echo '<em>' . $status . '</em></div>';
        }
      } 
    }
    ?>
  </body>
</html>

注意 清单 7 包括两个单独的 API 调用:第一个调用检索好友列表,第二个调用检索追随者列表。两个响应的数据都通过 SimpleXML 以普通方式进行解析和呈现。图 4 显示了一个输出结果示例。

图 4. 寻找和显示用户好友和追随者的交互式 Web 窗体
寻找和显示用户好友和追随者的交互式 Web 窗体的屏幕截图

检索好友时间表

您已经查看了公共时间表和用户时间表,但是 Identi.ca API 还提供了好友时间表。该时间表包含指定用户(或目前通过身份验证的用户)及其好友发布的消息的组合。参见 清单 8,它通过请求目前通过身份验证的用户的好友时间表说明了好友时间表的用法:

清单 8. 检索好友时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;  
    }
    .img {
      float:left;
      margin-right:1em; 
      padding-bottom: 10px;
      height: 48px;
      width: 48px;
    }    
    </style>
  </head>
  <body>
  <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Http_Client');

    // set credentials
    $username = 'your-username';
    $password = 'your-password';

    // load friends timeline
    try {
      $client = 
        new Zend_Http_Client('http://identi.ca/api/statuses/friends_timeline.xml');
      $client->setAuth($username, $password);
      $response = $client->request('GET');
      $xml = simplexml_load_string($response->getBody());
    } catch (Exception $e) {
      echo "Failed to read API response: " . $e->getMessage();
      exit();
    }

    if (count($xml->status) > 0) {
      echo '<h2>Recent status updates</h2>';
      foreach ($xml->status as $entry) {
        echo '<div class="item"><img src="' . 
          $entry->user->profile_image_url . '" class="img" />';
        echo $entry->user->name . ' (@' . 
          $entry->user->screen_name . ')<br/>';
        $status = (trim($entry->text) != '') 
          ? $entry->text : 'No status information';
        echo '<em>' . $status . '</em></div>'; 
      }
    }
  ?>
  </body>
</html>

使用备用 AtomPub API

前述示例都使用了 Identi.ca 与 Twitter 兼容的 API。然而,正如在本文开头所述,Identi.ca 还提供另一个版本的 API,该版本产生 AtomPub 格式的结果。尽管该 API 不包括与 Twitter 兼容的 API 的所有功能,但是它产生了更丰富的数据,在某些用例中可以作为有用的替代方案。

为了说明 AtomPub API 的工作原理,清单 9 复制了 清单 2,并使用 AtomPub API 来构建公共时间表的表示形式。

清单 9. 使用 AtomPub API 检索公共时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em; 
    }
    </style>
  </head>
  <body>
  <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Feed');

    // load public timeline
    try {
      $feed = Zend_Feed::import('http://identi.ca/api/statuses/public_timeline.atom');
    } catch (Zend_Feed_Exception $e) {
      echo "Failed to import feed: " . $e->getMessage();
      exit();
    }

    echo '<h2>Recent public timeline updates</h2>';
    foreach ($feed as $entry) {
      echo '<div class="item">';
      echo $entry->title . '<br/>';
      echo 'By: <em>' . $entry->author->name . '</em> on ' . 
        date('d M Y h:i', strtotime($entry->published)) . '</div>';
    }
  ?>
  </body>
</html>

清单 9 可见,AtomPub API 的端点几乎与 Twitter 兼容的 API 的端点完全相同(在本示例中),唯一的区别在于它使用了 .atom 后缀。该 API 请求的响应是一个 Atom feed,包含 Identi.ca 最新发布的消息,如 图 5 所示。

图 5. AtomPub feed 示例
带有多个 identi.ca 消息的 AtomPub feed 示例的屏幕截图

尽管可以通过 SimpleXML 处理该 feed,如前面的 清单 2 中所示,但是 Zend Framework 以其 Zend_Feed 组件的形式提供了更好的选择,专门用于解析 Atom 和 RSS feed。Zend_Feed import() 方法用于导入 Atom feed,并将其转换为对象,然后可以使用标准对象属性符号进行处理。与以前一样,这段脚本在 feed 的条目上进行迭代,提取每个条目的标题、作者和出版日期,产生与 图 1 类似的输出。


使用备用 PHP 库

如果您不喜欢通过 SimpleXML 和 Zend Framework 等工具滚动自己的代码,可以使用现成的库与来自 PHP 的 Identi.ca API 进行交互。其中的一个库是 identica-php,它提供对 Identi.ca 的 Twitter 兼容 API 的全功能实现,并拥有易于理解和易于使用的额外好处。它分布在 GNU GPL2 下,可以在包含 cURL 支持的任何 PHP 环境下免费下载和使用。在 参考资料 中可以找到下载链接,以及指向 PHP 手册页面的指针,该页面说明了如何激活 cURL 支持。

要了解 identica-php 的工作原理,请参见 清单 10,它使用 identica-php 来检索 Identi.ca 的公共时间表。

清单 10. 使用 identica-php 库检索公共时间表
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }  
    </style>
  </head>
  <body>
  <?php
  // load required library file
  require_once('identica.lib.php');

  // initialize service object
  $service = new Identica(false, false);

  // get public timeline
  $xml = simplexml_load_string($service->getPublicTimeline('xml'));
  
  // process and display entries
  echo '<h2>Recent public timeline updates</h2>';
  foreach ($xml->status as $entry) {
    echo '<div class="item">';
    echo $entry->text . '<br/>';
    echo 'By: <em>' . $entry->user->screen_name . '</em> on ' . 
      date('d M Y h:i', strtotime($entry->created_at)) . '</div>';  
  }
  ?>
  </body>
</html>

清单 10 首先加载了 identica-php 类库并初始化 Identi.ca 服务对象的一个新实例。在通常情况下,该对象通过有效的 Identi.ca 用户名和密码进行初始化;在该清单中,因为所访问的资源是公共资源,所以会忽略证书。

服务对象公开了许多不同的方法,这些方法直接映射到 Twitter 兼容 API 中的方法。清单 10 使用其中一种方法 getPublicTimeline() 来检索 Identi.ca 中的当前公共时间表。该方法接受一个指定返回数据的格式的额外参数,在本示例中,该参数为 XML。在调用该方法后,会在内部使用 cURL 来发送请求和检索响应。

收到响应后,会通过 PHP 的 simplexml_load_string() 函数传递该响应,并将其转换为 SimpleXML 对象,然后提取构建页面所需的各个数据位,与过去使用 SimpleXML 符号提取数据位相同。本示例中的输出结果与 图 1 中的输出相同。

清单 11 提供了另一个示例说明 identica-php 库能够简化某些操作,当检索用户的好友和追随者时,可重写 清单 7 来使用它。

清单 11. 使用 identica-php 库检索用户的好友和追随者
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }
    .img {
      float:left;
      margin-right:1em;
      padding-bottom: 10px;
      height: 48px;
      width: 48px;
    } 
    </style>
  </head>
  <body>
    <h2>Find Friends and Followers</h2>
    <form method="get">
      Find friends and followers of: 
      <input type="text" name="user" />
    </form> 

    <?php
    if (isset($_GET['user'])) {
      // load required library file
      require_once('identica.lib.php');

      // set credentials
      $username = 'your-username';
      $password = 'your-password';

      // initialize service object
      $service = new Identica($username, $password);

      // select user
      $user = $_GET['user'];

      // get user's friends
      $friends = simplexml_load_string($service->getFriends('xml', $user));

      // get user's followers
      $followers = simplexml_load_string($service->getFollowers('xml', $user));

      if (count((array)$friends->user) > 0) {
        echo '<h2>Friends</h2>';
        foreach ($friends->user as $user) {
            echo '<div class="item"><img src="' . 
              $user->profile_image_url . '" class="img" />';
            echo $user->name . ' (@' . $user->screen_name . ')<br/>';
            $status = (trim($user->status->text) != '') 
              ? $user->status->text : 'No status information';
            echo '<em>' . $status . '</em></div>';
        }
      } 

      if (count((array)$followers->user) > 0) {
        echo '<h2>Followers</h2>';
        foreach ($followers->user as $user) {
            echo '<div class="item"><img src="' . 
              $user->profile_image_url . '" class="img" />';
            echo $user->name . ' (@' . $user->screen_name . ')<br/>';
            $status = (trim($user->status->text) != '') 
              ? $user->status->text : 'No status information';
            echo '<em>' . $status . '</em></div>';
        }
      }

    }
    ?>
  </body>
</html>

本示例中的大多数困难的工作都通过 getFriends()getFollowers() 方法来完成,这些方法接受用户名和格式限定符,并负责制定相应的 URL,发送请求和接收响应。本示例中的输出结果与 图 4 中的输出相同。


结束语

到目前为止,我们看到的仅仅是冰山一角。本文中的示例侧重于从 Identi.ca API 读取数据。如果构建实际的应用程序,可能还需要使用 API 将数据写回 Identi.ca,例如,发布状态更新或建立追随者/好友关系。可以使用多种方法来执行这些操作,本文的第 2 部分对此进行了详细讨论。

参考资料

学习

获得产品和技术

  • Zend Framework:下载并构建更安全、可靠和现代的 Web 2.0 应用程序和 Web 服务,提供广泛可用的 API。
  • identica-php 库 下载完整的、易于使用的 PHP 库,与 identi.ca 平台进行互动。
  • IBM 产品评估版:下载或 在 IBM SOA Sandbox 中查看在线试用产品,获得 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 提供的应用程序开发工具和中间件产品。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source
ArticleID=754536
ArticleTitle=使用带有 Identi.ca 的 PHP,第 1 部分
publish-date=07122011