1. TOPTOP
  2. Webサービス
  3. Twitter

複数アカウントのツイートを表示させて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

// 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行目で日付の新しい順(降順)にソートしているところです。

確認

tweet_sort2

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

tweet_sort3

tweet_sort4

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

〔参考サイト〕