マエカワの備忘録的な何か

思い立ったが吉日

JAVAでTwitterを動かしたい

はじめに

 この記事は、結構前に投稿した記事
maekawa-yoshimiki-1119.hatenablog.com
で参照したブログがなぜかなくなってしまっていたことを受けて、「せっかくだしもう一回復習しとくか!!」と書き始めたものになります。
 使用言語はJAVAで、eclipseを使います。また、Twitter4JAPIをたたいていこうと思っている所存でございまし。
 今回は、導入の仕方やTwitter Application Managementでの鍵の取得方法など、詳細な部分まで書き留めていこうと思っているので、よければお付き合いのほどよろしくお願いいたします。

本題へ

Twitter Application Managementへの登録

 Twitterを動かすために必要になってくる既存アカウントの登録を行っていきます。作業用の鍵垢を新しく作って進めていくのが無難です。使用するのはTwitter Application Managementというもの。以下のリンクから飛ぶことができます。
apps.twitter.com
 登録は簡単。

  1. 右上のsign inからTwitterアカウントにログイン
  2. 「Create New App」をクリック
  3. 「アプリケーション名」「概要」「webサイト」を入力。規約に同意して「Create your Twitter application」をクリック

 これで、Twitterアカウントをアプリケーションという形で運用することができるようになりました。

鍵とアクセストークンの取得

 アカウントを登録できたとはいえ、このままでは使えません。なので、使えるようにするために必要なものを取りに行きます。上のタブにある「Keys and Access Tokens」をクリック
 出てきたページには「Consumer Key」と「Consumer Secret」が表示されていますが、これはとりあえず置いといて、ページの下あたりにある「Create Access Tokens」みたいなボタンをクリックします。
 これで、アカウントをTwitter4Jで動かすために必要な鍵とアクセストークンの取得は完了です。

Twitter4Jのダウンロード・パス通し

 ここで、今回Twitterアカウントを動かす要となるライブラリ、Twitter4Jのダウンロードおよび、eclipseへのビルトインパス通しをやっていきます。
 まず、以下のリンクへ飛びます。
http://twitter4j.org/ja/index.html

  1. 「ダウンロード」セクションにある最新安定バージョンをダウンロード
  2. ダウンロードしたzipファイルを適当なディレクトリに解凍

 これで、ダウンロードはおしまい。次に、eclipseへのパス通しをしていきます。

  1. 例のごとくeclipseの「プロジェクトを右クリック」→「プロパティ」→「ビルトインパス」に移動する
  2. 「外部JARを追加」でTwitter4Jフォルダのlibディレクトリにある5個のjarファイルを選択する
  3. 適用してウィンドウを閉じる

 これでeclipseへのパス通しは完了です。簡単でしょ。ここまでしたら、Twitter4Jを使ったコードがエラーをはかなくなります。コンパイルはできるといったところでしょうか。

twitter.propertiesを作成する

 登録アカウントと同期させるために、先ほどTwitter Application Managementで取得した鍵とトークンをtwitter.propertiesというファイル名で保存していきます。
 ひな型はこちら

debug=true
oauth.consumerKey=xxxxxxxxxxxxxxxxxxxxx
oauth.consumerSecret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
oauth.accessToken=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
oauth.accessTokenSecret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 xxxx…のところにそれぞれの鍵なりトークンなりをコピペしていきます。1行目ではデフォルトでfalseになっているデバック機能をtrueに変更しています(;などは必要ありません)。
 ここまでやって、初めて登録アカウントを操作することができます。

