ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2009-06-13

MacOS XでTwitterをSkypeのムードメッセージに

最近Twitterを始めたのだが、Twitterに投稿した呟きをSkypeのムードメッセージに反映したいと思うのは、男と女が惹かれ合うがごとく自然なことだろう。ちなみに、Skypeのムードメッセージというのは、名前の横っちょに表示される短いメッセージのことだ。Skypeを利用している人ならご存じだろう。

Skypeのデフォルトの機能では、Twitterからメッセージを拾ってくることは出来ない。さてどうしたものか?とGoogle先生に聞いてみたら、既に連携している人が居るではないか。このサイトで掲載されているプログラムを動かすべく、DBusやらpkg-configやらをインストールしたり、CPANで各種Perlモジュールをインストールしまくったりして、無事にこのプログラムを動作させることが出来た。しかし動作エラーが出てSkypeのムードメッセージが変更されない。なんでかな?と思ってさらに色々調べた結果・・・気がついた。「あ、これLinux専用じゃん!」

そんなわけで一連のインストール作業は徒労に終わったわけだが、日本男児たるものその程度で諦めるようではいけない!

気を取り直してちゃんと調べたところ、Mac OS XではSkype.frameworkを使ってSkypeをコントロールすることができるということが分かった。(最初から気づけよ>俺)このフレームワークを使って書かれたTwitter/Skype連携プログラムは存在しないようだし、ならばしょうがないからこのフレームワークを使ってプログラムを書くか!ということになるわけですな。

で、出来たプログラムがこれ↓

#!/usr/bin/ruby

require 'rubygems'
gem 'twitter'
require 'twitter'
require 'osx/cocoa'
OSX.require_framework 'Skype'

class SkypeMood < OSX::NSObject
def clientApplicationName
return 'Skype Mood From Twitter'
end

addRubyMethod_withType 'skypeAttachResponse:', 'v@:i'
def skypeAttachResponse(status)
return if status != 1
puts 'Successfully connected to Skype!'
end

def isRunning
return OSX::SkypeAPI.isSkypeRunning
end

def setDelegate appname
OSX::SkypeAPI.setSkypeDelegate self
end

def setMood text
OSX::SkypeAPI.sendSkypeCommand "SET PROFILE MOOD_TEXT #{text}"
end
end

class AppController < OSX::NSObject
@DEFAULT_INTERVAL = 60
attr_accessor :sm

def setAuth email, pass
@httpauth = Twitter::HTTPAuth.new(email, pass)
end

def initTimer interval
OSX::NSTimer::scheduledTimerWithTimeInterval_target_selector_userInfo_repeats(checkInterval(interval),self,:timerJob,nil,true)
end

def checkInterval interval
return interval == 0 ? @DEFAULT_INTERVAL : interval
end

def timerJob
return unless @sm.isRunning
timeline = Twitter::Base.new(@httpauth).user_timeline
@sm.setMood timeline[0].text
end
end

def usage
puts "Usage: #{$0} your.name@domain.com password [check interval]"
exit 1
end

usage if ARGV.length < 2

sm = SkypeMood.alloc.init
OSX::SkypeAPI.setSkypeDelegate(sm)
OSX::SkypeAPI.connect

c = AppController.new
c.setAuth ARGV[0].to_s, ARGV[1].to_s
c.initTimer ARGV[2].to_s
c.sm = sm

OSX::NSRunLoop.currentRunLoop.run

即興で作ったプログラムなので、なんでRubyなの?とかエラー処理が甘いんじゃね?などという点には目をつむって頂きたい。

使い方は簡単。

1. まずはこのプログラムを/usr/local/bin/twittermood.rbなどに保存しよう。

2. コマンドを実行する。

shell> twittermood.rb メールアドレス パスワード インターバル

これらはTwitterに登録したメールアドレスとパスワードを使う。インターバルは秒単位だ。

3. Twitterに投稿する。

4. しばし待つ。

5. Skypeのムードメッセージに反映される。

6. プログラムを終了させるときはCtrl-CまたはkillコマンドでOK。


ただし、このプログラムはそのままでは利用出来ない。このプログラムで利用しているtwitter gemSkype.frameworkをインストールする必要があるからだ。

Skype.frameworkのインストールは簡単だ。次のコマンドを使おう。

shell> sudo cp -r /Applications/Skype.app/Contents/Frameworks/* /Library/Frameworks

twitter gemは、gemコマンドでインストールすることが出来るのだが、gem自信のバージョンが1.3.1以上でないとインストール出来ないので、まずは先にgemをアップグレードしなければならない。俺のマシンでは、元々インストールされているgemは1.0.1だった。gemのアップグレードとインストールを行う一連のコマンドは次の通り。

shell> wget http://rubyforge.org/frs/download.php/57643/rubygems-1.3.4.tgz
shell> tar zxf rubygems-1.3.4.tgz
shell> cd rubygems-1.3.4
shell> sudo ruby setup.rb
shell> sudo gem install twitter

そんなわけでTwitterの投稿をSkypeムードメッセージに登録したい人はお試しあれ!


追記: 上記のプログラムのライセンスはもちろんGPLv2 or later!!

1 コメント:

chilldope さんのコメント...

できませんでしたー。こんなエラーメッセージでした。。。

/opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- osx/cocoa (LoadError)
from /opt/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from twittermood.rb:6

コメントを投稿