地震情報通知アプリ”Quake Notifier”のソースコードを公開してみた。

前回の記事で書いた「GrowlRuby地震情報通知アプリ”Quake Notifier”」ですが、ブックマークを頂いたこともあり、GrowlRubyのサンプルコードとして公開することにしました(またしても近隣からの突込みも)

http://d.hatena.ne.jp/dot_h2o2/20090815/p1

つたないソースコードですが公開します、より多くの人のお役に立つよう改良希望です(ライセンスはとりあえずGPLにしておきます)。

#!/usr/bin/ruby
# Based on twitter notifier (http://d.hatena.ne.jp/snaka72/)
#
# Quake Notifier
# 0.1 .h2o write http://d.hatena.ne.jp/dot_h2o2/
#

require 'net/http'
require 'rubygems'
require 'json'
require 'pit'
require 'ruby_gntp'

#Default Config
$polling_time = 30 # Seconds 
$check_location = "札幌" # Filter Location

#$twitter_feed = '/statuses/user_timeline/4104111.json'		#earthquake_jp
$twitter_feed = '/statuses/user_timeline/23551157.json'	#p2pquake

$after_flag=false

$tweeted = {}

$growl = GNTP.new
$growl.register({
  :app_name => "Twitter",
  :notifications => [{ :name => "Quake", :enabled => true },
               	     { :name => "Error", :enabled => true }]
})

def get_timeline
  max_count = 2
  Net::HTTP.version_1_2

  req = Net::HTTP::Get.new($twitter_feed)

  proxy_host, proxy_port = (ENV["HTTP_PROXY"] || '').sub(/http:\/\//, '').split(':')

  Net::HTTP::Proxy(proxy_host, proxy_port).start('twitter.com') {|http|
    res = http.request(req)

    if res.code != '200'
      $growl.notify({
        :name  => "Error",
        :title => "Error occurd",
        :test  => "Can not get messages"
      })
      puts res if $DEBUG
      return
    end

    results = JSON.parser.new(res.body).parse()
    results.reverse!
    results.length.times do |i|
      break if i >= max_count

      id = results[i]["id"]
      next if $tweeted.include?(id)

      puts screen_name  = results[i]["user"]["screen_name"]
      text         = results[i]["text"]
      icon         = results[i]["user"]["profile_image_url"]

	    if text =~ /#{$check_location}/ && $after_flag
	 	#Debug
	 	#puts "match"
      	$growl.notify({
        	:name => "Quake",
        	:title =>  screen_name,
        	:text => text,
        	:icon => icon,
        	:sticky=> true
      	})
      	else
      		puts "done"
        end
      
      $after_flag = true
      $tweeted[id] = true

      sleep 1
    end
    }
end

# Check timeline.
while true do	
  get_timeline
  sleep $polling_time
end

注意点:

  • コードはUTF-8として保存してください。(Twiiterから取得する文字コードUTF-8のため)
  • 通知希望地域は$check_locationで設定してください(標準は札幌)
  • 地震情報のソース(標準はp2pquakeさん)はサンプルとして2件、記述しているので好きなほうを選んでください。


動作確認:
WindowsXP SP3 ruby 1.8.7(i386-mswin32) with Growl v2.0 Beta 20

もし、バイナリ(Rubyのインストール不要)版が欲しい方が居られましたら、コメント等で連絡くください。