読者です 読者をやめる 読者になる 読者になる

Javaで書かれたTwitterの自動フォロー返しを、Scalaで書いてみた #twitter4j #twtr_hack

Scala Java Twitter4J

つくっているiOS、AndroidアプリのPRキャンペーンでTwitterの自動フォロー返しが必要になったので、最近勉強をはじめたScalaで書いてみました。
参考にさせていただいたのは以下のJavaソースです。もちろん、Twitter4Jを使います。

http://d.hatena.ne.jp/yoheiM/20100827

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

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


public class AutoRefollow {
	protected static Twitter twitter;
	public static void main(String[] args) throws Exception {
		System.out.println("処理開始");
		twitter = new Twitter("yoheiMune", "56909885");
		IDs frends = getFrendIds();
		IDs follower = getFollowerIds();
		List<Integer> notFollowIdList = calcNotFollow(follower, frends);
		doFollow(notFollowIdList);
		System.out.println("処理終了");
	}

	protected static void doFollow(List<Integer> notFollowIdList) throws TwitterException {
		for (Integer userId : notFollowIdList) {
			User user = twitter.createFriendship(userId);
			if(user == null) {
				throw new TwitterException("フォローに失敗しました。対象ID:" + userId);
			}
			System.out.println("フォローしました。対象:" + user.getName());
		}
	}

	protected static List<Integer> calcNotFollow(IDs follower, IDs frends) {
		List<Integer> returnValue = new ArrayList<Integer>();
		for(int id : follower.getIDs()) {
			if(! contains(frends, id)) {
				returnValue.add(Integer.valueOf(id));
			}
		}
		return returnValue;
	}

	private static boolean contains(IDs frends, int id) {
		
		for(int frendId : frends.getIDs()) {
			if(frendId == id) {
				return true;
			}
		}
		return false;
	}

	protected static IDs getFollowerIds() throws TwitterException {
		return twitter.getFollowersIDs();
	}

	protected static IDs getFrendIds() throws TwitterException {
		return twitter.getFriendsIDs();
	}

}

処理は以下のような感じですね。
・自分がフォローしているリストを取得
・自分のフォロワーリストを取得
・自分のフォロワーリストと自分がフォローしているリストを比較し、自分がフォローしていない人をリストにする
・自分がフォローしていない人に対してフォローする。

Scalaで書いたら以下のようになりました。
上記の手順は最後に一行にまとまっています。
また、コンパイルせずにインタプリタとして動作させることを前提でかいています。
ScalaのArrayまわりの使い易さが異常ですね。
エラー処理とかいろいろ抜けていますが、ScalaでかくとJavaで書くよりこんなにシンプルになるよ!というScalaのステマでした。
(むりくり1行にまとめています・・・。)

import twitter4j.Twitter
import twitter4j.TwitterFactory
import twitter4j.TwitterException
import twitter4j.Status
import twitter4j.auth.AccessToken
import twitter4j.IDs

val twitter: Twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer("consumerKey", "consumerSecret");
twitter.setOAuthAccessToken(new AccessToken("accessToken", "accessTokenSecret"));

twitter.getFollowersIDs(twitter.getId(),-1).getIDs().filter(!(twitter.getFriendsIDs(twitter.getId(),-1).getIDs()).contains(_)).foreach(twitter.createFriendship(_));