arc の日記

はてなダイアリーから引っ越してきました。さらに新しい記事は https://junkato.jp/ja/blog/ で書いています。

Skypeチャットの新着発言をTwitterのDM(iPadのBoxcar)で読む

僕は、手元のマシンでSkypeを常時起動しているわけではないんですが、チームワークの会議室代わりにSkypeチャットを使っており、Skypeチャットで発言があったらすぐに知りたいと常々思っていました。そんな折、チームのid:takashyx便利そうなスクリプトを書いていたので、同じようなことをしてみました。
具体的には、Skypeのチャットルームで誰かが発言をすると、Twitterの自分のアカウント宛てにDirect Message(DM)が送られてきます。そして、Twitterの設定でDMが送られてくるとPC宛にメールで通知され、Gmailのフィルタで携帯に転送されて届くようになっています。さらに、DMはBoxcarというサービスで監視されており、iPadにプッシュ通知が送られてきます。
このプログラムを動かしてからは、携帯かiPadが傍にあるか、Twitterを見ているときにはSkypeの新着発言にすぐ気付けるようになりました。

対象

なお、僕はMac OSX Snow Leopard (x86)とWindows (x64)で動作確認しました。この記事では主にMac OSXでサービスを動作させる手順について説明します。

準備

Twitterの連携アプリ登録

Twitterの連携アプリ登録を行ってOAuthのConsumer key/secretを取得します。

Skype.frameworkのコピー

Skype API(Skype4Java)を使うために必要です。

mashiro:~ arc$ sudo cp -Rf /Applications/Skype.app/Contents/Frameworks/Skype.framework/ /Library/Frameworks/
Skype2witterのダウンロード

http://digitalmuseum.jp/etc/hatena/arc_at_dmz/diary/20100724-Skype2witter.tar.gzをダウンロードして適当なディレクトリに展開します。

mashiro:~ arc$ wget http://digitalmuseum.jp/etc/hatena/arc_at_dmz/diary/20100724-Skype2witter.tar.gz
mashiro:~ arc$ tar -zxvf 20100724-Skype2witter.tar.gz
x Skype2witter/
x Skype2witter/bin/
x Skype2witter/lib/
x Skype2witter/make.sh
x Skype2witter/oauth.sh
x Skype2witter/skype2witter.sh
x Skype2witter/src/
x Skype2witter/src/com/
x Skype2witter/src/Skype2witter.java
x Skype2witter/src/TwitterOAuth.java
x Skype2witter/src/com/skype/
x Skype2witter/src/com/skype/ChatMessageFixed.java
x Skype2witter/src/com/skype/ChatMessageMonitor.java
x Skype2witter/lib/skype4java/
x Skype2witter/lib/twitter4j/
x Skype2witter/lib/twitter4j/LICENSE.txt
x Skype2witter/lib/twitter4j/twitter4j-core-2.1.3.jar
x Skype2witter/lib/skype4java/LICENSE.txt
x Skype2witter/lib/skype4java/skype.jar
x Skype2witter/bin/com/
x Skype2witter/bin/Skype2witter$1.class
x Skype2witter/bin/Skype2witter.class
x Skype2witter/bin/TwitterOAuth.class
x Skype2witter/bin/com/skype/
x Skype2witter/bin/com/skype/ChatMessageFixed$LeaveReason.class
x Skype2witter/bin/com/skype/ChatMessageFixed$Status.class
x Skype2witter/bin/com/skype/ChatMessageFixed$Type.class
x Skype2witter/bin/com/skype/ChatMessageFixed.class
x Skype2witter/bin/com/skype/ChatMessageMonitor$Listener.class
x Skype2witter/bin/com/skype/ChatMessageMonitor.class

OAuthのAccess token取得

先ほど取得したConsumer key/secretを引数にして、コンソールでシェルスクリプト oauth.sh を起動します。
提示されたURLをブラウザで開き、自分のアカウントへのアクセスを「許可」すると、PINコードが表示されます。それをコンソールに入力すると、Access tokenが表示されます。この情報を使ってSkypeのチャットメッセージをTwitterのDMとして送信します。

mashiro:~ arc$ cd Skype2witter/
mashiro:Skype2witter arc$ ./oauth.sh consumer_key consumer_secret
[Sat Jul 24 16:28:59 JST 2010]Will use class twitter4j.internal.logging.StdOutLoggerFactory as logging factory.
[Sat Jul 24 16:28:59 JST 2010]Will use twitter4j.internal.http.HttpClientImpl as HttpClient implementation.
Open the following URL and grant access to your account:
https://twitter.com/oauth/authorize?oauth_token=hogehoge
Enter the PIN(if aviailable) or just hit enter.
[PIN]:1111111
token: foobar
tokenSecret: foobarsecret

Skype2witterの起動

これまでに集めた情報を引数に与えてSkype2witterを起動します。 & を付けてバックグラウンドジョブとして起動したのち、disownでデーモンプロセス化するのがおすすめです。こうすると、シェルからログアウトしてもずっとプログラムが動いてくれます。

