リニューアル後のラフィアンの近況をメールで送信する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で認証をしていたから。
恥ずかしいコードだけど、晒しておく。