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 が記述されていないという複合的な要因だった。日本語の混じる処理って面倒だ。