twitter apiでつぶやきを取得して解析して人気のコンテンツを集める方法

はじめに

久しぶりにtwitter apiを使ってみる。過去にちょっと使ったことがあるがすっかり忘れているのでついでにまとめることにした。
やりたいことは特定のキーワードでつぶやきを取得して文章を解析。で同じような文章がたくさんつぶやかれていたらそれはみんなが興味のある内容なんだなと解釈してどんな内容が人気なのかを集計するツールを作ってみたいと思う。
また、今回はfuelphpでの開発で話を進めます

まずはtwitterにアプリを登録する

twitterアカウントはもってる前提です。

Twitter Developersから登録できます。ちょっとわかりずらいけどこのページの下のにある「Manage Your Apps」から登録できます
f:id:yoppy0066:20141227203710p:plain

で、以下のページが開くので「Create New App」を押します
f:id:yoppy0066:20141227203939p:plain

で、さらに以下のページが開くのでこの中の「Name」「Description」「Website」を入力します。「Callback URL」はtwitterアカウントでのログインを使ったりするときに必要ですが今回は使わないのでスルー。「Name」「Description」は適当に入力。「Website」も適当に自分のもっているURLを入力すればよいと思う。
f:id:yoppy0066:20141227204210p:plain

これでアプリケーションが登録される。で、apiを使用するために以下の値が必要になるので確認しておく。
・Consumer Key (API Key)
・Consumer Secret (API Secret)
Access Token
Access Token Secret

とりあえずここまでで下準備完了

必要なライブラリをもってくる

ここではphpからtwitter apiを呼び出すのに便利な「twitter oauth」というライブラリを使う。
githubで公開されてるので
ここからダウンロードできます。

cd ~/work #作業ディレクトリに移動して
wget --no-check-certificate https://github.com/abraham/twitteroauth/archive/master.zip #ライブラリをダウンロード(master.zipというファイル名で保存される)
unzip master.zip #解凍(twitteroauth-masterフォルダが作られる。この中のtwitteroauthというフォルダ以下が今回必要なファイル)
cp ./twitteroauth-master/twitteroauth ~/www/fuel/app/vendor #fuelphpの必要な場所に配置

実装する

<?php
namespace Fuel\Tasks;

// twitterauth読み込み
require(APPPATH.'vendor/twitteroauth/OAuth.php');
require(APPPATH.'vendor/twitteroauth/twitteroauth.php');

class Get
{
    // twitteroauthオブジェクト
    static $twitterOAuth;
    
    // twitter developerから取得した値
    static $CONSUMER_KEY           = "****";
    static $CONSUMER_SECRET        = "*****";
    static $ACCESS_TOKEN           = "*****";
    static $ACCESS_TOKEN_SECRET    = "*****";

	public static function run()
	{

        // 取得する回数(1回で100件ずつ取得するので100*x)
        $TRY_NUM                = 3;

        // 取得するキーワード
        $KEYWORD                = "キーワード";

        // twitter取得
        $result = self::get_twitter($KEYWORD, $TRY_NUM);
        
        // 出力
        foreach ($result as $k => $v) {
            echo $v["id"] . "\t" . $v["user_id"] . "\t" . $v["created_at"] . "\t" . $v["text"] . "\n";
        }

    }

    /**
     * キーワードを指定してtwitter apiにてつぶやき取得
     * @param string $keyword
     * @param int $try_num この値x100件取得
     * @return array
     */
    static function get_twitter($keyword, $try_num)
    {
        // twitter oauthオブジェクト
        self::$twitterOAuth = new \TwitterOAuth(
            self::$CONSUMER_KEY,
            self::$CONSUMER_SECRET,
            self::$ACCESS_TOKEN,
            self::$ACCESS_TOKEN_SECRET
        );

        // 取得
        $result = array();
        $max_id = null;
        for ($i=0; $i<=$try_num; $i++) {
            $tmp = self::get_twitter_onetry($keyword, $max_id);
            $result = array_merge($result, $tmp);
            $max_id = $tmp[count($tmp)-1]["id"];
        }
        return $result;
    }

    /**
     * キーワードを指定してtwitter apiにてつぶやき取得
     * @param string $keyword
     * @param int $max_id この値より以前の投稿のみ取得
     * @return array
     */
    static function get_twitter_onetry($keyword, $max_id)
    {
        // パラメータを指定して実施
        $params = array(
            "q"                 =>$keyword, // keyword
            "include_entities"  =>"1",
            "lang"              =>"ja",     // language
            "count"             =>100,      // number of tweets
            "result_type"       =>"recent"  // result type
        );

        if ($max_id) {
            $params["max_id"] = $max_id;
        }

        $result = self::$twitterOAuth->OAuthRequest(
            "https://api.twitter.com/1.1/search/tweets.json",
            "GET",
            $params
        );

        $json = json_decode($result);

        // 必要なデータだけ取得
        $result = array();

        foreach ($json->statuses as $k => $v) {

            // 投稿日時(タイムゾーンの変換と整形)
            $created_at = date("Y-m-d H:i:s", strtotime($v->created_at));

            // つぶやき(改行をとりのぞく)
            $text = mb_ereg_replace("\r|\n|\t", "", $v->text);

            // つぶやきに含まれているURL
            $urls = array();
            if (isset($v->entities->urls)) {
                foreach ($v->entities->urls as $k2 => $v2) {
                    $urls[] = $v2->expanded_url;
                }
            }

            $result[] = array(
                "id"            => $v->id_str,
                "created_at"    => $created_at,
                "text"          => $text,
                "user_id"       => $v->user->id_str,
                "urls"          => $urls,
            );
        }
        return $result;
    }
}

ソースそのままはりつけちゃいました、、、
今回はtwitterからデータを取得するところまででした。
ちょっと長くなったので次回はtwitterのコンテンツを解析するところを実装したいと思います


以上です