倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

むしろ Twitter4J で twitter を勉強してみる (5) : StatusMethods インターフェース (II)

今回は StatusMethods インターフェースの続きいきまっせ〜(記事一覧)。

残っている StatusMethods のメソッドは次の3つでした:

package twitter4j.api;

public interface StatusMethods{
    ...
    // リツイートの取得
    ResponseList<Status> getRetweets(long statusId)
    ResponseList<User> getRetweetedBy(long statusId, Paging paging)
    IDs getRetweetedByIDs(long statusId, Paging paging)
}

これらは引数の ID (long 値)で特定される記事に対して、その記事をリツイートしているステータスやユーザーを取得するメソッドです。 getRetweetedByIDs() メソッドは「getRetweetedBy で返されるユーザーを IDs オブジェクトで返す」という意味のようで、返される IDs オブジェクトが保持している ID は(ステータスなどではなく)ユーザーに関する情報です*1

サンプル・コード


リツイート関連のメソッドを使ったサンプル・コード(Groovy です)。 ここでは、3つのメソッドどれもに対しても、ある記事 (id : 120732438078046208L) をリツイートしたユーザーの名前 (screenName) を表示させています:

@Grab('org.twitter4j:twitter4j-core:[2.2.4,)')

import twitter4j.*

def twitter = new TwitterFactory().getInstance()
long id = 120732438078046208L    // 対象記事の ステータス ID

// リツイートの取得
twitter.getRetweets(id).each{ Status status ->    // 返された List の各要素に対して
    println status.user.screenName
}

def paging = new Paging()    // とりあえず、ページングは雑な扱いで :-9
                                          // null とか渡せると手軽だけどムリっぽい・・・

// リツイートしたユーザーの取得 (User オブジェクト)
twitter.getRetweetedBy(id, paging).each{ User user ->
    println user.screenName
}

// リツイートしたユーザーの取得 (ユーザー ID の long 値
twitter.getRetweetedByIDs(id, paging).getIDs().each{ long userId ->
    println twitter.showUser(userId).screenName
    // Twitter#showUser(long) でユーザー ID から User オブジェクトを取得できる
}

getRetweetedByIDs() メソッドはユーザーの ID のみしか返されないので、他のユーザー情報が必要なら Twitter#showUser() メソッドなどで詳細を取得する必要があります。

処理のイメージ図


getRetweets()

getRetweetedBy()
getRetweetedByIDs()

関連する型


上で出てきたメソッドに関連する型は以下の3つ:

  • twitter4j.ResponseList インターフェース
  • twitter4j.IDs インターフェース
  • twitter4j.Paging クラス

ResponseList と IDs は前回やった TwitterResponse インターフェースを拡張しています。

ResponseList

ResponseList インターフェースはリスト形式の応答を表す型です。 例えば Status のリストや User のリストなどを返したいときに使われます。 ResponseList の型定義はこんなの:

pakcage twitter4j;

public interface ResponseList<T> extends TwitterResponse, java.util.List<T>{ ... }

List インターフェースを拡張しているので List の API を使って要素を取得したり、Iterator を使って要素を列挙したりできます。

IDs

IDs は Status や User の ID を表す long 値をリスト(配列)として返す応答を表す型です。 上記の ResponseList と使用目的は大して変わらないと思いますが、要素がオブジェクトでなく long 値なので軽量なんじゃないかと思います。 型定義は以下の通り:

pakcage twitter4j;

public interface IDs extends TwitterResponse, CursorSupport, java.io.Serializable{ ... }

CursorSupport は long 値の ListIterator といった感じのインターフェースで、前後 (previous / next) の要素にアクセスするメソッドを持っています。

Paging

Paging クラスは、ステータスやユーザーなどの検索結果のページングを指定するクラスです。 今回出てきた getRetweetedBy(), getRetweetedbyIDs() メソッド以外にも Paging オブジェクトを引数にとるメソッドはたくさんあります。 ただし、それぞれのメソッドによってサポートされているプロパティが異なるようなので注意。 詳しくは「Twitter4J - サポート API」や JavaDoc を参照のこと*2

Paging クラスの型定義は以下のようになっています:

pakcage twitter4j;

public final class Paging implements java.io.Serializable{

    // コンストラクタ
    Paging() 
    Paging(int page) 
    Paging(int page, int count) 
    Paging(int page, int count, long sinceId) 
    Paging(int page, int count, long sinceId, long maxId) 
    Paging(int page, long sinceId) 
    Paging(long sinceId) 
    ...
}

Java Bean としてのプロパティには以下のようなモノがあります:

プロパティ名 備考
page int ページ
count int 1ページあたりの件数
sinceId long 指定した ID 以降の要素を取得
maxId long 指定した ID 以前の情報を取得


各プロパティに対して getter/setter メソッドが定義されています。 また、page プロパティ以外には Python 風のプロパティ設定メソッドも定義されています(サンプル・コード参照):

@Grab('org.twitter4j:twitter4j-core:[2.2.4,)')

import twitter4j.*

def twitter = new TwitterFactory().getInstance()

// 2ページ目をリクエスト, 1ページあたりの件数は10件
def paging = new Paging(2, 10)
// def paging = new Paging(2).count(10)    // Python 風プロパティ設定

twitter.getRetweetedBy(122373552975523842L, paging).each{ User user ->
    println user.screenName
}

Paging クラスは immutable でもなくスレッド・セーフでもないので、複数スレッド菅で共有する場合は注意が必要とのこと。

Twitter API ポケットリファレンス (POCKET REFERENCE)

Twitter API ポケットリファレンス (POCKET REFERENCE)

*1:ちなみに、そのうち見るかもしれない TimelineMehods インターフェースの getRetweetedByMe() や getRetweetedByUser() メソッドは、ステータスのリストが返されます。

*2:「サポート API」と JavaDoc の内容が一致してないのもあるようですが、たぶん JavaDoc の方は正しそう。 確かめてませんが。