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)); } } }