Twitter4J を用いた OAuth 認証
Sign in with your Twitter account | Twitter Developers にて予め consumer key と consumer secret を取得していることを前提とする.
参考にしたのは,以下のサイト:
といいますか,正直に申し上げると後者のサイトのパクリです.
Twitter4J 2.2.2 を利用した場合,consumer key 等の与え方が上記ページと異なっていたので,備忘録として書いておきます.
import java.io.*; import twitter4j.Twitter; import twitter4j.TwitterFactory; import twitter4j.TwitterException; import twitter4j.auth.RequestToken; import twitter4j.auth.AccessToken; import twitter4j.Status; public class TwitterLoginOAuth { public static void main(String[] args) { //コンシューマ・キーとコンシューマ・シークレット final String m_ConsumerKey = "consumer key"; final String m_ConsumerSecret = "consumer secret"; Twitter twitter; //アクセストークンの読み込み AccessToken accessToken = loadAccessToken(); //アクセストークンが既に保存されていれば,それを利用して //Twitter 認証を行う.さもなくば,アクセストークンを取りにいく. try { if(accessToken != null){ //自分のディレクトリに保存していた Access Token を利用する. twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(m_ConsumerKey, m_ConsumerSecret); twitter.setOAuthAccessToken(accessToken); } else { twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(m_ConsumerKey, m_ConsumerSecret); //アクセストークンの取得 accessToken = getOAuthAccessToken(twitter); //自分のディレクトリに Access Token を保存しておく storeAccessToken(accessToken); } //自分のステータスの更新(=ツイートの投稿) Status status = twitter.updateStatus(args[0]); System.out.println("Successfully updated the status to [" + status.getText() + "]."); } catch(Exception e){ System.err.println(e); System.exit(1); } } //アクセストークンの取得 static AccessToken getOAuthAccessToken(Twitter twitter){ RequestToken requestToken = null; AccessToken accessToken = null; try { //リクエストトークンの作成 //(メモ) アクセストークンを取得後,保存して再利用するならば // リクエストトークンの作成は1度きりでよい. requestToken = twitter.getOAuthRequestToken(); //ブラウザで Twitter 認証画面を表示するよう促し, // PIN コードを入力させ,アクセストークンを作成(取得)する 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(); } } } //while() } catch(Exception e){ e.printStackTrace(); System.exit(1); } return accessToken; } //アクセストークンの読み込み 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(); } } } } //アクセストークンの保存 private static void storeAccessToken(AccessToken accessToken){ //ファイル名の生成 File f = createAccessTokenFileName(); //親ディレクトリが存在しない場合,親ディレクトリを作る. File d = f.getParentFile(); if (!d.exists()) { d.mkdirs(); } //ファイルへの書き込み ObjectOutputStream os = null; try { os = new ObjectOutputStream(new FileOutputStream(f)); os.writeObject(accessToken); } catch (IOException e){ e.printStackTrace(); } finally { if(os != null){ try { os.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); } }