PHPとTwitterAPIを利用して、自分のタイムラインを表示してみる@デザイナー
caraldo.net | WebとiPhoneとロードバイクが大好き! » プログラミング » PHP » PHPとTwitterAPIを利用して、自分のタイムラインを表示してみる@デザイナー

10/02/26追記
コメントで指摘頂いたキャッシュ対応版作成しました。合わせてご覧下さい。
PHPの勉強の為にTwitterのAPIを使用して、まずは自分のタイムラインを表示してちょこちょこ修正を加えてみたいと思います。
完成イメージはサンプルをご覧ください。
⇒TwitterAPIサンプルページ
ちょっと熱くなって前置きが長いので、本題だけ早くという方は目次までスクロール↓して下さい。
PHPの勉強にあたってデザイナーが読んだ方が良い記事
最近デザイナー×PHPに関する以下の記事を読みました。
このブログでもちょこちょこPHPには触れていますが、まだまだ持ってきたScriptをちょいちょい修正する程度のレベルです。
スキルレベルはPHPアーカイブを見て頂ければ大体分かるかと。
ただ、この程度でも出来ると凄い楽しいんですよね。
デザイナーがphpが書けるようになるとどうなるかというと、当然、すっげー楽しくなります。 なんでかというと、自分の頭の中で膨らませた妄想サービスを、ノーストップで世界中に公開できるから。デザイナーがwebサービスを10週間で作れるようになる方法。
ですね。出来た時はとりあえずメッセやらフル稼働で人に見せますw
激しく同意→「デザイナーはphpを覚えると楽しいよ!」RedLine Magazine : PHPを勉強する事についてデザイナが思う事。
知らなかった事と中途半端だった知識がピーン(←ニュータイプの効果音)と連結する瞬間に遭遇した時とか「うひょーー」ってなります。
「うひょーー」w皆さん同じようでなんか嬉しくなりました。
デザイナー視点での話は両サイトに凄い良い感じに書かれていますので、この辺にして本題に。
構想&目次
jquery.cookie.jsを使用した時もそうですが、構想が大事です。
RedLine Magazineさんでも
私がまったく理解できなかった処理の道筋の立て方についての話ですが、最初からソースを書こうとしても私の頭のキャパオーバーで無理だったので、まずは関数とかそういうの一切無視で日本語で順番にどういうことをすればいいのか考える事にしました。RedLine Magazine : PHPを勉強する事についてデザイナが思う事。
と書かれていますね。
私も処理を日本語で考えてみました。
- XML(RSS)を取得する
- XML内の画像・プロフィールを展開する
- つぶやきを表示する
- URLをリンクに置き換える
- @username をリンクに置き換える
- twitpicからサムネイルを展開する
- 最後にHTMLを成形する
サンプルページに最終的なPHPソースが載っています。
では、一連の処理を説明して行きます。
XML(RSS)を取得する
Twitter API 仕様書 日本語訳を見ながら進めて行きます。
最近ではTwitter API Viewerなんて便利なサービスもあります。
TwitterのAPIはjson形式やxml形式等で提供されていますが、今回はxml形式のデータを利用します。
PHPでの該当行は2行目~の以下の記述です。ソースはプレーン表示を押すと見やすいです。
$username = '66103531'; $url = "http://twitter.com/statuses/user_timeline.xml?id=" . $username . "&count=20";
まずはユーザー名を変数に代入します。こういったプログラム内で頻繁に出てくる(であろう)値は、どこかで定義しておくと、使いまわす際に便利です。
ユーザー名の調べ方

