Twitterで特定アカウントあてのメッセージだけを表示してみるスクリプトをrubyで作ってみた
参考にしたのは、
http://ruby.g.hatena.ne.jp/garyo/20100512/p2
http://twitter.rubyforge.org/
ほとんど参考情報のまま。
#!/usr/local/bin/ruby
require 'twitter'
httpauth = Twitter::HTTPAuth.new('USERNAME', 'PASSWORD')
client = Twitter::Base.new(httpauth)
Twitter::Search.new.to('SEARCH_ACCOUNT').each do |r|
puts
puts r.created_at
puts r.from_user
puts r.text
end
なお、rubyのバージョンは
ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]
Comments
CentOS5.4
の環境で作成。
最初に
gem install twitter
をしたかったが、
rubygems が無かったので、rubygems のインストールからスタート。
CentOSには、残念ながらrubygemsのパッケージがないので、
http://rubyforge.org/frs/?group_id=126&release_id=43601
からソースダウンロード。
インストールしようとしたら、rubyのバージョンが1.8.5ではダメ、1.8.6以上にしろと言われた。
もうついでなので、CentOSパッケージ版ruby関連は削除した。
yum remove ruby ruby-devel ruby-libs
ソースからruby 1.9.1p378 をインストールし、更にrubygems をインストール。
ようやく
gem install twitter
が実行できた。
Twitter::Search
の結果、返ってくるのは、
こんな感じ。
<#Hashie::Mash
created_at="Wed, 12 May 2010 00:48:36 +0000"
from_user="account"
from_user_id=123456789
geo=nil
id=12345678901
iso_language_code="ja"
metadata=<#Hashie::Mash result_type="recent">
profile_image_url="http://*$#.com/images/default_profile.png"
source="<a href="http://twitter.com/">web</a>"
text="@SEARCH_ACCOUNT かなのめがねかめのなか"
to_user="SEARCH_ACCOUNT"
to_user_id=987654321>
Vine Linux 4.2
gem install twitter した時の出力
# gem install twitter
When you HTTParty, you must party hard!
Building native extensions. This could take a while...
Successfully installed oauth-0.4.0
Successfully installed hashie-0.2.0
Successfully installed crack-0.1.6
Successfully installed httparty-0.5.2
Successfully installed yajl-ruby-0.7.6
Successfully installed twitter-0.9.5
6 gems installed
Installing ri documentation for oauth-0.4.0...
Installing ri documentation for hashie-0.2.0...
Installing ri documentation for crack-0.1.6...
Installing ri documentation for httparty-0.5.2...
Installing ri documentation for yajl-ruby-0.7.6...
Installing ri documentation for twitter-0.9.5...
Updating class cache with 1381 classes...
Installing RDoc documentation for oauth-0.4.0...
Installing RDoc documentation for hashie-0.2.0...
Installing RDoc documentation for crack-0.1.6...
Installing RDoc documentation for httparty-0.5.2...
Installing RDoc documentation for yajl-ruby-0.7.6...
Installing RDoc documentation for twitter-0.9.5...
こんなのでした。
r.created_at を日本標準時に
puts r.created_at
を
puts Time.parse (r.created_at)
にする。
Tue, 18 May 2010 11:58:25 +0000
が
2010-05-18 20:58:25 +0900
に変わる。
puts (Time.parse r.created_at).strftime "%Y/%m/%d(%a) %X"
だと、
2010/05/18(Tue) 20:58:25
となる。
新しいメッセージを受け取ったらメールで通知
CRONで1時間に1回稼働するということにして、1時間以内のメッセージだったら通知ということにした。
CRONを信じられない場合は、$INTERVAL_TIMEをもう少し長めに取った方がよいでしょう。
最後の確認は、人間の眼でするということで。
# cat chk_twitter.rb
#!/usr/local/bin/ruby # -*- coding: utf-8 -*- require 'twitter' require 'net/smtp' require 'date' $INTERVAL_TIME = 1 * 60 * 60 #second unit $SENDER_MAIL = "送信元メールアドレス" $SMTP_SERVER = "smtp.xxx.net" $DOMEIN = "xxx.net" $USER = "smtpアカウント" $PASSWORD = "smtpパスワード" to = ["a@xxx.net", "b@xxx.com"] $BASE_TIME = Time.parse DateTime.now.to_s httpauth = Twitter::HTTPAuth.new('Twitterアカウント', 'Twitterパスワード') client = Twitter::Base.new(httpauth) Twitter::Search.new.to('kagoyajp').each do |r| if ($BASE_TIME - (Time.parse r.created_at)) $INTERVAL_TIME $BODY = -"EOM" #{$BODY} #{(Time.parse r.created_at).strftime "%Y/%m/%d(%a) %X"} #{r.from_user} #{r.text} EOM end end def sendmail(body, header) Net::SMTP.start($SMTP_SERVER, 587, $DOMEIN, $USER, $PASSWORD, :login) do |smtp| smtp.sendmail "EOM", $SENDER_MAIL, header["to"] From: #{$SENDER_MAIL} To: #{header["to"]} Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Date: #{Time.now.strftime '%a, %d %b %Y %H:%M:%S %z'} Subject: #{header["subject"]} #{body} EOM end end if $BODY sendmail $BODY, "to" => to, "subject" => "Twitterで新しいメッセージを受信しました" end送信先メールアドレスを指定する時、
to = ["a@xxx.net", "b@xxx.com"]
で送信できるけれど、メーラーで見た時も宛先がこのままになる。
メールの文字コードはcharset=UTF-8にした。
件名が文字化けする場合としない場合がある。
MacのMailでも受信サーバーにより違う。
warning
/usr/local/lib/ruby/1.9.1/net/protocol.rb:291: warning: regexp match /.../n against to UTF-8 string
というwarningがたくさん出ます。
意図したとおりのメールは送信されるのですが。