サブアカの発言全部消した

while true
  begin
    c = OAuth::Consumer.new("fugafugafugafuga","hogehogehoge", {:site => "http://twitter.com"})
    t = OAuth::AccessToken.new(c, TOKEN, SECRET)
    JSON.parse(t.get("/statuses/user_timeline.json?count=200").body).each do |p|
      puts "#{p["id"]}: #{p["text"]}"
      p t.post("/statuses/destroy/#{p["id"]}.json") rescue nil
     end
    sleep 60
  rescue
    sleep 20
  end
end

こんなの。 /statuses/destroy は API 制限の適用対象外なので /statuses/user_timeline のところのみウエイトをかければよい。並列アクセスなどもしていないので警察に逮捕される可能性も少ないでしょう。

ところで周知の通り twitter の /statuses/user_timeline はその人の最新発言 3200 件までしか取ることが出来ない。じゃあその 3200 件を消しきってしまうとどうなるかというと、 API でも Web でもその人の発言が一切取得できなくなります。発言件数だけ取得できるけど、出てこない。ちなみに status id を指定して直叩きすれば取れる。

推測ですが、 status id を指定した場合はプライマリーキーで検索すればいいだけなので MySQL から取ってきてもコストが低いのでそうしているが、一覧はコストが高いので、一覧を作成してそれをキャッシュサーバーに載せて、一覧はキャッシュからの取得のみとしているのではないでしょうか。それが一覧取得 3200 件制限の理由。

3200 件全部消しきった後ある程度待つと、それより古い発言がまたポツポツと取得出来るようになります。なので上記スクリプトを回しっぱなしにしているといつか発言が全部消えます。 6000 件程発言していたサブアカの場合全消去には 5 日間程かかりました。