PHP を使用して Twitter を RSS に変換する

PHP ライブラリーを使って Twitter ストリームを RSS フォーマットにする

この記事ではまず Twitter の基礎を説明した後、PHP 開発者のために、公開 PHP ライブラリーを使って自分と友達のタイムラインからつぶやきを抽出し、RSS をはじめとする別のフォーマットに変換する方法を紹介します。

Thomas Myer, Principal, Triple Dog Dare Media

authorThomas Myer は、テキサス州オースチンにあるコンサルティング会社、Triple Dog Dare Media の共同創立者です。彼は、ナレッジ・マネージメント、情報設計、そしてユーザビリティーに関する著作活動を行っています。



2009年 3月 03日

本題に入る前に、Twitter について私が思っていたことを打ち明けなければなりません。私は今では熱烈なファンとして Twitter をよく使っていますが、Twitter が登場した当初、このサービスに多少当惑していました。実のところ、反感を持っていたと言ってもよいでしょう。

告白してすっきりしたところで、これまでの経緯を説明させてください。

2007年のメディア・カンファレンス、South by Southwest で Twitter が初めて紹介されたとき、親しい友人が早速、私に電話をかけてきて言いました。「サインアップしてアカウントを取るといいよ。実に素晴しいサービスだから!」。会場のいたるところに設けられた大きなモニターには、マイクロブロギング・メッセージが映し出されていたに違いありません。この年、私は旅行する機会が多かったため、South by Southwest には出席できませんでした。ついでに言えば、私は自分の小さな世界にあまりにも気を取られていたので、「マイクロブロギング」だの「つぶやき」だの、友人の言っていることがまるでわかりませんでした。

その後まもなくして、このサービスを試してみる機会がありましたが、結局行きついたのは、自分には向いていないという結論です。実際、Twitter のことをまったくの時間の無駄と言っていたくらいです。ワープ航法を考え出したり、癌治療さえ発明した人類が、どうしてこのサービスに興味を引かれるのかがわかりませんでした。当時の Twitter は、子供のために作ったハム・サンドウィッチについて語るような人々で溢れているように見えました。

それから数カ月後、私は突然にして四六時中 Twitter を使うようになりました。今では、ニュース・ソースや大統領候補、そして各地に散らばる友達をフォローしています。なぜこのように大きな変化を遂げたのか、私自身正確なところはわかりませんが、多くの Twitter ユーザーは同じような経験をしているはずです。例えて言うなら、これは初めて携帯電話を持つようになったときのようなものです。最初のうちは、すぐに使える公衆電話や自宅の電話、それにオフィスの電話が至るところにあるというのに高価な電話を持ち歩くのは馬鹿げていると感じます。けれども、遠い町外れの道路脇で立ち往生している自分に気付いたとき、あの小さな携帯電話さえ持っていたら助かっていたのに、と後悔することになります。

しかし 1 つ確かなことは、携帯電話が公衆電話に代わるのとは異なり、Twitter は私のソーシャル・ネットワークでの活動に置き換わるのではなく、むしろ促進するということです。私は普段、Web で見つけた興味深い文書やリソースなどを投稿するために Twitter を使っています。フォロワーを考えさせたり、笑わせたり、少なくとも何らかの形で役に立ってほしいという願いからです。もちろんたまには、「コーヒーが飲みたい」、「昨日の夜の仕事はきつかった」という以外に話のネタがない日もありますが、このような場当たりの言葉を投稿するのはなるべく少なくしています。

開発者として、私はある時点で欲が出て、Twitter についてあれこれ研究して分析し、少なくともこのサービスがどのように機能しているのかを解明したくなりました。私は以前の記事で、PHP で単純なマイクロブロギング・ツールを作成する方法を紹介しました。このツールは、イントラネット・アプリケーションなどのクローズド・システムのコンテキストで有効に機能する軽量なものです。

今回の記事では Twitter の内部構造の少し深いところまで入り込み、その API について少し調べてから、一部のタスクを簡易化することが可能な知名度の高い公開 PHP ライブラリーへと話を進めます。この記事の最終目標は、Twitter が機能する仕組みを明らかにすること、そして Twitter のタイムライン を RSS にエクスポートするために使用できるツールを提供することです。なぜこのようなことをするかと言えば、Twitter のようなソーシャル・メディア・サービスにとっては、共有することは必須条件であり、またその存在理由でもあるからです。Twitter の更新を Web サイトに載せておくと便利な場合があります。特に、私のように情報とリソースを共有するために Twitter のサービスを利用している人にとっては、便利なことが多いのです。

