Twitter から mixiボイスと、ついでに Skype のムードメッセージを変更するスクリプト

Twitter をはじめてから、類似のサービスがいろいろあるなーと思っていましたが、

お互いに投稿を共有できないサービスも多いみたいです。

せっかくだから mixiボイスにも投稿しちゃうような方法は無いかと調べていたら、

5.1さらうどん 様の「[Ruby]twitterからmixiボイスにポストするスクリプト関連まとめ+修正版」にまさしくそれを行うためのスクリプトが掲載されていました!

Ruby は全くの素人ですが、試してみたところ良好に動作したので、そのまま利用させていただくことにしました。



さて、次は Skype のムードメッセージも同様にできないかと調べていたら、

漢(オトコ)のコンピュータ道 様の「MacOS XでTwitterをSkypeのムードメッセージに」に、良いスクリプトが掲載されていることをみつけました。

これも上手くうごきましたので、両方使うことにしたのですが、

せっかくだから 1本にまとめてしまおうと、改造してみることにしました。

#と言いましても、私のオリジナルコードは一切なく、本当に両名の方のコードを合体させただけです・・・



できあがりはこちら。


#!/usr/bin/ruby
# -*- coding: utf-8 -*-

require 'rubygems'
require 'Mechanize'
require 'rubytter'
require 'osx/cocoa'

OSX.require_framework 'Skype'

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.close

tweets =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
end

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 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
func
end
end

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

c = AppController.new
c.initTimer 60
c.sm = sm

OSX::NSRunLoop.currentRunLoop.run

Ruby は全くの未経験なので、グローバルな定義で良いものが関数内部にあったりしますが、

とりあえず動いているのでよしとしよう・・・



動かし方

Snow LeopardRuby 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 で、前者は 改変についての言及を見つけることができませんでしたが、

他の方々も改変版を配布していらっしゃる様なので、ここに公開させていただきました。

#問題がある場合は、速やかに削除いたします。



ご両名に有用なスクリプトを公開していただことを感謝いたします!