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
これ以上の詳しい処理内容については各ファイルの中身を追ってみてみてください。