twitter4jからtwitterの検索APIを利用する

概要

 今回はtwitter4jを利用して、検索結果の取得を行う。
 まず初めに、検索APIで利用できるオプションについて列挙した。続いて、twitter4jからそれらオプションを利用して検索結果の取得を行った。

検索(search) APIのオプション

 twitterの検索APIでは、必須となる検索クエリ(文字列)に加えて、以下のオプションが利用可能である*1

option項目 概要
callback JSON形式で取得する時専用。渡したcallback関数名のJSONP化する……らしい。twitter4jを利用する場合は不要
lang 取得するツイートの言語を絞り込む。指定には ISO 639-1 code*2を利用する
locale クエリの言語を指定する。現在はjaのみが有効
rpp return per page. 位置頁にいくつのツイートを返すかを指定する。最大は100
page 何ページ目のツイートを取得するか
since_id ツイートを取得する範囲の開始id
max_id ツイートを取得する範囲の終了id
since ツイートを取得する範囲の開始日付。"YYYY-MM-DD"のフォーマットで指定する
until ツイートを取得する範囲の終了日付。"YYYY-MM-DD"のフォーマットで指定する
geocode ツイートを取得する半径とその中心の緯度経度。"緯度,経度,半径("mi" or "km")"のフォーマットで指定する
show_user ツイートにユーザ名を含める。デフォルトはfalse
result_type mixed, recent, popularの3つから結果を選択する。デフォルトはmixed

 尚、最新の公式ドキュメントでは、max_id及びsinceの存在が確認できない。一方で、twitter API wikiによれば、これらのオプションも存在している*3。どうやら、現在もこの二つのオプションは利用できるようだが、どういう事なのか気になる所だ。

検索APIの利用

 twitter4jから検索APIを利用する場合には、Query クラスと Twitterクラスのsearch(Query) メソッドを利用する*4。検索結果はQueryResultクラスで受け取ることになる。例えば、オプションを指定しない場合には、以下の様にすれば良い。

Twitter twitter = new TwitterFactory().getInstance();
Query query = new Query("hoge");
QueryResult result = twitter.search(query);

 オプションの指定は、全てQueryクラスを通して行う。Queryクラスには、上に挙げたcallbackとshow_userを除いた、全てのオプションに対応するメソッドが存在している。

option項目 対応するメソッド
lang setLang(java.lang.String lang)
local setLocale(java.lang.String locale)
rpp setRpp(int rpp)
page setPage(int page)
since_id setSinceId(long sinceId)
until setUntil(java.lang.String until)
geocode setGeoCode(GeoLocation location, double radius, java.lang.String unit)
result_type setResultType(java.lang.String resultType)

 例えば、2009/10/25から2010/10/25までのツイートから"test"という文字列を含むツイート検索し、それを新着順にして一ページに50件表示する場合、次の様に書く。

Query query = new Query("test");
query.since("2009-10-25");
query.until("2010-10-25");
query.setResultType(query.RECENT);
query.setRpp(50);
QueryResult result = twitter.search(query);

検索結果の利用

 検索結果からツイートを取り出すには、QueryResult.getTweets()メソッドを利用する。タイムラインの取得時にはStatusクラス(正確にはインターフェースだが)のListとして受け取った。これに対して、検索結果の取得は、Tweetクラス(やはり正確にはインターフェース)*5のListとして受け取る。
 TweetはStatusと比べていくつかの情報が減っており、ユーザ名やその発言内容など基本的な情報しか得られない。
 検索結果から投稿日時、投稿者、投稿内容を得る場合には、以下の様に書く。

List<Tweet> twitterSerches = result.getTweets();
for (Tweet tweet : twitterSerches) {
    out.println(tweet.getCreatedAt().toString() + ":" + tweet.getFromUser() + ":" + tweet.getText());
}

まとめ

  • 検索オプションでは検索の時間的範囲や空間的範囲などを指定できる
  • 検索結果の取得には、Twitter.search(twitter4j.Query)メソッドを用いる
  • オプションを指定する場合は予めQueryにそれを指定する

このエントリで残した課題

  • Tweetから取得できる内容の整理
  • max_id, sinceオプションの存在検証

次回

 twitter APIを利用する時によく聞く『利用回数制限』について調べ、twitter4jからそれを確認する手段を確認する。