@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

Twitter Streaming APIをTwitter4Jで試してみる

Twitterアプリケーションでは、最新の情報をどうやって取得してくるかってのが割りと課題になったりしますよね。定期的にAPIを叩いて最新情報を取得するようにするとか、ユーザに更新ボタンを押させる(やそれに準ずる操作)とか。
で、TwitterのStreamingAPIなら、つなげたまま、新しいTweetが勝手に送られてくるような事が出来るようです。
今回はTwitter4Jで、とあるハッシュタグに関連するツイートをコンソールに垂れ流してみるってのをやってみたよ。
Twitter4J - コード例 の一番下にStreaming APIの使い方が簡単に書かれてます。けどちょっと古いんですかね、TwitterStreamFactoryにStatusListenerを引数とするコンストラクタは見当たりませんでした。

// Twitterインスタンスと違ってTwitterStreamは後で認証情報を設定出来ないっぽいので、
// 先に作っておきます。作り方は好きな方法を使えば良いと思うけど、今回はConfigurationBuilderでやります。
// TwitterStreamFactoryの引数に設定ファイルのパスを渡すのでも良いです
Configuration configuration = new ConfigurationBuilder()
        .setOAuthConsumerKey("xxxxxxxxxx")
        .setOAuthConsumerSecret("xxxxxxxxxx")
        .setOAuthAccessToken("xxxxxxxxxx")
        .setOAuthAccessTokenSecret("xxxxxxxxxx")
        .build();
// TwitterStreamのインスタンスを作ります
TwitterStream twitterStream = new TwitterStreamFactory(configuration).getInstance();
// リスナーを作ります
StatusListener listener = new StatusListener() {
    @Override
    public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
        // ツイートが削除された時に通知されるようです
        // 今回は無視します
    }
    @Override
    public void onScrubGeo(long userId, long upToStatusId) {
        // ツイートの位置情報が削除された場合に通知されるようです
        // 今回は無視します
    }
    @Override
    public void onStatus(Status status) {
        // ツイートされた時に通知されるようです
        // 今回はコンソールにscreen_nameと内容を出力します
        System.out.println(status.getUser().getScreenName() + " : " + status.getText());
    }
    @Override
    public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
        // よくわからないけど、ツイート?トラック?の制限が変わった時に通知されるっぽい
        // 今回は無視します
    }
    @Override
    public void onException(Exception e) {
        // 例外が起こった場合に通知されます
        // 今回はスタックトレースでも出しておきます
        e.printStackTrace();
    }
};
// リスナーを登録します
twitterStream.addListener(listener);
// 検索用のフィルターを作ります
FilterQuery filterQuery = new FilterQuery();
// 検索する文字列を設定します。 複数設定することも出来て、配列で渡します
filterQuery.track(new String[] {"#followmeJP"});
// フィルターします
twitterStream.filter(filterQuery);
// 5分間だけ全裸で待機します
try {
    Thread.sleep(300 * 1000L);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    // ストリームをやめます
    twitterStream.shutdown();
}

今回は、#followmeJPが含まれるfilterでやりましたけど、位置情報だったり、特定のユーザだったりでも出来るようです。楽しそうですね。現場感がありそうです。
よくサッカースタジアムに見に行くのですが、スタジアムの位置情報がわかれば、その場の感想がわかるってもんですね、あら、楽しそう。でも、試合中は試合見てるんで、試合前とかハーフタイムとか試合後なんですけど、人が密集しすぎててネットがつながりにくい状況でビビります。ドコモダケ
#followmeJPはいっぱい流れてました。誰もフォローしませんでしたけど。
横から流れてくるようにしたら、ニコニコ動画とかBalloo!とかっぽいものも出来そうな感じですね。