Twitter Botの前の記事の仕様では、bot側から@aigeininへのツイートを取得しなければならなかった。そのために、お題が投稿されたタイミングがわからないから、15秒おきにツイートを取りに行っていた。これが面倒だった。
そこで、TwitterStreamingAPIを使って、投稿のイベントを取得することにした。
twitter4jのサンプルにちょっとだけ手を加えたものは次のようになる
public static void main(String[] args) throws TwitterException { TwitterStream twitterStream = new TwitterStreamFactory().getInstance(); twitterStream.setOAuthConsumer(consumerKey, consumerSecret); twitterStream.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret)); AiGeininBot2 aig = new AiGeininBot2(); StatusListener listener = new StatusListener() { // フィルターをかけたツイートが取れると、このリスナーが呼び出される @Override public void onStatus(Status status) { // ツイート内容がStatusで与えられる System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText()); // statusを与えて、次のメソッドで処理する aig.execNazokake(status); } @Override public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId()); } @Override public void onTrackLimitationNotice(int numberOfLimitedStatuses) { System.out.println("Got track limitation notice:" + numberOfLimitedStatuses); } @Override public void onScrubGeo(long userId, long upToStatusId) { System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId); } @Override public void onStallWarning(StallWarning warning) { System.out.println("Got stall warning:" + warning); } @Override public void onException(Exception ex) { } }; twitterStream.addListener(listener); // ここで @aigeinin 向けたツイート、リプライだけを取得するためのフィルターを作る final String[] TRACK = { "@aigeinin" }; FilterQuery filter = new FilterQuery(); filter.track(TRACK); // ここでフィルターを組み込む twitterStream.filter(filter); }