約束の地

あの日あの時のキャロの想い出

Twitter の gem において RT の Favorite 数は取得できない(が、何とかして取得する方法)

RT の Favorite 数

gem を用いた場合に限った話ではなく API そのものの制限だとは思うのですが、念のためこのような標題にします。

結論

API でリツイートを取得した場合は、元のツイートの Fav 数は取得できない ということです(正確には 0 が返ってくる)。なお、RT 数は取得できます*1

取得する方法(前置き)

このような場合に Fav 数を取得するにはどうしたらいいでしょうか。具体例を用いて考えてみます。

元ツイートの ID が878826249413566467のツイートがあります。このツイートを RT したツイートの ID が878826633854992384です。これら 2つ のツイートの情報を API で取得してみます。コードは一部省略し、tweetに Twitter::Tweet オブジェクトが入っているものとします。

tweet = client.status(id)
puts "id: #{tweet.id}, rt_count: #{tweet.retweet_count}, fav_count: #{tweet.favorite_count}, tweeted_at: #{tweet.created_at}"

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

id: 878826249413566467, rt_count: 16, fav_count: 15, tweeted_at: 2017-06-25 04:04:40 +0000
id: 878826633854992384, rt_count: 16, fav_count: 0, tweeted_at: 2017-06-25 04:06:11 +0000

見事にリツイートされたツイートでは Fav 数が 0 になっています。

もし後者のツイートだけが取得できたとして、正しく Fav 数を取得するにはどうしたらいいでしょうか。いや、もっと広い意味で、「リツイートされたツイートのオブジェクトが取得できたとき、その元ツイートのオブジェクトはどのようにしたら取得できるのか」という問題が浮かび上がってきます。

取得する方法(結論)

retweeted_tweetメソッドを用いる

具体例

ツイートID が878826633854992384のツイートのオブジェクトに対して、retweeted_tweetメソッドを用いてみましょう。以下のようなコードになります(一部省略)。

tweet = client.status(878826633854992384)
p tweet.retweeted_tweet

結果は以下のようになり、ちゃんとリツイート元のツイートオブジェクトが取得できました。

#<Twitter::Tweet id=878826249413566467>

補足

最後に書くのもなんですが、リツイートされたツイートは、見た目の内容は元ツイートですが、単体ではユニークなツイートIDや、いつリツイートしたか、などの元ツイートとは異なる情報を持っています。そのため、今回のようなことになっているのだと考えられます。

ただ、このような仕様ということは、「リツイートされたツイートがリツイートされたり Fav されたりした場合はその情報を取得できるのか」ということが問題になるのですが、できなさそうな気がします*2

あと、retweeted_tweetメソッドを、リツイートされたツイートではないツイート(要はオリジナルのツイート)に対して実行すると、例外になるわけではなく、空っぽの値が返ってきます。

*1:これは当然かもしれませんが

*2:ちゃんと調べてはいない

Powered by はてなブログ