twitter4j とか OAuth とか諸々

とりあえず、Basic 認証が使えない、という微妙な話があったので動作などを週末にかけてナニしてみます。

申し込み

http://twitter4j.org/ja/code-examples.html によれば

OAuth を利用するには http://twitter.com/oauth_clients/new で事前にアプリケーションを登録しておき consumer key, consumer secret を取得しておく必要があります。

との事にて適当な名前で申し込んでみたら、色々面倒臭いかと思ったら次の画面で Consumer Key とか Consumer secret とかの情報が頂けました。
ので、とりあえず、普通の java で試験してみます。パクッて以下。

import java.io.BufferedReader;
import java.io.InputStreamReader;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
import twitter4j.http.RequestToken;


public class TwitterOAuthSample {

	public static void main(String args[]) throws Exception{

		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer("[consumer key]", "[consumer secret]");
		RequestToken requestToken = twitter.getOAuthRequestToken();
		AccessToken accessToken = null;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while (null == accessToken) {
			System.out.println("Open the following URL and grant access to your account:");
			System.out.println(requestToken.getAuthorizationURL());
			System.out.print("Enter the PIN(if aviailable) or just hit enter.[PIN]:");
			String pin = br.readLine();
			try{
				if(pin.length() > 0){
					accessToken = twitter.getOAuthAccessToken(requestToken, pin);
				}else{
					accessToken = twitter.getOAuthAccessToken();
				}
			} catch (TwitterException te) {
				if(401 == te.getStatusCode()){
					System.out.println("Unable to get the access token.");
				}else{
					te.printStackTrace();
				}
			}
		}

		storeAccessToken(twitter.verifyCredentials().getId() , accessToken);
		Status status = twitter.updateStatus(args[0]);
		System.out.println("Successfully updated the status to [" + status.getText() + "].");
		System.exit(0);
	}
	private static void storeAccessToken(int useId, AccessToken accessToken){
		System.out.println(accessToken.getToken());
		System.out.println(accessToken.getTokenSecret());
	}

}

Customer Key および Customer Secret は今から修正して試験します。

試験してみた

起動したらコンソールに以下なソレが出力。

pen the following URL and grant access to your account:
http://api.twitter.com/oauth/authorize?oauth_token=BhYZw (以下略
Enter the PIN(if aviailable) or just hit enter.[PIN]:

で、ブラウザにて上記 URL にアクセスしてみたら認証しますか? 的な画面が出力されて、Allow を選択したら 7 桁の数字が出力。これを入力したら二つの文字列が出力された挙句例外を吐いて終了。
おそらくは以下のソレ

		Status status = twitter.updateStatus(args[0]);

プログラム起動する時に引数を仕込んでませんでした (わら
それは良いとして、これで AccessToken をげとできたので、もう一つのソレを試す。

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;


public class TwitterOAuthSample2 {

	@SuppressWarnings("deprecation")
	public static void main(String args[]) throws Exception{
		TwitterFactory factory = new TwitterFactory();
		Twitter twitter = factory.getInstance();
		twitter.setOAuthConsumer("fuga", "hoge");
		AccessToken accessToken = loadAccessToken();
		twitter.setOAuthAccessToken(accessToken);
		Status status = twitter.updateStatus("Hello World");
		System.out.println("Successfully updated the status to [" + status.getText() + "].");
		System.exit(0);
	}
	
	private static AccessToken loadAccessToken(){
		String token = "fuga"; // load from a persistent store
		String tokenSecret = "hoge"; // load from a persistent store
		return new AccessToken(token, tokenSecret);
	}
}

を、異なるプロセスだけど、一回認証できてれば AccessToken は使いマワし可能な模様。良かった。

と、思ったら

メイル返信後にリトライしてみたら TwitterException でオチますた。あまり微妙なコトをヤッてると投稿規制が入りそうで嫌だなぁ。再度試験してみたら再度オチた。
これ、別なアカウント取得して試験してみた方が良いな。

そりゃ良いのですが

アプリ起動する度に毎回この認証が必要なのであれば相当微妙。週末は台風らしいので (ry

あら?

これってなんかカン違いしてますな。しかも

        twitter.setOAuthAccessToken(accessToken);

が deplicate って何だそれ。と思ったらそうでも無いような話もあったり Eclipse 上では叱られますな。

と思ったら

以下なコンテンツを発見。

盛り込んで試験してみたんですが、以前取得した AccessToken では update できず。どうもやはりアプリ起動時に認証しつつ、タイムアウトする前に投稿しとかないと微妙な模様。

しかし

それでも timeout しやがったらもうどうにもならんな。仕方が無いので Android なコンテンツアプリに実装を仕込んでみる予定ですが、今日はもう限界orz