Identi.ca で PHP を使用する: 第 1 回

PHP と StatusNet API を使用して、Identi.ca のマイクロブログのアップデートを一覧表示、検索、投稿する

Identi.ca は、ユーザーが近況メッセージやニュースを投稿できる、人気の高い無料のマイクロブロギング・サービスです。Web アプリケーション開発者は Identi.ca API を使用して、これらのメッセージにアクセスしたり、これらのメッセージを作成、検索したりすることができるようになっています。この 2 回連載の記事では Identi.ca API について紹介し、この API を PHP で使用して動的な Web アプリケーションを作成する方法を説明します。

Vikram Vaswani, Founder, Melonfire

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



2011年 8月 19日

はじめに

よく使われる頭文字語

  • API: Application Programming Interface
  • GNU GPL2: GNU General Public License
  • HTML: HyperText Markup Language
  • HTTP: HyperText Transfer Protocol
  • JSON: JavaScript Object Notation
  • REST: Representational State Transfer
  • RSS: Really Simple Syndication
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

マイクロブロギングを利用するとなると、大半の人々は迷わず Twitter を選びます。Twitter は現在、世界で最もよく使われているマイクロブロギング・サイトですが、他に選択肢がないわけではありません。Google Buzz、Pownce、Tumblr、Plurk、Yammer、そして Identi.ca など、Twitter と同じようなサービスは他にも数多くあり、そのすべてに同じような一連の機能 (なかでも注目すべき機能として、短い近況メッセージを投稿し、同じサービスを使用している他のユーザーから近況アップデートを受信できる機能) が備わっています。さらに、これらのサービスの多くには Web API が用意されているため、開発者は事前定義された API を使用してユーザー・コンテンツにアクセスし、そのコンテンツを使ってカスタム Web アプリケーションを作成することができます。

この記事では、使いやすさの点で Twitter に匹敵する、人気の高いマイクロブロギング・サービス Identi.ca を取り上げます。Identi.ca の興味深い点は、これが StatusNet 上で実行できることです。StatusNet はオープンソースの PHP 製品で、マイクロブロギングのための完全なプラットフォームを提供します。オープンソースであるということは、ユーザーはこのプラットフォームをダウンロードして、公衆インターネットまたは専用ネットワーク内のどちらで使用するかに関わらず、無料で使用できるということです。さらに、カスタム・プラグインや拡張機能によって拡張することもできます。

これに加え、Identi.ca などの StatusNet をベースとしたサイトの場合には、サイトのすべてのコンテンツに Web サービス API からアクセスできるようになっています。したがって、アプリケーション開発者はこの API を使用してユーザーが作成したコンテンツを検索および取得し、そのコンテンツをカスタム・アプリケーションに統合することができます。この API は、XML や JSON を含め、さまざまな共通フォーマットでデータを返すことができるため、これらのフォーマットをサポートする任意のプログラミング言語で使用することも、コミュニティーによって開発された PHP、Perl、および Java 技術用のクライアント・ライブラリーから使用することもできます。

この 2 回の連載記事では、Identi.ca API について紹介し、この API を使用してユーザーの近況アップデートを取得および投稿する方法、友達やフォロワーのリストにアクセスする方法、そしてネットワークで特定の検索キーワードと一致するアップデートを検索する方法を説明します。さらに、さまざまな属性を使用してデータを検索する場合のサンプル・コードや、システム内のデータを追加、更新、削除する場合のサンプル・コードも記載します。


API の概要

Identi.ca を使用してアプリケーションの開発を始める前に、この API がどのような動作をするかを理解しておく必要があります。あらゆる Web サービスと同じく、最初に必要なのは、指定の API エンドポイントに HTTP リクエストを送信することです。この HTTP リクエストには、API メソッドに対する 1 つ以上の入力パラメーターに加え、必要なレスポンス・フォーマット (XML、JSON、RSS など) を示す識別子を含めます。サーバーはクエリーに対し、リクエストされたデータ・セットを指定されたフォーマットで返します。そして、このレスポンスを構文解析し、処理し、レンダリングして表示するという仕組みです。

この API の動作を確かめるには、お好みの Web ブラウザーで URL http://identi.ca/api/statuses/public_timeline.xml にアクセスしてみてください。このリクエストによって、最近 Identi.ca に投稿された近況メッセージの一覧が XML フォーマットで返されます。このメソッドによって返される XML データ (検索結果ページのソース・コードで確認することができます) には、各メッセージに関する詳細情報が含まれます。リスト 1 は、その一例です。

