複数アカウントのツイートを表示させてTwitterのタイムラインっぽい画面をつくる【改良編】
目次
先日、ユーザー定義関数を使って、いかにもTwitterタイムラインっぽいもの(新しいタブで開く)を作ってみました。しかしよく考えてみると、そもそもこの表示の仕方では、タイムラインを再現していることにはなりません。
なぜなら、ユーザー定義関数を使うだけではTwitterタイムラインのように、ツィートが時系列に並ばないからです。TwitterAPIで取得したツイートを、よりTwitterっぽく再現するためにはデータベースが必要となります。
データベーステーブルの作成
データベース(MySQL)を使用するので、まずテーブルを作成します。
create table tweet ( id int(11) not null auto_increment primary key, tw_id text, tw_screen varchar(16), tw_date varchar(25), tw_txt text );
合わせて、最初に次のクエリ文を挿入しておきます。
insert into tweet (tw_id, tw_screen, tw_date, tw_txt) values ('1', 'echizenya', '2012-06-12 11:00:00', 'test');
挿入しているデータはすべてダミーです。tw_idが0でなければ何でもいいです。こちらの記事でも書いております。
PHPのコード
先にPHPのコードを書いておきます。ポイントは3つありますので後述します。
<?php // userTimeline関数の定義 function userTimeline($screenname) { // データベースの接続(最新のステータスIDを取得) try { $dbh = new PDO('mysql:host=localhost;dbname=tweet1;charset=utf8', 'myusername','mypassword'); } catch(PDOException $e) { var_dump($e->getMessage()); exit; } // もっとも大きい(新しい)ステータスIDを1件選択するためのクエリ文を発行 $sql = "select tw_id from tweet order by tw_id desc limit 1"; $stmt = $dbh->query($sql); // ステータスIDを取得する foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { // 0以上ではダメなので1以上にする if ($user['tw_id'] >= 1) { $sinceid_str = $user['tw_id']; } // 文字列型を整数型に $sinceid = intval($sinceid_str); } // 切断 $dbh = null; // twitterOAuth呼び出し require_once("twitteroauth/twitteroauth.php"); $consumerKey = "MYCONSUMERKEY"; $consumerSecret = "MYCONSUMERSECRET"; $accessToken = "MYACCESSTOKEN"; $accessTokenSecret = "MYACCESSTOKENSECRET"; $twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret); $request = $twObj->OAuthRequest('https://api.twitter.com/1.1/statuses/user_timeline.json','GET', array( 'count'=>'1', 'screen_name' => $screenname, 'since_id' => $sinceid, )); $results = json_decode($request); if(isset($results) && empty($results->errors)){ foreach($results as $tweet){ // データベースへ接続(ツイートの格納) try { $dbh = new PDO('mysql:host=localhost;dbname=tweet1;charset=utf8', 'myusername','mypassword'); } catch(PDOException $e) { var_dump($e->getMessage()); exit; } $stmt = $dbh->prepare( "insert into tweet ( tw_id, tw_screen, tw_date, tw_txt ) values ( :tw_id, :tw_screen, :tw_date, :tw_txt)"); $stmt->bindParam(":tw_id", $tw_id); $stmt->bindParam(":tw_screen", $tw_screen); $stmt->bindParam(":tw_date", $tw_date); $stmt->bindParam(":tw_txt", $tw_txt); $tw_id = $tweet->id; $tw_screen = $tweet->user->screen_name; $tw_date = date('Y-m-d H:i:s', strtotime($tweet->created_at)); $tw_txt = $tweet->text; // 実行 $stmt->execute(); // データベースの切断 $dbh = null; } } else { echo "関連したつぶやきがありません。"; } } // userTimeline関数の実行 userTimeline("retrip_news"); userTimeline("ReutersJpSports"); userTimeline("TimeOutTokyoJP"); // データベースへ接続(表示) try { $dbh = new PDO('mysql:host=localhost;dbname=tweet1;charset=utf8', 'myusername','mypassword'); } catch(PDOException $e) { var_dump($e->getMessage()); exit; } $sql = "select * from tweet order by tw_date desc"; $stmt = $dbh->query($sql); foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { echo $user['tw_screen']; echo "<br/>"; echo $user['tw_date']; echo "<br/>"; echo $user['tw_txt']; echo "<br/><br/>"; }
ポイント1:userTimeline関数について
でuserTimeline関数の定義(4~89行目)と、userTimeline関数の実行(92~94行目)です。コツは前回の記事で書きました。
ポイント2:常に最新のステータスIDを見る
14行目から25行目にかけて、クエリ文でもっとも新しい(大きい)ステータスIDを取得するようにします。その取得したステータスIDでもって、GET statuses/user_timelineの引数である、since_idにセットします(44行目)。
ポイント3:ツイートの日付でソート
データベースのテーブルにPDOクラスを用いて、ツイートの格納(51~83行目)と表示(98~115行目)を繰り返しています。ポイントなる点は、105行目で日付の新しい順(降順)にソートしているところです。
- #02 データを全件表示してみよう | PHP入門(応用編) – プログラミングならドットインストール(新しいタブで開く)
- #04 データを挿入してみよう (2) | PHP入門(応用編) – プログラミングならドットインストール(新しいタブで開く)
確認
元々のTwitterタイムラインはこんな感じでしたが、
データベーステーブルを用意して、上記のプログラミングコードを実行するとこうなります。上はデータベース内の様子で、下はそれをブラウザで表示させたときの画像です。
〔参考サイト〕