先日作成したTwitterの地震速報を受信してMacのGrowlへ通知するツールを作り直しました。
仕組み的には前回とたいして変わっていませんが、以下の機能を追加しました。
- 複数の対象をFollowする事を可能にした。
- SIGHUPを受信するとTwiterサーバに対して強制的に再接続を行うようにした。
- PIDファイルを出力するようにした。
前回のツールも今回のツールも、Macのスリープ復帰時にTwitterとの再接続が出来ないという
致命的な問題があります。
この問題への対策としてツールがSIGHUPを受信すると再接続を行うようにしました。
ですので、スリープ復帰後にターミナルから kill -HUP `cat ~/hogehoge.pid` てな感じで
SIGHUPを送信するとサーバーへの再接続が行われます。
スリープ復帰の度に手動入力するのは面倒なので sleepwatcherデーモン等を使って
スリープ復帰時にkill -HUPを自動実行すると良いのではないかと思います。
#!/usr/bin/ruby # -*- coding: utf-8 -*- require 'rubygems' require 'tweetstream' require 'ruby-growl' require 'webrick' # 監視するTwitterアカウント (どちらか片方で十分だと思う) # @earthquake_jp (4104111) # http://labs.transrain.net/products/earthquake_jp/ # @eew_jp (16052553) # http://quake.twiple.jp/ # 複数の監視対象に対応するため配列に格納 # ID番号 id = [4104111,16052553] # アカウント名 id_name = ["earthquake_jp","eew_jp"] # 自分のTwitterのアカウント $USERNAME = "username" $PASSWORD = "password" ### tweetの受信およびGrowlの送信処理 ################################# def EarthquakeNotification(id,id_name) # SIGHUPを受信したらメソッドを終了する Signal.trap(:HUP){return} # Growlへの接続をオープンする g = Growl.new("localhost","Earthquake Notification",["Notification"],nil,"") # TweetStreamはデーモンではなくクライアントとして動作させる TweetStream::Client.new($USERNAME, $PASSWORD).follow(*id) do |status| # screen_nameが監視対象と同一か判定する、同一なら通知を行なう。 if id_name.include?(status.user.screen_name) then g.notify("Notification","地震速報", "** #{status.user.screen_name} ** \n#{status.text}\n") end end end ### 本体 ############################################################## # PIDファイルの名前を生成 "HOME/スクリプト名.pid" pid_name = "#{File.expand_path("~")}/#{File.basename(__FILE__,'.*')}.pid" # TweetStreamでのデーモン化は行なわず、自力でのデーモン化を行なう WEBrick::Daemon.start do # PIDファイルの作成 File.open(pid_name,"w") do |file| file.puts(Process.pid) end # 再接続を行うためにループ処理で通信系を呼び出す loop do EarthquakeNotification(id,id_name) end end