Twitterのrepliesなどを複数ページ取得

twitter-replies

呼び出し例

#!/usr/bin/env ruby
require 'TwitterAPI'

user = ARGV.shift
pass = ARGV.shift

api = TwitterAPI.new(user,pass)
api.replies(1,3).each{ |e| # 1-3ページを取得
  puts e.url
  puts e.content
  puts e.last_updated
}


replies()の他に、friends_timeline()とpublic_timeline()がある。
引数なしで呼び出すと1ページ目だけ読む。


TwitterAPI.rb

#!/usr/bin/env ruby
require 'rubygems'
require 'open-uri'
require 'feed-normalizer'
require 'kconv'

class TwitterAPI

  def initialize(user,pass)
    @user = user
    @pass = pass
  end
  
  def replies(start_page=1, end_page=1)
    puts 'getting replies'
    get_api("http://twitter.com/replies.atom", start_page, end_page)
  end
  
  def friends_timeline(start_page=1, end_page=1)
    puts 'getting friends_timeline'
    get_api("http://twitter.com/statuses/friends_timeline.atom", start_page, end_page)
  end
  
  def public_timeline(start_page=1, end_page=1)
    puts 'getting public_timeline'
    get_api("http://twitter.com/statuses/public_timeline.atom", start_page, end_page)
  end
  
  def get_api(uri, start_page, end_page)
    entries = Array.new
    for page in start_page..end_page
      print "reading page#{page}..."
      begin
        page = open(uri.to_s+'?page='+page.to_s,
                    :http_basic_authentication => [@user, @pass]).read()
        feed = FeedNormalizer::FeedNormalizer.parse(page)
        feed.entries.each{ |e|
          entries.push(e)
        }
      rescue
        puts "fetch feed error!"
        sleep 4
        next
      end
      sleep 4
      puts 'success'
    end
    entries.each{ |e|
      e.content.gsub!(/&#(?:(\d*?)|(?:[xX]([0-9a-fA-F]{4})));/) { [$1.nil? ? $2.to_i(16) : $1.to_i].pack('U') }
    }
    puts entries.size.to_s+'entries'
    return entries
  end
  
end