Twitter botが作りたい。
Twitter4jでTwitterの検索をします。
検索をする場合には、Twitter#search(Query)というメソッドを使用します。この引数で検索の条件を指定します。ちなみにこのメソッドの場合は認証不要です。
TwitterAPIの制限として、2011/01の時点では検索できる範囲が7日〜10日だそうです、また呟きが増えるほど検索できる期間は先の7日から10日よりももっと短くなるそうです。なので、検索して何かを解析するようなTwitterアプリケーションとかbotとかを作る場合は、呟きを検索して自分のアプリケーション内に溜め込むバッチみたいな処理が必要ですね。
コード例(Twitter4jサイトのコードからちょっと改造)
Twitter twitter = new TwitterFactory().getInstance(); Query query = new Query("#twitter4j"); // 検索条件を#twitter4jで検索 query.setXXX(xxxx) // 検索条件指定(オプション) query.setXXX(xxxx) // 検索条件指定(オプション) query.setXXX(xxxx) // 検索条件指定(オプション) QueryResult result = twitter.search(query); System.out.println("hits:" + result.getTotal()); for (Tweet tweet : result.getTweets()) { System.out.println(tweet.getFromUser() + ":" + tweet.getText()); }
Queryクラスについてのメモ
Twitter4jのサイトの説明ではこのクラスは再利用可能とのこと。ここから下はTwitter4jというよりTwitterAPIのことになるが、メモとして残しておく。
setQuery(クエリ文字列)
検索文字列、Queryクラスのコンストラクタでも指定可能。半角大文字、小文字を区別し必須条件みたいです。指定を忘れると以下のようなメッセージの例外が出力されます。
error - You must enter a query.
検索ワードをスペースで区切っていくと、複数の検索条件になりますが、基本的にAND検索になるようです。検索文字列は以下のように柔軟な検索が可能です。
- 完全一致する言葉を検索
- ""で囲みます。
- 例:"happy hour"('happy hour'を含むツイートを検索)
- OR検索したい場合
- ワードをORで羅列する
- 例:love OR hate('love'または'hate'を含むツイートを検索)
- 検索から除きたい言葉がある場合
- 除きたいワードの前に'-'をつける
- 例:beer -root('beer'を含み'root'を除くツイートを検索)
- 特定のユーザーの呟きを検索
- from:をつける
- from:arcanum_jp(arcanum_jpから発信されたツイートを検索)
- 特定のユーザーに向けた呟きを検索
- to:をつける
- to:arcanum_jp(arcanum_jpに発信されたツイートを検索)
- 特定のユーザーへの言及の検索
- ユーザーIDの前に@をつける
- @arcanum_jp(arcanum_jpへの言及の検索)
- 地域を検索
- near:をつける
- 例:near:"san francisco"(サンフランシスコに近い地域の検索)
- 例:near:NYC(ニューヨークから半径15マイル以内)
- 検索開始日
- since:をつける
- since:2011-01-30(2011-01-30を検索開始日にする)
- setSince( )でも指定可能です。
- 検索終了日
- until:をつける
- until:2011-01-30(2011-01-30を検索終了日にする)
- setUntil( )でも指定可能です。
- リンクを含むもの
- filter:linksを検索ワードに含める
- hilarious filter:links("hilarious"を含み、リンクがあるもの )
- xxxxxx(これわからんので放置)
- source:を検索ワードの前につける
- news source:twitterfeed containing "news" and entered via TwitterFeed
setUntil(日付)
日付はYYYY-MM-DD形式で指定。未来日は駄目、なので"9999-12-31"とか言う横着は不可。未来日を指定すると以下のようなエラーの例外が出力されます。
403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (http://support.twitter.com/forums/10711/entries/15364). error - You cannot use an 'until:' date in the future
setSince(日付)
日付はYYYY-MM-DD形式で指定。Twitterの検索インデックスに入っている期間しか検索できない。Twitterの公式サイトでは1000日分までみたいな制限が書いてあったが2011/01/30現在では"2007-06-20"まで日付はOKだった。検索範囲外の場合、以下のようなエラーメッセージが出力されます。
403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (http://support.twitter.com/forums/10711/entries/15364). error - Nothing in that date range
setRpp(1ページのレコード数)
検索件数が多い場合、setPage()で指定されたページ部分を検索結果として返す。その1ページに含める最大件数。
setPage()を参照。
setPage(ページ番号)
検索結果が多い場合はsetRpp()で指定した件数を1ページとして返すが、その中のどのページを返すかについてのページ番号。検索結果が1000件の場合でsetRpp(100), setPage(2)とした場合、10ページ結果ができるがそのうちの2ページ目(101件目〜200件目)までを返すようになる。
setResultType(結果のタイプ)
次の3つから選択
- Query.RECENT
- 新しい発言を優先的に検索結果に含める
- Query.POPULAR
- 人気の高い発言を優先的に検索結果に含める
- Query.MIXED
- 上記の「新しい発言」と「人気の高い発言」の両方を適度に検索結果に含める
setGeoCode()
・・・
setLang(lang)
ISO 639-1 codeを利用する。日本語の言語は'ja'
setLocale(ロケール)
jaとかの2文字
setSinceId
検索結果のうちの範囲の開始位置を指定する。一応条件的には1(大変古い!検索結果にすら入らない)でもOKだった。
setMaxId(最大ツイートID)
検索結果のうちの範囲の終了位置を指定する。一応条件的には99999999999L(まだ無いID)でもOKだった。