Twitter から mixiボイスと、ついでに Skype のムードメッセージを変更するスクリプト
Twitter をはじめてから、類似のサービスがいろいろあるなーと思っていましたが、
お互いに投稿を共有できないサービスも多いみたいです。
せっかくだから mixiボイスにも投稿しちゃうような方法は無いかと調べていたら、
5.1さらうどん 様の「[Ruby]twitterからmixiボイスにポストするスクリプト関連まとめ+修正版」にまさしくそれを行うためのスクリプトが掲載されていました!
Ruby は全くの素人ですが、試してみたところ良好に動作したので、そのまま利用させていただくことにしました。
さて、次は Skype のムードメッセージも同様にできないかと調べていたら、
漢(オトコ)のコンピュータ道 様の「MacOS XでTwitterをSkypeのムードメッセージに」に、良いスクリプトが掲載されていることをみつけました。
これも上手くうごきましたので、両方使うことにしたのですが、
せっかくだから 1本にまとめてしまおうと、改造してみることにしました。
#と言いましても、私のオリジナルコードは一切なく、本当に両名の方のコードを合体させただけです・・・
できあがりはこちら。
Ruby は全くの未経験なので、グローバルな定義で良いものが関数内部にあったりしますが、
#!/usr/bin/ruby
# -*- coding: utf-8 -*-require 'rubygems'
require 'Mechanize'
require 'rubytter'
require 'osx/cocoa'def func
######################
#mixiのログイン情報
######################
mixi_username ='' # mixiのログイン用メールアドレス
mixi_password ='' # mixiのログイン用パスワード######################
#twitterのログイン情報
######################
twitter_username ='' # twitterユーザー名(メールアドレスは不可です。
twitter_password ='' # twitterログイン用パスワード######################
#その他設定項目(必要に応じて変更してください)
######################
cachefile ='echo_cache.dat' # キャッシュファイル名
comment ='[ついったーから投稿]' #追加するフッタ(何も追加しない場合''にしてください)
tweets = Array.new
# twitterのタイムラインから最新の発言を取得して、配列に格納
begin
tw =Rubytter.new(twitter_username,twitter_password)
tw.user_timeline(twitter_username).each{|status|
tweets.push(status.text.gsub("\n"," "))
}
rescue Exception => e
puts e.backtrace
return e.backtrace
end;# キャッシュファイルを読み取る
# ファイルがない場合、現在のタイムラインの最新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.closetweets =tweets.reverse
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
break
end
end
# その発言がreplyである
if /^@/=~tweets[i]
flag =false
end
if flag ==true
# mixiエコーに投稿
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]f = form['body'] =tweets[i]+comment
puts tweets[i]
form.click_button
@sm.setMood tweets[i]+comment
end
end
# キャッシュを生成
cache = File.open(cachefile,'w')
for i in 0...(tweets.size)
cache.puts tweets[i]
end
cache.close
endclass SkypeMood < OSX::NSObject
def clientApplicationName
return 'Skype Mood From Twitter'
endaddRubyMethod_withType 'skypeAttachResponse:', 'v@:i'
def skypeAttachResponse(status)
return if status != 1
puts 'Successfully connected to Skype!'
enddef isRunning
return OSX::SkypeAPI.isSkypeRunning
enddef setDelegate appname
OSX::SkypeAPI.setSkypeDelegate self
enddef setMood text
OSX::SkypeAPI.sendSkypeCommand "SET PROFILE MOOD_TEXT #{text}"
end
endclass AppController < OSX::NSObject
@DEFAULT_INTERVAL = 60
attr_accessor :smdef initTimer interval
OSX::NSTimer::scheduledTimerWithTimeInterval_target_selector_userInfo_repeats(checkInterval(interval),self,:timerJob,nil,true)
enddef checkInterval interval
return interval == 0 ? @DEFAULT_INTERVAL : interval
enddef timerJob
return unless @sm.isRunning
func
end
endsm = SkypeMood.alloc.init
OSX::SkypeAPI.setSkypeDelegate(sm)
OSX::SkypeAPI.connectc = AppController.new
c.initTimer 60
c.sm = smOSX::NSRunLoop.currentRunLoop.run
とりあえず動いているのでよしとしよう・・・
動かし方
Snow Leopard の Ruby 1.8.7 で試しました。
起動すると1分置きにmixiボイスの記事と比較して、ボイスへの投稿とムードメッセージの変更を行います。
~% sudo gem install Mechanize
~% sudo gem install rubytter
~% sudo cp -Rpa /Applications/Skype.app/Contents/Frameworks/Skype.framework/ /Library/Frameworks/Skype.frameworkスクリプトを nantara.rb などとして保存
~% ruby nantara.rb
後者は GPLv2 で、前者は 改変についての言及を見つけることができませんでしたが、
他の方々も改変版を配布していらっしゃる様なので、ここに公開させていただきました。
#問題がある場合は、速やかに削除いたします。
ご両名に有用なスクリプトを公開していただことを感謝いたします!