複数アカウントのツイートを表示させてTwitterのタイムラインっぽい画面をつくる【改良編】

Twitter_logo_blue

先日、ユーザー定義関数を使って、いかにもTwitterタイムラインっぽいものを作ってみました。しかしよく考えてみると、そもそもこの表示の仕方では、タイムラインを再現していることにはなりません。

tweet_sort1

なぜなら、ユーザー定義関数を使うだけでは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行目で日付の新しい順(降順)にソートしているところです。

確認

tweet_sort2

元々のTwitterタイムラインはこんな感じでしたが、

tweet_sort3

tweet_sort4

データベーステーブルを用意して、上記のプログラミングコードを実行するとこうなります。上はデータベース内の様子で、下はそれをブラウザで表示させたときの画像です。

〔参考サイト〕

Twitter_logo_blue

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次