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を勉強する事についてデザイナが思う事。

と書かれていますね。

私も処理を日本語で考えてみました。

サンプルページに最終的な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(検索条件,置換,対象文字列);

こんな書き方になります。

⇒参考:文字列内のURLにリンクを貼る - phpspot

ここで使用している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>";

これで完成です!

TwitterAPIサンプルページ

最初の$username = '66103531';を自分の値に置き換えれば動作します。

PHP書くよりブログ書く方が苦労してたりしてw
プログラマさんに言わせれば「何それw」みたいなとこがあると思いますが、現状で精いっぱいやってみました。
セキュリティとか良く突っ込まれているのを見ますので、その辺りも一緒に考えて行こうと思います。

次は認証が必要なAPIとか触ってみようかな~なんて思ってます。

このエントリーのトラックバックURL:

このエントリーへのトラックバック:

デザイナーでもPHP使いたい!シリーズ第二弾です。 第一弾はPHPとTwitterAPIを利用して、自分のタイムラインを表示してみる@デザイナーです。こ...

2010年2月26日 11:13  caraldo.net | WebとiPhoneとロードバイクが大好き!

コメント

お邪魔します
twitterAPIって確か1時間に何回もリクエストすると規制されちゃったような。。。

なので1回取りに行ったら1時間以内は取りにいかないみたいな処理が必要かなと。
(ブログリニューアルしたら記事書いてみようかな。。。)
ボクも最近phpメインで書くようになったので、思わずコメントしてしまいました

これからも面白い記事期待してますー!

Posted by ; iskr : 2010年2月17日 19:20

>iskrさん

コメントありがとうございます。
API規制ですね、確かにすっかり抜け落ちていますねw

次はそこら辺りを考えてみた方が良さそうですね。

これからもどんどん突っ込み下さい。

Posted by ; k@管理人 : 2010年2月17日 19:35

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)




太字 イタリック アンダーライン ハイパーリンク 引用

caraldo_K

Webディレクター的な事やってます!
iPhone楽しい!マラソン・ロードバイクで肉体改造計画中!でも一番好きなのは漫画です㌰㌰⋋( 'Θ')⋌㌰㌰

poooooon

最近Web屋になりました。iPhoneとねこが好きです。ロードバイクは好きと良く言いますが全然乗ってません。

Our tweets
Loading..

POWERED BY MT4