Twitter4J を使ってみる

山本裕介氏 (侍ズム #samuraism)が提供されている Twitter4J を用いて,Twitter API を叩く.

ユーザ情報の取得と表示

Twitter twitter = new TwitterFactory().getInstance();
String screenName = "hogehoge";

//ユーザ情報の取得と表示
try {
    User user = twitter.showUser(screenName);
    System.out.println("User ID : " + user.getId());
    System.out.println("ScreenName : " + user.getScreenName());
    System.out.println("User's Name : " + user.getName());
    System.out.println("Number of Followers : " + user.getFollowersCount());
    System.out.println("Number of Friends : " + user.getFriendsCount());
    System.out.println("Language : " + user.getLang());
} catch(Exception e){
    e.printStackTrace();
}

ユーザ・ステータスの取得と表示

Twitter twitter = new TwitterFactory().getInstance();
String screenName = "hogehoge";
try {
    User user = twitter.showUser(screenName);
    Status status = user.getStatus();
    System.out.println(status.getCreatedAt());
    System.out.println(status.getId());
    System.out.println(status.getSource());
    System.out.println(status.getText());
} catch(Exception e){
    e.printStackTrace();
}

フォロワーの一覧を得る

150 APIs で拾いきれないほど多くのフォロワーを抱えるユーザに対応するため,Rate Limiting への処理を含めて,こんな感じ(でよいのかしら? 自信なし).
(2011.06.08 追記) rateLimit.getSecondsUntilReset() の値を sleep() に与えては駄目でした.以下のコードのように,適当な時間を設定するのが現実的みたい.

import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.Status;
import twitter4j.IDs;
import twitter4j.RateLimitStatus;
import twitter4j.TwitterException;

import java.util.List;
import java.util.ArrayList;

public class twitter4jSample {

    //フォロワーの一覧を得る
    static List followers(Twitter twitter, String screenName){
        List<Long> m_FollowersList = new ArrayList<Long>();

        long cursor = -1;
        int count = 0;
        while(true) {
            IDs ids = null;
            try {
                //IDs ids = twitter.getFollowersIDs(user.getId(), cursor);
                ids = twitter.getFollowersIDs(screenName, cursor);
            } catch(TwitterException twitterException){
                // Rate Limit に引っかかった場合の処理
                // (メモ) status code も併せてチェックすべきか?!

                RateLimitStatus rateLimit = twitterException.getRateLimitStatus();
                int secondsUntilReset = rateLimit.getSecondsUntilReset();
                System.err.println("please wait for " + secondsUntilReset + " seconds");
                System.err.println("Reset Time : " +  rateLimit.getResetTime());
                
                //(注) 120秒間,水増し・・getSecondsUntilReset() の返す値が負の
                //場合があり,それに対応するため
                // long waitTime = (long)(secondsUntilReset + 120) * 1000;
                long waitTime = (long)(300 * 1000); // 300秒待ち
                try {
                    Thread.sleep(waitTime);
                } catch(Exception e){
                    e.printStackTrace();
                }

                continue;
            } catch(Exception e){
                e.printStackTrace();
            }
            
            long[] idArray = ids.getIDs();
            for(int i = 0; i < idArray.length; i++){
                //System.out.println("["+(++count)+"]" + idArray[i]);
                m_FollowersList.add(new Long(idArray[i]));
            }
            
            if(ids.hasNext()){
                cursor = ids.getNextCursor();
            } else {
                break;
            }
        }

        return m_FollowersList;
    }

    public static void main(String[] args){
        Twitter twitter = new TwitterFactory().getInstance();

        String screenName = "hogehoge";

        //フォロワーの一覧を得る
        List followersList = followers(twitter, screenName);

        for(int i = 0; i < followersList.size(); i++){
            System.out.println("["+(i+1)+"]" + followersList.get(i));
        }
    }
}