読者のなかには、「結局のところ何が要点なのか」と質問したくなる方もいるでしょう。これまでソーシャル・マーケティングとメディアの動向を追ってきているとしたら、政府、企業ブランド、販売業者、消費者、そしてあらゆる分野のマニアの人達といった誰もが、「マーケットは会話にある (markets are conversations)」(訳注: 1999年に Cluetrain Manifesto がマーケットに関して表明した考え) という時流に便乗していることはご存知のはずです。実際、この話題についてはデジタル媒体上に溢れかえっていると言っても過言ではありません。

こうした多くの人々とは違い、技術のエキスパートである皆さんは、これらのツールについて、また会話がどのようにして可能になるかについて、具体的な内容を理解できる条件が整っています。「ソーシャル・メディアの云々」についてくどくど話すのではなく、基本的なレベルで全容を実際に理解している一人となれば、仕事に就く上でも有利です。それに加え、スキルを磨き続けていくという点でも有益です。

Twitter API の技術的背景

一見したところ、Twitter はおおむねブログ・サービスの縮小版と言えます。このサービスでは、ユーザーが「つぶやき」を投稿します。つぶやきは 140 文字以内に制限され、日付と時刻のスタンプが付けられます。ユーザーが互いにフォローし合うことができるこのサービスは、基本的には単純化された配信サービスです。Twitter アカウントに関する情報、そしてアカウントに関連付けられたタイムラインとつぶやきは、標準 Web インターフェースで利用できるだけでなく、Twitter API を介してサードパーティーのアプリケーションで利用することもできます。Twitter API は、REST (Representational State Transfer) API または検索 API のいずれかによって Twitter のデータとサービスを公開します。

つぶやきの RSS フィードを公開する上で検索機能は必要ないため、この記事では REST API のみを取り上げます。言うまでもなく、検索 API は Atom フォーマットと JSON (JavaScript Serialized Object Notation) フォーマットでデータを提供し、各種の検索基準 (特定の単語が含まれるつぶやき、特定のユーザーからのつぶやき、特定のユーザーへのつぶやき、特定のユーザーを参照するつぶやき、ハッシュ・タグが含まれるつぶやき、そしてこのすべての組み合わせ) を使用できるようにするという点で極めて便利です。REST API も検索 API 同様に便利で、データを RSS、XML、JSON、および Atom フォーマットで提供します。

REST API はその認証スキームとして HTTP 基本認証を使用するため、ライブラリーとユーティリティーを使用するにはほとんどの場合、Twitter のユーザー名とパスワードが必要になります。Twitter アカウントをまだお持ちでない場合は、Twitter を開始するため、あるいは少なくとも Twitter アカウントの認証クレデンシャルにアクセスするためにアカウントを取得してください。ただし、Twitter API ウィキに記載されているように、「すべてのレスポンスは認証側ユーザーのコンテキストに応じたものになります」ということなので、ユーザーがフォローしていない保護されたユーザーから情報を取得しようとしても、そのリクエストは失敗します。

Twitter API は、REST API として提供されているというその言葉どおり、REST の設計原則に従います。REST は通常広い意味で使われており、REST という言葉が表すのは、ドメイン固有のデータを他の層 (SOAP や cookie など) を使用せずに HTTP で送信する単純なインターフェースのことです。RESTful なサービスは大抵、1 つ以上のリソースを中心に機能し、リソースのそれぞれが一意にアドレス指定できるもの、つまり URI (Uniform Resource Identifier) で特定できるものに結び付けられます。Twitter API のコンテキストで言うと、ユーザー、フォロワー、タイムラインなどについての情報を抽出するために使用できるさまざまな RESTful なサービスがあります。

