teriyaki note

好きなものはラーメンと将棋

Twitterで自分が誰にどれくらい 「いいね」 されたのかを調べる方法

成果物

自分のツイートが過去にどのアカウントから何件の「いいね」を貰ったかをグラフにしてみた。

f:id:teriyaki398:20181117094456p:plain:w500

作成したコードはGitHubに公開してます。

github.com

環境

今回の目的

2018年11月、次の衝撃的なニュースが話題に。

www.itmedia.co.jp

なんと、ツイッターの「いいね」機能が無くなるかもしれないそうです。

多くの人がこの機能で承認欲求を満たしていることでしょう。私もそうです。

それなら今のうちに、自分のツイートがどれくらいファボをもらっているのか、
そして、どのアカウントから何件もらっているのかを調べておきたい!

実はこれ、簡単な事ではないです

Twitter公式が公開しているAPI を使えば、

  • 自分のツイート一覧
  • フォローしているアカウント一覧

などの様々な情報が取得できますが、肝心の特定のツイートにいいねしたアカウント一覧という情報は取得できないのです。

API についての詳しい説明は割愛します。取得できる情報はページ下部に載せておきます。)

すなわち、公式API では「いいね の合計数」は調べられますが、「いいね の内訳」は調べられないのです(詳しくはこちら

また、合計数を調べたいだけならわざわざAPI を使わなくとも、
自分のアカウントのアナリティクス からCSV形式のデータをエクスポートしてなんやかんやすればいけそうです。

Twitter Analytics

解決策1

という事でAPIを用いずに取得する方法で頑張るしかないです。

色々調べた結果、 stackoverflow で同じような質問があったので、そちらを参考にします。

記事内の関数はツイートidを入れるといいね元アカウントidリスト を返します。

stackoverflow.com

各ツイートにツイートid と呼ばれる識別番号が付与されており、それを与えると対象ツイートにいいねしたアカウントのリストが得られるという訳です。

つまり、基本的な方針としては

  • Twitter API を用いて自分のツイートid 一覧を取得する
  • 各ツイートid ごとに、いいねしたアカウントidのリストを取得する
  • アカウントid を集計する
  • matplotlib を用いてグラフを描画する

という感じでしょう。

note

アカウントid とは@xxxxx のようなやつとは別物です。各ユーザに振り分けられた数列で、普段目にすることはありません。@xxxxx のようなid はscreen name と呼ばれ、API を叩いてアカウントid からscreen name に変換することができます。

ただし、この方法では誰でも閲覧できるアカウントしか対象になりません。
すなわち、鍵垢(非公開のアカウント)からのいいねは統計に入らないのです。

解決策2

鍵垢からのいいねも含めて調べたい場合。

  • Twitter API で相互フォローしてるアカウントリストを取得する
  • 各アカウントが「いいね」したツイート一覧を取得する
  • その中で自分のツイートの数を集計する

みたいにする必要があります。

パッと見で気づくかもしれませんが、これはかなり素直(あほ)な実装で、かなり時間がかかります(笑)

回しっぱなしで気長に待てる場合や、
定期的に回してデータベースを更新していく。みたいな運用を想定している人向けでしょうね。

(試しに期間を今年分に絞って回してみたが、それでも2、3時間ぐらいかかった)

コードの詳細な説明は省きます。

note

当然のことですが、鍵垢を含めた検索は自分のアカウントでしか行えません。他のアカウントに来ているいいねの統計は公開アカウントからのもののみです。

役立ちそうな情報メモ

Twitter Developer アカウントの取得について

Twitter API を使うためには開発者用のアカウントを取得する必要があります。

Developer — Twitter Developers

いつの間にか仕様が変わっていて、取得がかなり面倒になっていました。

ただ、面倒と言っても適当に入力したらすぐに取得できました。

masatoshihanai.com

アカウントid リストの取得方法

元記事のプログラムは Python 2系 で書かれていたので、Python 3系 に少しだけ書き換えました。

def getUserIDList(self,post_id):
    """
    指定されたIDのツイートにいいねした人のIDリストを返す

    post_id : string
        調べるツイートID
    """
    # 一秒まつ
    sleep(1)
    
    try:
        json_data = urllib.request.urlopen(url='https://twitter.com/i/activity/favorited_popup?id=' + str(post_id)).read().decode("utf-8")
        found_ids = re.findall(r'data-user-id=\\"+\d+', json_data)
        unique_ids = list(set([re.findall(r'\d+', match)[0] for match in found_ids]))
        return unique_ids
    except urllib.request.HTTPError:
        return False

クラスのメソッドにしたのでselfが付いてます。

matplotlib でいい感じの円グラフ

いい感じの円グラフの作成には以下を参考にしました。

qiita.com

普通にやると色が足りなくなってしまうので、

temp = cm.Pastel1(np.arange(9))
col = []
for i in range(len(data)):
    col.append(temp[i % 9])

このようにして 9色 をデータの数だけループするような色リストを作成しました。それだけです。

注意点

こちらにも書いてあるが、リクエストの間隔は少なくとも 1秒 空ける必要がある。

そのため、結局全てのツイートを調べるには、少なくとも Tweet数 x 1 [sec]だけの時間がかかってしまう。

2000件くらいツイートしていれば 最低でも 2000秒はかかる。

また、ユーザーid : screen_name の解決も 1ユーザずつ行なっており、こちらも1秒ずつ間隔を空ける必要がある。よって、「ツイート数はそれほどでもないが、大量のアカウントからいいねされている」みたいな感じのアカウントもかなり時間がかかってしまう。

API で取得できる情報

APIでツイートを取得したとき、以下の情報が付随してくる。

キー 内容
created_at ツイートされた日時
id ツイートに一意に割り当てられるid
id_str id の 文字列
text ツイートの本文
truncated ツイート本文が長すぎて途中で切られたかどうか
entities ハッシュタグや画像・動画などに関する情報
extended_entities 複数の画像を取得したいとき
source どの端末からの送信か
in_reply_to_status_id (リプの場合)どのツイートへのリプライか
in_reply_to_status_id_str どのツイートへのリプライかの文字列
in_reply_to_user_id リプするアカウントのid
in_reply_to_user_id_str リプするアカウントのid の文字列
in_reply_to_screen_name リプするアカウントのscreen_name
user ツイート送信者の情報(JSON)
geo ツイートを送信したときの位置情報(非推奨らしい)
coordinates こちらも送信時の位置情報
place ツイートに関連付けられている場所情報(必ずしもこの場所からの送信とは限らない)
contributors アカウントを複数人で運営している時の話
is_quote_status 引用ツイートかどうか
retweet_count リツイートされた数
favorite_count いいねされた数
favorited 認証済みユーザーにいいねされたかどうか
retweeted 認証済みユーザーにリツイートされたかどうか
possibly_sensitive ツイートにリンクがあり、そのコンテンツが危険な可能性がある
lang 言語