tweetをmixi voiceに投稿する
twitterとmixi 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