Twitterをmixiボイスに同期する
iPhoneからついったーを利用するほうが多いし、わざわざmixiボイスだけにポストすることはないので、同時にできないものかと思った。
やっぱりみんなやっているようで
- twitterからmixiボイスにマルチポストするRubyスクリプト書いた - 5.1さらうどん
- Mixiエコーの内容をtwitterにポストするrubyスクリプト - 電脳戦士ハラキリ -SE道とは死ぬ事と見つけたり-
とりあえずそのまま利用していたんだけど、どうやらこの前のDNS攻撃のときにハングしたみたいで、そしたら同じつぶやきを毎回ポストするようになってしまった。
原因はポストしたやつを記録しておくファイルがデッドロック状態になって、最新のものがずっと更新されないという状態になってしまったこと。
そこでスクリプトを読んでみたら、危なっかしい記述が多かったので作り直してみた。
# vim:set encoding=utf-8 et ts=2 sts=2 sw=2: # #= ついったーとmixiボイスを同期する # require "rubygems" require "mechanize" require "rubytter" # mixiのログイン情報 mixi_id = "mixi" mixi_passwd = "password" # ついったーのログイン情報 twitter_id = "twitter" twitter_passwd = "password" # mixiにログイン agent = WWW::Mechanize.new page = agent.get("http://mixi.jp/") form = page.forms.first form["email"] = mixi_id form["password"] = mixi_passwd form.submit # mixiボイスの投稿フォームを取得 page = agent.get("http://mixi.jp/recent_echo.pl") form = nil page.forms.each do |f| if f.action =~ %r!/add_echo.pl$! form = f break end end # ついったーから最新の発言を取得 tweets = [] Rubytter.new(twitter_id,twitter_passwd).user_timeline(twitter_id).each do |t| tweets << t.text.tr("\n"," ") end # ポスト済のログファイルを読み込んで書き込み済のものを排除 posted_log_file = File.expand_path("posted.log", File.dirname(__FILE__)) posted = [] if File.exist?(posted_log_file) open(posted_log_file, "r"){|f| posted = f.readlines} end posts = tweets.dup posted.each do |p| posts.delete(p.chop) end exit if posts.empty? # ログファイルを更新 open(posted_log_file, "w"){|f| f.puts tweets.join("\n")} # mixiボイスへの投稿 posts.reverse.each do |p| form["body"] = p form.submit end