2011年11月15日火曜日

#サンタクラウドの集計(その1)

スズキです。

#サンタクラウド の集計ページはS3上で公開しています。
つまり、S3のWebサイトホスティング機能を使っています。

そして、一時間に一回更新されるランキングの部分は、下記のようなスクリプトで
適当な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接続は一時間に100回しかできないので、Tweetが100以上になると、
対策をしなければいけません...

とりあえず、昔のTweetが消える前に、新規追加形式にしないと...
--------
http://www.suz-lab.com

0 コメント: