こんにちは。「Javaを復習する初心者」です。
今回はtwitter4jというライブラリを使用し、Twitter上のツイートを複数語検索するということをやりました。
ライブラリのインストール
まず、twitter4jのライブラリ一式をサイトからダウンロードし、プロジェクトに追加します。今回はlibフォルダにjarファイルを配置し、ビルド・パスの画面でjarの追加を行いました。何が不要かということは考えす、ダウンロードしたtwitter4j-4.0.4.zipのlibフォルダに入っていたものを全て追加しました。配置したのは以下のjarファイルです。
- twitter4j-async-4.0.4.jar
- twitter4j-core-4.0.4.jar
- twitter4j-examples-4.0.4.jar
- twitter4j-media-support-4.0.4.jar
- twitter4j-stream-4.0.4.jar
twitter4j.propertiesというファイルをsrc直下に新規作成します。このファイルにはTwitterアプリケーションのカスタマーキーとアクセストークンを記載します。なのでTwitterアプリケーションを作成してキーを取得しました。
プロパティファイル
debug=true
oauth.consumerKey=xxx
oauth.consumerSecret=xxx
oauth.accessToken=xxx
oauth.accessTokenSecret=xxx
このプロパティファイルがない場合、エラーになりました。内容を見ると末尾にシステム時刻を同期する必要があることが書いてありますが、今回はプロパティファイルを用意するのみでエラーは解消しました。
エラー内容
Exception in thread "main" 401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync.
message - Invalid or expired token.
code - 89
処理の流れ
プログラムの処理の流れは以下のようになります。
- TwitterFactory#getSingleton()メソッドでインスタンス取得。
- Twitter#search()メソッドで検索処理実行。
- Status#getText()メソッドで内容を取得。
今回は以下のようにプログラムを作りました。
TwitterFactory#getSingleton()メソッドでTwitterクラスのインスタンスを取得します。このファクトリークラスがプロパティを読み込んでインスタンスを生成してくれるようです。検索処理はTwitter#search()メソッドでできますが、引数にはQueryクラスのインスタンスを指定します。そのため、まずQueryクラスのインスタンスを生成します。Query#setQuery()メソッドで検索文字列を設定できます。今回はString.joinメソッドを使って、空白区切りの文字列を生成し、引数に指定してます。これで空白区切りの文字列による複数語検索になります。検索条件として、Query#setCountで件数を設定、Query#setSinceメソッド()とQuery#setUntilメソッド()で年月日の範囲を指定しましした。年月日はYYYY-MM-DD形式で指定します。
Twitter#search()メソッドにQueryのインスタンスを渡すことで検索結果が得られます。QueryResultクラスのインスタンスが返却されます。QueryResult#getTweets()で結果のリストを取得することができます。このオブジェクトはList<Status>型です。Status#getText()メソッドで内容を取得することができます。そのまま出力すると改行が反映されますが、今回は改行をreplaceメソッドで消してます。
ソースと実行結果
以下はソースと実行結果です。
ソースコード
package test;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
public class Test {
public static void main(String[] args) throws TwitterException {
String[] searchWords = {"寿司", "カレー"};
Twitter twitter = TwitterFactory.getSingleton();
Query query = new Query();
query.setQuery(String.join(" ", searchWords));
query.setCount(10);
query.setSince("2016-07-25");
query.setUntil("2016-08-01");
// 検索実行
QueryResult result = twitter.search(query);
// 検索結果
for (Status tweet : result.getTweets()) {
System.out.println(tweet.getText().replace("\n", ""));
System.out.println("--");
}
}
}
結果のイメージ
[tweetの内容1]
--
[tweetの内容2]
--
[tweetの内容3]
--
[tweetの内容4]
--
[tweetの内容5]
--
[tweetの内容6]
--
[tweetの内容7]
--
[tweetの内容8]
--
[tweetの内容9]
--
[tweetの内容10]
--
念のためプライバシーを配慮し、出力結果はイメージしました。カレーまたは寿司を含んだ内容が出力されました。