Twitter4jでUserStreamにチャレンジ

TwitterのUserStreamにチャレンジしてみました。
UserStreamを使って、Botがリプライに即反応したり、ツイートがお気に入り登録されたらなにか反応するみたいなことが出来ればなーと思っています。

ちなみにGAE/Jでやりたかったのですがもろもろの制約により無理そうなので、SAStrutsでやってみました。
Elastic Beanstalkでは問題なく動作しそうです。

public class TwitterAction
{
	static final String CONSUMER_KEY = "XXX";
	static final String CONSUMER_SECRET = "XXX";
	static final String ACCESS_TOKEN = "XXX";
	static final String ACCESS_TOKEN_SECRET = "XXX";
	
	/*
	 * UserStreamの開始
	 */
	@Execute(validator=false)
	public String startUserStream()throws Exception
	{
		ConfigurationBuilder builder = new ConfigurationBuilder();
		builder.setOAuthConsumerKey(CONSUMER_KEY);
		builder.setOAuthConsumerSecret(CONSUMER_SECRET);
		builder.setOAuthAccessToken(ACCESS_TOKEN);
		builder.setOAuthAccessTokenSecret(ACCESS_TOKEN_SECRET);
		builder.setUserStreamBaseURL( "https://userstream.twitter.com/2/" );
		
		Configuration conf = builder.build();
		
		TwitterStreamFactory twitterStreamFactory = new TwitterStreamFactory(conf);
		TwitterStream twitterStream = twitterStreamFactory.getInstance();
		twitterStream.addListener(new MyUserStreamAdapter());
		twitterStream.user();
		
		return null;
	}
}

/**
 * UserStreamAdapter
 */
class MyUserStreamAdapter extends UserStreamAdapter
{
	private static final Logger logger = Logger.getLogger(MyUserStreamAdapter.class);
	
	/*
	 * ツイートに対する反応
	 */
	@Override
	public void onStatus(Status status)
	{
		super.onStatus(status);
		
		logger.info(status.getText() + " : " + status.getUser().getScreenName());
	}
	
	/*
	 * お気に入り登録に対する反応
	 */
	@Override
	public void onFavorite(User source, User target, Status favoritedStatus)
	{
		super.onFavorite(source,target,favoritedStatus);
		
		String message = source.getName() + "が" + target.getName() + "のツイート「" + favoritedStatus.getText() + "」をふぁぼった";
		logger.info(message);
	}
}

UserStreamAdapterには他にもメソッドがありますが、今回は2つだけ試してみました。

  • onStatus
    • 自分のタイムライン上のツイートに反応します。自分のツイート、リツイートにも反応します。
    • ただし、自分がフォローしてるAさんとフォローしていないBさんがいたとしたとき、AさんからBさんへのリプライ、その逆にも反応するようです。(Bさんが鍵付きの場合は除く)
  • onFavorite
    • 誰かが自分のツイートをお気に入りした、もしくは自分がだれかのツイートをお気に入りしたときに呼ばれます。


onStatusはリプライに対する反応が特殊な感じがしました。
onFavoriteは、自分が関連するお気に入りにしか反応しないみたいです。
フォロワーさん同士のお気に入りにも反応したら面白かったのですが・・・。