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

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

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

2011年 8月 22日 ― 著者からの要求により、リスト 2 の直後の段落の最初の文を変更しました。

はじめに

この連載の第 1 回の記事では、Identi.ca Web サービス API について紹介し、この API を使用して PHP ベースの Web アプリケーションでデータを読み取って使用するいくつかの例を示しました。さらに、Identi.ca API の 2 通りの使い方として、SimpleXML や Zend Framework などのツールを使って手動でコードを作成する方法、そして identica-php などの既製の PHP ライブラリーを使用する方法を説明しました。

前回の記事で紹介した例では、いずれも Identi.ca API への読み取り専用アクセスを焦点としましたが、連載を締めくくるこの最後の記事では、Identi.ca API を使ってユーザーの入力を取得し、Identi.ca に表示する方法を説明します。今回の取り組みでは、新しい投稿を作成する機能、投稿にお気に入りのマークを付ける機能、そしてフォロワーの関係をセットアップする機能などを組み込んで、サンプル PHP スクリプトの機能を拡張します。それでは、さっそく本題に入りましょう。


近況メッセージの検索

よく使われる頭文字語

  • API: Application Programming Interface
  • HTTP: HyperText Transfer Protocol
  • JSON: JavaScript Object Notation
  • RSS: Really Simple Syndication
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

Identi.ca API を使用する最も一般的な理由の 1 つがその検索機能です。Identi.ca API がベースとしている Twitter API と同じように、Identi.ca API が公開する検索インターフェースは、検索結果を Atom フォーマットと JSON フォーマットの両方で返します。URL http://identi.ca/api/search.atom でアクセスできるこの検索インターフェースを処理するのに最も簡単な手段となるのは、この連載の第 1 回でも使用した Zend_Feed コンポーネントのようなツールです。

リスト 1 に、Zend_Feed を使用して Identi.ca で特定の検索語と一致する投稿を検索し、検索結果を表示する方法を示します。

リスト 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 フィードとして返されます。Zend_Feed コンポーネントは Atom フィードと RSS フィードを構文解析する目的で設計されているため、Zend_Feed コンポーネントで使用するには Atom フィードが適しています。

Zend_Feed import() メソッドを使って Atom フィードをインポートすると、標準のオブジェクト・プロパティー表記を使って処理できるオブジェクトに変換されます。リスト 1 には、Zend_Feed を使用してフィード内のエントリーを繰り返し処理し、各エントリーのタイトル、作成者、公開日を抽出する方法が示されています。この処理の結果、図 1 のような出力が生成されます。

図 1. 検索結果を一覧表示する Web ページ
'green lantern’ の検索結果を一覧表示する Web ページのスクリーン・キャプチャー

サンプル・アプリケーション: インタラクティブな検索ユーティリティー

リスト 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>

リスト 1 からリスト 2 への変更内容は、検索リクエスト URL のエンドポイントに、ユーザーによる入力に対するサポートを追加しているだけのマイナーなものです。具体的には、このリストでは生成された Atom フィードを構文解析し、検索の一致結果を一覧表示します。ページごとに表示する結果件数は、リクエスト URL に追加された rpp パラメーターによって指定されます。検索語は URL エンコードしてから API に渡さなければならないことに注意してください。

図 2 に、このツールが実行されている様子を示します。

図 2. インタラクティブな Identi.ca 検索エンジン
captain america の検索結果を表示する、インタラクティブな Identi.ca 検索エンジンのスクリーン・キャプチャー

近況メッセージの追加および削除

投稿を検索できるだけでなく、新たに投稿を作成することも可能です。Identi.ca API には、新しい近況メッセージを投稿したり、既存の近況メッセージを削除したりするためのメソッドが用意されています。新規メッセージをユーザーのタイムラインに投稿するには、認証済みのクライアントが POST を使ってリクエストを送信しなければなりません。第 1 回でも登場した Zend_Http_Client コンポーネントは、POST と認証の両方をサポートするため、この必要を満たすにはぴったりです。

リスト 3 を見てください。ここに、Identi.ca 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 ではまず、必要なクラス・ライブラリーをロードして、ユーザーのアカウント資格情報を定義します。次に、Zend_Http_Client オブジェクトが Identi.ca API のエンドポイント URL で初期化され、setAuth() メソッドを使用して認証用のアカウント資格情報が設定されます。続いて、’status’ リクエスト引数によって近況メッセージ・テキストが POST パラメーターとしてリクエストに追加された後、リクエスト全体が Identi.ca に送信されます。

リクエストが成功すると、Identi.ca は新しく作成されたメッセージを表す XML レスポンスを、そのメッセージに固有の ID とともに返します。この XML文書を構文解析すれば、成功または失敗を示すメッセージを表示できるというわけです。また、Identi.ca のユーザー・タイムラインにも、新しく作成されたメッセージが表示されます。

既存のメッセージを削除するのも同じく簡単で、メッセージ削除に対応する API エンドポイントにメッセージの固有 ID を POST 送信するだけで削除することができます。リスト 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 を構文解析して、ユーザーがこれまで投稿したメッセージを一覧表示します。各メッセージには、同じくメッセージの固有 ID が GET 変数として組み込まれた「Delete (削除)」リンクが伴います。さらに、このコードにはユーザーが新しい近況メッセージを入力できるように、単純な Web フォームも含まれています。このフォームを送信することで、入力されたメッセージが POST によってフォーム処理スクリプトに送信されます。

