Scalaで世界最速のふぁぼ爆撃

はじめに

  • Scalaなら超簡単に並列化できる(Erlangっぽいらしい)
  • ScalaならJavaのライブラリが使える
  • JavaにはTwitter4jという優秀なライブラリがある

結論:ふぁぼ爆撃するしかない

コード

package com.ponkotuy.twitter

import scala.collection.JavaConverters._
import scala.concurrent.ops._
import twitter4j._

object FavBomb {
  val api = new TwitterFactory().getInstance()
  val MAX = 100
  def main(args: Array[String]) {
    bomb("HCOOH_1", 100)
  }

  // numは100単位
  def bomb(scapegoat: String, num: Int) {
    (1 to num/MAX).par.foreach { i =>
      val tweets = api.getUserTimeline(scapegoat, new Paging(i, MAX)).asScala
      tweets.map { t =>
        spawn {
          try {
            api.createFavorite(t.getId)
          } catch {
            case e => e.printStackTrace()
          }
        }
      }
    }
  }
}

詳細

  • spawnは非同期実行
  • parは平行コレクション。foreachとかで可能な限り並列に実行してくれる。多分spawnだけで十分だけど説明したかったので
  • twitter4jはスレッドセーフなのでapi.createFavoriteは並列に実行可能(?)
  • 2.9.2で動作確認(ただしtry catch節は後で慌てて追加してテストしてない)

ちなみに

100設定で自爆してみたけど、うち90は一瞬で爆撃に成功したが、結局spawnの処理が戻ってこず強制終了している。残りの10が例外をキャッチできてなくて何が起こったのか分かってない。規制された可能性も結構ある。(冷静に考えてDoS攻撃にしか見えないし)

あと、今回、どうも受信側のUserStreamがネックになる可能性あり。