Twitter API を使用するには、お馴染みの手法がいくつか関連してきます。あるデータ型から別のデータ型に切り替えるには、大抵はファイル名の拡張子を変更するだけで十分です。つまり、RSS ではなく Atom が必要だとしたら、ファイル名の拡張子を切り替えればよいだけで、そのデータ型をサポートしているメソッドがあれば、新たにフォーマット化されたデータ・ストリームを取得することができます。リクエストのパラメーターを UTF-8 (8 ビットの Unicode Transformation Format) に変換して URL (Uniform Resource Locator) エンコーディングを使用するのも名案です。特にリクエストに複雑なストリングが関わってくる場合には、この方法がなおさら役に立ちます。

重要な注意事項として、Twitter API がサポートするのは以下のタイプのリクエストです。

  • GET。データを取得する場合に使用します。
  • POST。データをサブミット、変更、または破棄する場合に使用します。
  • DELETE。これも、データを破棄する場合に使用します。

POST 操作でデータを取得しようとすると、API がエラーを返します。デバッグする際には、リクエストのタイプにメソッドを一致させることから始めるのが効果的です。

HTTP を使用する他の REST サービスと同じく、Twitter API は一連のステータス・コードとエラー・メッセージを利用します。Twitter API はすべてのリクエストに対し、標準の適切な HTTP ステータス・コードを返します (表 1 に記載)。そのため Twitter API は、皆さんがすでに使い慣れている Ajax (Asynchronous JavaScript + XML) や単純な同期 GET および POST 操作などの HTTP ベースの操作と (まったく同じではないとしても) 同じように操作できます。

表 1. Twitter API のステータス・コード
コード内容
200 OKすべて正常です。
304 Not Modifiedリクエストに対して返す新規データはありません。
400 Bad Request無効なリクエストです。何らかの詳細が提供されます。実行回数制限 (この後、詳しく説明) を超えた場合にも、このコードを受け取ります。
401 Not Authorized認証の詳細情報を提供し忘れたか、または無効な情報を提供しました。
404 Not Found要求した URI は存在しません (つまり、該当するユーザーが存在しないか、該当するデータ・サービスがサポートされていないということです)。
500 Internal Server Errorこれは通常、Twitter 側に問題があることを意味します。
502 Bad GatewayTwitter がダウンしているか、アップグレード中です。
503 Service UnavailableTwitter サーバーが過負荷状態です、

エラー・メッセージは常に、要求されたフォーマットで返されます。つまり、XML を要求すると、すべてのエラー・メッセージは XML フォーマットで返されることになります。リスト 1 に、その一例として Twitter API ウィキに記載されているエラー・メッセージを抜粋します。

リスト 1. エラー・メッセージの抜粋 (XML フォーマット)
<?xml version="1.0" encoding="UTF-8"?>
<hash>
Ƞ<request>/direct_messages/destroy/111.xml</request>
Ƞ<error>No direct message with that ID found.</error>
</hash>

最後に、実行回数制限について注意しておきます。クライアントに許容されるリクエスト数は、最初にリクエストを行ってから 1 時間の間に 100 件までです。この数には POST 更新操作は含まれません。認証されていないリクエストは IP アドレス別に追跡される一方、認証済みリクエストはリクエストを行ったユーザー別に追跡されます。この実行回数制限を超えると Twitter がステータス・コード 400 のエラー・メッセージを返すので、自分用のローカル・キャッシュを実装することを検討する必要があります。公開タイムラインは Twitter によって少なくとも 60 秒間はキャッシュされるため、更新をリクエストしても時間の無駄です。

ただし、実行回数制限の問題に突き当たった場合には、制限の適用外にする申請を Twitter に送ることができます (「参考文献」を参照)。Twitter から 48 時間以内に連絡がくるので、これに同意すると、アプリケーションの最大許容リクエスト数が 1 時間あたり 20,000 件になります。


Twitter REST API の操作

私が Web 開発者としてスタートしたばかりの若い頃は、どんなコードでも昼夜を問わず取り組むことに何の問題もありませんでした。15 年経った今、当時よりだいぶ年を取っていることは確かで、もう若い頃のようにはできないとしても願わくは賢くなっていてほしいものです。ここではいくつかの Twitter REST API メソッドについて詳しく説明しますが、これは情報を提供することだけが目的です。最終的には皆さんのそれぞれが、作業の苦労を大幅に取り除いてくれる、優れた PHP ライブラリーを選ぶことになります。

その一方、何のコンテキストもなくライブラリーを紹介するのでは意味がありません。そこでこれから、一般的に使われている Twitter REST API のメソッドおよび呼び出しをいくつか抜粋して簡単に説明することにします。

