旧バージョンでもそうだったが、RTを普通のツイートとして取得したとき、長いテキストのツイートは後ろのほうが切れてしまう。

Status#isRetweet でツイートがRTであることを判断して、Status#getRetweetedStatus でリツイートの元ツイートを取得すれば、テキストの後ろのほうが切れてない状態で取得できる。

以下、Twitter4J 3.0.3 (twitter4j-core-3.0.3.jar) を使用したサンプルコード。


import java.util.*;
import twitter4j.*;
import twitter4j.auth.*;
import twitter4j.conf.*;
 
public class Twitter4JRetweetedStatusSample {
 
  public static void main(String[] args) throws Exception {
    
    // application info
    String consumerKey = "abcdeFGHIJ1234567890";
    String consumerSecret = "XYZABcdefg12345HIJKLmnopq67890asdfgzxcvb12";

    // user info
    String screenname = "nilab";
    String accessToken = "5704532-abcdefghij1234567890KLMNOPQRST123456789012";
    String accessTokenSecret = "1234567890abcdefghij1234567890ABCDEFGHIJ123";
    
    Twitter twitter = getTwitter(consumerKey, consumerSecret, accessToken, accessTokenSecret);
    printTweets(twitter, screenname, null, null);
  }
  
  private static Twitter getTwitter(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret){
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
      .setOAuthConsumerKey(consumerKey)
      .setOAuthConsumerSecret(consumerSecret)
      .setOAuthAccessToken(accessToken)
      .setOAuthAccessTokenSecret(accessTokenSecret);
    TwitterFactory factory = new TwitterFactory(cb.build());
    AccessToken token = new AccessToken(accessToken, accessTokenSecret);
    Twitter twitter = factory.getInstance(token);
    return twitter;
  }
  /*
  private static Twitter getTwitter(String consumerKey, String consumerSecret, String token, String tokenSecret){
    Twitter twitter = new TwitterFactory().getInstance();  
    AccessToken accessToken = new AccessToken(token, tokenSecret);
    twitter.setOAuthConsumer(consumerKey, consumerSecret);
    twitter.setOAuthAccessToken(accessToken);
    return twitter;
  }
  */
  
  private static void printTweets(Twitter twitter, String screenname, Long sinceId, Long maxId) throws Exception {
    
    // Paging
    final int count = 200;
    Paging paging = new Paging(1, count);
    if(maxId != null){
      paging.setMaxId(maxId.longValue());
    }
    if(sinceId != null){
      paging.setSinceId(sinceId.longValue());
    }
    
    ResponseList<Status> statusList;
    
    // no exist Twitter#getRetweetedByMe in Twitter4J 3.0.x and Twitter API 1.1
    //statusList = twitter.getRetweetedByMe(paging);
    
    statusList = twitter.getUserTimeline(screenname, paging);
    for(int i=0; i<statusList.size(); i++){
      Status s = statusList.get(i);
      String rt = "";
      if(s.isRetweet()){
        Status rts = s.getRetweetedStatus();
        String username = rts.getUser().getScreenName();
        rt = "RT @" + username + ": " + rts.getText();
      }
      long id = s.getId();
      Date created = s.getCreatedAt();
      String text = s.getText();
      GeoLocation location = s.getGeoLocation();
      Double lat = null;
      Double lng = null;
      if(location != null){
        lat = new Double(location.getLatitude());
        lng = new Double(location.getLongitude());
      }
      String source = null;
      if(s.isRetweet()){
        source = s.getRetweetedStatus().getSource();
      }else{
        source = s.getSource();
      }
      StringBuffer sb = new StringBuffer();
      System.out.println("id   : " + id);
      System.out.println("created: " + created);
      System.out.println("text   : " + text);
      System.out.println("rttext : " + rt);
      System.out.println("lat  : " + lat);
      System.out.println("lng  : " + lng);
      System.out.println("source : " + source);
      System.out.println(sb.toString());
    }
  }
}

以下、実行結果からいくつか抜粋。

普通のツイート。


id     : 294398087814868992
created: Thu Jan 24 19:55:48 JST 2013
text   : 天・地・星・空・山・川・峰・谷・雲・霧・室・苔・人・犬・上・末・硫黄・猿
rttext : 
lat    : null
lng    : null
source : <a href="http://sites.google.com/site/yorufukurou/" rel="nofollow">YoruFukurou</a>

短いツイートをリツイートした場合。


id     : 294397690421325824
created: Thu Jan 24 19:54:13 JST 2013
text   : RT @buzztube: 以呂波耳本へ止千利奴流乎和加餘多連曽津祢那良牟有為能於久耶万計不己衣天阿佐伎喩女美之恵比毛勢須
rttext : RT @buzztube: 以呂波耳本へ止千利奴流乎和加餘多連曽津祢那良牟有為能於久耶万計不己衣天阿佐伎喩女美之恵比毛勢須
lat    : null
lng    : null
source : web

長いツイートをリツイートした場合。

普通に取得したツイートはテキストが途中で切れてしまっていて、末尾が「 ...」となってしまう。Status#getRetweetedStatus で取得した Status を使えばOK.


id     : 294397669261053953
created: Thu Jan 24 19:54:08 JST 2013
text   : RT @buzztube: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 ...
rttext : RT @buzztube: 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
lat    : null
lng    : null
source : web

Twitter4J - バージョン - バージョン 2.2.x から 3.0.x への移行 を見ると、いくつかのメソッドが廃止されているので注意。

ただ、API1.1にてgetRetweetedByMe()は廃止されてしまいます。
以下のようにユーザータイムラインからisRetweet()がtrueのものを抽出するような工夫が必要になります。
ResponseList statuses = twitter.getUserTimeline();
for(Status status : statuses){
if(status.isRetweet()){
status.getRetweetedStatus().getUser().getScreenName() または getName();
}
}

ユーザAのリツイートした相手の情報取得方法を教えてください - Google グループ

Ref.

tags: twitter4j twitter java

Posted by NI-Lab. (@nilab)