技術開発日記

技術やら日々思ったことを綴ってます。

twitter4j

若干今更感はあるけど、twitter4jを触る機会があったので、とりあえず、以下の3機能を簡単に実装してみた。

・OAuth認可をつかってツイートする。
・指定したユーザのタイムラインを取得する。
・ツイートの検索をする。

準備
 1.なにはともあれ、まずはtwitterの開発者用アカウントを登録しないといけないので、
 https://dev.twitter.com/ にアクセスしてアプリケーション名やらアプリケーションURLなどを登録。
 その際、自分のtwitterのアカウントを登録しないといけないので、そこは普段のアカウントでなく
 テスト用のアカウントを作成しておいて登録した方が無難かもしれない。
 
 2.次にtwitter4jを公式サイトからダウンロードして、プロジェクトにパスを通してあげる。
   ※今回はmavenを使ってない単純なjavaプロジェクトで作成。
 
実装
 ひとまず、クラスはMainクラスとtweet関連を管理するクラスの2つだけにしてみた。
 ツイート、タイムライン取得、検索はそれぞれ別のクラスにしてもよかったけど、
 3機能しかないうえに機能拡張しないので、とりあえず1つのクラスにまとめておいた。
 ※逆に言えば、機能が10個以上とかで機能拡張するなら、AbstractクラスでもInterfaceでも立てて、
  そこに共通処理を置いて継承させるように複数クラスを作った方がいいかもしれない。

動作確認
 ツイートする機能に関しては実際に自分のアカウントで内容を確認するとして、
 タイムラインの取得と検索に関しては単純にコンソールに出力される簡単なものなので、そこで確認。

ソースコード
 下記にあるものはところどころ省いている箇所があるので、 keichanzahorumon/twitter4j · GitHubの方に完全版を上げました。

・Mainのクラス

public static void main(String[] args) {
    String methodName = args[0];
    TweetControler tweetControler = new TweetControler();

    // ツイートする
    if (methodName.equals("tweet")) {
        tweetControler.tweet(args[1]);
    }

    // 指定した文字列を含むツイートを検索する
    else if (methodName.equals("search")) {
        tweetControler.searchTweets(args[1]);
    }

    // 指定したユーザ名のツイートを取得する
    else if (methodName.equals("timeline")) {
        tweetControler.getTimeLine(args[1]);
    }
}


・ツイートする箇所

public void tweet(String message) {

    try {
        // accessToken がすでに有効な場合はエラー
        RequestToken requestToken = twitter.getOAuthRequestToken();
        
        System.out.println("Request token: " + requestToken.getToken());
        System.out.println("Request token secret: " + requestToken.getTokenSecret());
        
        AccessToken accessToken = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // PINが入力されるまで待ち
        while (accessToken == null) {
            System.out.println("以下のURLにアクセスして承認してくらさい。");
            System.out.println(requestToken.getAuthorizationURL());
            System.out.print("PINを入力して、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("accessToken の取得に失敗。。。");
                } else {
                    te.printStackTrace();
                }
            }
        }
        
        // ツイートする
        Status status = twitter.updateStatus(message);
        System.out.println("ツイートに成功 : [" + status.getText() + "].");
        System.exit(0);
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("OAuthトークンの取得に失敗: " + te.getMessage());
        System.exit(-1);
    } catch (IOException ioe) {
        ioe.printStackTrace();
        System.out.println("System input の取得に失敗。。。");
        System.exit(-1);
    }
}


・タイムラインを取得する箇所

// getTimeLineで何ページ目のツイートかを指定する。(1以上を指定)
private static final int PAGE_NUMBER = 1;

public void getTimeLine(String user) {
 
    try {
        // 指定したページ番号のタイムラインを取得
        ResponseList<Status> statuses = twitter.getUserTimeline(user, new Paging(PAGE_NUMBER));
            
        // 取得したタイムラインの数だけ出力
        for (Status status : statuses) {
            System.out.println(status.getCreatedAt() + "@" + status.getUser().getName() + "--" + status.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("指定したユーザのタイムラインの取得に失敗。。。");
        System.exit(-1);
    }    
}


 
・ツイートを検索する箇所

// searchTweetsで何ページ取得するかを指定する。
private static final int PAGE_COUNT = 1;

public void searchTweets(String queryString) {
    Query query = new Query(queryString);
    
    // 1ページ分の取得件数を指定
    query.setRpp(RETURN_PER_PAGE);
    
    for (int i = 1; i <= PAGE_COUNT; i++) {
        // ページ数を指定
        query.setPage(i);
        QueryResult result;
        try {
            // 検索
            result = twitter.search(query);
       
            // 検索結果の分だけ検索内容を出力
            for (Tweet tweet : result.getTweets()) {
                System.out.println(tweet.getText());
            }
        } catch (TwitterException te) {
            te.printStackTrace();
            System.out.println("指定した文字列での検索に失敗。。。");
            System.exit(-1);
        }
    }
}