発売日reminder
Daemon化してみた。本やCD、DVDごとにアトリビュートが違うから意外と手間がかかった。24時間sleepすればいいんだけど、MacBookで動かすので1時間sleepして1日1回だけチェックするようにしてみた。ちゃんと動くかな?
追記>AWSがtimeoutすることがあるようです。
$KCODE='u' require 'rubygems' require 'recs4' gem 'twitter4r' require 'twitter' require 'date' require 'webrick' # Your Amazon Web Service access key AWSKey = "xxxxxxxxxxxxxxxxxxxxxx" # Your target list TARGET = [ {:artist => "Coldplay", :category => "Music"}, {:artist => "スガシカオ", :category => "Music"}, {:author => "伊坂幸太郎", :category => "Books"}, {:author => "森博嗣", :category => "Books"}, {:title => "サラリーマンNEO", :category => "DVD"} ] # Twitter user/pass USER = "xxxxxxxxxx" PASSWORD = "xxxxxxxxxx" class AmazonService OPTION = { "Books" => {:search_index => "Books", :sort => "daterank", :item_page => "1", :response_group => "Medium"}, "Music" => {:search_index => "Music", :sort => "-releasedate", :item_page => "1", :response_group => "Medium"}, "DVD" => {:search_index => "DVD", :sort => "-releasedate", :item_page => "1", :response_group => "Medium"} } OUTPUT = { "Books" => {:title => :title, :date => :publication_date, :author => :author}, "Music" => {:title => :title, :date => :release_date, :author => :artist}, "DVD" => {:title => :title, :date => :release_date, :author => :actor} } def initialize @opr = RECS4::Operation.new(AWSKey, :locale => "jp") end def retrieve ret = [] TARGET.each do |t| op = t.reject{|k, v| k == :keyword or k == :category} op.merge!(OPTION[t[:category]]) result = @opr.item_search(t[:keyword], op) next if result[:items][:item] == nil result[:items][:item].each do |i| item = {} ret << item OUTPUT[t[:category]].each do |key, value| if i[:item_attributes][value] != nil then item[key] = i[:item_attributes][value].text else item[key] = "" end end end end return screen(ret) end def screen(items) tmr = Date::today + 1 items.delete_if {|i| i[:date] != tmr.to_s} end end class ReleasePoster def initialize @twit = Twitter::Client.new(:login => USER, :password => PASSWORD) end def post(items) items.each do |i| str = "明日発売: " + i[:title] + " / " + i[:author] @twit.status(:post, str) end end end WEBrick::Daemon.start { today = "" loop do unless today == Date::today then as = AmazonService.new items = as.retrieve if items != nil and items.size > 0 then tw = ReleasePoster.new tw.post(items) tw = nil end as = nil today = Date::today end sleep 60 * 60 end }