S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

Twitter4Jを使ってみる

URLの扱いを確認しときたかったので。

必要なもの

JavaとTwitter4JとEclipseがあればOK。
プロジェクトを作って、クラスパスにTwitter4Jのjarを追加。

Twitterにアプリケーションを登録

Twitter Developersでアプリケーションを登録します(Create an appをクリック)。
名前も説明もWebサイトのURLも後で、設定画面(My applicationsのSettings)で変更できますので適当に入力しときます。
Webアプリじゃないので、必須項目の「WebSite」はダミー(https://twitter.com/)を入力しときます。
これで、My applicationsで「Consumer key」「Consumer secret」「Access token」「Access level」が確認できます。
設定画面では、アクセスレベル(作成時は「Read only」)やアイコン画像などの変更もできます。

twitter4j.propertiesの作成

twitter4j.propertiesをクラスパス上に作成します。
登録したアプリケーションのOAuth情報とHTTPSの設定を追加しときます。

debug=true
oauth.consumerKey=*********************
oauth.consumerSecret=******************************************
oauth.accessToken=**************************************************
oauth.accessTokenSecret=******************************************
http.useSSL=true

後はコードを書いて実行

import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.URLEntity;

public class TwitterTrial {

  public static void main(String[] args) {
    // Twitterのインスタンスを取得(twitter4j.propertiesの設定でオブジェクトが取得できる)
    Twitter tw = new TwitterFactory().getInstance();
    try {
      // Twitterからホームのタイムライン(ステータスのリスト[20件])を取得する
      ResponseList<Status> statusList = tw.getHomeTimeline();
      for (Status status : statusList) {
        // StatusのID、ツイート日時、ユーザの表示名を表示する
        System.out.println(status.getId() + "\t" + status.getCreatedAt() + "\t" + status.getUser().getScreenName());
        // Statusのツイートを表示する
        System.out.println("\t" + status.getText());
        }
      }
    } catch  (Throwable t) {
      t.printStackTrace();
    }
  }
}
193813348691869697	Sun Apr 22 06:27:57 JST 2012	S_a_k_U
	さてどうなるかな? http://t.co/dmz44Dpq http://t.co/tv87WiAd
…

あら?Twitterの画面とURLの見え方が違うなぁ〜

URLの扱いを確認

import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.URLEntity;

public class TwitterTrial2 {

  public static void main(String[] args) {
    // Twitterのインスタンスを取得(twitter4j.propertiesの設定でオブジェクトが取得できる)
    Twitter tw = new TwitterFactory().getInstance();
    try {
      // Twitterから特定のIDのステータスを取得する
      Status status = tw.showStatus(193813348691869697L);
      // StatusのID、ツイート日時、ユーザの表示名を表示する
      System.out.println(status.getId() + "\t" + status.getCreatedAt() + "\t" + status.getUser().getScreenName());
      // Statusのツイートを表示する
      System.out.println("\t" + status.getText());
      int i = 0;
      // Statusが持っているURLの情報を表示する
      for (URLEntity urlentity : status.getURLEntities()) {
        i++;
        System.out.println( "\t"  + "[URL-" + i + "]" + urlentity.getDisplayURL());
        System.out.println( "\t"  + "[URL-" + i + "]" + urlentity.getExpandedURL());
        System.out.println( "\t"  + "[URL-" + i + "]" + urlentity.getURL().toString());
      }
    } catch  (Throwable t) {
      t.printStackTrace();
    }
  }
}
193813348691869697	Sun Apr 22 06:27:57 JST 2012	S_a_k_U
	さてどうなるかな? http://t.co/dmz44Dpq http://t.co/tv87WiAd
	[URL-1]d.hatena.ne.jp/S_a_k_U/
	[URL-1]http://d.hatena.ne.jp/S_a_k_U/
	[URL-1]http://t.co/dmz44Dpq
	[URL-2]google.co.jp/search?q=%E3%8…
	[URL-2]http://www.google.co.jp/search?q=%E3%81%86%E3%83%BC%E3%81%AB%E3%82%83%E3%83%BC&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
	[URL-2]http://t.co/tv87WiAd

ほほう〜

Status.getText() ステータスのテキスト t.coの短縮URL
URLEntity.getDisplayURL() URL要素の表示URL Web画面に表示されるURL(文字列)
URLEntity.getExpandedURL() URL要素の元URL ツイートした時に入力したURL
URLEntity.getURL().toString() URL要素のURL t.coの短縮URL

多分Twitter内部では、ツイートのURLはt.coの短縮URLで保持していると見える。
APIがステータス(Status)とURL要素(URLEntity)を返すときに、t.coから「ツイートした時に入力したURL」を取得して、「Web画面に表示されるURL(文字列)」を生成して、URL要素(URLEntity)に設定しているような動作をしているっぽい?
Web画面に表示されるURL(文字列)でのツイートのテキストがTwitter4JのAPIで取得できない所をみると、Web画面側(プレゼンテーション層)で置き換えてるってことなのかな???