フォーム処理スクリプトは、要求されるたびに、リクエスト・メソッドが GET と POST のどちらであるかを調べ、そのメソッドに応じて実行するアクションを決定します。

  • POST リクエストの場合、スクリプトはユーザーが入力したメッセージを取得した後、リスト 3 と同じように、そのメッセージを新規メッセージの作成に対応する API エンドポイントに POST 送信します。
  • GET リクエストの場合、スクリプトはリクエスト URL に含まれるメッセージ ID を取得した後、リスト 4 と同じように、そのメッセージをメッセージの削除に対応する API エンドポイントに POST 送信します。

図 3 に、このスクリプトを実行することで、ユーザーの近況メッセージが一覧表示された様子を示します。

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

図 4 に、この Web フォームで新しい投稿を追加した結果を示します。

図 4. メッセージ投稿後に更新されたユーザー・タイムラインを一覧表示する Web ページ
メッセージ投稿後に更新されたユーザー・タイムラインを一覧表示する Web ページのスクリーン・キャプチャー

ユーザーの購読情報の管理

Identi.ca API では、ユーザー自身のタイムラインにメッセージを投稿したり、既存のメッセージを削除したりすることができるだけではありません。この API を使って、フォロワー関係を管理することもできます。Identi.ca 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 文書が含まれるレスポンスが返されます。このレスポンスでは、特殊な following というプロパティーが true に設定されます。

リスト 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();
}
?>

ユーザーのお気に入りの管理

Identi.ca では、Twitter と同じようにユーザーが特定のメッセージにお気に入りのマークを付けることができるようになっています。この機能は、ユーザーが特定のメッセージに、特に関心の高い貴重なメッセージとしてフラグを立てるのに便利な方法です。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. ユーザーのお気に入りを一覧表示する Web ページ
ユーザーのお気に入りを一覧表示する Web ページのスクリーン・キャプチャー

別のユーザーのお気に入りを取得することもできます。それには、id パラメーターを使って対象ユーザーのスクリーン・ネームをエンドポイントに渡せばよいのです。

プログラムによって新しいメッセージをユーザーのお気に入りに追加するには、まず始めに、メッセージの固有 ID を取得する必要があります。リスト 9 では、お気に入りのメッセージの ID を取得しているという前提で、その ID を参照する API に POST リクエストを送信しています。

リスト 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 リクエストが成功した場合のレスポンスは、メッセージのメタデータとコンテンツが含まれ、favorited プロパティーが true に設定された XML 文書となります。

ここまでのところでお察しのことと思いますが、プログラムによってお気に入りのメッセージを削除することも可能です。それには同じく、適切な API エンドポイントにメッセージ ID を渡します。リスト 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();
}
?>

サンプル・アプリケーション: ダッシュボード

これまでに説明した情報を基に、Identi.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 の場合には、数値のユーザー ID を検索し、その ID で指定されたユーザーとの認証済みユーザーのフォロワー関係を、API を使用して削除します。
  • o=favor の場合、数値のメッセージ ID を検索し、その ID に対応するメッセージを認証済みユーザーのお気に入りリストに、API を使用して追加します。
  • o=disfavor の場合、数値のメッセージ ID を検索し、その ID に対応するメッセージを認証済みユーザーのお気に入りリストから、API を使用して削除します。

いずれの場合にも、指定されたアクションを実行した後に、スクリプトは API を使って Identi.ca パブリック・タイムラインを再度リクエストして、XML レスポンスを構文解析し、リスト内のメッセージを適切なコントロールと併せて表示します。

図 6 は、実行中のリスト 11 の一例です。

図 6. Identi.ca のブラウザー・ベースのダッシュボード
複数のユーザーからの投稿を表示する、Identi.ca のブラウザー・ベースのダッシュボードのスクリーン・キャプチャー

まとめ

この記事では、SimpleXML と Zend HTTP クライアント・ライブラリーの組み合わせを利用して Identi.ca API から PHP アプリケーションにデータを統合する方法をまとめて一気に説明しました。この 2 回連載の記事の例では、Identi.ca API の 2 つの主な使い方を紹介し、Identi.ca のコンテンツを検索する方法、プログラムによってコンテンツを追加、変更、削除する方法、ユーザーの購読情報とお気に入りを管理する方法、そしてユーザーの Identi.ca データにアクセスするためのカスタマイズしたインターフェースを作成する方法をサンプル・コードと併せて説明しました。

これらのサンプル・コードで明らかにされているように、Identi.ca API は、開発者がマイクロブロギング・サービス、そしてコンテンツの集約と検索をベースとした独創的な新しいアプリケーションを作成する際にすぐに使える、本格的で柔軟なインターフェースです。ぜひ、実際に使って自分で確かめてみてください。

参考文献

学ぶために

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

  • 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=756773
ArticleTitle=Identi.ca で PHP を使用する: 第 2 回
publish-date=09162011