arcanum_jp’s blog

おっさんの日記

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だった。