最もよく使用されている API メソッドは、おそらく public_timeline でしょう。他のステータス・メソッドと同じく、XML、JSON、RSS、および Atom フォーマットで使用可能で、このメソッドを取得するにも他のステータス・メソッドと同じく GET メソッドを使用します。このメソッドは、http://twitter.com/statuses/public_timeline.xml (または .rss など) に用意されています。このメソッドの status 要素 (リスト 2 に記載) には基本的に、アカウントを記述するノードが含まれ、ユーザーを記述するユーザー・ノードが組み込まれます。

リスト 2. public_timeline の status 要素
<status>
  created_at
  id
  text
  source
  truncated
  in_reply_to_status_id
  in_reply_to_user_id
  favorited
  <user>>
   id
   name
   screen_name
   description
   location
   profile_image_url
   url
   protected
   followers_count

friends_timeline もかなりよく使われているメソッドで、このメソッドは認証側ユーザーとそのユーザーの友達が最近投稿した 20 件のつぶやきを返します。Twitter にログインしているとしたら、これは http://www.twitter.com/home とほとんど変わりません。http://twitter.com/statuses/friends_timeline.xml (または .rss、.atom、.json) に用意されているこのメソッドは、GET リクエストによって取得します。また、since (Mon%2C+2+Feb+2009+11%3A45%3A33+GMT のような HTTP 変更日) や page (タイムラインからつぶやきの特定ページを取得) などのオプション・パラメーターをスローすることもできます。

次に、user_timeline メソッドは friends_timeline と似ていますが、(ご想像の通り) 特定ユーザーのつぶやきに限定されます。Twitter ユーザー名が指定されていない場合、API は取得する対象を認証側ユーザーのタイムラインという前提にします。

もちろんこれ以外にも多数のメソッドを使用できますが、手始めとしては上記に挙げた 3 つのメソッドで十分です。前にも触れたように、何の助けがなくても Twitter API をいじり回すことはできますが、それでは生産的な開発者とは言えません。開発者にはそれぞれ締め切りがあるため、事前ビルドされたライブラリーを使用するのが最善の策です。

幸運なことに、twitterlibphp という名前の優れたライブラリーが用意されています (「参考文献」を参照)。早速このライブラリーをダウンロードして、テスト用サーバーまたは開発用サーバーに追加してください。次のセクションでは、このライブラリーをいろいろと使用してみます。


twitterlibphp の使用方法

twitterlibphp ライブラリーには、それぞれが Twitter API メソッドにマッピングされるメソッドの一覧が含まれています。接続、認証、エラー処理、そして送受信はライブラリー自体が処理するので、このライブラリーを組み込んで認証し、そこに含まれるメソッドのいずれか 1 つを使用するだけでライブラリーを使い始めることができます。

初心者のために、showUser() メソッドを使用して特定ユーザーのつぶやきを XML フォーマットで取得する場合について説明します。リスト 3 の $user および $pw に、ご自分のアカウントのクレデンシャルに含まれる値を代入してください。これだけで、そのユーザーのつぶやきに関する情報を取得することができます。

リスト 3. showUser() メソッド
include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-password";

$twitter = new Twitter($user,$pw);

$xml = $twitter->showUser("xml", $user);

echo $xml;

これを実行した結果、大量の情報が XML フォーマットのまま出力されます。リスト 4 に記載する XML からは、私の本名、スクリーン・ネーム、最新のつぶやきがわかるだけでなく、つぶやいている対象のユーザー、プロフィール画像へのパス、さらには色の設定までわかります。

