Twitter APIをOAuth認証で利用する方法(Javaの場合)

追記:自分がつぶやければいいだけなら、Twitter4Jでつぶやく練習で紹介している方法が簡単です。

API Version 1.1に対応しました。

4862670849辻村浩『 Twitter API プログラミング』(ワークスコーポレーション, 2010)を読みました。形式について言うと、ソースコードが頻繁に折り返していて読みにくい(というかほとんど読めない)のがちょっと残念でした。内容について言うと、OAuth認証を利用する方法をもう少し具体的に書いた方がいいんじゃないかと思いました。OAuth認証は最初の関門なので、すべてのメジャーなプログラミング言語について、具体的な実装を載せておいてくれるととても便利だったはずです。

というわけで、OAuth認証を利用するクライアントの作り方を書いておきましょう。

まず、http://dev.twitter.com/appsでアプリケーションを登録し、Concumer keyとConsumer secretを取得します。登録とは言っても、この時点ではアプリケーションの実体はなくてもかまいません。

アプリケーションを利用するユーザごとに、以下の作業を行います。

  1. アプリケーションが認証用のURLを生成し、ユーザに提示する
  2. ユーザは、提示されたURLにアクセスする
  3. (ユーザは)そこで取得するPINをアプリケーションに送信(あるいは入力)する
  4. PINを受け取ったアプリケーションは、それを使ってAccess tokenとToken secretを作成し、記録する

1と3、4は自動化できますが(3にはコールバックを使う)、手動で行う場合は次のようになります(Commons Codecのcommons-codec-バージョン番号.jarとoauth-signpostのsignpost-core-バージョン番号.jarを利用可能にしておく必要があります)。

import java.io.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;
 
public class TokenCreator {
  public static void main(String[] args) throws Exception {
    // プロキシサーバの設定
    //System.setProperty("http.proxyHost", "proxy.example.net");
    //System.setProperty("http.proxyPort", "3128");
    //System.setProperty("https.proxyHost", "proxy.example.net");
    //System.setProperty("https.proxyPort", "3128");

    OAuthConsumer consumer = new DefaultOAuthConsumer(
        "***** Concumer key *****",
        "***** Consumer secret *****");
 
    OAuthProvider provider = new DefaultOAuthProvider(
        "https://api.twitter.com/oauth/request_token",
        "https://api.twitter.com/oauth/access_token",
        "https://api.twitter.com/oauth/authorize");
 
    String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
    System.out.println("このURLにアクセスし、表示されるPINを入力してください。");
    System.out.println(authUrl);
    System.out.print("PIN:");
 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String pin = br.readLine();
 
    provider.retrieveAccessToken(consumer, pin);
    System.out.println("Access token: " + consumer.getToken());
    System.out.println("Token secret: " + consumer.getTokenSecret());
  }
}

以上で準備は完了です。ここで紹介した方法では、ユーザがPINを手入力しなければなりません。手入力の代わりにTwitterからのコールバックを利用する方法を「OAuth認証でTwitterを利用するWebアプリケーション(Javaの場合)」で紹介するので参考にしてください。

いずれにしても、access tokenとtoken secretが得られれば、Twitter APIを使えます。たとえば、つぎのようなコードでつぶやけます。

import java.io.*;
import java.net.*;
import java.util.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;
import oauth.signpost.http.*;

/**
 * Twitterでつぶやくサンプル。
 */
public class StatusUpdate {

  public static void main(String[] args) throws Exception {
    // プロキシサーバの設定
    //System.setProperty("http.proxyHost", "proxy.example.net");
    //System.setProperty("http.proxyPort", "3128");
    //System.setProperty("https.proxyHost", "proxy.example.net");
    //System.setProperty("https.proxyPort", "3128");

    // これはユーザによらない
    OAuthConsumer consumer = new DefaultOAuthConsumer(
            ***** Consumer key *****,
            ***** Consumer secret *****);

    // これはユーザごとに異なる
    consumer.setTokenWithSecret(
            ***** Access token *****,
            ***** Token secret *****);

    // メッセージの作成
    String message = "テスト";
    //message = "@yabuki " + message; //返信の場合は先頭に"@宛先 "を付ける
    //message += " at " + (new Date()); //重複回避のために現在時刻を入れる
    message = URLEncoder.encode(message.toString(), "UTF-8").replace("+", "%20");

    // HTTPリクエスト
    URL url = new URL("https://api.twitter.com/1.1/statuses/update.json");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");

    // パラメータの設定
    HttpParameters hp = new HttpParameters();
    hp.put("status", message);
    //hp.put("in_reply_to_status_id", "156465092035215361"); //返信の場合は返信先のTweet IDを指定する
    consumer.setAdditionalParameters(hp);
    consumer.sign(connection);

    // POSTによる送信
    connection.setDoOutput(true);
    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write("status=" + message);
    //writer.write("&in_reply_to_status_id=" + "156465092035215361"); //返信の場合は返信先のTweet IDを指定する
    writer.flush();
    writer.close();

    // 結果の表示
    System.out.printf("%s %s\n", connection.getResponseCode(), connection.getResponseMessage());
    BufferedReader br = new BufferedReader(new InputStreamReader(
            connection.getResponseCode() == HttpURLConnection.HTTP_OK
            ? connection.getInputStream()
            : connection.getErrorStream(),
            "UTF-8"));
    String line = null;
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
  }
}

実は、「HTTPリクエスト」と「パラメータの設定」、「POSTによる送信」の部分は、以下の4行で代用できます。

URL url = new URL("https://api.twitter.com/1.1/statuses/update.json?status=" + message);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
consumer.sign(connection);

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。

4 thoughts on “Twitter APIをOAuth認証で利用する方法(Javaの場合)

  1. JavaでOAuthを使え!

    Twitterの普及とともに、サード・パーティのウェブサイトやアプリケーションから、Twitterに…

  2. ピンバック: DevQuiz for GDD : 2-legged OAuth (1) | もぐら王国

    • すいません,このあたりを更新する予定はありません。このブログ自体もTSLにしなければ

コメントは停止中です。