javaからtwitter APIを叩いて、あるユーザーのuser_timelineを取得してみる。

 




今更ですが、twitter APIを利用して、あるユーザーのツイートを集めてみるサンプルを作ってみました。
その時にはまったことがあるのでいくつか書ければと思います。
 

あるユーザーのtwitter発言を取得する流れを考えてみる

 
普通に考えたらREST APIを叩くことによって、発言を取得できるものだと思ってました。

  1. user_timelineのREST APIを調べる
  2. user_timelineを実行後、どんなデータが戻されるか確認する(xml,jsonなど)
  3. 適当にクライアントプログラムでパースして表示する

安易に2〜3時間でできると思ったら、結構時間が掛かりました。
 

twitter.com/statuses/user_timeline/screen_name.xml」でデータが取得できるものだと思っていた。

 
Googleで検索していると「twitter.com/statuses/user_timeline」みたいな感じで外部 API
呼び出している人がいたので、そのまま真似をして取得してみました。
(多分、古い記事だったんだと思います。)

サンプルは、こんなイメージです。
 

  import java.net.URL;
  import java.net.HttpURLConnection;
  
  String apiUrl = "http://twitter.com/statuses/user_timeline/screen_name.xml"
  URL connectUrl = new URL(apiUrl);
  HttpURLConnection con = (HttpURLConnection)connectUrl.openConnection();

  con.setRequestMethod("GET");
  con.setDoOutput(true);
  con.setInstanceFollowRedirects(true);

  System.out.println("レスポンスヘッダ:");
  System.out.println("レスポンスコード[" + con.getResponseCode() + "] " +
            "レスポンスメッセージ[" + con.getResponseMessage() + "]");

 
レスポンスが、
 「レスポンスコード[200] レスポンスメッセージ[OK]」
となれば良いのですが、
 「レスポンスコード[400] レスポンスメッセージ[Bad Request]」
となりなかなかうまく通信できませんでした。
 
いろいろページを参照していると、1時間に150回くらいアクセス
できそうなのですが、稀に一回だけしかアクセスできない。

他にREST用のAPIがあるものと思い、探してみると「api.twitter.com」という
ドメインを発見しました。

twitter development「GET statuses/user_timeline」
 

api.twitter.com/1/statuses/user_timeline.json?screen_name={screen_name}」でデータが取得できるものだと思っていた。

 
API用のURIを書き換えて、再出発してみました。
 

  String apiUrl = "http://api.twitter.com/1/statuses/user_timeline.json?screen_name={screen_name}"
  URL connectUrl = new URL(apiUrl);
  HttpURLConnection con = (HttpURLConnection)connectUrl.openConnection();

  con.setRequestMethod("GET");
  con.setDoOutput(true);
  con.setInstanceFollowRedirects(true);

  System.out.println("レスポンスヘッダ:");
  System.out.println("レスポンスコード[" + con.getResponseCode() + "] " +
            "レスポンスメッセージ[" + con.getResponseMessage() + "]");

 
twitter.com」でアクセスしてたときより、きちんとデータが取得できた
と思いきややはり、下記のエラーがでてしまいました。

「レスポンスコード[400] レスポンスメッセージ[Bad Request]」

もしや、GETする場合も「OAuth」が必要かと思い、リクエスト発行時にOAuth認証
付属させてみました。
 

再度、あるユーザーのtwitter発言を取得する流れを考えてみる

  1. user_timelineのREST APIを調べる 「api.twitter.com/1/statuses/user_timeline.json?screen_name={screen_name}」
  2. API発行時に、OAuth認証を実施する
  3. user_timelineを実行後、どんなデータが戻されるか確認する(xml,jsonなど)
  4. 適当にクライアントプログラムでパースして表示する

すると、「レスポンスコード[200] レスポンスメッセージ[OK]」という感じで、無事、user_timelineのデータを
取得することができました。