リスト 1. API フィードの例
<?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> 要素が 1 つ以上含まれます。これらのエントリーごとに、メッセージのテキスト、投稿された日時、投稿された場所など、さまざまな情報が提供されます。さらに、<user> サブ要素が追加情報として、メッセージを投稿したユーザーに関する情報を提供します。具体的には、ユーザーの固有 ID、スクリーン・ネーム、実名、プロフィールの URL、フォロワーの人数、そして投稿件数などの情報です。

この API には、以下の重要な点があります。

  • Identi.ca などの StatusNet をベースとしたサイトには、実際には以下の 2 つのバージョンの API があります。
    • Twitter 対応バージョン: XML および JSON レスポンス・フォーマットをサポートします。
    • StatusNet 固有の REST API: レスポンスを AtomPub フォーマットで返します。

    この記事に記載する例のほとんどでは、Twitter 対応の API を使用しますが、完全を期して、AtomPub ベースの API を使用した例もいくつか取り上げます。

  • リスト 1 の API レスポンスは XML にエンコードされていますが、このレスポンスを JSON で受信するのも簡単です。リスト 1 を生成するために使用した URL を見ると、API エンドポイントの終わりにレスポンス・フォーマットが指定されていることがわかります。したがって、リクエスト URL を http://identi.ca/api/statuses/public_timeline.json に変更するだけで、JSON レスポンスを取得することができます。
  • API は、HTTP 基本認証と OAuth 認証の両方をサポートします。この連載記事で使用する API メソッドの大半には認証は必要ありませんが、例えば新規近況メッセージを API を使用して投稿するなどの操作には、認証が必要です。HTTP 基本認証を実際に使用した例は、この連載の各所で目にすることになります。
  • Identi.ca API には現在、時間当たりの送信量の制限や割り当て量が一切ありません。この制限は将来変更される可能性があるため、アプリケーションを作成するときには必ず最新バージョンのドキュメントを確認してください。ホスト・サービスに過剰な負荷をかけないように、データはできる限りアプリケーション内でキャッシュに入れるよう心掛けてください。

開発の準備

背景情報を説明したところで、早速 Identi.ca のデータと PHP アプリケーションの統合について見て行きましょう。統合方法としては、以下の 2 つの方法があります。

  • Zend Framework や PHP の XML 拡張機能などのツールを使って、API リクエストとレスポンスを手動で作成および構文解析する
  • identica-php などの事前ビルドされた PHP ライブラリーを使用する

最初の方法では、リクエストの送信方法や処理方法を柔軟に制御できますが、追加の作業を伴います。それよりも単純で簡単なのは 2 番目の方法ですが、この方法だと、柔軟性がある程度失われます。具体的には、使用できる API 呼び出しが、現在ライブラリーでサポートされているものだけに制限されるということです。

連載で取り上げる一部の例では、identica-php ライブラリーにはまだ含まれていない Identi.ca メソッドを使用します。そのため、サンプル・コードの大半では最初の方法が使われています。ただし、完全を期して、identica-php ライブラリーを使用した例も記載し、その利点と違いを明らかにします。

開発に取り掛かる前に、以下の条件が揃っていることを確認してください。

  • 最新バージョンの Zend Framework がインストールされた、実際に使用できる Apache または PHP 環境。Zend Framework はスタンドアロン・パッケージとしてダウンロードすることができます (「参考文献」に、インストール・ガイドへのリンクを記載してあります)。このライブラリーはコミュニティーによってテストされた確かなコード・ベースをアプリケーションに提供するだけでなく、このライブラリーを使うことによって、XML ツリーをナビゲートしたり、カスタム名前空間を扱ったりするといった詳細な部分を作成するのに専念するのではなく、アプリケーションのコア機能に専念できるようになります。
  • identi.ca でのユーザー・アカウント。登録は無料です (「参考文献」にリンクを記載してあります)。アカウントのユーザー名とパスワードは、API を使用するときに必要になるのでメモしておいてください。また、アカウントを登録するついでに、アカウントから近況アップデートをいくつか投稿して、操作対象とする基本データを用意しておいてください。
  • Twitter API ドキュメント。タイプミスと思われるかもしれませんが、そうではありません。Identi.ca の Twitter 対応 API については、現在 API ドキュメントの作成が進められているところです。そのため、Twitter 対応 API を使用する際には、Twitter の API ドキュメントを参照するのがおそらく最善です。Twitter の API ドキュメントへのリンクは、「参考文献」に記載されています。

