tweetをmixi voiceに投稿する

twittermixi voiceを連携したいのだけど、ぐぐって見つけたやつは微妙なカンジなのでrubyで自分で書いた。
まだテスト中だけどコードは下みたいな感じ。
飲みながら書いたのであまり地震がありません。
いや、今日は地震があった。ないのは自信な。
cronで回すか、さらに下に書いたぐるぐるスクリプトでぐるぐるまわすとtwitterのつぶやきがmixi vocieにも反映される。

MIXI_NAME = 'mail address'
MIXI_PASS = 'password'

TW_NAME = 'username'
TW_PASS = 'password'

MIXI_FOOT = '[from twitter]'

SAVE_FILE = 'tweet.dat'
LOG_FILE = STDOUT #'tw2mixi.log'

MAX_RETRY = 10

require 'rubygems'
require 'mechanize'
require 'rubytter'
require 'kconv'
require 'logger'
require 'time'

$log = Logger.new(LOG_FILE)
$log.level = Logger::DEBUG

class Tweets
	def initialize(id, pass)
		raise 'need twitter id and password' if !(id and pass)
		@id = id
		@pass = pass
		@tw = nil
		@last_tweet = get_saved_time
	end
	def login
		@tw = Rubytter.new(@id, @pass)
	end
	def post_mixi
		mixi = MixiVoice.new(MIXI_NAME, MIXI_PASS)
		tweets = get_new_tweet
		tweets.sort!{ |new, old|
			Time.parse(new.created_at.to_s) <=> Time.parse(old.created_at.to_s)
		}
		tweets.each do |tweet|
			mixi.post(tweet.text.gsub("\n",' ') + MIXI_FOOT)
			File.open(SAVE_FILE, 'w') do |file|
				file.print Time.parse(tweet.reated_at.to_s)
			end
			$log.info(tweet.text.gsub("\n",' ') + MIXI_FOOT)
		end
	end
	def get_new_tweet
		retry_counter = 0
		begin
			login if !@tw
			if @last_tweet then
				tmp = Array.new
				tweets = @tw.user_timeline(@id)
				tweets.each do |tweet|
					if Time.parse(tweet.created_at.to_s) > @last_tweet then
						tmp << tweet
					end
				end
				return tmp
			else
				return [@tw.user_timeline(@id).first]
			end
		rescue
			$log.error $!.to_s + 'twitter get error'
			retry_counter += 1
			raise 'cant connect twitter' if retry_counter > MAX_RETRY
			@tw =nil
			retry
		end
	end
	def get_saved_time
		File.open(SAVE_FILE) do |file|
			if (str = file.read.to_s).size > 0 then
				return Time.parse(str)
			else
				return nil
			end
		end
	end
end

class MixiVoice
	VOICE_URI = 'http://mixi.jp/recent_voice.pl'
	def initialize(id, pass)
		raise 'need mixi id and password' if !(id and pass)
		@id = id
		@pass = pass
		@agent = nil
	end
	def post(text)
		retry_counter = 0
		begin
			login if !@agent
			page = @agent.get(VOICE_URI)
			form = page.forms[1]
			form['body'] = text
			form.click_button
		rescue
			$log.error $!.to_s + 'mixi voice post error'
			retry_counter += 1
			raise 'cant connect mixi' if retry_counter > MAX_RETRY
			@page = nil
			retry
		end
	end
	def login
		retry_counter = 0
		begin
			@agent = Mechanize.new
			page = @agent.get("http://mixi.jp/")
			form = page.forms.first
			form["email"] = @id
			form["password"] = @pass
			form.submit
		rescue
			$log.error $!.to_s + 'mixi login error'
			retry_counter += 1
			raise 'cant login mixi' if retry_counter > MAX_RETRY
			retry
		end
	end
end

Tweets.new(TW_NAME, TW_PASS).post_mixi
exec_ruby = ARGV.shift or raise
ruby_file = File.open(exec_ruby).read
while(1)
	begin
		eval ruby_file
	rescue
		print $!
	end
	sleep(60*5)
end