本記事の目的
RubyのMechanizeを使ってTwitterアナリティクス上で閲覧できるツイートアクティビティデータのエクスポートを自動化するスクリプトを作成する。
Twitterアナリティクス
- Twitter公式が提供している分析ツールで、日々のツイートインプレッションのグラフやツイート毎のインプレッション数、リンクのクリック数、お気に入り数などを見ることが出来る
- アナリティクス自体には簡単な分析機能しか無く、複雑な分析をしたい場合はデータをエクスポートして自前で頑張る必要がある
今回は、Twitterアナリティクスへのログインから指定期間のツイートアクティビティデータのエクスポートまでをスクリプトで自動化する。
Mechanize
Webページの遷移やログインを補助してくれるRubyのgem。
以下を参考にさせて頂いた。
Rails スクレイピング手法 Mechanizeの使い方
[Ruby]Mechanizeでログイン機能があるサイトにログインする
実装
1. MechanizeでのTwitterアナリティクスへのログイン
TwitterアナリティクスにMechanizeを使ってログイン出来ることを確認する。
【ID】【パスワード】は自分のTwitterアカウントのもの。
rubyのバージョンは 2.0.0p598
require 'mechanize'
agent = Mechanize.new
agent.user_agent_alias = 'Windows Mozilla'
url = "https://analytics.twitter.com/user/【ID】/tweets"
page = agent.get(url)
form = page.form_with(action: 'https://twitter.com/sessions')
form.fields[0].value = '【ID】'
form.fields[1].value = '【パスワード】'
p form.submit.title
ログインに成功していれば上記のコードで以下の出力結果が得られる。
"【ID】に関するツイートアクティビティアナリティクス"
2. データのエクスポート
MechanizeではJavascriptが動作しないため、Javascriptを前提として作られているエクスポートボタンから直接ファイルのダウンロードを行うことが出来ない。
この場合、Mechanizeのエージェントが取得しているセッション情報を再利用して、エクスポート操作時のHTTPリクエストをエミュレートすることでファイルのダウンロードを実行できる。
今回エミュレートすべきHTTPリクエストの内容は、ChromeのDeveloper Tool等で調査した。
3. 1,2を合わせて
最終的なスクリプトのコードは以下のようになった。
require 'mechanize'
require 'time'
ITERATE = (Time.parse(ARGV[1]).to_i - Time.parse(ARGV[0]).to_i ) / (60 * 60 * 24) + 1
START_DATE = (Time.parse(ARGV[0]).to_i).to_s + "000"
END_DATE = (Time.parse(ARGV[1]).to_i + (60 * 60 * 24 - 1)).to_s + "999"
agent = Mechanize.new
agent.user_agent_alias = 'Windows Mozilla'
url = "https://analytics.twitter.com/user/【ID】/tweets"
export_url = "https://analytics.twitter.com/user/【ID】/tweets/export.json?start_time=" + START_DATE + "&end_time=" + END_DATE + "&lang=ja"
bundle_url = "https://analytics.twitter.com/user/【ID】/tweets/bundle?start_time=" + START_DATE + "&end_time=" + END_DATE + "&lang=ja"
page = agent.get(url)
form = page.form_with(action: 'https://twitter.com/sessions')
form.fields[0].value = '【ID】'
form.fields[1].value = '【パスワード】'
form.submit
for i in 1..ITERATE do
agent.post(export_url ,"")
sleep(10)
end
file = agent.get(bundle_url)
file.save
ruby getTwitterActivity.rb 2016-08-01 2016-08-02
取得したい期間の開始日と終了日を引数として与えて実行すると、実行ファイルのディレクトリにcsvファイルが保存される。
あとはcronで定期的に実行し、csvをデータベースに保存するなりすればよい。
csvは時刻のタイムゾーンがUTCなので分析の際は注意
その他
長期間データの一括取得とかをやりすぎるとアカウントが凍結されるかもしれないので注意したい