だいぶ昔に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。放置状態で、リソースの無駄遣いなので止めようと思いつつ、放置している・・・。