URLの扱いを確認しときたかったので。
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画面側(プレゼンテーション層)で置き換えてるってことなのかな???