twitterStreaming API + OAuth with Twitter4J 2.2.5-SNAPSHOT
OAuth 認証にて Twitter Streaming API を利用するプログラム例。
import java.io.*;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.TwitterException;
import twitter4j.StatusListener;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.auth.AccessToken;
import twitter4j.json.DataObjectFactory;
public class TwitterStreamingOAuth {
static TwitterStream authentication(){
//コンシューマ・キーとコンシューマ・シークレット
final String m_ConsumerKey = "consumer key";
final String m_ConsumerSecret = "consumer secret";
//アクセストークンの読み込み
AccessToken accessToken = loadAccessToken();
if(accessToken == null){ return null; }
TwitterStream twitterStream = null;
try {
//raw JSONを取得するため、setJSONStoreEnabled(true) を設定
Configuration conf = new ConfigurationBuilder().setJSONStoreEnabled(true).build();
//TwitterStream オブジェクトの生成
twitterStream = new TwitterStreamFactory(conf).getInstance();
//自分のディレクトリに保存していた Access Token を利用する.
twitterStream.setOAuthConsumer(m_ConsumerKey, m_ConsumerSecret);
twitterStream.setOAuthAccessToken(accessToken);
} catch(Exception e){
e.printStackTrace();
}
return twitter;
}
//アクセストークンの読み込み
private static AccessToken loadAccessToken(){
File f = createAccessTokenFileName();
ObjectInputStream is = null;
try {
is = new ObjectInputStream(new FileInputStream(f));
AccessToken accessToken = (AccessToken) is.readObject();
return accessToken;
} catch (IOException e) {
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// アクセストークンを保存するファイル名を生成する
static File createAccessTokenFileName() {
// (メモ) System.getProperty("user.home") の返し値は
// ホームディレクトリの絶対パス
String s = System.getProperty("user.home") + "/.twitter/client/sample/accessToken.dat";
return new File(s);
}
public static void main(String[] args) {
//Streaming API のためのリスナ
StatusListener listener = new StatusListener(){
public void onStatus(Status status) {
//一般には Text がとれれば十分でしょ 。
//System.out.println(status.getUser().getName() + " : " + status.getText());
//Status を raw JSON へ変換
String json = DataObjectFactory.getRawJSON(status);
System.out.println(json);
}
public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {}
public void onScrubGeo(long userId, long upToStatusId){}
public void onTrackLimitationNotice(int numberOfLimitedStatuses) {}
public void onException(Exception e) { e.printStackTrace(); }
};
//認証 & TwitterStream の取得
TwitterStream twitterStream = authentication();
//リスナ登録
twitterStream.addListener(listener);
//Streaming API のリスニング開始
//取得したステータスの処理は listener#onStatus() で行う。
twitterStream.sample();
}
}(2011.10.03追記)System.out.println() の出力をリダイレクトしたら,日本語を含む多バイト文字が読めなかった.文字が化ける原因は,上記のプログラムを shell script 中で呼び出している点およびその中で export LANG=ja_JP.UTF-8 が記述されていないという複合的な要因だった。日本語の混じる処理って面倒だ。