Sunflat のブログ

ソフトウェア開発についての話題が多いかも

TwitterでReplyが来たらメールするスクリプト

Twitterで、Replyが来たらメールするRubyスクリプトを書いてみた。
たまにしかログインしない人向けw

ruby twitter_reply_mail.rb "ユーザ名" "パスワード" "送信に使うSMTPサーバ名" "メールアドレス"

のように引数を指定して、タスク(Windows)やcronなどで定期的に呼び出せば、OK!

Windowsで動作確認しましたが、Linux等でも動くと思う

twitter_reply_mail.rb
#!ruby -Ku

require 'date'
require 'net/http'
require 'net/smtp'
require 'yaml'
require 'rexml/document'
require 'kconv'

$KCODE='u'

def do_mail(subject,msg)
  # puts msg; return # for test
  msg=Kconv.tojis(msg)
  Net::SMTP.start( $smtpsrv, 25 ) {|smtp|
    smtp.send_mail <<____, $mailfrom, $mailto
From: #{$mailfrom}
To: #{$mailto}
Subject: #{subject}
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=iso-2022-jp

#{msg}
____
  }
  puts "I sent a mail."
end

def error(msg)
  puts "Error: #{msg}"
  do_mail "Error from twitter_reply_mail", msg
  exit(1)
end

# parameters
error "Give me paremeters!" if ARGV.length<4
account=ARGV[0]; password=ARGV[1]; $smtpsrv=ARGV[2]; $mailto=ARGV[3]
$mailfrom=$mailto

begin

# load data
DATA_FILE='twitter_reply_mail.dat'
datafile=File.exist?(DATA_FILE) ? YAML.load(File.open(DATA_FILE, 'r')) : {}

# http get
res=nil;
Net::HTTP.version_1_2
Net::HTTP.start('twitter.com', 80) {|http|
  req = Net::HTTP::Get.new('/statuses/replies.xml')
  req.basic_auth account, password
  res = http.request(req)
}

# parse
mailbody=""
error("Invalid responce code: #{res.code}") unless res.code.to_i==200
lastdate=(datafile['lastdate'].nil?) ? DateTime.new(2000) : DateTime.parse(datafile['lastdate'].to_s)
newdate=DateTime.new(2000)
doc=REXML::Document.new res.body
doc.elements.each("/statuses/status") do |s|
  sdate=DateTime.parse(s.elements["created_at"].text)
  newdate=sdate if newdate < sdate
  next if sdate <= lastdate
  mailbody << s.elements["user/screen_name"].text << ": " << s.elements["text"].text << "\n"
end

# mail
if !(mailbody.empty?)
  mailbody << "\nhttp://twitter.com/home/\n"
  do_mail "Twitter reply arrived", mailbody
else
  puts "no update"
end

# save data
datafile['lastdate']=newdate.to_s
YAML.dump(datafile,File.open(DATA_FILE, 'w'))

rescue
  error $!.to_s + "\nat " + $@.to_s
end

※カレントディレクトリに、twitter_reply_mail.datというデータファイル(最新発言の日時を記録)を生成します。
※メールを送らずにテストしたい場合は、13行目のコメントをはずすと良いかも