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

指定したリストにいる人たちがフォローしている人の中で人気のある人を探す

この人はおもろいなと思った人をリストにまとめた後、自分がおもろいと思っている人がフォローしている人はおもろいだろうということで、そのリストの人たちに人気のある人たちを探してフォローしてやろうとかそういうことを考えました。
というか、前作ったやつのtwitter APIを使ったバージョン。


twitter.rb 0.8.3 をつかっているので

gem isntall twitter 

してください。


とりあえず、数を数えるまで作った。
リストを作るのがとても面倒くさいことに気がづきました。おやすみなさい。

require 'rubygems'
require 'twitter'

TWIT_ID = 'name'
TWIT_PW = 'password'

TARGET_LIST = 'listname'

client = Twitter::HTTPAuth.new(TWIT_ID, TWIT_PW)
tw = Twitter::Base.new(client)

list_members = tw.list_members(TWIT_ID, TARGET_LIST)

counter = Hash.new(0)
list_members.users.each do |user|
	print user["screen_name"], "\n"
	fr_lists = tw.friends(:screen_name => user["screen_name"])
	fr_lists.each do |tmp_user|
		counter[tmp_user["screen_name"]] += 1
	end
	sleep(1)
end

File.open("out.list", "w") do |f|
	counter.keys.sort{|a,b| counter[b] <=> counter[a]}.each do |user|
		f.print user, ":", counter[user], "\n"
	end
end

Windows Media Audioのタグを頼りにフォルダ作ってファイル名変更して整理する

一部 ruby の wmainfo でタグ情報を読んだ時にエラーが出る。
iconv が UTF-8 の変換で失敗する。なぜに?

# checking wma tag informaiton and rename from tag infomation

require 'rubygems'
require 'wmainfo'
require 'find'
require 'fileutils'
require 'kconv'

search_path = ARGV.shift
dest_path = ARGV.shift
dest_path = search_path if dest_path.nil?
col_name = ['AlbumTitle', 'AlbumArtist', 'TrackNumber', 'Author', 'Title']

log = File.open("log.csv", "w")
log.print 'FileName,' + col_name.join(',') + "\n"

Find.find(search_path) do |filename|
	next unless filename.match(/\.(ASF|asf|wma|WMA)$/)
	if FileTest.directory?(filename) then
		print filename, "\n"
		next
	end
	begin
		log.print filename, ","
		print filename, "\n"
		wma = WmaInfo.new(filename, :encoding=>"UTF-8")
		tmp = []
		col_name.each do |col|
			tmp << wma.tags[col]
		end
		log.print tmp.join(',')
		new_name = []
		new_path = []
		if (artist = wma.tags['AlbumArtist'].to_s).size > 0 then
			new_path << artist
		elsif (artist = wma.tags['Author'].to_s).size > 0 then
			new_path << artist
		end
		if (album = wma.tags['AlbumTitle'].to_s).size > 0 then
			new_path << album
		end
		if (track = wma.tags['TrackNumber'].to_s).size > 0 then
			new_name << sprintf("%02d", track)
		end
		if wma.tags['Title'].to_s.size > 0 then
			new_name << wma.tags['Title'].to_s
		else
			next
		end
	rescue
		log.print $!, "\n"
		next
	end
	new_name = (new_name.join(' - ') + '.wma').tosjis
	new_path = (dest_path + '\\' + new_path.join('\\')).tosjis
	new_name.gsub!(/[\/:<>\\\*\?\"|]/, '_') if new_name.match(/[\/:<>\\\*\?\"|]/)
	new_name = new_path + '\\' + new_name
	if FileTest.exist?(new_name) then
		log.print("don't move\n")
		print "don't move\n"
		next
	else
		p new_path
		FileUtils.mkdir_p(new_path) if !FileTest.exist?(new_path)
		FileUtils.mv(filename, new_name)
		print new_name,"\n"
		log.print "," + new_name + "\n"
	end
end

下に書いたmp3バージョンはフォルダ分類はしてなかった。
だいぶ前に作ったやつだから動作忘れてた。

mp3のタグを頼りにファイル名を変更したりフォルダに分類して入れたりする

# select mp3 files which have id3 tag
# 2009/11/22

require 'find'
require 'rubygems'
require 'mp3info'
require 'kconv'
require 'fileutils'

search_path = ARGV.shift
dest_path = ARGV.shift

Find.find(search_path) do |filename|
	next unless filename.match(/\.(mp3|MP3)$/)
	if FileTest.directory?(filename) then
		print filename, "\n"
		next
	end
	tmp = Array.new
	begin
		Mp3Info.open(filename) do |mp3|
			tmp = [
				mp3.tag.artist.to_s.tosjis,
				mp3.tag.album.to_s.tosjis,
				mp3.tag.title.to_s.tosjis,
				mp3.tag.tracknum,
				mp3.mpeg_version,
				mp3.layer,
				mp3.bitrate,
				mp3.samplerate,
				mp3.length,
				FileTest.size?(filename),
				filename
			]
		end
	rescue
		print $!, "\n"
		next
	end
	if tmp[2].to_s.size > 0 then
		begin
			tracknum = sprintf("%02d", tmp[3].to_s)
		rescue
			tracknum = "00"
		end
		new_file = [tmp[0].to_s, tmp[1].to_s, tracknum, tmp[2].to_s].join(' - ') + '.mp3'
		new_file.gsub!(/[\/:<>\\\*\?\"|]/, '_') if new_file.match(/[\/:<>\\\*\?\"|]/)
		print  dest_path + '\\' + new_file, "\n"
		begin
			FileUtils.mv(filename,  dest_path + '/' + new_file)
		rescue
			print $!, "\n"
			next
		end
	end
end

64bitのRuby1.9をWindowsに入れるときのメモ

ニューマシン購入とともに64bitに移行しました。
ということでせっかくなのでRubyも64bitに移行しようと思います。
どういうメリットが有るかは良くわかってませんが使ってみるのです。


http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html
この辺から最新のx64版をダウンロードしてc:\local\ruby1.9\とかに展開しました。


ひょっとしたら拡張ライブラリも64bitにしとかないとまずいんじゃないのか?と思い、64bitでコンパイルされているやつを探しました。32bitのdllとかいれるとどうなるかは知りません。(→うごかないようです


http://www.winimage.com/zLibDll/index.html
zlibは上記ページの「for AMD64/Intel EM64T」って書いてあるところのリンクからバイナリをゲットです。
ゲットしたものを展開し、zliwapi.dllとかいう名前になっているのでzlib.dllにリネームしてc:\local\ruby1.9\bin\にコピーして完了。
rubygemsも無事動いたようなのでこれでOKなんじゃないでしょうか。


うーん、意外とx64のバイナリが見つからなかったり、x86のモノもインストールしようかしら。