Twitterをmixiボイスに同期する

iPhoneからついったーを利用するほうが多いし、わざわざmixiボイスだけにポストすることはないので、同時にできないものかと思った。

やっぱりみんなやっているようで

とりあえずそのまま利用していたんだけど、どうやらこの前のDNS攻撃のときにハングしたみたいで、そしたら同じつぶやきを毎回ポストするようになってしまった。
原因はポストしたやつを記録しておくファイルがデッドロック状態になって、最新のものがずっと更新されないという状態になってしまったこと。

そこでスクリプトを読んでみたら、危なっかしい記述が多かったので作り直してみた。


t2m.rb 直

# 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