トップ «前の日記(2012-07-25) 最新 次の日記(2012-09-07)» 編集

Route 477



2012-08-23

[ruby] Enumerable#lazyでTwitterの過去の発言を検索してみた

所用でこのツイートの前後の会話を見たかったので、Twitter gemでトライしてみた。

Ruby 2.0のEnumerable#lazyを使うと、API経由でネットワーク越しにやってくる過去のツイートの列も普通のEnumerableと同じインターフェイスで操作することができる。

(1..Float::INFINITY).lazy
  .flat_map{|page|
    sleep 1
    p page:page
    Twitter.user_timeline(count: 200, page: page, trim_user: true)
  }.drop_while{|tweet|
    tweet.created_at > Time.new(2012, 5, 15)
  }.take_while{|tweet|
    tweet.created_at > Time.new(2012, 4, 15)
  }.each{|tweet|
    attrs = tweet.attrs
    cleanup!(attrs)
    pp attrs
  }

「ツイートの列」と書いたけど、Twitter APIでは一度に200件ずつ発言が降ってくる。flat_mapを使うと、これを自然にツイートの列として扱うことができる。便利。

そのあとは、当該発言のあたり(4/15 - 5/15)だけ取り出すためにdrop_whileとtake_whileを使っている。 最初はselectでいけるかなと思ったけど、selectだと列の終わりまで全部チェックしてしまうのでダメなのであった。