パブリック・タイムラインの取得

必要なすべてのソフトウェアが揃っているという前提で、まずは単純な例から始めましょう。リスト 2 は、PHP を使用してリスト 1 に記載した Identi.ca パブリック・タイムラインにアクセスし、取得した XML レスポンスを構文解析し、その結果を 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 は、開発者がパブリック・タイムラインにアクセスするための手段となるだけではありません。この API を使って、特定のユーザーが投稿したメッセージの一覧、いわゆるユーザー・タイムラインを取得することもできます。デフォルトで 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 と同様です。ユーザー・タイムラインを取得する場合には、HTTP 基本認証のためのクレデンシャルを設定する Zend_Http_Client オブジェクトの setAuth() メソッドを使用して、認証済みリクエストを送信することに注意してください。パブリック・タイムラインの場合と同じく、このリクエストに対するレスポンスは XML 文書です。この文書に、選択されたユーザーが投稿した一連の近況メッセージが含まれます。このデータを SimpleXML で構文解析して処理するのは、ごく簡単です。図 2 に、出力の一例を示します。

図 2. ユーザーのタイムラインを一覧表示する Web ページ
ユーザーのタイムラインを一覧表示する Web ページのスクリーン・キャプチャー

リスト 5 は、リスト 4 をさらにインタラクティブにしたバージョンです。このリストに含まれる Web フォームに Identi.ca のユーザー名を入力すると、そのユーザーが投稿した最新のメッセージを取得することができます。

リスト 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 には、ユーザーの友達とフォロワーをそれぞれの最新の近況メッセージと一緒に取得するためのメソッドがあります。デフォルトでは、Identi.ca 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 ページに変換することができます。

他のユーザーについて、この種の情報を取得することも可能です。例えばリスト 6 を改訂したリスト 7 は、友達とフォロワーの一覧をインタラクティブに取得するツールとなります。有効なユーザー名を入力するだけで、(そのユーザーのプライバシー設定で許可されていることを前提として) 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 では 2 つの API 呼び出しを行うことに注意してください。最初の呼び出しで友達の一覧を取得し、2 番目の呼び出しでフォロワーの一覧を取得します。この 2 つの呼び出しに対するレスポンスのデータは、通常どおりの方法で SimpleXML によって構文解析されてレンダリングされます。図 4 に、出力例を示します。

図 4. ユーザーの友達とフォロワーを検索して表示するインタラクティブな Web フォーム
ユーザーの友達とフォロワーを検索して表示するインタラクティブな Web フォームのスクリーン・キャプチャー

友達のタイムラインの取得

パブリック・タイムラインとユーザー・タイムラインについてはすでに説明しましたが、Identi.ca API では友達のタイムラインを取得することもできます。友達のタイムラインには、指定されたユーザー (または現在認証されているユーザー) とその友達が投稿したメッセージがまとめて含まれます。リスト 8 に Identi.ca API を使用して、現在の認証済みユーザーの友達のタイムラインをリクエストする方法を説明します。

リスト 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 には AtomPub フォーマットで結果を生成する API も用意されています。この API には Twitter対応 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 リクエストに対するレスポンスは、Identi.ca の最新の投稿が含まれる Atom フィードとなります (図 5 を参照)。

図 5. AtomPub フィードの例
いくつかの identi.ca のメッセージを表示するサンプル AtomPub フィードのスクリーン・キャプチャー

もちろん、このフィードを先ほどのリスト 2 と同じように SimpleXML で処理することも可能ですが、Zend Framework はそれよりも優れた手段を Zend_Feed コンポーネントという形で提供しています。このコンポーネントは、特に Atom フィードと RSS フィードを構文解析するように設計されていて、Zend_Feed import() メソッドを使って Atom フィードをインポートすると、標準のオブジェクト・プロパティー表記を使って処理できるオブジェクトに変換されます。前と同じく、このスクリプトはフィード内のエントリーを繰り返し処理して各エントリーのタイトル、作成者、公開日を抽出し、図 1 のような出力を生成します。


PHP ライブラリーを使用する場合

