とみふらの明るく楽しい日記

日記や俺用メモなどなんでもあり。

twitterのwebから一定時間ごとにTL取得してつぶやき切り出して表示

前回に引き続き、Nokogiriっていうrubygemを使って名前やつぶやきを切り出して表示してみました。
Nokogiriの使い方を思い出せるように糞コードですがぺたりしておきます。
スクレイピングは規約で禁止されてるらしいので自己責任です。
終了はCtrl+Cなど強制終了で。

#!/usr/bin/env ruby

require 'rubygems'
require 'mechanize'
require 'nokogiri'

username = '' #ユーザ名を入れる
password = '' #パスワードを入れる
interval = 15 #TL取得間隔(秒)

class Tweet
  def initialize(user,status,url)
    @user = user
    @status = status
    @url = url
  end
  def output
    print @user + ':'
    puts @status
  end
  def sametweet(url) #取得済みtweetを特定
    if @url == url
      return true
    else
      return false
    end
  end
end

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
agent.get('http://twitter.com/login')

agent.page.form_with(:action => 'https://twitter.com/sessions'){|form|
  form.field_with(:name => 'session[username_or_email]').value = username
  form.field_with(:name => 'session[password]').value = password
  form.click_button
}

tweets = []
loop do
  i = 0
  doc = Nokogiri(agent.page.body)
  # class属性が"hentry"から始まるli要素
  doc.search('//li[starts-with(@class,"hentry")]').map{|e|
    #imgnode = e.search('img')
    #puts imgnode.attribute('src') #iconのurlを取得
    #puts imgnode.attribute('alt') #nameを取得
    user = e.search('strong').text
    status = e.search('span.entry-content').text
    url = e.search('a.entry-date').attribute('href').text
    #既に取得したtweetは登録しない
    registered = false
    tweets.each{|tw|
      registered = tw.sametweet(url)
      break if registered == true
    }
    unless registered
      tweets << Tweet.new(user,status,url)
      tweets.last.output
      i += 1
    end
  }
  puts '新着'+i.to_s+''
  sleep interval
  agent.get('http://twitter.com/')
end


実行例

課題点
20件以上取得できないので2ページ目以降も取得しに行くなど。