Blog
Processing 2.0とTwitter4Jで、ProcessingからTweetしてみる
多摩美の授業で、Arduinoで取得したセンサーの値を、Processing経由でTwitterへ投稿するサンプルを作成する必要がありいろいろ調べてみた。昨年度は、Stewgateというプロキシを経由してやってみたのだけれど、できればProcessingで完結したい。というわけで調べてみた。
Processingのフォーラムで調べてみると、Twitter4JというJavaのライブラリを使うといいらしい。ただ、どうやってライブラリをProcessingに追加するかなどがいまいちあいまい… ということでまとめてみた。
まず、Twitter4Jのページから、最新版のライブラリをダウンロード。その中にあるlibフォルダ以下にある.jarファイルがProcessingで必要なものとなる。これらをまとめて、Processing側からLibraryとして認識されるよう”library.properties”などを記述。これでProcessingからLibraryとして認識されるはず。下記からProcessing用にまとめたものをダウンロードできます。
このZipファイルを解凍した”twitter4j”フォルダを、~/Document/Processing/libraries/ 以下にコピー。これで準備完了。
あとは、TwitterのDeveloper向けページで新規にアプリを作成し、”Consumer key”, “Consumer secret”, “Access token”, “Access token secret”をそれぞれ取得。また、Settingの項目の”Application Type”を”Read and Write”にしておくこと。
下記のテストコードで確認できます。画面をクリックすると、Tweetするはず。
import twitter4j.conf.*; import twitter4j.internal.async.*; import twitter4j.internal.org.json.*; import twitter4j.internal.logging.*; import twitter4j.http.*; import twitter4j.internal.util.*; import twitter4j.api.*; import twitter4j.util.*; import twitter4j.internal.http.*; import twitter4j.*; String msg = "Automatically posted from Processing"; String consumerKey = "xxxx"; String consumerSecret = "xxxx"; String accessToken = "xxxx"; String accessSecret = "xxxx"; Twitter myTwitter; int ms; color bg = color(0, 0, 0); void setup() { size(400, 400); frameRate(60); ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setOAuthConsumerKey(consumerKey); cb.setOAuthConsumerSecret(consumerSecret); cb.setOAuthAccessToken(accessToken); cb.setOAuthAccessTokenSecret(accessSecret); myTwitter = new TwitterFactory(cb.build()).getInstance(); } void draw() { background(bg); if (millis() - ms > 1000) { bg = color(0, 0, 0); } } void mousePressed() { try { Status st = myTwitter.updateStatus(msg + ", " + getDate()); println("Successfully updated the status to [" + st.getText() + "]."); ms = millis(); bg = color(0, 0, 255); } catch (TwitterException e) { println(e.getStatusCode()); bg = color(255, 0, 0); } } String getDate() { String monthStr, dayStr, hourStr, minuteStr, secondStr; if (month() < 10) { monthStr = "0" + month(); } else { monthStr = "" + month(); } if (day() < 10) { dayStr = "0" + day(); } else { dayStr = "" + day(); } if (hour() < 10) { hourStr = "0" + hour(); } else { hourStr = "" + hour(); } if (minute() < 10) { minuteStr = "0" + minute(); } else { minuteStr = "" + minute(); } if (second() < 10) { secondStr = "0" + second(); } else { secondStr = "" + second(); } return monthStr + "/" + dayStr + ", " + hourStr + ":" + minuteStr + ":" + secondStr; }
追記
Arduinoと連携して、3分に一度、周囲の環境情報(このサンプルでは照度と温度)をつぶやくサンプルつくったので、こちらも掲載。センサーは、ArduinoのAnalog In 0に、照度センサー(NJL7502L)の値を、Analog In 1に温度センサー(LM61BIZ)の値を入れてます。
こんな感じでつぶやくはず!!
Arduino側
void setup() { Serial.begin(9600); } void loop() { int in0 = analogRead(0); int in1 = analogRead(1); Serial.print(in0); Serial.print('\t'); Serial.println(in1); delay(180000); }
Processing側
import processing.serial.*; import twitter4j.conf.*; import twitter4j.internal.async.*; import twitter4j.internal.org.json.*; import twitter4j.internal.logging.*; import twitter4j.http.*; import twitter4j.internal.util.*; import twitter4j.api.*; import twitter4j.util.*; import twitter4j.internal.http.*; import twitter4j.*; String consumerKey = "xxxx"; String consumerSecret = "xxxx"; String accessToken = "xxxx"; String accessSecret = "xxxx"; Twitter myTwitter; Serial myPort; float illumi, tempr; int ms; color bg = color(0, 0, 0); void setup() { size(400, 400); frameRate(60); ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setOAuthConsumerKey(consumerKey); cb.setOAuthConsumerSecret(consumerSecret); cb.setOAuthAccessToken(accessToken); cb.setOAuthAccessTokenSecret(accessSecret); myTwitter = new TwitterFactory(cb.build()).getInstance(); myPort = new Serial(this, Serial.list()[0], 9600); myPort.bufferUntil('\n'); } void draw() { background(bg); if (millis() - ms > 1000) { bg = color(0, 0, 0); } } void tweetValue() { try { Status st = myTwitter.updateStatus("My room illumination is " + illumi + ", temprture is " + tempr + ", " + getDate()); println("Successfully updated the status to [" + st.getText() + "]."); ms = millis(); bg = color(0, 0, 255); } catch (TwitterException e) { println(e.getStatusCode()); bg = color(255, 0, 0); } } void serialEvent(Serial p) { String inString0 = myPort.readStringUntil('\t'); illumi = float(inString0); String inString1 = myPort.readStringUntil('\n'); tempr = float(inString1) * 500.0 /1024.0 -60.0; tweetValue(); } void mouseReleased() { tweetValue(); } String getDate() { String monthStr, dayStr, hourStr, minuteStr, secondStr; if (month() < 10) { monthStr = "0" + month(); } else { monthStr = "" + month(); } if (day() < 10) { dayStr = "0" + day(); } else { dayStr = "" + day(); } if (hour() < 10) { hourStr = "0" + hour(); } else { hourStr = "" + hour(); } if (minute() < 10) { minuteStr = "0" + minute(); } else { minuteStr = "" + minute(); } if (second() < 10) { secondStr = "0" + second(); } else { secondStr = "" + second(); } return monthStr + "/" + dayStr + ", " + hourStr + ":" + minuteStr + ":" + secondStr; }