リニューアル後のラフィアンの近況をメールで送信するrubyスクリプト

condition.rb

require 'rubygems'
require 'mechanize'
require 'action_mailer'
$KCODE = 'utf8'

module Ruffian
  module Condition



class HorseCondition
  attr_accessor :club
  attr_accessor :title
  attr_accessor :date
  attr_accessor :text
  attr_accessor :uri
  attr_accessor :id

  def md5
    Digest::MD5.hexdigest @title+@date+@text
  end

  def ==(other)
    md5 == other.md5
  end
    
end

class Conditions < Array
  def crawl uri
    agent = WWW::Mechanize.new
    agent.user_agent_alias = 'Mac Safari'
    read_page agent.get(uri)
  end

  def read_html html
    uri = URI.parse('http://www.ruffian.co.jp/')
    response_header = { 'content-type' => 'text/html' }
    page = WWW::Mechanize::Page.new uri,response_header,html,'200'
    read_page page
  end
  def read_page page
    page.search("//div[@class='condition_title']") {|condition_title|
      condition_date_box = condition_title.next_sibling
      condition_text = condition_date_box.next_node

      condition = HorseCondition.new
      condition.club = "ruffian"
      /.*愛馬番号:(\d+)/ =~ condition_title.inner_text.to_s
      condition.id = $1.to_i
      #TODO:set uri
      condition.uri = ""
      condition.title = condition_title.inner_text.to_s
      condition.date = condition_date_box.inner_text.to_s
      condition.text = condition_text.to_s
      push condition
    }
  end

  def load filename
    clear
    yaml = File.open filename ,"r"
    conditions = YAML.load yaml
    conditions.each  {|condition|
      push condition
    }
  end

  def store filename
    File.open( filename ,"w") { |file|
      file.write to_yaml
    }
  end

  def select_changed compared
    if compared.kind_of?(String)
      filename = compared
      compared = Conditions.new
      compared.load filename
    end
    result = self.clone
    result.delete_if {|e|
      compared.include? e
    }
    result
  end

  
end

class Mailer < ActionMailer::Base
  @@default_charset = 'iso-2022-jp'
  def ruffianMail(recipient, condition)
    require 'nkf'
    from 'FROMアドレス'
    recipients recipient
    subject NKF.nkf('-Uj','ruffian mail')
    body NKF.nkf('-Uj',<<EOM)
#{condition.title}
#{condition.date}
#{condition.text}
EOM
  end
  def Mailer.pop_auth pop3
    require 'net/pop'
    pop = Net::POP3.new( pop3[:address], pop3[:port] )
    pop.start( pop3[:user_name], pop3[:password] )
    pop.finish
  end
end



  end
end

ruffian_mail.rb

require 'condition.rb'

condition_filename = "ruffian_condition.yaml"

conditions = Ruffian::Condition::Conditions.new
conditions.crawl "http://www.ruffian.co.jp/pc/condition?age=0&type=1&recruit=falsei&start=0&num=10000&prev=0"

owner = {
  102121=> [ "to_address@example.com" ],
}

ActionMailer::Base.smtp_settings = {
  :address => 'SMTPサーバのアドレス',
  :port    => 25,
  :domain => 'SMTPサーバのアドレス',
  :user_name => 'ユーザアカウント',
  :password =>'パスワード',
}

# pop before smtp authentication
pop3 = {
  :address => 'popサーバのアドレス',
  :port    => 110,
  :user_name => 'ユーザアカウント',
  :password =>'パスワード',
}  
Ruffian::Condition::Mailer.pop_auth pop3

#conditions.select_changed(condition_filename).each {|c|
conditions.each {|c|
  if owner.key? c.id
    owner[c.id].each {|to|
      Ruffian::Condition::Mailer.deliver_ruffianMail(to,c)
    }
  end
}

conditions.store condition_filename

で、

ruby ruffian_mail.rb

とかやると、ownerに突っ込んだ番号の馬の近況がそれぞれ指定したアドレス達に送られます。
conditions.eachのところをconditions.select.....に入れ替えると前回実行した時から近況が変わっている馬だけがメール送信されるはず。

popでアクセスしてるのは、メールサーバがpop before smtpで認証をしていたから。

恥ずかしいコードだけど、晒しておく。