Scalaで世界最速のふぁぼ爆撃
はじめに
結論:ふぁぼ爆撃するしかない
コード
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がネックになる可能性あり。