Twlogめも。
*趣旨
- Twitterのつぶやきを残したい。
- Twilogさん[http://twilog.org]にため込んだデータを自分のサーバに移したい。
*構成
- 言語:PHP with Services_twitter
- DB:MySQL Server
*つぶやき
Thanks @bootjp!
|
*API?
Application Programming Interface.簡潔にプログラミング出来るように用意されたインターフェース。
一から百まで手続きを書く必要がない。
*Services_Twitter?
PHPでTwitterのAPIを簡単に叩けるようにしたPEARパッケージ。*PHP?
え、そこも聞くんですか...?PHP: Hypertext Preprocessor
動的にHTMLを出力して動的なウェブページをうんぬん。
*PEAR?
PHP Extension and Application RepositoryPHPで使えるライブラリ(パッケージ)を公開しているサービス。
いろんなパッケージが公開されてて、それを導入するとすっげー幸せになれる。
*んで、結局どうだったの?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を利用しました。
*まとめ
- APIを使うと簡単にシステムを利用し別のプログラムを作ることができる。
(functionとかclassのような感じ。) - 然るべきPEARパッケージを利用するともっと簡単になる。
- Services_Twitterの最終更新が2007年7月なので、新しいAPIが使えなかったり、仕様変更に対応していない。(上記%d問題など。)
*Links
- Services_Twitter
http://labs.transrain.net/products/services_twitter/ - Jsphon
http://colo-ri.jp/develop/2009/08/jsphon.html - Twitter API - TwitterまとめWiki
http://usy.jp/twitter/index.php?Twitter%20API - Twitter Development Talk - API Documentation
http://apiwiki.twitter.com/Twitter-API-Documentation
*余談
- BASIC認証の場合、TwitterAPIは150回/60min.
- cronで5分おきに実行している。
- 5分おきに1+リプライ数のAPIを消費する。
- TwitterIRCGatewayを実行しているサーバで動かすとAPI制限に引っかかる可能性がある。
ので、取得は別サーバで行っているw - 実はServices_Twitterは複数有る。らしい。
制作:2010.02.21-2010.02.22
記述:2010.02.23
記述:2010.02.23
Copyright (C) 2010 kurosuke.org All rights reserved.