TwitterSearchApiで検索→DBに保存とか

phpでTwitterApiを叩いて、その結果を(さらに検索して)データベースに追加してみた。
こういうクエリをCronとかでできたらいいなーと思いつつ、気がついたら手動でアクセスしたりしてました。

"http://search.twitter.com/search.json?callback=?q=#桜2012&result_type=recent&lang=ja&rpp=100&page=1"
このUrlでGETしてJsonをデコードすると、最新の検索結果が配列として得れる。
(※ 検索内容(q=)に日本語や「#」をつかうときはurlencode()する)

TwitterApiについては、公式のドキュメントや、その日本語意訳版を参考にした。


Twitterでお花見をもっと楽しくというものを見かけたので、ここにあるお花見全般ハッシュタグのスポット名を検索してみようと思った。
そのために、上のようにハッシュタグで検索後にスポット名で検索し、一致するとデータベースに追加しようと思った。

//twitterApiを最大100*10個検索する
$tweets = array();
for($i=0; $i<10; $i++){
	$tweets = array_merge($tweets,
			json_decode(file_get_contents(
					'http://search.twitter.com/search.json?lang=ja&rpp=100&result_type=recent'
					.'&q='.urlencode('#桜2012').'&page='.($i+1)
					//.'&q='.urlencode('#桜2012+until:2012-04-01').'&page='.($i+1)
					// ↑のようにすると、その日までのツイートを検索する
				))->results
			);
}

//スポット名(事前に$spotsを作っておいた)で検索
//一致するとDBにInsertする、とりあえずSql文だけ
foreach($tweets as $tweet){
	foreach($spots as $spot){
		if(strstr($tweet->text, $spot['name'])){
			$query .= 'INSERT IGNORE INTO sakura_data (id, spot_id, tweet_date) '
						.'VALUES (\''.$tweet->id_str.'\', \''.$spot['id'].'\',\''.date('Y-m-d',strtotime($tweet->created_at)).'\');'
					 .'INSERT IGNORE INTO sakura_tweets (id, tweet) '
						.'VALUES (\''.$tweet->id_str.'\', \''.mysql_real_escape_string($tweet->text).'\');';
		}
	}
}

phpのarray_merge()を使って、すでにある配列に検索した内容を結合した。
配列に追加するとめんどくさいことになったので今回は結合することにした。

Sql文で「INSERT IGNORE 〜〜〜」とすると、すでに同じデータが追加されていると何もしない。
いちいちSqlで同じデータがあるか確認していたころが懐かしい…


こんなかんじに、検索して保存してみた。
このデータをいい感じに表示できたらなーと色々と考えてみたり、久々にブログ書いてみました