リスト 4. showUser() メソッドによる出力
<?xml version="1.0" encoding="UTF-8"?>
<user>
  <id>14129237</id>
  <name>Thomas Myer</name>
  <screen_name>myerman</screen_name>
  <location>Most likely rushing to my next</location>
  <description>Author, Infopreneur, Blogger, Consultant</description>
  <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/
  74029317/myerman_gmail.com_eef446f6_normal.jpg</profile_image_url>
  <url>http://www.tripledogs.com</url>
  <protected>false</protected>
  <followers_count>55</followers_count>
  <profile_background_color>FFFFFF</profile_background_color>
  <profile_text_color>5F5454</profile_text_color>
  <profile_link_color>A18FB9</profile_link_color>
  <profile_sidebar_fill_color>082C35</profile_sidebar_fill_color>
  <profile_sidebar_border_color>120E26</profile_sidebar_border_color>
  <friends_count>16</friends_count>
  <created_at>Wed Mar 12 02:10:30 +0000 2008</created_at>
  <favourites_count>3</favourites_count>
  <utc_offset>-21600</utc_offset>
  <time_zone>Central Time (US & Canada)</time_zone>
  <profile_background_image_url>http://static.twitter.com/images/themes/theme1/bg.gif
  </profile_background_image_url>
  <profile_background_tile>false</profile_background_tile>
  <following>false</following>
  <notifications>false</notifications>
  <statuses_count>427</statuses_count>
  <status>
    <created_at>Sun Feb 01 21:29:17 +0000 2009</created_at>
    <id>1167762741</id>
    <text>@adonoho [tweet snipped for privacy].</text>
    <source>web</source>
    <truncated>false</truncated>
    <in_reply_to_status_id>1167558714</in_reply_to_status_id>
    <in_reply_to_user_id>882801</in_reply_to_user_id>
    <favorited>false</favorited>
    <in_reply_to_screen_name>adonoho</in_reply_to_screen_name>
  </status>
</user>

このような詳細情報さえあれば、この XML ノード・セットを SimpleXML で処理し、何らかの有益な処理に使えるようになります。例えば、screen_name 要素と併せて statuses_count、さらには最新のつぶやきの created_at ノードを表示するツールを簡単に作成することができます。

そのようなツールを作成するのも興味深いことですが、ここで必要なのは RSS です。具体的に言うと、取得する必要があるのはユーザーのタイムラインです。タイムラインを RSS フォーマットにすれば、PHP で駆動するサイトにサイドバー・ウィジェットや固有のページとして、あるいは他のアドレス指定可能な宛先として表示できるようになります。

そのためにはまず、前に記載した例を変更して、ライブラリーの getUserTimeline() メソッドを使用します (リスト 5 を参照)。

リスト 5. getUserTimeline() メソッド
include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-password";

$twitter = new Twitter($user,$pw);

$rss = $twitter->getUserTimeline("rss", $user);

echo $rss;

ご覧のように、この関数はそのまま使用できる RSS を返します。

