しばらくはまっていたのでメモ.

Twitter4Jでフレンド(フォローしている人)のユーザIDをすべて取得するとき,Twitter#getFriendsIDs(longcursor)メソッドを使って

Twitter twitter = new TwitterFactory().getInstance();
List<Long> friendIds = new ArrayList<Long>();
long cursor = -1L;
do {
    IDs ids = twitter.getFriendsIDs(cursor);
    for (long id : ids.getIDs()) {
        friendIds.add(id);
    }
    cursor = ids.getNextCursor();
} while (cursor > 0);

とすると,凍結されているユーザ(suspended user)もfriendIdsに入ってしまうときがあるようです.これはTwitterの仕様なんですかね.

凍結されているユーザのステータスを取得しようとしたりすると403エラーが返ってきてしまいます.これではちょっと困る場面がありました.

凍結されていないフレンドのユーザIDだけ取得するには,Twitter#getFriendsStatuses(long cursor)メソッドを使うといいみたいです.このメソッドを使うと凍結ユーザが除かれたフレンドのリストを取得できます.ただし,このメソッドは最大100人ずつしか取得できないので,上の方法よりもAPI使用回数が多くなってしまいます.ちなみにTwitter#getFriendsIDs(long cursor)メソッドは最大5000人ずつ取得できます.

Twitter twitter = new TwitterFactory().getInstance();
List<Long> validFriendIds = new ArrayList<Long>();
long cursor = - 1L;
do {
    PagableResponseList<User> response = twitter.getFriendsStatuses(cursor);
    for (User user : response) {
        validFriendIds.add(user.getId());
    }
    cursor = response.getNextCursor();
} while (cursor > 0);

こうすれば,validFriendIdsに凍結されていないすべてのフレンドのユーザIDが入ります.ユーザID以外の情報を捨てているのがもったいないですね・・・.何か他の方法があるんでしょうか.