それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

JR西日本の運行情報を監視する。

JR西日本の遅延っぷりはナイスだ。JR東日本もナイスだ。両者は良い勝負。正直いってJR西の方がひどい。西は、JR東日本に比べるとシンプル路線。相互乗り入れもない。神戸〜京都でもシンプル。奈良なんてシンプルすぎるくらいだ。なのに遅れ続ける。もはや企業文化に原因があるのだろう。

遅延情報ページもCacheヘッダを送ってくるが、 if-modified-since を送付しても無視っぽい。いつも200okしか帰ってこない。そういう企業文化なんだろう。

というわけでJRを監視。

JR西の運行情報ページに30秒に一度アクセスして、前回と内容が変わっていればメールを送ることにした。

#!/usr/bin/env ruby
$KCODE='u'
def check_jr_kinki
    require 'rubygems'
    require 'mechanize'
    m = Mechanize.new
    m.get 'http://trafficinfo.westjr.co.jp/kinki.html'
    p = m.page
    title1 = p.search('div#contents_title').text.gsub(/\d+/,"") #=> "17:40 現在 近畿エリアの運行情報です。"
    title2 = p.search('div.time').text #=> "17:35更新"
    title3 = p.search('div.unkou').text #=> "【JR神戸線】 人身事故 振替輸送開始"
    body =  p.search('div.eikyou_block').text
    return [title1,title2,title3,body]
end 
def send_notify(title,body)
    require 'rubygems'
    require 'net/smtp'
    require 'base64'
    require 'tmail'
    mail = TMail::Mail.new
    mail.to = "takuya@localhost"
    mail.from = "takuya@localhost"
    mail.subject = title
    mail.date = Time.now
    mail.mime_version = "1.0"
    mail.body = body
    mail.set_content_type "text", "plain", {"charset" => "iso-2202-jp"}
    Net::SMTP.start("localhost","25","local",nil,nil,"plain") do |smtp|
        smtp.sendmail( mail.encoded, mail.from, mail.to)
    end 
end 
require 'rubygems'
require 'daemons'
Daemons.run_proc('jr_west_checker') do
   
    ret2  = [nil,nil,nil,nil]
    ret  = check_jr_kinki 
    loop do 
        send_notify( ret[0..2].join(''), ret[3] ) if ( ret.zip(ret2).map{|i,j| i==j }.reject{|i| i==true}.size > 0 )
        ret2 = ret  if ( ret.zip(ret2).map{|i,j| i==j }.reject{|i| i==true}.size > 0 )
        sleep 30
        ret  = check_jr_kinki
        
    end 
end 

しかもDaemonsでサービス常駐させてやった。もう何も怖くない。

mechanize 本当に便利ですね。

2012-02-02追記

ブクマコメントを頂いたので返信。

id:CIA1942
「もはや企業文化に原因が」福知山線の事故がなければもう少し状況は違ってると思いますよ?/それよりも「30秒に1回運行情報にアクセス」とか病的に近い頻度だと思うのだけど。


そう?キャッシュヘッダだけ見に行っても、毎回 200 OKが返ってくるので、どうしようもないんだけど。一分に一回でもいいんだけど、電車が15−20秒単位で運行されてることを考えると、「電車まだ来ないかーっ」ってストレスから見ればたいしたことないとも思う。

何秒にするかは、相手の更新頻度と間隔を考えて見極めたらいいのであって、WEBページのScrapeのWait時間に正解はないかと思うし、病的と言われるとちょっと。。。。

特に、今日(2012-02-02)のような大雪の日、また台風の日は、JR運行情報は毎分更新がありえます。大量更新がある事故が、いつ起きるわからないので、アクセスしすぎとも言えないんじゃないかと思います。



むしろ、画像やCSSを読み込まないので、ブラウザよりは通信量もコネクションも少ない。ですし
(最後のこれ↑は、言い訳がましいですけど)