Twitter4JでフォロワーのIDを取得する(最大175万人)

以前書いた記事を見に来た人のGoogleの検索ワードを見ていたら、5000人以上取得したいニーズが高そうなので書いてみる。
これで理論上175万人(5000人×API制限の350リクエスト毎時)まで取得出来ることになります。

twitter4j-coreのバージョン

  • 2.2.3-SNAPSHOT
package manipulate;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import twitter4j.IDs;
import twitter4j.Twitter;
import twitter4j.TwitterException;

import common.Authentificate;
import common.T4jCommon;

/**
 * @author eiryu
 *
 */
public class Samp {

    private static int ID_COUNT_PER_REQUEST = 5000;
    private static Twitter tw = new Authentificate().getAuthObject();

    /**
     * @param args
     * @throws TwitterException
     */
    public static void main(String[] args) throws TwitterException {

        getFollowers();
        T4jCommon.showRestAPIRequestCount(tw);
    }

    /**
     * フォロワーを取得する。
     * 
     * @throws TwitterException
     */
    private static void getFollowers() throws TwitterException {

        // 取得対象のユーザ名
        String targetScreenName = "takapon_jp";
        // カーソル初期値。現状のt4jのjavadocは 1オリジンだが、Twitter API Documentでは -1オリジンなのでそちらに準拠
        long cursor = -1L;
        // 一時的にIDを格納するオブジェクト
        IDs ids;
        // IDを全てストックするオブジェクト
        List<Long> followerIDs = new ArrayList<Long>();

        long page = 1L;
        do {
            // フォロワーが多いユーザだと無反応で寂しい&不安なので状況表示
            System.out.println(String.format("%dページ目取得中。。(%d <= %d)", page, ID_COUNT_PER_REQUEST * (page - 1),
                    ID_COUNT_PER_REQUEST * page++));
            ids = tw.getFollowersIDs(targetScreenName, cursor);
            // 取得したIDをストックする
            for (long id : ids.getIDs()) {
                followerIDs.add(id);
            }

            // 次のページへのカーソル取得。ない場合は0のようだが、念のためループ条件はhasNextで見る
            cursor = ids.getNextCursor();
        } while (ids.hasNext());
        // ファイル出力
        output(String.format("C:\\%s.txt", targetScreenName), followerIDs);
    }

    /**
     * ファイルへIDを出力
     * 
     * @param fileName
     * @param ids
     */
    private static void output(String fileName, List<Long> ids) {

        BufferedWriter wr = null;
        try {
            wr = new BufferedWriter(new FileWriter(fileName, false));

            for (long eachId : ids) {
                wr.write(String.valueOf(eachId));
                wr.newLine();
            }
            wr.flush();
            wr.close();

        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}


(English description)
Get specific user's follower ids. (5000ids/page, max 1.75 million ids.)