Twitterでfollowしなおすスクリプト→おまけでTwitterの発言数統計で遊んでみた

アカウント消して復活させるとふぉろーしているのにふぉろーしていないみたいな状態になったので、remove&followするためのスクリプトを書こうとした。まず、ふぉろーしている人たちのリストをスクレイピングして持ってこようと思ったらなんか謎のエラー。

>> agent.submit(login_form)
WWW::Mechanize::RedirectLimitReachedError: Maximum redirect limit (20) reached
        from /opt/local/lib/ruby/gems/1.8/gems/mechanize-0.8.4/lib/www/mechanize.rb:505:in `fetch_
page'                                                                                            
        from /opt/local/lib/ruby/gems/1.8/gems/mechanize-0.8.4/lib/www/mechanize.rb:509:in `fetch_
page'                                                                                            
        from /opt/local/lib/ruby/gems/1.8/gems/mechanize-0.8.4/lib/www/mechanize.rb:221:in `get'
        from /opt/local/lib/ruby/gems/1.8/gems/mechanize-0.8.4/lib/www/mechanize.rb:328:in `submit
'                                                                                                
        from (irb):48
        from (null):0

これじゃどうしようもないなーと思ったけど、そういえばTwitterPodに情報がたまっているので、適当に使うことにする。

/Users/yasuhisa% sqlite3 ~/Library/Application\ Support/TwitterPod/TwitterPod.sql
sqlite> .output twitter.txt
sqlite> select ZSCREEN_NAME from ZTWITTER;
sqlite> .quit
/Users/yasuhisa% cat twitter.txt | sort | uniq > twitter_uniq.txt

で、Rubyで適当にでっちあげれば完成。すでにfollowしている人をfollowしようとすると403という意味違うだろ、みたいなエラーに若干とまどったなどした。

require 'twitter'
twit = Twitter::Base.new("id", "password")

followings = []

f = open("/Users/yasuhisa/twitter_uniq.txt")
f.each {|following| followings.push following.chomp}
f.close

followings.reverse.each{|f|
  puts f
  begin
    twit.destroy_friendship(f)
    twit.create_friendship(f)
    sleep 3
  rescue Twitter::Unavailable => ex
    p ex.message 
    retry
  rescue Twitter::CantConnect =>ex
    p ex.message
  end
}

あっという間におわた。

おまけ

羃分布

発言回数で流行の羃分布になっているか見てみることにした。発言回数をソートしたファイルを作成。

/Users/yasuhisa% cat twitter.txt | sort | uniq -c | perl -anle 'print $F[0]' | sort -rn > twit_count.txt

ヒストグラムをRで吐かせる。

twit <- read.table("~/twit_count.txt",header=FALSE)[,1]
hist(twit,nclass=30,xlab="number of twit")

どう見ても羃分布です、本当にありがとうございました。

こっちのほうがいいかな?軸ひっくり返しただけと言えばそうなんだけど。

barplot(twit)

ABC分析

マーケティングとかで使われるABC分析をやってみると、3割のuserによって、timelineの8割が構成されていることが分かりました(少なくとも僕のtimelineは)。

plot(seq(length(twit)) / length(twit), cumsum(twit) / sum(twit),type="l",lwd=3,xlab="",ylab="発言の累積パーセンテージ")
abline(0.8,0,col="red",lwd=3)