SimpleXML や Zend Framework などのツールを使って独自のコードを開発するのを望まない場合には、PHP で Identi.ca API を使用するための既製のライブラリーを使うこともできます。そのようなライブラリーの 1 つとして挙げられるのは、identica-php です。Identi.ca の Twitter 対応 API を完全に実装するこのライブラリーには、非常に理解しやすく、使いやすいという付加価値もあります。GNU GPL2 の下で配布される identica-php は、cURL サポートを備えたあらゆる PHP 環境に無料でダウンロードして使用することができます。「参考文献」には、ダウンロードのリンクと併せ、cURL サポートを有効にする方法を説明している PHP マニュアル・ページへのリンクを記載してあります。

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 ではこれらのメソッドの 1 つ、getPublicTimeline() を使用して、Identi.ca から現在のパブリック・タイムラインを取得します。このメソッドは 1 つの追加パラメーターを受け入れます。それは、返されるデータのフォーマット (この例では XML) を指定するパラメーターです。メソッドが呼び出されると、その内部で cURL を使用してリクエストを送信し、レスポンスを取得します。

レスポンスを受け取った後、そのレスポンスは PHP の simplexml_load_string() 関数を介して SimpleXML オブジェクトに変換されて渡されます。そこからは前と同じく SimpleXML 表記を使用して、ページを作成するために必要な各種のデータを抽出します。この場合の出力は、図 1 に示した出力と同じです。

リスト 11 に、identica-php ライブラリーによって一部の処理を単純化するもう 1 つの例を記載します。このリストは、ユーザーの友達とフォロワーを取得するときに 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 に示した出力と同じです。


第 1 回のまとめ

第 1 回で説明した内容は、氷山の一角に過ぎません。この記事で紹介した例は、Identi.ca API からデータを読み取ることだけを焦点としていましたが、実際のアプリケーションを作成する場合には、データを読み取るだけでなく、API を使用して Identi.ca にデータを書き込む必要もあることでしょう。例えば近況アップデートを投稿する場合や、フォロワーや友達との関係をセットアップする場合などです。これらの操作を実行するための方法はいくつもあります。その詳細は、連載の第 2 回で説明します。

参考文献

学ぶために

  • StatusNet API: StatusNet API とその使い方について詳しく学んでください。
  • Indenti.ca のパブリック・タイムライン: Identi.ca アカウントを無料で登録して、無料のソフトウェア StatusNet ツールをベースとしたマイクロブロギング・サービスを試してください。
  • Zend_Http_Client コンポーネント: 簡単に HTTP リクエストを実行できるこのインターフェースの詳細を読んでください。Zend_Http_Client は、HTTP クライアントに期待される単純な機能と複雑な機能をサポートします。
  • Zend_Feed コンポーネント: フィードの要素、フィードの属性、およびエントリーの属性に自然な構文でアクセスして RSS フィードおよび Atom フィードを使用する方法についての詳細を読んでください。
  • Twitter の API ドキュメント: このドキュメントを参照しながら Twitter API を使い始めてください。
  • PHP での cURL サポート: cURL を有効にする方法を学んでください。libcurlライブラリーによって、各種のプロトコルでさまざまなタイプのサーバーに簡単に接続して通信できるようになります。
  • この著者による他の記事 (Vikram Vaswani 著、developerWorks、2007年8月から現在まで): XML や Google API、そしてその他の技術に関する記事を読んでください。
  • New to XML: XML を学ぶために必要なリソースを入手してください。
  • developerWorks の XML エリア: DTD、スキーマ、XSLT を含め、XML 分野でのスキルを磨くための資料を見つけてください。広範な技術に関する記事とヒント、チュートリアル、標準、そして IBM Redbooks については、XML 技術文書一覧を参照してください。
  • IBM XML 認定: XML や関連技術の IBM 認定技術者になる方法について調べてください。
  • developerWorks の Technical events and webcasts: これらのセッションで最新情報を入手してください。
  • Twitter での developerWorks: 今すぐ登録して developerWorks のツイートをフォローしてください。
  • developerWorks podcasts: ソフトウェア開発者向けの興味深いインタビューとディスカッションを聞いてください。
  • developerWorks オンデマンド・デモ: 初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。

製品や技術を入手するために

  • Zend Framework: Zend Framework をダウンロードして、よりセキュアで信頼性に優れ、幅広く利用可能な API を備えた最新の Web 2.0 アプリケーションおよび Web サービスを構築してください。
  • identica-php ライブラリー: この使いやすい完全な PHP ライブラリーをダウンロードして、identi.ca プラットフォームと対話してください。
  • IBM 製品の評価版: DB2、Lotus、Rational、Tivoli、および WebSphere のアプリケーション開発ツールとミドルウェア製品を体験するには、評価版をダウンロードするか、IBM SOA Sandbox のオンライン試用版を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source
ArticleID=751078
ArticleTitle=Identi.ca で PHP を使用する: 第 1 回
publish-date=08192011