リスト 6. getUserTimeline() メソッドによる出力
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Twitter / myerman</title>
    <link>http://twitter.com/myerman</link>
    <description>Twitter updates from Thomas Myer / myerman.</description>
    <language>en-us</language>
    <ttl>40</ttl>
  <item>
    <title>myerman: just got my copy of groundswell...also, 
    just got back from seeing Taken. Liam Neeson kicks butt!</title>
    <description>myerman: just got my copy of groundswell...also, just got back from 
    seeing Taken. Liam Neeson kicks butt!</description>
    <pubDate>Sun, 01 Feb 2009 04:16:55 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1166126064</guid>
    <link>http://twitter.com/myerman/statuses/1166126064</link>
  </item>
  <item>
    <title>myerman: For those of us trying to learn 
    Objective-C - some libraries. http://tinyurl.com/dkaj4m</title>
    <description>myerman: For those of us trying to learn 
    Objective-C - some libraries. http://tinyurl.com/dkaj4m</description>
    <pubDate>Fri, 30 Jan 2009 20:06:13 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1162686918</guid>
    <link>http://twitter.com/myerman/statuses/1162686918</link>
  </item>
  <item>
    <title>myerman: RT @andyhunter Google Chief Economist 
    on innovation: We’re in the middle of .. a period of “combinatorial innovation.”
    http://bit.ly/xgpN</title>
    <description>myerman: RT @andyhunter Google Chief Economist
    on innovation: We’re in the middle of .. a period of “combinatorial innovation.”
    http://bit.ly/xgpN</description>
    <pubDate>Fri, 30 Jan 2009 15:35:18 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1161902779</guid>
    <link>http://twitter.com/myerman/statuses/1161902779</link>
  </item>
  <item>
    <title>myerman: A-Team movie out next year? I love it when a plan comes together.
    http://tinyurl.com/ahckx9</title>
    <description>myerman: A-Team movie out next 
    year? I love it when a plan comes together.
    http://tinyurl.com/ahckx9</description>
    <pubDate>Thu, 29 Jan 2009 19:21:34 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1159386717</guid>
    <link>http://twitter.com/myerman/statuses/1159386717</link>
  </item>
  <item>
    <title>myerman: @andyhunter @cesart it's the pulvinar that gets you in trouble...
    every time!</title>
    <description>myerman: @andyhunter @cesart 
    it's the pulvinar that gets you in trouble...
    every time!</description>
    <pubDate>Thu, 29 Jan 2009 16:44:30 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1158923928</guid>
    <link>http://twitter.com/myerman/statuses/1158923928</link>
  </item>
  <item>
    <title>myerman: Create a manga avatar of yourself. http://www.faceyourmanga.com
    </title>
    <description>myerman: Create a manga avatar of yourself. http://www.faceyourmanga.com
    </description>
    <pubDate>Thu, 29 Jan 2009 16:43:55 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1158922223</guid>
    <link>http://twitter.com/myerman/statuses/1158922223</link>
  </item>
  <item>
    <title>myerman: Zombies ahead on Lamar & 15th....silly hackers! 
    http://tinyurl.com/c2s3nw</title>
    <description>myerman: Zombies ahead on Lamar & 15th....silly hackers!
    http://tinyurl.com/c2s3nw</description>
    <pubDate>Thu, 29 Jan 2009 13:21:24 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1158382096</guid>
    <link>http://twitter.com/myerman/statuses/1158382096</link>
  </item>
  <item>
    <title>myerman: Obama's Mac: http://tinyurl.com/b4hsza</title>
    <description>myerman: Obama's Mac: http://tinyurl.com/b4hsza
    </description>
    <pubDate>Thu, 29 Jan 2009 13:17:58 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1158375012</guid>
    <link>http://twitter.com/myerman/statuses/1158375012</link>
  </item>
  <item>
    <title>myerman: OK, looks like I'll be 
    speaking on Saturday at SxSW 2009.  More details 
    for the freelancer in your life: http://tinyurl.com/df8my9</title>
    <description>myerman: OK, looks like I'll be speaking on Saturday at SxSW 2009.  
    More details for the freelancer in your life: http://tinyurl.com/df8my9</description>
    <pubDate>Wed, 28 Jan 2009 22:39:29 +0000</pubDate>
    <guid>http://twitter.com/myerman/statuses/1156744158</guid>
    <link>http://twitter.com/myerman/statuses/1156744158</link>
  </item>

...snip
  </channel>
</rss>

この方法には 1 つ注意しなければならないことがあります。それは、実行回数制限に達するまでこの関数をただ繰り返し呼び出すというのではいけないということです。そうではなく、リクエスト数を少し絞り込まなければなりません。そこで使える賢い手段が、rateLimitStatus() メソッドとローカル側でのキャッシングを使用して、ローカル・キャッシングの効果をもたらすことです。

rateLimitStatus() メソッド (リスト 7 を参照) は、この 1 時間の実行回数が制限に達したかどうかをチェックする単純なリクエストです。質問される前に言っておきますが、実行回数制限状況のチェックはリクエスト数としてはカウントされません。必要な作業はフォーマットを指定するだけで、後はこの関数が引き受けてくれます。

リスト 7. rateLimitStatus() メソッド
include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-pw";

$twitter = new Twitter($user,$pw);
$status = $twitter->rateLimitStatus("xml");
echo $status;

上記の rateLimitStatus() メソッドを実行すると、以下の XML が返されます。

リスト 8. rateLimitStatus() メソッドによる出力
<?xml version="1.0" encoding="UTF-8"?>
<hash>
  <hourly-limit type="integer">100</hourly-limit>
  <reset-time type="datetime">2009-02-02T05:44:45+00:00</reset-time>
  <reset-time-in-seconds type="integer">1233553485</reset-time-in-seconds>
  <remaining-hits type="integer">99</remaining-hits>
</hash>

この出力のなかで必要なのは、remaining-hits ノード内の値です。この値が 5 やその程度 (あるいは 10 も考えられます) になった場合には、リクエストを送信する代わりにキャッシュされた RSS フィードにアクセスします。この XML ノード・セットが使用できるようになったら、後は SimpleXML をロードして直ちに実行回数制限の状況を構文解析するだけです。もちろん、XML の厄介な扱いに慣れていないのであれば、構文解析して JSON を出力するようにしたほうがよいかもしれません。

