twitterのタイムライン取得

rubyで書いてみた。APIを使わないでWeb(http://twitter.com/home)のhtmlを解析して取得するようにしてみた。こうすれば規制されないでするので...。

require 'net/http'
require 'date'
require 'time'
$KCODE = 'UTF8'
Net::HTTP.version_1_2

class Twitter

  def initialize(user, pass)
    @user = user
    @pass = pass
  end

  def get_context(page_number=1)
    req = Net::HTTP::Get.new("/home?page=#{page_number}")
    req.basic_auth @user, @pass
    Net::HTTP.start('twitter.com') { |http|
      responce = http.request(req)
      @context = responce.body
    }
    reg = /
          <tr\ class="hentry\ hentry_hover"\ id="status_(\d+)">.*?
          <a\ href="http:\/\/twitter.com\/.*?"
            \ class="url"><img\ alt=".*?"\ class=
            "photo\ fn"\ id="profile-image"\ src="(.*?)"\ \/><\/a>.*?
          <strong><a\ href="http:\/\/twitter.com
            \/.*?"\ title="(.*?)">(.*?)<\/a><\/strong>.*?
          <span\ class="entry-content">\n\t\t\t
            \ \ (.*?)\n\t\t\t<\/span>.*?
          <abbr\ class="published"\ title="(.*?\+00:00)">.*?
          from\ (.*?)\n.*?
          <\/tr>
          /mx
    list = @context.scan(reg)
    list.each { |data|
      data[4] = data[4].sub(/<a.*?>(.*?)<\/a>/, '\1')
      date = DateTime.parse(data[5]).new_offset(Rational(0, 24))
      data[5] = date.strftime("%a %b %d %H:%M:%S %Z %Y")
    }
    return list
  end

  def get_count(count_number)
    list = Array.new
    a = count_number / 20
    (a+1).times {|num|
      list += get_context(num+1)
    }
    list[count_number..(a+1)*20] = nil
    return list.compact
  end

  def make_xml(data)
    status = Array.new
    data.each { |line|
       tmp = "\t\t<created_at>#{line[5]}</created_at>\n"
       tmp += "\t\t<id>#{line[0]}</id>\n"
       tmp += "\t\t<text>#{line[4]}</text>\n"
       tmp += "\t\t<source>#{line[6]}</source>\n"
       tmp_user = "\t\t\t<name>#{line[2]}</name>\n"
       tmp_user += "\t\t\t<screen_name>#{line[3]}
         </screen_name>\n"
       tmp_user += "\t\t\t<profile_image_url>
         #{line[1]}</profile_image_url>\n"
       tmp += "\t\t<user>\n#{tmp_user}\t\t</user>\n"
       status += ["\t<status>\n#{tmp}\t</status>\n"]

    }
    return "<?xml version=\"1.0\
      " encoding=\"UTF-8\"?>\n<statuses type=
      \"array\">\n#{status}</statuses>"
  end
end

a = Twitter.new('ユーザー名', 'パスワード')
f = File.open('twitter.xml', 'w')
f.puts a.make_xml(a.get_count(25))

これで"twitter.xml"っていうファイルができます。
なるべくAPIが吐くようなxmlに合うように書いてみたけどどうだろうか。
正規表現がかなり汚くなってしまった...。目的通りに動いてるみたいだし気にしないことにしよう。


追記:お、なんかちゃんと動いてないぞ...。
修正しました。なんという凡ミス。