ユーザー名は、自分のホーム画面右カラムにあるRSSのリンクをクリックすると分かります。リンク先はhttp://twitter.com/statuses/user_timeline/【ユーザー名】.rssという形式になっているはずです。
user_timelineを使用する
自分のつぶやきを表示するので、タイムライン関連のAPIのuser_timelineを使用します。
これが3行目の記述です。引数countで取得件数が指定可能です。(最大200件まで)
XML内の画像・プロフィールを展開する
PHPでの該当行は4行目~の以下の記述です。
$rss = simplexml_load_file($url); echo "<img src=\"" . $rss->status->user->profile_image_url . "\">"; echo $rss->status->user->description;
PHP5の関数 simplexml_load_file を使用して、XMLを解析します。
PHP4では、simplexml_load_file は使えないのでPEARライブラリを使用する必要があります。
⇒参考:PEARのXML_RSSでRSSしてみる - Do You PHP?
私の環境はPHP5ですのでsimplexml_load_fileを使用して進めていきます。
⇒参考:SimpleXML - phpspot
4行目の
$rss = simplexml_load_file($url);
これだけで、$rssにXMLの内容が配列として格納されます。
以下サイトを眺めとくと理解が深まります。
⇒参考:PHP での SimpleXML 処理
ここまで完了すると、XMLの中身が$rss->status->user->descriptionなんて記述で参照出来る様になります。
こういう記述の仕方をオブジェクト参照構文と言う(っぽい)です。
なんか自慢げに使えそうです。
5行目と6行目でプロフィール部分のHTMLを成形しています。
ちょっと疑問なのがforeachの外の場合、最初に見つかったprofile_image_urlを参照するのか?というとこです。
試してみました。
echo $rss->status->text;
これを出力すると一個目のtextが表示されたので、最初に見つかったフィールドを参照するようですね。
つぶやきを表示する
さてつぶやきを表示するループ処理です。foreach処理については、参考書等で最初の方で触れられていますのできっとご存じのはずと思い割愛。
⇒参考:PHPスクリプト講座:foreach -- そふぃのphp入門
foreach ($rss->status as $i) {
$val = $i->text;
echo "<p>" . $val . "<br />";
}
この後textを色々いじくりまわす予定なので、9行目でとりあえず変数に代入して扱いやすくしてみます。
サンプルの方ではforeachの中でごちゃごちゃやっていますが、取得した値を表示するだけなら、ここまででOKです。
URLをリンクに置き換える
$val = ereg_replace("(http)(://[[:alnum:]\S\$\+\?\.-=_%,:@!#~*/&]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$val);
取得した[text]内のURLはただの文字列として出力されます。
これではいまいちなので正規表現を利用して、リンクに置き換えます。
ereg_replace(検索条件,置換,対象文字列);
こんな書き方になります。
ここで使用しているereg_replace関数は
この関数は PHP 5.3.0 で 非推奨となり、PHP 6.0.0 で削除されます。この機能を使用しないことを強く推奨します。PHP: ereg_replace - Manual
との事です。
ただpreg_replaceに変更したらうまく動かなかったので、今回はこれでw
正規表現勉強した方が良いですね。
[:alnum:]って記述も初めてみました。アルファベットと数字(英数字)を表すようです。
⇒参考:日曜プログラミング講座/PHP言語 - 文法編 - Water-Sunlight
@username をリンクに置き換える
上で紹介した正規表現を利用して@username 部分もリンクに置き換えます。
考え方としては「httpで始まると指定していた」部分を「@で始まる」にすれば良いのでは、それから://も不要だな、ユーザーの個別ページはhttp://twitter.com/【スクリーン名】だな、ということで
$val = ereg_replace("(@)([[:alnum:]\S\$\+\?\.-=_%,:@!#~*/&]+)","<a href=\"http://twitter.com/\\2\" target=\"_blank\">\\1\\2</a>",$val);
こんな記述になりました。
なんとなく掴めてきたかも。
twitpicからサムネイルを展開する
調子にのって、twitpicへのリンクだったらサムネイルを表示するようにしてみます。
この時点では既にURLはリンクに置き換えられている事も考慮しないといけないです。
Twitpic - Share photos on Twitterの形式も確認して
<a href="http://twitpic.com/13p7gv" target="_blank">http://twitpic.com/13p7gv</a> ↓ <a href="http://twitpic.com/13p7gv" target="_blank"><img src="http://twitpic.com/show/mini/13p7gv"></a>
こんな形式にしたいとこまで分かりました。
>http://twitpic.com/から始まる文字列を検索すればaタグの方は対象外に出来ます。
$val = ereg_replace("(>)(http://twitpic.com/)([[:alnum:]\S\$\+\?\.-=_%,:@!#~*/&]+)(</a>)","><img src=\"http://twitpic.com/show/mini/\\3\" /></a>",$val);
うまいこと行きました。
最後にHTMLを成形する
ここまでくればHTMLは問題無いですね。
と、思ったら時間の形式が日本時間じゃない!
Twitter API - PHPでタイムラインの取得 : ちょびんブログを参考に修正しました。
私の知らない関数が出てきましたので、調べときます。
⇒PHP関数講座:strtotime -- そふぃのphp入門
echo "<p>" . $val . "<br />"; echo "<a href=\"http://twitter.com/" . $i->user->screen_name . "/status/" . $i->id ."\">"; echo date( "Y年m月d日H時i分", strtotime( $i->created_at ) ); echo "</a>"; echo "</p>";
これで完成です!
最初の$username = '66103531';を自分の値に置き換えれば動作します。
PHP書くよりブログ書く方が苦労してたりしてw
プログラマさんに言わせれば「何それw」みたいなとこがあると思いますが、現状で精いっぱいやってみました。
セキュリティとか良く突っ込まれているのを見ますので、その辺りも一緒に考えて行こうと思います。
次は認証が必要なAPIとか触ってみようかな~なんて思ってます。