同じコードを JSON フォーマットを使用して実行すると、遙かに簡潔なステートメントになります。

{"remaining_hits":95,"hourly_limit":100,"reset_time":"Mon Feb 02 05:44:45 +0000 2009",
"reset_time_in_seconds":1233553485}

上記のストリングをカンマで区切り、さらにコロンで区切れば、remaining_hits の値を取得することができます。この方法でも十分に簡単ですが、PHP V5.2.0 以降を実行している場合には、json_decode() メソッドがすでに用意されているはずです。リスト 9 に記載するように、この関数を使用するだけで remaining_hits の数値を抽出できるので、後は単純な if 文を使って、その数値が 10 やそれ以下の値に近いかどうかを確認すればよいだけの話となります。数値が 10 よりも大きい場合には、Twitter から RSS フィードを取得しますが、後で使えるように RSS フィードはファイルに保存しておきます。数値が 10 を下回っている場合には、ローカルにキャッシュされて保存された RSS を提供します。

リスト 9. json_decode() メソッドの使用方法
include_once("twitter.lib.php");

$user = "your-username";
$pw = "your-password";

$twitter = new Twitter($user,$pw);
$status = $twitter->rateLimitStatus("json");
$fileName = $user.".rss";

$json_dump = json_decode($status);

$remaining = $json_dump->remaining_hits;

if ($remaining <= 10){
	
	$fh = fopen($fileName, 'r');
	$rssData = fread($fh, filesize($fileName));
	fclose($fh);
	echo $rssData;

	
}else{

	$rss = $twitter->getUserTimeline("rss", $user);
	
	//write to file
	//in case we need it!
	$fh = fopen($fileName,'w') or die("can't write to file");
	fwrite($fh,$rss);
	fclose($fh);
	
	echo $rss;
}

残る作業は、この PHP ファイルに適切な名前 (twitterfeed.php など) を付け、もう 1 つの購読オプションとしてユーザーに提供したり、あるいは WordPress サイドバー・ウィジェットをフィードするために使用したりするなど、必要に応じて使用することだけです。


まとめ

この記事では Twitter が機能する仕組みをほんの少し説明しました。その仕組みとは、具体的には REST API が公開する内容です。また、一般に公開された PHP ライブラリーを使用して作業を単純化する方法についても説明しました。皆さんがこの記事で、独自のアプリケーションとユーティリティーを作成するのに十分な知識を得られたことを願います。

参考文献

学ぶために

  • ウィキペディアに、REST の定義がわかりやすく記載されています。
  • Twitter REST API Documentation を読んでください。
  • PHP.net は、PHP 開発者のための情報源です。
  • Recommended PHP reading list」を読んでください。
  • developerWorks ですべての PHP 関連記事を調べてください。
  • developerWorks の Twitter をフォローしてください。
  • IBM developerWorks の PHP project resources にアクセスして、PHP の腕を磨いてください。
  • ソフトウェア開発者を対象とした興味深いインタービューや討論については、developerWorks ポッドキャストをチェックしてください。
  • PHP でデータベースを使用するには Zend Core for IBM を調べてみてください。シームレスにすぐに使えて、インストールも簡単なこの PHP 開発および実動環境は、IBM DB2 V9 をサポートします。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • 世界中で近日中に予定されている IBM オープンソース開発者を対象とした会議、見本市、ウェブ放送やその他のイベントをチェックしてください。
  • オープンソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
  • 無料の developerWorks On demand demos で、IBM およびオープンソースの技術と製品機能を調べて試してみてください。

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

  • Twitter アカウントを取得してください。
  • Mr. Tweet をフォローしてお勧めのユーザーを調べてください。
  • Justin Poliey が作成した twitterlibphp をダウンロードしてください。
  • Twitter のアプリケーション・ホワイトリストを申請してください。
  • IBM ソフトウェアの試用版を使用して、次のオープンソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。
  • IBM 製品の評価版をダウンロードして、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を使ってみてください。

議論するために

コメント

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=Open source
ArticleID=377850
ArticleTitle=PHP を使用して Twitter を RSS に変換する
publish-date=03032009