yoppa.org


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するはず。

[code language=”cpp”]
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;
}
[/code]

追記

Arduinoと連携して、3分に一度、周囲の環境情報(このサンプルでは照度と温度)をつぶやくサンプルつくったので、こちらも掲載。センサーは、ArduinoのAnalog In 0に、照度センサー(NJL7502L)の値を、Analog In 1に温度センサー(LM61BIZ)の値を入れてます。

こんな感じでつぶやくはず!!

Arduino側

[code language=”cpp”]
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);
}
[/code]

Processing側

[code language=”cpp”]
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;
}
[/code]