Twitter

#好きなエビ曲を10曲あげる で統計をまなぶ(その1. Twitter編)

モチベーション

2ヶ月ほどまえに #好きなエビ曲を10曲あげる というハッシュタグがトレンド入りしました。
エビ曲とは私立恵比寿中学の曲を表すのですが、隠れではありますが、ファミリー(ファンのこと)である私はこのトレンド入りにすっかり乗り遅れておりました。
このハッシュについてはあとむさんがすでに集計をされておりました。

好きなエビ曲を10曲あげる [エビ中]

とはいえ、最後に

あと、誰かこの結果を受けていろいろ分析してくれると嬉しいな!(他人任せ)

と書かれており、なにか面白いことが出来るんじゃないかなと思い立ったのがこのハッシュタグが流行ってから3週間経った2017年7月の末でした。
それから約2ヶ月間Web系、統計とはまったく縁遠い生活をしてきたクソSEの戦いは始まったのでした。

Twitter APIを使えるようにする

スクレイピングしちゃおうかなぁと思ったらそれは規約で禁止とのことで正々堂々とTwitter APIを使うことにしました。
Twitter APIを使うにはTwitterアプリケーションを登録する必要があるので次のサイトなどを参考に登録しました。
Twitter API キーの取得手順 - まだプログラマーですが何か?

ツイートを集める

とりあえず公式APIを使ってみる

まぁ、ここでAPIを使えば楽勝でツイートなんて集められるでしょと思ってtwitterの公式(?)Gemをインストール

gem install twitter

簡単に検索をかけてみました。

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key = "xxxxxxxxxxxxxxxxxxxxxxxxx"
  config.consumer_secret = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
  config.access_token = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
  config.access_token_secret = "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"
end

client.search("#好きなエビ曲を10曲あげる since:2017-06-30").each do |tweet|
  p tweet.id
  p tweet.created_at
  p tweet.text
end

なんか数件しか引っかからない・・・

調べてみるとTwitterの検索は数日分しか実施できないとのこと・・・この作業をしていたのは7月の末。祭りは過ぎた後・・・数ツイートしか引っかかりませんでした。
公式ページの検索では全部(?)ひっかかるのに・・・

1日ごとに検索したらうまくいくよなどの情報もありましたが、うまくいかず、数日経過、途方にくれました・・・

まさかの人力

Collectionsという機能を発見。どうやらツイートをリストに保存できる機能らしく、保存したツイートからAPI経由で取得できることを知りました。
しかし、公式ページにも公式アプリにもコレクションに追加する方法が出ていません。なんじゃそりゃ・・・
調べてみるとTwitter公式のTweetDeckを使うとできると書かれていました。
コレだ!というわけで1件1件数時間かけてコレクションに追加していきました。

その間にベアラートークンなんていうことも学びちょっとTwitterの使い方も覚えていきました。

コレクションの取り出しスクリプト

#!/usr/bin/env ruby
#-*- encoding:UTF-8 -*-

require 'oauth'
require 'json'

encoded_bearer_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
consumer_key = "xxxxxxxxxxxxxxxxxxxxxxxxx"
consumer_secret = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
consumer = OAuth::Consumer.new(
    consumer_key,
    consumer_secret,
    site: 'https://api.twitter.com/'
)
endpoint = OAuth::AccessToken.new(consumer, access_token, access_token_secret)


response = endpoint.get("https://api.twitter.com/1.1/collections/entries.json?id=custom-ZZZZZZZZZZZZZZZZZZ&count=100&max_position=
YYYYYYYYYYYYYYYYYY")

json = JSON.parse(response.body)

puts JSON.pretty_generate(json)

これで約700件のツイートのJSONを取得することができました。