yoppa.org


immediate bitwave

Blog

StewGate 1 (SG-1) を使用して、ProcessingからTwitterにつぶやいてみた

ちょっと授業でも必要なので、ProcessingからTwitterにメッセージを投稿する仕組みをつくってみた。備忘録として…

最初は、Twitter APIのJavaをでラッパーしたTwitter4Jを使用して、真面目にoAuth認証をしてTweetする仕組みを目指したのだが、認証の手続きのあまりの煩雑さに挫折…

困ってTwitterにつぶやいたら、@arms22 さんから耳寄りな情報が。StewGateというOAuth に対応していないクライアントから Twitter にアクセスするためのプロキシがあるらしい。早速これを採用してみた。

StewGateを使用するには、まずアクセスのためのトークンを発行してもらう必要がある。Twitterに自分のアカウントでログインした状態で、トークン発行のURLにアクセスしてトークンを取得しメモしておく。

次に、ProcessingからhttpサーバにPOSTする仕組みが必要となるのだが、フォーラムで調べたところ、下記の記事を発見。

HTTP post Processing

この最後の投稿を参考に簡単なサンプルを作成してみた。まず、準備として下記のJavaライブラリをダウンロードしておく。

http://hc.apache.org/httpclient-3.x/

次にProcessingのスケッチを新規に作成して、Sketch > Add File… を選択し先程ダウンロードしたhttpclientのフォルダの中にある「lib/httpcore-4.1.jar」を選択し、ファイルを追加しておく。マウスをクリックするとTweetします。

メインのスケッチ

TweetStewgate ts;
String token = "[取得したトークンを記入]";

void setup() {
  size(400, 400);
  ts = new TweetStewgate(token);
}

void draw() {
}

void mouseReleased() {
  ts.tweetMsg("hello hello");
}

TweetStewgate.pde

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

class TweetStewgate {
  String token;
  TweetStewgate(String _token) {
    token = _token;
  }

  void tweetMsg(String msg) {
    println("Tweet msg : " + msg);
    String url = "http://stewgate.appspot.com/sg1/post/";
    try {
      DefaultHttpClient httpClient = new DefaultHttpClient();

      HttpPost httpPost = new HttpPost( url );
      List nameValuePairs = new ArrayList(2);  
      nameValuePairs.add(new BasicNameValuePair("_t", token));
      nameValuePairs.add(new BasicNameValuePair("msg", msg));

      httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

      println( "executing request: " + httpPost.getRequestLine() );
      HttpResponse response = httpClient.execute( httpPost );
      HttpEntity entity = response.getEntity();

      println( response.getStatusLine() );

      if ( entity != null ) entity.writeTo( System.out );
      if ( entity != null ) entity.consumeContent();
      httpClient.getConnectionManager().shutdown();
    } 
    catch( Exception e ) { 
      e.printStackTrace();
    }
  }
}

コードを下記にアップしました。