share facebook facebook twitter menu hatena pocket slack

2011.11.16 WED

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

欲しい機能をサンタにつぶやく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以上になると、対策をしなければいけません。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。