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

通过 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 年 10 月 09 日

简介

在本系列的第 1 部分中,我向您介绍了 Identi.ca Web 服务 API,并且向您展示了一些如何使用 API 来读取和使用基于 PHP 的 Web 应用程序中 Identi.ca 数据的示例。在那篇文章中,我还向您介绍了两种 Identi.ca API,并且说明了如何使用 Identi.ca API,即要么使用诸如 SimpleXML 和 Zend Framework 这样的工具编写自己的代码,要么使用现成的 PHP 库,比如 identica-php 。

先前文章中的所有示例都着重关注于 API 的只读访问权。在这篇收尾文章中,我将向您展示如何获得用户的输入,并且通过 API 将它反馈回 Identi.ca。因为您要包含创建新帖、收藏帖以及设置关注者的功能,使用此方法,您可以在 PHP 脚本中改进这些功能。让我们开始吧!


搜索状态通知

常用缩略语

  • API:应用程序编程接口
  • HTTP:超文本传输协议
  • JSON:JavaScript 对象符号
  • RSS:简易信息聚合
  • URL:统一资源定位符
  • XML:可扩展标记语言

搜索是我们使用 API 的最常见的理由之一。正如 Twitter API(也是基于 API),Identi.ca API 公开一个搜索接口,可以通过 Atom 和 JSON 两种格式来返回结果。这个搜索接口可以在 URL http://identi.ca/api/search.atom 上找到,而且使用像 Zend_Feed 组件这样的工具就可以轻易对其进行处理,相关内容可以查看本文的第 1 部分。

清单 1 说明了如何搜索 Identi.ca 来查找与指定查询条件相匹配的帖子,并且用 Zend_Feed 来显示。

清单 1. 搜索 Identi.ca
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Feed');

// define query term
$q = 'green lantern';

// load search results
try {
  $feed = Zend_Feed::import('http://identi.ca/api/search.atom?q=' . urlencode($q));
} catch (Zend_Feed_Exception $e) {
  echo "Failed to import feed: " . $e->getMessage();
  exit();
}

if ($feed->count() > 0) {
  echo "<h2>Search results for '$q'</h2>";
  foreach ($feed as $entry) {        
    echo '<div>';
    echo $entry->title . '<br/>';
    echo 'By: <em>' . $entry->author->name . 
      '</em> on ' . date('d M Y h:i', strtotime($entry->published)) . 
      '</div> <br/>';
  }
}
?>

正如 清单 1 所述,Identi.ca 搜索是通过使用 q 参数将查询条件附加至请求 URL 来执行此项工作。由于请求 URL 有一个 .atom 后缀,搜索结果将作为 Atom feed 返回。Zend_Feed 组件非常适合此项工作,该组件是专门为解析 Atom feed 和 RSS feed 而设计的。

Zend_Feed import() 方法用于导入 Atom feed,并将其转化成一个对象,然后使用标准对象属性符号对其进行处理。清单 1 说明了如何使用 Zend_Feed 迭代 feed 中的条目,提取每个条目的标题、作者和发布日期,生成与 图 1 所示相似的输出。

图 1. 列出搜索结果的网页
列出 “green lantern” 的搜索结果的网页屏幕截图

示例应用:互动搜索实用工具

清单 2 是基于 清单 1 进行修订的,可创建一个具有更强互动性的搜索实用工具,充许用户在表单中输入查询条件,并且查看与查询条件相匹配的 Identi.ca 帖子。

清单 2. 一个互动的 Identi.ca 搜索实用工具
<html>
  <head>
    <style>
    .item {
      float:none;
      clear:both;
      margin-top:1em;
    }
    </style>
  </head>
  <body>
    <h2>Search </h2>
    <form method="get">
    Search for: <input type="text" name="q" />
    </form>
    <?php 
    if (isset($_GET['q'])) {
      // load Zend Gdata libraries
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Feed');

      // define query term
      $q = urlencode($_GET['q']);

      // load search results
      try {
        $feed = Zend_Feed::import(
          'http://identi.ca/api/search.atom?rpp=25&q=' . $q);
      } catch (Zend_Feed_Exception $e) {
        echo "Failed to import feed: " . $e->getMessage();
        exit();
      }

      if ($feed->count() > 0) {
        echo "<h2>Search results for '$q'</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>

清单 2 基于 清单 1 进行了少量的修改,支持将用户提供的输入内容传给搜索请求 URL 的端点;它解析生成的 Atom feed,以生成一个与搜索结果相匹配的列表。请求 URL 中的另一个 rpp 参数指定每页所显示的搜索结果数目。注意:查询条件必须用 URL 编码后,再传递至 API。

图 2 说明了运行中的工具。

图 2. 互动的 Identi.ca 搜索引擎
以 “captain america” 为搜索结果的互动 Identi.ca 搜索引擎的屏幕截图

添加和删除状态通知

正如您可以搜索帖子,您也可以重新创建帖子。Identi.ca API 包含了可发布新状态消息或删除现有状态消息的方法。要发布新消息到用户时间表,已经验证的客户机必须使用 POST 来传递请求。您在第 1 部分中见过的 Zend_Http_Client 组件可同时支持 POST 和身份验证,因此很好地满足了需求。

看一下 清单 3,其中说明了通过 API 发布新状态消息到用户时间表的过程。

清单 3. 发布一条新的状态消息
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Http_Client');

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

// post notice and display unique identifier 
// if message successfully posted
try {
  $client = new Zend_Http_Client('http://identi.ca/api/statuses/update.xml');  
  $client->setAuth($username, $password);
  $client->setParameterPost('status', 'Happy hippos in the sun');
  $response = $client->request('POST');
  $xml = simplexml_load_string($response->getBody());
  if ($xml->id) {
    echo 'New notice created with id: ' . $xml->id;
  } else {
    if ($xml->error) {
      throw new Exception($xml->error);
    } else {
      throw new Exception('Unspecified error');    
     }
  }
} catch (Exception $e) {
  echo "ERROR: " . $e->getMessage();
  exit();
}
?>

清单 3 首先载入必要的类库并定义帐户凭据。使用 API endpoint URL 初始化 Zend_Http_Client 对象,再使用 setAuth() 方法为进行身份验证而设置帐户凭据。接着使用 “status” 请求参数将状态消息文本作为 POST 参数添加至请求,然后再将整个请求传递至 Identi.ca。

如果成功的话,Identi.ca 会返回一条代表新创建消息的 XML 响应以及其惟一标识符。然后可以解析这个 XML 文档,并显示一条指明成功或失败的消息。新创建的消息也会显示在 Identi.ca 的用户时间表中。

删除现有的消息相当简单。您所需要的是消息的惟一标识符,它会通过 POST 被发布到 API 端点来删除消息。清单 4 说明了该过程。

清单 4. 删除一条状态消息
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Http_Client');

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

// define ID of notice to delete
$id = '0011223344';

// delete specified notice 
try {
  $client = new Zend_Http_Client(
    "http://identi.ca/api/statuses/destroy/$id.xml");
  $client->setAuth($username, $password);  
  $response = $client->request('POST');
  $xml = simplexml_load_string($response->getBody());
  if ($xml->id) {
    echo 'Notice with id: ' . $xml->id . ' successfully deleted.';
  } else {
    if ($xml->error) {
      throw new Exception($xml->error);
    } else {
      throw new Exception('Unspecified error');    
    }
  }
} catch (Exception $e) {
  echo "Failed to read API response: " . $e->getMessage();
  exit();
}
?>

示例应用:用户时间表编辑器

应用 清单 3清单 4 中所示的技术来创建一个用户时间表的互动视图非常简单。该视图可以让用户查看他或她之前的消息,还可以控制现有消息的删除或新消息的添加。

清单 5 显示完整的代码。

清单 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>
    <?php
    // load Zend Gdata libraries
    require_once 'Zend/Loader.php';
    Zend_Loader::loadClass('Zend_Http_Client');

    // define user credentials
    $username = 'your-username';
    $password = 'your-password';
    
    // set up authenticated client
    $client = new Zend_Http_Client();
    $client->setAuth($username, $password);

    try {
      // post message if message text present
      if (isset($_POST['m'])) {
        $client->setUri('http://identi.ca/api/statuses/update.xml');
        $client->setParameterPost('status', $_POST['m']);
        $response = $client->request('POST');
        $xml = simplexml_load_string($response->getBody());
        if (!isset($xml->id)) {
          if ($xml->error) {
            throw new Exception($xml->error);
          } else {
            throw new Exception('Unspecified error');    
          }
        }
      // delete message if message id present
      } else if (isset($_GET['d'])) {
        $id = $_GET['d'];
        $client->setUri(
          'http://identi.ca/api/statuses/destroy/$id.xml');
        $response = $client->request('POST');
        $xml = simplexml_load_string($response->getBody());
        if (!isset($xml->id)) {
          if ($xml->error) {
            throw new Exception($xml->error);
          } else {
            throw new Exception('Unspecified error');    
          }
        }
      }

      // load user timeline
      $client->setUri(
        'http://identi.ca/api/statuses/user_timeline.xml');
      $response = $client->request('GET');
      $xml = simplexml_load_string($response->getBody());
    } catch (Exception $e) {
      echo "ERROR: " . $e->getMessage();
      exit();
    }

    // parse and display status messages
    if (count($xml->status) > 0) {
      echo '<h2>Recent status 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)) . 
          '<br/>';
        echo '<small>';
        echo '<a href="?d=' . $entry->id . '">Delete</a>';
        echo '</small>';
        echo '</div>'; 
      }
    }
    ?>

    <h2>Add New Post</h2>
    <form method="post">
      Message: <input type="text" name="m" /> <br/>
      <input type="submit" name="submit" value="Post" />
    </form>
  </body>
</html>

乍看起来,代码可能非常复杂,事实上非常简单。在 清单 5 中,首先载入 Zend Framework 类库,并且设置一个已通过验证的 HTTP 客户机。还要检索当前的用户时间表(使用第 1 部分所讨论的技术),并解析时间表 XML 来显示用户先前消息的列表。每条消息都带一个 “Delete” 链接,还包含一个作为 GET 变量的消息惟一标识符。代码还为用户提供一个简单的 Web 表单来输入新的状态消息;一提交,消息就会通过 POST 传递至表单处理脚本。

每一次请求脚本时,它都会检查看请求方法是 GET 还是 POST,然后采取相应的措施:

  • 如果是 POST 请求,脚本会检索用户输入的消息,然后通过 POST 将其发送到 API 端点来创建新消息,如 清单 3 所示。
  • 如果是 GET 请求,脚本会检索包含在请求 URL 中的消息标识符,然后通过 POST 将其发送至 API 端点来删除消息,如 清单 4 所示。

图 3 显示了运行中的脚本,列出用户的最新消息。

图 3. 列出当前用户时间表的网页
列出当前用户时间表的网页屏幕截图

图 4 显示通过 Web 表单添加新帖的结果。

图 4. 列出发布消息后更新的用户时间表的网页
列出发布消息后更新的用户时间表的网页屏幕截图

管理用户订阅

除了可通过 API 在您自己的时间表中发布和删除消息之外,您还可以通过 API 来管理关注者名单。API 包含了方法,可列出关注已验证用户或被已验证用户关注的用户,还提供了从关注者名单中添加或删除用户的功能。

要查看此过程,请参见 清单 6, 它说明了如何关注另一个 Identi.ca 用户。

清单 6. 创建一个关注者名单
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Http_Client');

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

// define user to follow
$u = 'some-user';

// follow a user
try {
  $client = new Zend_Http_Client(
    'http://identi.ca/api/friendships/create.xml');
  $client->setAuth($username, $password);
  $client->setParameterPost('screen_name', $u);
  $response = $client->request('POST');  
  $xml = @simplexml_load_string($response->getBody());  
  if ($xml->following == 'true') {
    echo 'Now following user: ' . $u;
  } else {
    if ($xml->error) {
      throw new Exception($xml->error);
    } else {
      throw new Exception('Unspecified error');    
    }
  }  
} catch (Exception $e) {
  echo "Failed to read API response: " . $e->getMessage();
  exit();
}
?>

正如 清单 6 所述,必须由已通过验证的客户机使用被关注者的用户名将 POST 请求传递至 API 端点。如果操作成功,响应会包含一个 XML 文档,该文档含有指定用户的详细信息和一个设置为 true 的特殊属性 following

清单 7 说明了取消关注的过程(即打破关注者关系)。

清单 7. 打破关注者关系
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Http_Client');

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

// define user to unfollow
$u = 'some-user';

// unfollow a user
try {
  $client = new Zend_Http_Client(
    'http://identi.ca/api/friendships/destroy.xml');
  $client->setAuth($username, $password);
  $client->setParameterPost('screen_name', $u);
  $response = $client->request('POST');
  $xml = @simplexml_load_string($response->getBody());
  if ($xml->following == 'false') {
    echo 'No longer following user: ' . $u;
  } else {
    if ($xml[0]) {
      throw new Exception($xml[0]);
    } else {
      throw new Exception('Unspecified error');
    }
  }  
} catch (Exception $e) {
  echo "Failed to read API response: " . $e->getMessage();
  exit();
}
?>

管理用户收藏

正如 Twitter,Identi.ca 充许用户收藏某些消息。这一功能可以使用户很方便地将一条消息标记为非常感兴趣或非常有用的内容。Identi.ca API 包含了可用于检索用户的收藏并且在列表中添加和删除项的方法。

清单 8 提供了检索所有已验证用户所收藏的消息的示例。

清单 8. 检索用户收藏
<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');

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

  // list user favorites
  try {
    $client = new Zend_Http_Client('http://identi.ca/api/favorites.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();
  }

  // parse and display favorite status messages
  echo '<h2>Favorites</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>

检索收藏非常简单:发送 GET 请求至收藏端点,响应为一个 XML 文档,其中包含了用户收藏消息的列表。图 5 显示了输出示例。

图 5. 列出用户收藏的网页
列出用户收藏的网页屏幕截图

注意:也可以只使用 id 参数将目标用户名传递至端点来检索另一个用户收藏。

要通过编程向用户收藏中添加一条新的消息,您必须先取得用户的惟一标识符。假设您有了这个标识符,您可以发送一个 POST 请求至引用 id 的 API,如 清单 9 所示。

清单 9. 添加一条收藏消息
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Http_Client');

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

// define ID of notice to be favored
$id = '0011223344';

// favor a notice
try {
  $client = new Zend_Http_Client(
    "http://identi.ca/api/favorites/create/$id.xml");
  $client->setAuth($username, $password);
  $response = $client->request('POST');
  $xml = simplexml_load_string($response->getBody());  
  if ($xml->favorited == 'true') {
    echo 'Successfully added favorite.';
  } else {
    if ($xml->error) {
      throw new Exception($xml->error);
    } else {
      throw new Exception('Unspecified error');    
    }
  }
} catch (Exception $e) {
  echo "ERROR: " . $e->getMessage();
  exit();
}
?>

POST 请求发送成功后返回的响应为 XML 格式文档,它包含了消息的元数据和内容,以及设置为 true 的 favorited 属性。

此刻您可能已经猜到了,我们也可以通过编程将消息标识符传递至正确的 API 端点来删除收藏消息。 清单 10 给出了相关代码。

清单 10. 删除收藏消息
<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Http_Client');

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

// define ID of notice to be disfavored
$id = '0011223344';

// disfavor a notice
try {
  $client = new Zend_Http_Client(
    "http://identi.ca/api/favorites/destroy/$id.xml");
  $client->setAuth($username, $password);
  $response = $client->request('POST');
  $xml = simplexml_load_string($response->getBody());  
  if ($xml->favorited == 'false') {
    echo 'Successfully removed favorite.';
  } else {
    if ($xml->error) {
      throw new Exception($xml->error);
    } else {
      throw new Exception('Unspecified error');    
    }
  }
} catch (Exception $e) {
  echo "ERROR: " . $e->getMessage();
  exit();
}
?>

示例应用:仪表板

有这些信息在手,现在您可以为 denti.ca 构建一个简单的基于浏览器的管理界面,一个类似于 Identi.ca 首页所显示的界面。这个界面显示了当前公共时间表,并提供可关注其他用户或收藏某些消息的功能。

清单 11 显示了完整的代码。

清单 11. Identi.ca 仪表板
<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');

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

    $client = new Zend_Http_Client();
    $client->setAuth($username, $password);
    
    try {
      if (isset($_GET['o'])) {
        switch ($_GET['o']) {
          case 'follow':
            $client->setUri('http://identi.ca/api/friendships/create.xml');
            $client->setParameterPost('user_id', $_GET['d']);
            $response = $client->request('POST');  
            $xml = @simplexml_load_string($response->getBody());  
            if ($xml->following != 'true') {
              if ($xml->error) {
                throw new Exception($xml->error);
              } else {
                throw new Exception('Unspecified error');
              }
            }  
            break;

          case 'unfollow':
            $client->setUri('http://identi.ca/api/friendships/destroy.xml');
            $client->setParameterPost('user_id', $_GET['d']);
            $response = $client->request('POST');  
            $xml = @simplexml_load_string($response->getBody());  
            if ($xml->following != 'false') {
              if ($xml->error) {
                throw new Exception($xml->error);
              } else {
                throw new Exception('Unspecified error');    
              }
            } 
            break;

          case 'favor':
            $client->setUri(
              'http://identi.ca/api/favorites/create/' . $_GET['d'] . '.xml');
            $response = $client->request('POST');
            $xml = simplexml_load_string($response->getBody());  
            if ($xml->favorited != 'true') {
              if ($xml->error) {
                throw new Exception($xml->error);
              } else {
                throw new Exception('Unspecified error');    
              }
            }
            break;

          case 'disfavor':
            $client->setUri(
              'http://identi.ca/api/favorites/destroy/' . $_GET['d'] . '.xml');
            $response = $client->request('POST');
            $xml = simplexml_load_string($response->getBody());  
            if ($xml->favorited != 'false') {
              if ($xml->error) {
                throw new Exception($xml->error);
              } else {
                throw new Exception('Unspecified error');    
              }
            }
            break;
        }
      }

      // load public timeline
      $client->setUri(
        'http://identi.ca/api/statuses/public_timeline.xml');
      $response = $client->request('GET');
      $xml = simplexml_load_string($response->getBody());
    } catch (Exception $e) {
      echo "ERROR: " . $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)) . 
        '<br/>';
      echo '<small>';
      echo ($entry->user->following == 'false') ? 
        '<a href="?o=follow&d=' . $entry->user->id . 
        '">Follow user</a>' : 
        '<a href="?o=unfollow&d=' . $entry->user->id . 
        '">Unfollow user</a>';
      echo ' | ';
      echo ($entry->favorited == 'false') ? 
        '<a href="?o=favor&d=' . $entry->id . 
        '">Mark message as favorite</a>' : 
        '<a href="?o=disfavor&d=' . $entry->id . 
        '">Remove message from favorites</a>';
      echo '</small>';
      echo '</div>';
    }
    ?>
  </body>
