Twlogめも。

*趣旨


*構成


*つぶやき


xxxkurosukexxx:自分のつぶやきログを自鯖に保持するようにしたいけどさてどうしようかなぁ。

bootjp:@xxxkurosukexxx API叩いて落とすのはどうでしょう?

Thanks @bootjp

*API?

Application Programming Interface.
簡潔にプログラミング出来るように用意されたインターフェース。
一から百まで手続きを書く必要がない。

*Services_Twitter?

PHPでTwitterのAPIを簡単に叩けるようにしたPEARパッケージ。

*PHP?

え、そこも聞くんですか...?
PHP: Hypertext Preprocessor
動的にHTMLを出力して動的なウェブページをうんぬん。

*PEAR?

PHP Extension and Application Repository
PHPで使えるライブラリ(パッケージ)を公開しているサービス。
いろんなパッケージが公開されてて、それを導入するとすっげー幸せになれる。

*んで、結局どうだったの?w

一日で完成したw
デザイン云々はとりあえず後回しw

*ふーん。

あ、結局そんな反応ですよねw
結局は自己満足なんですよねwww

*ところでTwitterって?

えっ...

*本題。

途中から話はそれましたが、本題に入りたいと思います。
といっても、Services_Twitter配布元のサイトを見れば解説ががっつり書いてあるので、
必要なAPIを叩いて求める形に加工して出力するなりなんなりするだけなんですが。

今回は自分のつぶやきを拾いたかったので、getUserTimeline()を使用しました。
enableJsonConvert()しといててあげると、返ってきたデータが連想配列になるので、foreachでぶん回します。
サンプル:
 $user = 'Twitterのユーザ名';
 $pass = 'Twitterのパスワード';
 $st =& new Services_Twitter($user, $pass);
 $arr = $st->getUserTimeline();
 foreach($arr as $item){
     echo $item["id"]."\n"; //status_id
     echo $item["text"]."\n"; //つぶやきの中身
     echo date("Y-m-d,H:i:s",strtotime($item["created_at"])); //(整形した)つぶやき日時
     echo "\n";
 }
これでとりあえず一覧表示できます。

ついでに、もしin_reply_to_status_idが有った場合はリプライ元のつぶやきも取得するようにしました。
こちらはgetStatusShow($id)で指定したstatus_idのつぶやきが取得できるので、そこからまた必要なデータを取り出します。
サンプル:
 if($item["in_reply_to_status_id"]!=NULL){
     $rid=$item["in_reply_to_status_id"];
     $arr2 = $st->getStatusShow($rid);
     echo $item["in_reply_to_screen_name"]."\n"; //reply元ユーザ名
     echo $arr2["text"]."\n"; //reply元つぶやきの中身
     echo date("Y-m-d,H:i:s",strtotime($arr2["created_at"])); //(整形した)reply元つぶやき日時
     echo "\n";
 }
そういえば、getStatusShow($id)にすっげぇ苦戦しました。(ここ本題。
いつだったか忘れましたが、Twitterの仕様変更でstatus_idがint型からfloat型に変更になったんですよね。
なので、$item["in_reply_to_status_id"]ももれなくfloat型なんです。
しかし、getStatusShow($id)がint型を要求していますw
なので$idが勝手に丸められてしまい、目的のつぶやきを取得することが出来ませんでした。
悩んだあげく、Services_Twitterの本体であるTwitter.phpを覗いてトレースしてみたら、
Twitter.php line:46
  var $sm_show            = 'http://twitter.com/statuses/show/%d.json';
...犯人居ましたw
他のところは%s(文字列)と記述されているのに、ここだけ%d(10進整数)でしたw

ということで、無事にデータを取得することが出来るようになったので、あとはSQL文に整形し直し、データベースに叩き込むだけです。
PHPはMySQLとの相性も良いのでここもさらっと書き上げてしまいます。
サンプル:
 $link = mysql_connect('DBサーバアドレス', 'DBユーザ', 'DBパスワード');
 mysql_select_db('DB名');
 $sql = "SQL文";
 mysql_query($sql,$link);
これだけ。
実際に書いたコードでは、foreachの中で整形しmysql_queryを実行してます。
本当はエラーチェックを事細かに書くべきだと思いますが、自己満足システムなのでとりあえず放置してありますw

あとは出力側のPHPファイルで、こちらもmysql_queryでDBからデータを取り出し、
foreachでぶん回して適当に整形して出力しています。
余談ですが、出力ページの右側にあるカレンダーもPEARパッケージのCalendar-betaを利用しました。

*まとめ


*Links


*余談



制作:2010.02.21-2010.02.22
記述:2010.02.23
Copyright (C) 2010 kurosuke.org All rights reserved.