実際にコードを書いてみる

 ここから先の話はTwitter4Jのサイト(http://twitter4j.org/ja/code-examples.html)に載っていることをちょっとまとめたものになりますので、より詳しく知りたい方はそちらへお願いします。

Twitterインスタンスを取得する

 投稿、取得などなどを色々するにはTwitter4JのTwitterクラスのインスタンスをTwitterFactoryクラスで生成する必要があります。まずはそこから。

  Twitter twitter=new TwitterFactory().getInstance();

これでおっけい。

文字ツイートの投稿

 基本的にツイートを行う際は

  1. StatusUpdateクラスにツイート内容を登録
  2. TwitterクラスのupdateStatusメソッドでツイートを投稿

という流れを取っていきます。
 文字の投稿内容はStatusUpdateの引数として設定することができますので、ここではそれをやっていきます。

import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

class TextTweet{
  public static void main (String[] args) throws IOException{
    try{
      String tweetString = "Hello World !"; //ツイートしたい文字列

      /*インスタンスの生成*/
      Twitter twitter = new TwitterFactory().getInstance();

      /*updateの生成 これに内容を登録していく*/
      /*引数でtwitterStringを登録している*/
      StatusUpdate update = new StatusUpdate(tweetString);

      /*ツイートの投稿*/
      Status status = twitter.updateStatus(update);

    }catch(TwitterException e){
      e.printStackTrace();
    }
  }
}

 これで投稿完了です。Twitter4Jのクラスを使用する場合、TwitterExceptionっていう例外が出る可能性があるので、try文またはthrowsでの処理を書き足す必要が出てきます。まぁ、eclipseは賢いので、ここら辺もエラーとして教えてくれます。

画像ツイートの投稿

 文字だけの投稿ではTwitterではありません。画像も投稿したい!!ということで、やっていきましょう。画像を投稿する方法は確認したところ二つ。

  1. StatusUpdateクラスのmediaメソッド、setMediaメソッドで画像をファイルの形で登録する
  2. UploadedMediaクラスのインスタンスTwitterクラスのuploadMediaメソッドで画像をファイルの形で登録し、StatusUpdateクラスのsetMediaIdsで画像のIDを登録する

といっても何が何だかわからないので、実際書いていきます。まずは1の方法。

/*1の方法*/

import java.io.File();

import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

class ImageTweet1{
  public static void main (String[] args) throws IOException{
    try{
      String tweetString = ""; //今回は文字は指定しません。

      /*インスタンスの生成*/
      Twitter twitter = new TwitterFactory().getInstance();
      /*updateの生成 これに内容を登録していく*/
      StatusUpdate update = new StatusUpdate(tweetString);

      File file = new File("画像ファイルのpath");
      update.media(file);
      /*
      update.setMedia(file);
      */

      /*ツイートの投稿*/
      Status status = twitter.updateStatus(update);

    }catch(TwitterException e){
      e.printStackTrace();
    }
  }
}

 24行目でコメントアウトしているsetMediaメソッドををmediaメソッドの代わりに使ってもちゃんと動きます。
 ファイルシステムからパス取得、toFile()でファイル変換して変数fileに入れるという方法もほかのサイトで見ましたので加えて書いておきます。

import java.nio.FileSystem;
import java.nio.FileSystems;
import java.nio.Path;

/*省略*/
    FileSystem fs = FileSystems.getDefault();
    Path path = fs.getPath();
    File file = path.toFile();
    update.media(file);
/*省略*/

 この、media、setMediaメソッドを使った方法は楽なんですが、画像が1枚しか登録できません…(自分の検索能力では見つけられませんでした。知っている人がいるならぜひ教えてください…)。
 お次は2の方法を書いていきます。

/*2の方法*/

import java.io.File();

import twitter4j.Status;
import twitter4j.StatusUpdate;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.UploadedMedia;

class ImageTweet2{
  public static void main (String[] args) throws IOException{
    try{
      String tweetString = ""; //今回は文字は指定しません。

      /*インスタンスの生成*/
      Twitter twitter = new TwitterFactory().getInstance();
      /*updateの生成 これに内容を登録していく*/
      StatusUpdate update = new StatusUpdate(tweetString);

      /*画像データをファイル形式で取得*/
      File file1 = new File("画像のpath");
      File file2 = new File("画像のpath");

      /*UploadedMediaインスタンスの生成*/
      UploadedMedia media1 = twitter.uploadMedia(file1);
      UploadedMedia media2 = twitter.uploadMedia(file2);

      /*メディアIDの登録*/
      update.setMediaIds(new long {media1.getMediaId() , media2.getMediaId()});

      /*ツイートの投稿*/
      Status status = twitter.updateStatus(update);

    }catch(TwitterException e){
      e.printStackTrace();
    }
  }
}

 このプログラムでは、MediaIdを複数個updateに登録することで、複数画像の投稿を実現しています。また、31行目の波かっこの中に1つのMediaIdを入れたときは投稿された画像は1つ、4つ以上のMediaIdを入れてしまうとエラーを吐いて処理が中断しました。
 もちろん、この方法でもファイルシステムからのファイル取得は可能です。
 ここまで画像ツイートについてやってきましたが、複数画像を投稿できる2の方法を利用したほうが便利そうです。

タイムラインの取得

 自分のタイムラインの取得もできる。TwitterクラスのgetHomeTimelinメソッドで取得していきます。取得する際はStatusの形でListに保存します。
 取得できるツイート数はデフォルトで20個となっていますが、今回のコードではPagingを用いて50個取得できるようにしてあります。以下ソースコードです。

import twitter4j.Paging;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

class GetTimeLine{
  public static void main(String[] args){
    /*インスタンスの取得*/
    Twitter twitter=new TwitterFactory().getInstance();

    /*タイムラインの取得のオプションを設定*/
    Paging page=new Paging();
    /*取得数の設定 上限は200*/
    page.setCount(50);
    /*タイムラインの取得 オプションを適用するにはPagingを引数にする*/
    List<Status> statuses=twitter.gettHomeTimeline(page);

    /*拡張for文で書き出してます*/
    for(Status status:statuses){
      /*getNameはアカウント名 getScreenNameはid getTextは本文*/
      System.out.println(status.getUser().getName()
              +"(@"+status.getUser().getScreenName()+")\n"+status.getText()+"\n");
    }
  }
}

 実際に取得してみて気づいたんですが、プロモーションツイートが引っかかってこないんですね、これ。ちょっとしたTL閲覧ツールができるかもしれないです。

最後に

 長くなってしまいましたが、ここまでTwitter4Jの導入から簡単なアカウントの操作方法を書いてきました。やっぱりドキュメント読んで書いていくのは大変だなぁ…と感じる次第です。
 自分はこれから、AndroidアプリケーションとTwitterをこのライブラリを使って連携させてみたいなぁと考えていたり、複数アカウントで同時投稿とかできたらいいかなぁなんて考えていますので、モノができたらまた記事にしようかと思います。
 とにかく、この記事はあくまで覚書として。導入で困っている人の助けになってほしいものです。
 
 読んでくださった方に感謝を。
 それでは。