</html>

清单 11 被视为一个庞大的条件语句,它基于请求 URL 中的 o 参数的值执行一个特定的分支。

  • o=follow 时,它会寻找帐户名并且使用 API 通过编程创建一个拥有相应用户的关注者名单。
  • o=unfollow 时,它会寻找数值型用户标识符并且使用 API 来删除已验证用户的关注者名单中指定的用户。
  • o=favor 时,它会寻找数值型消息标识符并且使用 API 来向已验证用户的收藏列表添加相应消息。
  • o=disfavor 时,它会寻找数值型消息标识符并且使用 API 从已验证用户的收藏列表中删除相应的消息。

上述每种情况中,执行指定的操作后,脚本会通过 API 重新请求 Identi.ca 公共时间表,解析 XML 响应,并且在列表中显示消息,还会进行适当的控制。

图 6 显示 清单 11 的应用示例。

图 6. 基于浏览器的 Identi.ca 仪表板
基于浏览器的 Identi.ca 仪表板(附有几个用户帖子)的屏幕截图

结束语

本文完成了关于如何结合使用 SimpleXML 和 Zend HTTP 客户机库将数据从 Identi.ca API 整合至 PHP 应用程序的速成课。这个分两部分的文章中的示例向您介绍了两种风格的 API ,展示了如何搜索 Identi.ca 内容,说明了如何通过编程来添加、修改和删除内容,演示了如何管理用户订阅和收藏,以及如何给用户 Identi.ca 数据构建一个自定义界面。

