Twitter4JのStream APIを使用して、特定ユーザのtweetを監視する

だいぶ昔にtwitterのbotを作成してGAEで動かしていた。*1

今回は、少しリニューアルしようと思って、久しぶりにtwitter4Jを利用して作成した。

ポイントは下記3点。

・TwitterStreamのsample()メソッドを実行すると、全世界のtweetが取得されるため、処理しきれない(リアルタイムで欲しい情報を取得するのが困難)。
・FilterQueryを使用して、絞り込みを行う
・FilterQueryを使用して絞り込んだ場合、tweetの取得にはsample()ではなく、filter(query)を使用する。

下記がサンプル。
◎Mainクラス

public class GetByStreaming {
	public static void main(String[] args) throws TwitterException, FileNotFoundException {
		TwitterStream twStream = new TwitterStreamFactory().getInstance();
		Twitter tw = new TwitterFactory().getInstance();

		InfoStatusListenerImpl infoStatusListenerImpl = new InfoStatusListenerImpl();
		infoStatusListenerImpl.setOutputFile("test.txt");

		twStream.addListener(infoStatusListenerImpl);

                //絞込対象のユーザ名からユーザIDを取得する
		String screenName = "ユーザID";
		User user = tw.showUser(screenName);
                //絞込対象のユーザID一覧
		long[] followers = new long[]{user.getId()};

                //streamをユーザIDで絞込
		FilterQuery filterquery = new FilterQuery();
		filterquery.follow(followers);
		twStream.filter(filterquery);
	}
}

◎StatusListenerの実装

public class InfoStatusListenerImpl implements StatusListener{
	File file;
	FileOutputStream filOutputStream;
	OutputStreamWriter outputStreamWriter;

	public void setOutputFile(String fileName) throws FileNotFoundException{
		file = new File(fileName);
		filOutputStream = new FileOutputStream(file);
		outputStreamWriter = new OutputStreamWriter(filOutputStream);
	}

	@Override
	public void onStatus(Status status) {
		System.out.println("***********onStatus***********");
		System.out.println(status.getUser().getScreenName());
		System.out.println(status.getUser().getName());
		System.out.println(status.getText());

		try {
			outputStreamWriter.write(status.getUser().getScreenName());
			outputStreamWriter.write(",");
			outputStreamWriter.write(status.getUser().getName());
			outputStreamWriter.write(",");
			outputStreamWriter.write(status.getText());
			outputStreamWriter.write(",");
			outputStreamWriter.write("\n");
			outputStreamWriter.flush();
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
    }

	@Override
    public void onDeletionNotice(StatusDeletionNotice sdn) {
    }

	@Override
    public void onTrackLimitationNotice(int i) {
    }

	@Override
    public void onScrubGeo(long lat, long lng) {
    }

	@Override
    public void onException(Exception excptn) {
    }

    @Override
    public void onStallWarning(StallWarning arg0) {
        // TODO Auto-generated method stub
    }
}

*1:正確には今も動いているw。放置状態で、リソースの無駄遣いなので止めようと思いつつ、放置している・・・。