先日作成した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