特定のユーザがフォローしているユーザのリストを取得してファイルに吐き出す。


スポンサーリンク

すごく雑なサンプルだけど。

package twitter.action;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import twitter4j.PagableResponseList;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;

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

		long cursor = -1;
		int count = 0;
		StringBuilder sb = new StringBuilder();
		sb.append("screenName,name,followersCount,friendsCount,description");
		while (cursor != 0) {

			//15回リクエスト送ったら怒られるから、14で区切っとく。本来はThread#sleepするのが望ましい
			if (count >= 14) {
				break;
			}
			PagableResponseList<User> friendlist = twitter.getFriendsList("maname", cursor);
			int sizeoffrendlist = friendlist.size();


			for (int i = 0; i < sizeoffrendlist; i++) {
				User user = friendlist.get(i);
				sb.append(user.getScreenName())
				  .append(",")
				  .append(user.getName())
				  .append(",")
				  .append(user.getFollowersCount())
				  .append(",")
				  .append(user.getFriendsCount())
				  .append(",")
				  .append(user.getDescription())
				  .append("\n");
			}
			cursor = friendlist.getNextCursor();
			System.out.println("====> New cursor value"+cursor);
			count++;
		}

		PrintWriter pw = null;
		try {
			File file = new File("user_list.txt");
			pw = new PrintWriter(file);
			pw.println(sb.toString());
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (pw != null) {
				pw.close();
			}
		}

	}
}

これでフレンドリストを取得してファイルに吐き出すことができる。
問題は、以下のようなエラーが出る時だ。

429:Returned in API v1.1 when a request cannot be served due to the application's rate limit having been exhausted for the resource.
https://dev.twitter.com/rest/public/rate-limiting

これは、

15回以上リクエスト送るなよ。
それなら15分間のインターバルをおけ

ということ。

あまり暴力的なリクエストを送ってしまうと、ツイッターのサーバが困ってしまうため、その対処だといえる。

だから、実際に作るときは、リクエスト数を調整して、15回リクエストを送るごとにスレッドをsleepさせるなどの処理を追加する必要がある。
あるいは、分散させるか。