正如这些示例所阐明的,对于想构建围绕微博服务、内容聚合和搜索的创新应用程序的开发人员来说,Identi.ca API 是一个成熟而又灵活的界面。不妨试试,看看感觉如何。

参考资料

学习

  • 使用带有 Identi.ca 的 PHP,第 1 部分 (Vikram Vaswani,developerWorks,2011 年 7 月):Identi.ca 是一种很受欢迎的免费微博服务,可用于发布状态消息和新闻。在这个分两部分的文章中,学习如何通过 Identi.ca API 来创建、访问和搜索这些消息,以及如何将其与 PHP 结合使用来创建动态 Web 应用程序。
  • StatusNet API:了解关于 StatusNet API 的更多信息,以及使用方法。
  • 公共时间表 — Indenti.ca:注册一个免费 Identi.ca 帐户,并基于免费软件 StatusNet 工具尝试微博服务。
  • Zend_Http_Client 组件:读取更多关于执行 HTTP 请求的简单界面的信息。Zend_Http_Client 支持预计 HTTP 客户端提供的简单和复杂功能。
  • Zend_Feed 组件:读取关于使用具有自然语法的 RSS 和 Atom feed 的更多信息,以便访问 feed 元素、feed 属性和条目属性。
  • Twitter 的 API 文档:查看信息并通过 Twitter API 开始。
  • 本文作者的更多文章(Vikram Vaswani, developerWorks,2007 年 8 月至今):阅读关于 XML、其他 Google API 和技术的文章。
  • XML 新手入门 获取学习 XML 所需的参考资料。
  • developerWorks 中国网站 XML 技术专区: 寻找提高 XML 领域技能所需的资源,包括 DTD、模式和 XSLT。参见 XML 技术文档库,从那里获取广泛的技术文章和技巧、教程、标准和 IBM 红皮书。
  • IBM XML 认证:了解如何能够成为 XML 领域及相关技术的 IBM 认证开发人员。
  • developerWorks 技术活动网络广播随时关注这些会议中涉及的技术。
  • developerWorks 播客:聆听针对软件开发人员的有趣的访谈和讨论。
  • developerWorks 演示中心:观看面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。

获得产品和技术

  • Zend Framework:下载并构建更安全、可靠和现代的 Web 2.0 应用程序和 Web 服务,提供广泛可用的 API。
  • identica-php 库,下载完整的、易于使用的 PHP 库,与 identi.ca 平台进行互动。
  • IBM 产品评估试用版软件:下载或 IBM SOA 人员沙箱 中查看在线试用产品,获得 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=764301
ArticleTitle=使用带有 Identi.ca 的 PHP,第 2 部分
publish-date=10092011