mashiro:Skype2witter arc$ ./skype2witter.sh consumer_key consumer_secret foobar foobarsecret &
[1] 50365
mashiro:Skype2witter arc$ [Sat Jul 24 16:41:25 JST 2010]Will use class twitter4j.internal.logging.StdOutLoggerFactory as logging factory.
[Sat Jul 24 16:41:25 JST 2010]Will use twitter4j.internal.http.HttpClientImpl as HttpClient implementation.
CURRENTUSERHANDLE arc_at_dmz
USERSTATUS ONLINE
CONNSTATUS ONLINE
SKYPEVERSION 2.8.0.851
mashiro:Skype2witter arc$ disown %1

実際に発言があるとこのようなログが出ます。

MESSAGE 387 STATUS RECEIVED
MESSAGE 387 PARTNER_DISPNAME digitalmuseum
MESSAGE 387 BODY hello, world!
Skypeで digitalmuseum が発言しました: hello, world!

また、携帯には次のようなメールが送られてきました。

Skypeで digitalmuseum が発言しました: hello, world!
arc@dmz / arcatdmz

  • -

このユーザーをフォローしたい場合はこちらまで:http://twitter.jp/arcatdmz
(以下略)

なお、Mac OSXでSkype4Javaを使うにあたって工夫した点がいくつかあります。以降、ソースコードについての解説が続きます。

Skype2witterのソース

20100724-Skype2witter.tar.gzのsrcディレクトリ以下にソースコードが入っており、make.shを実行することで最新のコードをコンパイルできます。

mashiro:Skype2witter arc$ ls -al
total 24
drwxr-xr-x   8 arc  staff   272  7 24 16:39 .
drwx------+ 36 arc  staff  1224  7 24 16:58 ..
drwxr-xr-x   6 arc  staff   204  7 24 16:15 bin
drwxr-xr-x   4 arc  staff   136  7 24 15:51 lib
-rwxr-xr-x   1 arc  staff   241  7 24 16:15 make.sh
-rwxr-xr-x   1 arc  staff   120  7 24 16:15 oauth.sh
-rwxr-xr-x   1 arc  staff   126  7 24 16:16 skype2witter.sh
drwxr-xr-x   5 arc  staff   170  7 24 16:52 src
mashiro:Skype2witter arc$ ./make.sh

src直下の2ファイルが主な処理の流れを記述したソースで、src/com/skype/以下のファイルがSkype4JavaをMac OSX用のSkypeでも動作するようにハックしたソースです。

mashiro:Skype2witter arc$ cd src
mashiro:src arc$ ls -al
total 16
drwxr-xr-x  5 arc  staff   170  7 24 16:52 .
drwxr-xr-x  8 arc  staff   272  7 24 16:39 ..
-rw-r--r--  1 arc  staff  1957  7 24 16:52 Skype2witter.java
-rw-r--r--  1 arc  staff  1792  7 24 16:52 TwitterOAuth.java
drwxr-xr-x  3 arc  staff   102  7 24 15:51 com

Skype2witter.javaには、最後にDMを送ってから30分以内に送られた発言については無視するように次のような処理が書いてありますが、時間を調整したい場合はここを修正してコンパイルし直してください。

	final long now = Calendar.getInstance().getTimeInMillis();

	// 30 mins
	if (now - previous > 1000 * 60 * 30) {
		// (略)
		previous = now;
	}

さて、Skype APIにはバージョンがいくつもあり、Skype for Windowsは新しいものに準拠しているんですが、Skype for Mac OSXはどうやらバージョン3でdeprecatedになった命令を使っているようで、素のSkype4Javaは新しいものにしか対応していないため動作しません。
例えば、チャットメッセージが送受信されると、http://developer.skype.com/accessoriesの「Skype Public API Reference」からダウンロードできる仕様書にMESSAGE - obsolete(public_api_ref.html#head-d3b106489b643c1c4745c286afda65b2d6067317)と書いてあるものが送られてくるので、新しくCHATMESSAGEに置き換わった命令を待っているSkype4Javaはこれを検知できません。すなわち、Skype.addChatMessageListener(ChatMessageListener)が動きません。その他にも、メッセージの送信者名を得るためのキーワードがPARTNER_DISPNAMEからFROM_DISPNAMEに置き換わっていました。
そこで、これらの古い命令にも対応できるようChatMessageをChatMessageFixedクラスに書き換え、Skype.addChatMessageListener(ChatMessageListener)の処理をChatMessageMonitorクラスとして独立させました。

mashiro:src arc$ cd com/skype/
mashiro:skype arc$ ls -al
total 32
drwxr-xr-x  4 arc  staff   136  7 24 15:51 .
drwxr-xr-x  3 arc  staff   102  7 24 15:51 ..
-rw-r--r--  1 arc  staff  9474  7 24 09:47 ChatMessageFixed.java
-rw-r--r--  1 arc  staff  2507  7 24 14:39 ChatMessageMonitor.java

これ以上の詳しい処理内容については各ファイルの中身を追ってみてみてください。