先日、ユーザー定義関数を使って、いかにも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]<?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/>";
}
[/php]
ポイント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タイムラインはこんな感じでしたが、
データベーステーブルを用意して、上記のプログラミングコードを実行するとこうなります。上はデータベース内の様子で、下はそれをブラウザで表示させたときの画像です。
〔参考サイト〕