欲しい機能をサンタにつぶやくAWSの2011 Xmas企画「サンタに願いを」(#サンタクラウド) の集計ページはS3上で公開しています。
つまり、S3のWebサイトホスティング機能を利用しています。
そして、1時間に1回更新されるランキングの集計は、下記のスクリプトを用いて、EC2上でランキングデータのJSONファイルを毎時作成し、JavaScriptで読み込んでいます。
// 初期設定 $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); $keyword = "%23jawsug%20%23%E3%82%B5%E3%83%B3%E3%82%BF%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89"; $page = 1; $ranking = array(); do { // 該当するTweetを取得 curl_setopt($curl, CURLOPT_URL, "http://search.twitter.com/search.json?result_type=recent&rpp=100&page=$page&q=$keyword"); $tweet_json = curl_exec($curl); $tweet_object = json_decode($tweet_json, true); foreach($tweet_object["results"] as $tweet) { // RT以外のTweetのRetweetを取得 if(strpos($tweet["text"], "RT ") === false) { curl_setopt($curl, CURLOPT_URL, "http://api.twitter.com/1/statuses/" . $tweet["id_str"] . "/retweeted_by.json"); $retweet_json = curl_exec($curl); $retweet_object = json_decode($retweet_json, true); // Tweetがまだ存在してたら if(!isset($retweet_object["error"])) { $retweet_users = array(); // Retweet情報の追加 foreach($retweet_object as $retweet) { array_push($retweet_users, array( "retweet_user_name" => $retweet["screen_name"], "retweet_user_image" => $retweet["profile_image_url"] )); } // Tweet情報の追加 array_push($ranking, array( "tweet_id" => $tweet["id_str"], "tweet_text" => $tweet["text"], "tweet_user_name" => $tweet["from_user"], "tweet_user_image" => $tweet["profile_image_url"], "retweet_users" => $retweet_users )); } } } $page++; } while(count($tweet_object["results"])); // Retweet数順にソート usort($ranking, function($a, $b) { if(count($a["retweet_users"]) == count($b["retweet_users"])) { return 0; } else { return (count($a["retweet_users"]) > count($b["retweet_users"])) ? -1 : 1; } }); // JSONファイルにしてS3にアップロード require_once("/opt/aws/php/default/sdk.class.php"); define("AWS_KEY" , "AAAAAAAAAAAAAAAAAAAA"); define("AWS_SECRET_KEY", "ssssssssssssssssssssssssssssssssssssssss"); $s3 = new AmazonS3(); $s3->set_region(AmazonS3::REGION_APAC_NE1); $response = $s3->create_object("www.suz-lab.com", "santacloud/tweet.json", array( "body" => json_encode($ranking), "acl" => AmazonS3::ACL_PUBLIC, "contentType" => "text/javascript", "curlopts" => array(CURLOPT_SSL_VERIFYPEER => false) ));
今回は、Tweet情報をtogetterからでなく、直接Twitterから取得しています。
故に、時間が経つと昔のTweetが取得できなくなってしまうので、早いうちに、前回のTweet情報に新規分を追加する形に修正します。
また、TwitterへのAPI接続は1時間に100回しかできないので、Tweetが100以上になると、対策をしなければいけません。