Twitter APIをJavaで触る!Twitter4jを使ってみた

目次

  1. 背景
  2. 環境・必要事項
  3. 使い方
    1. プロジェクトをダウンロード
    2. Consumerキーを設定
    3. ユーザ名を変更
    4. 起動コマンド
  4. ソース解説
    1. Twitter 4jについて
    2. OAuthを使ったログイン処理
    3. タイムラインの取得
    4. ツイート
  5. まとめ
  6. 関連記事
  7. 【PR】おすすめ技術本

背景

こんにちは。 karintomania(@karintozuki)です。

JavaでTwitter APIを触る方法を調べたところ、
Twitter4jというライブラリが良いらしい。
今回はそれを使って、ターミナルからTwitterを触るツールを作ってみたので、
少しソースを解説したいと思う。

環境・必要事項

  • Java8以上
  • MacOS

Twitterデベロッパーアカウントが必要。

使い方

プロジェクトをダウンロード

Githubはこちら。
適当なフォルダでgit cloneするなり
zipでダウンロードするなりしてほしい。

いくつか初期設定が必要です。

Consumerキーを設定

resource/twitter4j.properties内の以下二つのプロパティを設定する。
これらの値はTwitterデベロッパーアカウントを作成すると取得できる。

twitter4j.properties
1
2
3
4
// コンシューマーキーを設定
oauth.consumerKey=put-your-consumer-key
// コンシューマーシークレットを設定
oauth.consumerSecret=put-your-consumer-secret

ユーザ名を変更

ユーザ名(使用したいアカウントの@xxxxのxxxx部分)を
Authenticator.javaの以下の箇所に入れる。
ソースベタうちでごめんなさい。

Authenticator.java
1
2
3
4
public void init(){

// ユーザー名(@xxxのxxx)を適宜変えてください
Auth auth = ar.getAuth("put-user-name-here");

起動コマンド

以下コマンドをプロジェクトルートフォルダで実行すると、
ツールが起動する。
./gradlew run --console=plain

–console=plainオプションをつけているのは、
Gradleのメッセージがちょっとうるさいから。

起動したら以下のコマンドが使える。
最初はloginコマンドを打ってログインする必要がある。

コマンド 意味
login ログインできる
tl タイムラインを5件ずつ表示する。nを押すと次の5件を表示する
tw ツイートです。素のままだと改行もできないので、実用的じゃない爆
help ヘルプが申し訳程度に出る

ソース解説

Twitter 4jについて

このツールではTwitter4jというライブラリを使っている。
公式サンプルがだいぶ参考になるので、そちらも合わせてみていただきたい。
http://twitter4j.org/ja/

OAuthを使ったログイン処理

OAuth処理はAuthenticator.javaで行っている。
authenticate()メソッドを少し紹介する。

.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// OAuth認証
public void authenticate(){
    // The factory instance is re-useable and thread safe.
    Twitter twitter = TwitterFactory.getSingleton();
try{
RequestToken requestToken = twitter.getOAuthRequestToken();
AccessToken accessToken = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (null == accessToken) {
System.out.println("Open the following URL and grant access to your account:");
System.out.println(requestToken.getAuthorizationURL());
System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:");
String pin = br.readLine();
try{
if(pin.length() > 0){
accessToken = twitter.getOAuthAccessToken(requestToken, pin);
}else{
accessToken = twitter.getOAuthAccessToken();
}
} catch (TwitterException te) {
if(401 == te.getStatusCode()){
System.out.println("Unable to get the access token.");
}else{
te.printStackTrace();
}
}
}

//persist to the accessToken for future reference.
storeAccessToken(twitter.verifyCredentials().getScreenName(),accessToken);
}catch(TwitterException te){
te.printStackTrace();
}catch(IOException ioe){
ioe.printStackTrace();
}

  }

実際に動作させると、
以下の流れで成功するとトークンが取得できる。

  1. 認証用のURL表示 requestToken.getAuthorizationURL()使用
  2. 認証画面をブラウザで開き、コードを取得
  3. コードをターミナルに入力してもらい、トークン取得 twitter.getOAuthAccessToken(requestToken, pin);

このGIFをみてもらうと分かりやすいと思う。

トークンは取得すると、アクセストークンとアクセストークンシークレットが取得できる。
このプログラム内ではMyBatisとSQLiteを使って永続化している。興味があればDTOフォルダ内を参照して欲しい。

タイムラインの取得

タイムラインの取得はTwitterServiceクラス内のshowTimeLine()メソッドで行っている。

TwitterService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// タイムライン表示
public void showTimeLine(){
Scanner in = new Scanner(System.in);
String s = "";
int page = 1;
String commandMode = "TimeLine Mode (next:n, back:b, quit:q)>";

// タイムライン表示
showPagedTimeLine(page);

do{
System.out.print(commandMode);
s = in.nextLine();
switch (s){
// タイムラインを終了
case "q":
break;
// 次のページを表示
case "n":
showPagedTimeLine(++page);
break;
// 前のページを表示
case "b":
showPagedTimeLine((page > 1) ? --page : 0);
break;
default:
System.out.println(s + " command is not found.");
}

}while(!s.equals("q"));

// Dont close the scanner.
// It will close the scanner of App.java as well
// in.close();
}

// ツイートを5件ずつ表示
public void showPagedTimeLine(int page){

Paging paging = new Paging(page, 5);
try{
// タイムライン取得
List<Status> statuses = twitter.getHomeTimeline(paging);
statuses.stream().forEach(status -> System.out.println(formatTweet(status)));
}catch(TwitterException te){
te.printStackTrace();
}
}

// 表示用に整形
public String formatTweet(Status s){
String tweetText = s.getUser().getName() + " :\n\n" + s.getText();
tweetText += "\n----------------------------";
return tweetText;
}

twitter.getHomeTimeline()メソッドでタイムラインを取得できる。
このメソッドはページネーションに対応しているため、
このプログラム内では5件ずつ取得するようにしている。

こちらも動作イメージとしてGIFを用意した。

ツイート

ツイートにはtwitter.updateStatus()メソッドを使う。
普通に標準入力を読み込んでメソッドに文字列を渡しているだけ。

TwitterService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// ツイートする
public void tweet(){

Scanner in = new Scanner(System.in);
String tweetMode = "Tweet Mode >";
System.out.print(tweetMode);

String s = in.nextLine();

try{
// ツイートを送信
twitter.updateStatus(s);
}catch(TwitterException te){
te.printStackTrace();
}

System.out.println(s);

// Dont close the scanner.
// It will close the scanner of App.java as well
// in.close();

}

こちらも動作イメージとしてGIFを用意した。

まとめ

Twitter周りの実装は全部Twitter4j任せで簡単にできた。
しかし、利用したいAPIによっては対応していないのもあるようなので、注意が必要。
例えばいいねやインプレッション数が取得できるEngagement APIには対応していないようだった。

また、CLIツールとして動作するようなものを作るのが初めてだったので、
そこに結構苦戦した。

それじゃ今日はこの辺で。

関連記事

こちらの記事もおすすめ。

Spring BootでLINE Botのサンプルを動かす 〜おうむ返しのその先へ〜

【PR】おすすめ技術本

Java Silverの勉強にはこちらがおすすめです。