2013年10月26日

最近、processingでTwitterと連動した作品をつくったので
一部のプログラムをメモ。
それとあまりネット上でprocessingとTwitterについて書いている人が
少なかったので。
主に特定のワードが含まれているツイートを検索して
その人のツイートを使ってあれこれしようというもの。



まずprocessingでTwitterを使うための準備として
Twitter4jというライブラリは必要不可欠
その辺のアレについてはこちらで多摩美の田所先生が丁寧に解説
してくれているのでここからライブラリをDLする。
http://yoppa.org/blog/3972.html

ただこのtwitter4jは若干古いやつなので
本家のサイトからもtwitter4jをDLして
http://twitter4j.org/ja/index.html#download
twitter4j-3.0.4>>libの中に入っている5つの.jarの拡張子のファイルを
先ほどDLしたprocessing用のライブラリに入っている古いバージョンのやつと
入れ替えておいた方がいいかも。

簡単に言うとライブラリの中身を
twitter4j-async-3.0.4.jar
twitter4j-core-3.0.4.jar
twitter4j-examples-3.0.4.jar
twitter4j-media-support-3.0.4.jar
twitter4j-stream-3.0.4.jar
twitter4j.jar
こうする

あとはデベロッパーページで新しくアプリを作成して
”Consumer key”, “Consumer secret”, “Access token”, “Access token secret”
を取得する。
これについてはweb上に腐る程詳しく書いてるページあると思うので省略

それではここからprocessingでツイートを検索するソースを載せてー
適当にメモしますー。

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.*;
 
Twitter twitter;
Query query = null;
QueryResult queryResult = null;
String queryWord = "#XXXXXX";       //検索ワード
String resultWord = " ";      //検索したツイートを格納するところ
PImage icon = null;           //その人のイメージ画像
String username = null;       //user name
 
PFont font = createFont("MS Gosic", 20);
int count=0;
 
String consumerKey = "******";
String consumerSecret = "******";
String accessToken = "******-******";
String accessSecret = "******";
 
void setup(){
  size(1000, 700);
  frameRate(30);
 
  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setOAuthConsumerKey(consumerKey);
  cb.setOAuthConsumerSecret(consumerSecret);
  cb.setOAuthAccessToken(accessToken);
  cb.setOAuthAccessTokenSecret(accessSecret);
 
  twitter = new TwitterFactory(cb.build()).getInstance();
  query = new Query(queryWord);
  //ここの数を変えると上から何個目を検索するかが選べる
  query.count(1);
 
}
 
void draw(){
  background(255);
  //●秒に一回ツイートを検索、読み込み
  if(count%900 == 0){
    try{
      queryResult = twitter.search(query);
    }
    catch(TwitterException e){
      println(e.getStatusCode());
    }
    if(queryResult != null){
      for(Status status:queryResult.getTweets()){
        resultWord = status.getText();                                             //tweet
        icon = loadImage(status.getUser().getOriginalProfileImageURL(), "png");    //image
        username = status.getUser().getScreenName();                               //nameをここで取得
      }
    }
    count = 0;
  }
 
  //名前、ツイートを描画
  textFont(font);
  fill(0);
  textSize(10);
  text(username, 0, 100);
  textSize(20);
  text(resultWord, 0, 150);
  image(icon, 0, 0, 50, 50);
 
  count++;
}



このプログラムは特定のワードで今一番トップにあるツイートを引っ張ってきて
アイコン、スクリーンネーム、ツイートを表示するだけのもの
900/framerate秒に一回検索をし、それぞれを取得していく。

このtwitter4jというライブラリは元のJavaDocを読むとかなり
いろんなことができるみたいですごく面白かった。
例えばstatusというクラス?にはいろんなメソッド?があって(詳しい用語はわからない)
今回はツイートを取得するgetText() と
イメージを取得するgetUser().getOriginalProfileImageURL() と
ユーザー名を取得するgetUser().getScreenName()
しか使ってないけれど
どれだけふぁぼをもらっているかgetFavoriteCount()、
それはRetweetのものなのかisRetweet()
などいろいろ遊べそうである。

それを応用してこんなプログラムもさくっと書いてみました。
検索の一番上にあった人にリプライをおくるプログラムです。

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.*;
 
Twitter twitter;
Query query = null;
QueryResult queryResult = null;
String queryWord = "#XXXXX";       //検索ワード
String resultWord = " ";      //検索したツイートを格納するところ
String oldWord = " ";         //以前のツイートと比較する用の変数
PImage icon = null;           //その人のイメージ画像
String username = null;       //user name
long statusid;                //status id
 
PFont font = createFont("MS Gosic", 20);
int count=0;
 
String consumerKey = "******";
String consumerSecret = "******";
String accessToken = "******-******";
String accessSecret = "******";
 
void setup(){
  size(1000, 700);
  frameRate(30);
 
  ConfigurationBuilder cb = new ConfigurationBuilder();
  cb.setOAuthConsumerKey(consumerKey);
  cb.setOAuthConsumerSecret(consumerSecret);
  cb.setOAuthAccessToken(accessToken);
  cb.setOAuthAccessTokenSecret(accessSecret);
 
  twitter = new TwitterFactory(cb.build()).getInstance();
  query = new Query(queryWord);
  //ここの数を変えると上から何個目を検索するかが選べる
  query.count(1);
 
}
 
void draw(){
  background(255);
  oldWord = new String(resultWord);
  //●秒に一回ツイートを検索、読み込み
  if(count%900 == 0){
 
    try{
      queryResult = twitter.search(query);
    }
    catch(TwitterException e){
      println(e.getStatusCode());
    }
    if(queryResult != null){
      for(Status status:queryResult.getTweets()){
        resultWord = status.getText();
        icon = loadImage(status.getUser().getOriginalProfileImageURL(), "png");
        username = status.getUser().getScreenName();
        statusid = status.getId();
      }
    }
    count = 0;
  }
 
  //ツイートを比較、新しくなった場合はtweet
  if(resultWord.equals(oldWord) == false){
    //引数はスクリーンネームとステイタスID
    tweetPost(username, statusid);
  }
 
  //名前、ツイートを描画
  textFont(font);
  fill(0);
  textSize(10);
  text(username, 0, 100);
  textSize(20);
  text(resultWord, 0, 150);
  image(icon, 0, 0, 50, 50);
 
  count++;
}
 
 
//ツイートをする関数
void tweetPost(String name, long reply) {
  try {
    //File f = new File("xxxx/xxxx/xxxxx/");//コメントアウトすると任意の画像をツイートに添付できる
    StatusUpdate update = new StatusUpdate("@"+name+" "+"test "+year()+"年"+month()+"月"+day()+"日  "+hour()+":"+minute()+":"+second());  //ツイートする文
    //update.setMedia(f);
    update.setInReplyToStatusId(reply);
    Status st = twitter.updateStatus(update);
    println("post succeed!!");
  }
  catch (TwitterException e) {
    println(e.getStatusCode());
  }
}



ツイートをする部分に関しても調べるといろんなメソッドが用意されててすごく
面白かったです。
何よりTwitterという普段使ってるツールにここまで自分で操作できるといった点で
プログラムを書いてて楽しみがあったし、実行できた時の感動が大きかったな。

IMG_9684

もうちょいいろいろ頑張ってこんな作品になりましたとさ。


コメントを残す

© Sako.log All Rights Reserved.