前回の続きを見て行きましょう。今回は PIN コードを入力するフォームの作成や accessToken の取得など、大切なのは部分がいくつかあります。
- getPIN() 関数
PIN コードを入力するためのテキストフィールドを表示する関数です。また、入力された文字列を一時的に保存します。
void getPIN() { | |
setLayout(null); | |
background(0); | |
inputLine = new TextField("Enter your PIN code here."); | |
inputLine.setBounds(150, 30, 200, 20); | |
add(inputLine); | |
} |
setLayout で null を引数にすると、レイアウトマネージャが無効になります。これにより、手動で指定した位置にテキストフィールドを置けるようになります。new でテキストフィールドオブジェクトを生成して、setBounds で位置や大きさを決めます。入力された文字は、add で inputLine に加えていきます。
参考1:テキストを入力しよう参考2:Processing で日本語入力フォーム(Swingアプリケーション利用)
- マウスをクリックした時の処理
マウスをクリックした時の処理を書いています。ちょっと長いですが、ひとつずつ確認していきましょう。
void mouseClicked() { | |
if(mouseX > 100 && mouseX < 200 && mouseY > 200 && mouseY < 250) { | |
pin = inputLine.getText(); | |
println(pin); | |
try { | |
accessToken = twitter.getOAuthAccessToken(requestToken, pin); | |
aToken = accessToken.getToken(); | |
aSecret = accessToken.getTokenSecret(); | |
setProperties(); | |
for(int i = 0; i < 5; i++) getTimeline(i); | |
}catch(TwitterException te) { | |
if(401 == te.getStatusCode()) { | |
println("Unable to get the access token."); | |
te.printStackTrace(); | |
}else { | |
te.printStackTrace(); | |
} | |
} | |
} | |
} |
まずクリックの有効範囲を指定します。次に、inputLine に保持していた情報を String 型の変数 pin に代入し、この pin と requestToken を引数にして Twitter から accessToken を取得します。さらに accessToken オブジェクトから aToken と aSecret を取得しますが、この2つがはじめの変数の宣言で省略した accessToken, accessSecret に相当します。これで準備が整いました。setProperties() 関数でこれらの情報を使って Twitter にアクセスし、getTimeline() 関数でタイムラインの上位5つを画面に表示させます。今回も try - catch 構文を使いましょう。
- setProperties() 関数、getTimeline() 関数
これまでのエントリで見てきた処理と同じ内容です。
void setProperties() { | |
ConfigurationBuilder cb = new ConfigurationBuilder(); | |
cb.setOAuthConsumerKey(consumerKey); | |
cb.setOAuthConsumerSecret(consumerSecret); | |
cb.setOAuthAccessToken(aToken); | |
cb.setOAuthAccessTokenSecret(aSecret); | |
TwitterFactory tf = new TwitterFactory(cb.build()); | |
twitter = tf.getInstance(); | |
certification = true; | |
} | |
void getTimeline(int n) { | |
try { | |
statuses = twitter.getHomeTimeline(); | |
myTextarea = cp5.addTextarea( | |
"label: " + n, | |
statuses.get(n).getUser().getName() + "\n" + statuses.get(n).getText(), | |
30, 105+(100*n), 400, 80); | |
myTextarea.setColorBackground(color(120)); | |
myTextarea.setColor(color(255)); | |
myTextarea.setFont(createFont("Meiryo", 14)); | |
}catch(TwitterException e) { | |
print("Get timeline: " + e + " Status code: " + e.getStatusCode()); | |
} | |
} |
Twitter にアクセスできる状態になった場合は、certificatoin を true にしておきましょう。そうしなければ、OAuth 認証が成功しても、draw() 関数で設定した認証ボタンがそのまま描写され続けてしまいます。その他に変更点はありません。
- すべてのコード
import twitter4j.*; | |
import java.util.List; | |
import java.awt.*; | |
import controlP5.*; | |
String consumerKey = "xxxxxx"; | |
String consumerSecret = "xxxxxx"; | |
Twitter twitter; | |
ControlP5 cp5; | |
Textarea myTextarea; | |
List<Status> statuses = null; | |
PImage BT1, BT2; | |
boolean certification = false; | |
boolean iterations = true; | |
boolean displayGUI = true; | |
TextField inputLine; | |
String pin = ""; | |
String url; | |
String aToken, aSecret; | |
RequestToken requestToken; | |
AccessToken accessToken; | |
void setup(){ | |
size(480, 640); | |
cp5 = new ControlP5(this); | |
BT1 = loadImage("ok.png"); | |
BT2 = loadImage("ok_.png"); | |
doOAuth(); | |
} | |
void draw() { | |
background(0); | |
if(!certification) { | |
image(BT1, 200, 200); | |
if(mouseX > 100 && mouseX < 200 && mouseY > 200 && mouseY < 250) { | |
image(BT2, 200, 200); | |
} | |
if(displayGUI) { | |
getPIN(); | |
displayGUI = false; | |
} | |
} | |
} | |
void doOAuth() { | |
twitter = TwitterFactory.getSingleton(); | |
twitter.setOAuthConsumer(consumerKey, consumerSecret); | |
accessToken = null; | |
try { | |
requestToken = twitter.getOAuthRequestToken(); | |
} catch(TwitterException e) { | |
e.printStackTrace(); | |
} | |
if(iterations) { | |
url = requestToken.getAuthorizationURL(); | |
link(url); | |
} | |
iterations = false; | |
} | |
void getPIN() { | |
setLayout(null); | |
background(0); | |
inputLine = new TextField("Enter your PIN code here."); | |
inputLine.setBounds(150, 30, 200, 20); | |
add(inputLine); | |
} | |
void mouseClicked() { | |
if(mouseX > 100 && mouseX < 200 && mouseY > 200 && mouseY < 250) { | |
pin = inputLine.getText(); | |
try { | |
accessToken = twitter.getOAuthAccessToken(requestToken, pin); | |
aToken = accessToken.getToken(); | |
aSecret = accessToken.getTokenSecret(); | |
setProperties(); | |
for(int i = 0; i < 5; i++) getTimeline(i); | |
}catch(TwitterException te) { | |
if(401 == te.getStatusCode()) { | |
println("Unable to get the access token."); | |
te.printStackTrace(); | |
}else { | |
te.printStackTrace(); | |
} | |
} | |
} | |
} | |
void setProperties() { | |
ConfigurationBuilder cb = new ConfigurationBuilder(); | |
cb.setOAuthConsumerKey(consumerKey); | |
cb.setOAuthConsumerSecret(consumerSecret); | |
cb.setOAuthAccessToken(aToken); | |
cb.setOAuthAccessTokenSecret(aSecret); | |
TwitterFactory tf = new TwitterFactory(cb.build()); | |
twitter = tf.getInstance(); | |
certification = true; | |
} | |
void getTimeline(int n) { | |
try { | |
statuses = twitter.getHomeTimeline(); | |
myTextarea = cp5.addTextarea( | |
"label: " + n, | |
statuses.get(n).getUser().getName() + "\n" + statuses.get(n).getText(), | |
30, 105+(100*n), 400, 80); | |
myTextarea.setColorBackground(color(120)); | |
myTextarea.setColor(color(255)); | |
myTextarea.setFont(createFont("Meiryo", 14)); | |
} | |
catch(TwitterException e) { | |
print("Get timeline: " + e + " Status code: " + e.getStatusCode()); | |
} | |
} |
長くなりましたが、全体としてはこんな感じです。createWriter() や createReader() を使うと Twitter へのアクセス権を保存でき、次回から PIN コードの入略を省略することも可能になります。興味のある人は挑戦してみてください。