Hatena::ブログ(Diary)

5.1さらうどん Twitter

2009/09/18(Fri)

twitterからmixiボイスにマルチポストするRubyスクリプト書いた

| 06:57 |

【9月19日追記】修正版作りました。

twitterからmixiボイスにポストするスクリプト関連まとめ+修正版 - 5.1さらうどん

http://gyazo.com/443d7a568c0d551ac4c3fa808af80643.png

「mixiボイス」提供開始、つぶやき機能「エコー」正式サービス化 -BB Watch

昨日からmixiボイスのサービスが始まりましたね。

mixiエコー時代は、あまり使われていなかったようだけど、mixiボイスが始まってからは、強制的にホームに表示されるようになって利用者が増えたように感じます。


ということで、twitterからmixiボイスにマルチポストするRubyスクリプトを書いてみた。


使い方

スクリプト内の以下の変数を勝手に変更してください。

######################
#mixiのログイン情報
######################
mixi_username ='hogehoge' #mixiのログイン用メールアドレス
mixi_password ='fugafuga' #mixiのログイン用パスワード

######################
#twitterのログイン情報
######################
twitter_username ='piyopiyo' #twitterユーザー名(メールアドレスは不可)
twitter_password ='foobar' #twitterログイン用パスワード

######################
#その他設定項目(必要に応じて変更してください)
######################
cachefile ='echo_cache.dat' #キャッシュファイル名
comment ='[ついったーから投稿]' #追加するフッタ(何も追加しない場合''にしてください)

本当はyamlファイルでも用意すればよかったんだろうけど・・・。

また、ライブラリとして、「Mechanize」、「rubytter」が必要ですので、各自インストールしてください。

推奨動作環境は、Ruby1.8.7です。


これを、crontabで回してやればOK。

twitterにはAPI制限があるし、あまり頻繁にアクセスするとmixiの方でもアクセス制限がかかるようなので、10分に1回程度の実行が良いと思われます。


初回実行時は、自動的にキャッシュファイル(デフォルトではecho_cache.dat)が生成され、twitterの最新の1ポストのみがmixiボイスに投稿されます。

既にキャッシュファイルが存在している場合は、キャッシュファイルとタイムラインの差分を取り、まだボイスに投稿されていないものだけを投稿します。

ただし

・reply(@から始まるつぶやき)は一切mixiボイスにはポストされません

・twitterのタイムラインからは最近の20件までしか読み込まれません

・文章のみで差分を取っているため、過去20件以内に同内容のつぶやきがある場合は、mixiボイスにポストされません。

・つぶやき中の改行は、全てスペースに変換されます。


ソースは以下からコピーしてお使いください。

require 'rubygems'
require 'Mechanize'
require 'rubytter'
######################
#mixiのログイン情報
######################
mixi_username ='hogehoge' #mixiのログイン用メールアドレス
mixi_password ='fugafuga' #mixiのログイン用パスワード

######################
#twitterのログイン情報
######################
twitter_username ='piyopiyo' #twitterユーザー名(メールアドレスは不可)
twitter_password ='foobar' #twitterログイン用パスワード

######################
#その他設定項目(必要に応じて変更してください)
######################
cachefile ='echo_cache.dat' #キャッシュファイル名
comment ='[ついったーから投稿]' #追加するフッタ(何も追加しない場合''にしてください)

agent = WWW::Mechanize.new
#mixiにログイン
page = agent.get("http://mixi.jp/")
form = page.forms.first
form["email"] = mixi_username
form["password"] = mixi_password
form.submit

#mixiエコーのページを取得
page = agent.get('http://mixi.jp/recent_echo.pl')
form = page.forms[1]

tweets = Array.new
#twitterのタイムラインから最新の発言を取得して、配列に格納
tw =Rubytter.new(twitter_username,twitter_password)
tw.user_timeline(twitter_username).each{|status|
	tweets.push(status.text.gsub("\n"," "))
}

#キャッシュファイルを読み取る
#ファイルがない場合、現在のタイムラインの最新1件以外を全て書き込む
begin
 cache = File.open(cachefile)
rescue
 cache = File.open(cachefile,'w')
 for i in 1...(tweets.size)
 	cache.puts tweets[i]
 end
end
cache.close

#読み込んだキャッシュを配列に格納
cache = File.open(cachefile,'r')
posted =Array.new
cache.each do |line|
 posted.push(line)
end
cache.close

		
for i in 0...(tweets.size)
	flag =true
	#最新の発言20件とキャッシュが一致
	for j in 0...(posted.size)
		if tweets[i].gsub("\n","")==posted[j].gsub("\n","")
	 		flag = false
		end
	end
	#その発言がreplyである
	if /^@/=~tweets[i]
		flag =false
	end
	if flag ==true
		#mixiエコーに投稿
		f = form['body'] =tweets[i]+comment
		puts tweets[i]
		form.click_button
	end
end
#キャッシュを生成
cache = File.open(cachefile,'w')
 for i in 0...(tweets.size)
 	cache.puts tweets[i]
 end
cache.close

バグなどの報告お待ちしております。

【9/19追記】:コードの改変、再配布はご自由にどうぞ。こちらから引用したことのみ併記していただけると幸いです。

tobytoby 2009/09/19 06:13 こんにちは!改造したいのですが、コードのライセンスなどどのようになっておりますでしょうか?

gigi-netgigi-net 2009/09/19 06:15 どうも。こんなゴミみたいなものにライセンスもクソもないので改変、再配布ご自由にどうぞ。
こちらから引用したことのみ併記して貰えるとうれしいです。

辺境のついったったー辺境のついったったー 2009/09/19 12:20 ありがたく使わせて頂きます!
自分自身Rubyに関しては(というかプログラムについては)ずぶの素人で、環境の構築につまづいたりと大変でしたが、なんとか無事動作させることができました!
感謝感謝です!

tobytoby 2009/09/19 15:18 ありがとうございます!

このエントリーの派生でスクリプトを作っておられる方もいらっしゃて影響力がすごい ><;