Twitter の gem を用いて、あるツイートをリツイートした人の一覧と、リツイート自体のツイートオブジェクトを取得する方法

前提

retweeters_idsメソッド、あるいはretweeters_ofメソッドを用いる場合は自分のツイートでなければ取得できません。

なのでこれらのメソッドは用いないで、最後に書くようにretweetsメソッドを用いるべきです。すなわち、この記事の途中の大半はスルーして構わなかったりします。

方法

まずは例によってクライアントを以下のように生成します。

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "CONSUMER_KEY"
  config.consumer_secret     = "CONSUMER_SECRET"
  config.access_token        = "ACCESS_TOKEN"
  config.access_token_secret = "ACCESS_TOKEN_SECRET"
end

そうしたら知りたいツイートを指定して retweeters_idsまたはretweeters_ofのメソッドを実行するだけです。2つのメソッドの違いは以下のとおりです。

retweeters_ids メソッドの場合

引数には「ツイートID」を取ります。メソッドの返り値はTwitter::Cursorクラスになります。ドキュメントはこちらになります。attrsメソッドで生の値を取得できますが、普通にループさせて「ユーザID」を取得するのが良いと思います。そのためのコードは以下のとおりです。

rt_user_ids = client.retweeters_ids(878826249413566467)
rt_user_ids.each do |rt_user_id|
  puts rt_user_id
end

結果は以下のようになります。

133256291
630624713
812918959309623300
1468904413
238613609
235992043
375552231
3837967872
114230059
125667313
4210949119
3811083012
101411562
852859752279228417
3545395213

retweeters_of メソッドの場合

引数には「ツイートID」を取ります。メソッドの返り値はArrayクラスになります*1Arrayの一つ一つの中身はTwitter::Userクラスです。

Twitter::Userで使えるメソッドはこちらになります。こちらは直感的ですね。具体的なコードを書くと以下のようになるでしょうか。ここではメソッドはlocationを用いて、ユーザプロフィール内の「居住地」を表示させています。

rt_users = client.retweeters_of(878826249413566467)
rt_users.each do |rt_user|
  puts rt_user.location
end

結果は以下のようになります。

ルルノイエの地下室
大和国⇔煌めきの向こう
銀さんの谷間
現実と非現実の境(現実逃避気味)
福島県
ハルモニア神聖国
ミャアタウン
魚釣島 T: 25.74387,123.47335
トランの古城
ハルモニア神聖国
ビュッデヒュッケ

retweets メソッドを使う

たぶんこれが直感的で普通だし、上の2つのメソッドを使う理由も特にないと思います。返り値は Twitter::Tweet オブジェクトになります。以下のようなコードになるでしょうか。なおメソッド名は複数形であるretweetsですので注意が必要です。

rt_tweets = client.retweets(878826249413566467)
rt_tweets.each do |rt_tweet|
  puts "screen_name: #{rt_tweet.id}, location: #{rt_tweet.user.location}"
end

結果は以下のようになります。

tweet_id: 880262952099561473, location: 千葉県千葉市
tweet_id: 878948240338558976, location: ルルノイエの地下室
tweet_id: 878895590758797312, location: 大和国⇔煌めきの向こう
tweet_id: 878888620441993216, location: 
tweet_id: 878886067574775810, location: 銀さんの谷間
tweet_id: 878881252685750272, location: 現実と非現実の境(現実逃避気味)
tweet_id: 878877672348065793, location: 福島県
tweet_id: 878877565162725376, location: ハルモニア神聖国
tweet_id: 878867713942106112, location: ミャアタウン
tweet_id: 878846822600425472, location: 魚釣島 T: 25.74387,123.47335
tweet_id: 878842922799570944, location: 
tweet_id: 878830403540275200, location: 
tweet_id: 878830306282713088, location: 
tweet_id: 878827922294923264, location: トランの古城
tweet_id: 878827263751409665, location: ハルモニア神聖国
tweet_id: 878826633854992384, location: ビュッデヒュッケ

補足

  • retweeters_idsメソッドも、retweeters_ofメソッドも、retweetsメソッドも、引数に「ツイートID」を与えていますが、Twitter::Tweetオブジェクトでも大丈夫です
  • retweeters_idsメソッドも、retweeters_ofメソッドも、retweetsメソッドも、取得数の上限は 100 です
    • ツイートの検索メソッドとは異なり、「範囲」を一意に取得したり指定したりするオプションが無いため、100 を超えた値を取得するのは不可能だと思います(短い間隔でぐるぐる回して重複する値を除外する、という方法なら理論上はいけそうですが……)
  • リツイートされたツイートがまたリツイートされたときに、その値をうまく取得できるのか、ということはまだ試していません(もし可能ならば、いわゆるインフルエンサーを探すのに役立ちそうですね)

*1:ids_only のオプションに true を指定すれば、ユーザIDがそのまま返ります

Powered by はてなブログ