Skypeで特定のチャット/人物のみGrowlする

僕は普段SkypeGrowl通知は邪魔なのでオフにしていますが,たまには特定のチャットや人物に対してGrowl通知をして欲しい時もあります.Skypeの通知設定では細かいところまで設定できないのでSkype4Pyを使って作ってみました.Skype version 5になってからSkype4Pyは一部動かないところが出てきちゃったりしてますが*1,まぁこれくらいはできます.
通知にGrowlを使っています.Growl SDKからPython用のbindingをインストールして下さい.また,そこを適当に直せばwindowsでもlinuxでも動作すると思います.

先頭にある handle_names に通知して欲しいユーザーのハンドル名(echo123とか),names_of_chats に通知して欲しいチャット名を入れます.ちなみにこのチャット名というのはチャットごとに割り当てられているIDのことで,以下のスクリプトで最近のチャットのIDが確認できます.

このスクリプトを実行して通知してほしいチャットのIDを names_of_chats につっこんで下さい(IDは #mfumi2/$echo123;xxxxxxxxxxxx みたいな感じです).

また,詳しくは後述しますが,get_avatar_imges() の最初の行のアイコンを取得するためのパスを適当に修正して下さい(~/Library/Application Support/Skype/Skypeハンドル名/main.db です)



ソースを見ればだいたい何をしているか分かると思います.
OnMessageStatus()がメッセージ着信等があったときにSkypeからコールバックされます.この関数の中でメッセージが予め登録してあるチャットに一致するかを判定し,一致した場合にはGrowlで通知します.ここではOnMessageStatus()ではチャット名しか判定していませんが,例えば,

	if message.FromHandle in handle_names:
		growl.notify( ... )

とすれば指定したハンドル名からのメッセージがあったときに通知します.
OnOnlineStatus()はユーザーステータスの変更があったときにSkypeからコールバックされます.ここでは指定したユーザーのステータスの変化があったときに通知するようにしてます.なお status は英語ですが日本語で通知したければ statusに対応する日本語の辞書 ( {ONLINE: オンライン, AWAY: 取り込み中, … }) を作ればいいと思います.
まぁこの辺適当に編集すればいろいろと応用できるんじゃないでしょうか.OnMessageStatus(),OnOnlineStatus()以外にも登録できるコールバック関数はたくさんあります.



さて,今回このスクリプトを書くにあたってGrowl通知までは楽だったのですが,通知に表示させるアイコンを取得するのに非常に苦労しました… Skype4Py自体にはアイコンを取得するための関数というものは用意されていませんが,Skype APIには用意されています.
http://developer.skype.com/public-api-reference#COMMAND_GET_USER_AVATAR
ということで,

	command = skype.Command("GET USER echo123 AVATAR 1 /tmp/echo123.jpg")
	skype.SendCommand(command)

とかやれば /tmp/echo123.jpg に echo123 の画像が保存されるはず…なんですが Mac OS X だとどう頑張っても動いてくれませんでしたorz
しかたないので,Skypeが使ってるんだからどっかにキャッシュでも保存してあるだろうということで探してみると,~/Library/Application Support/Skype/AvatarCache というそのまんまのディレクトリを発見! これでいける! と思ったのもつかのま,ディレクトリの中身を見ると昔のアイコン(アバター)が保存されているだけ… どうやら昔のバージョンはこれを使っていたようですがバージョンが上がりもはやこのディレクトリは使われていないようです. がっくりしましたが気を取り直して AvatarCashe ディレクトリを見てみると,Skypeハンドル名がついた別のディレクトリがあることに気付きました.その中を見てみると sqlrite のデータベースファイルがいくつもあります.この中にあるのでは,と思って探ること数十分… main.db の中の Contacts テーブルに BLOBとしてavator_image というデータがあることが判明! これを取り出してみると無事にGrowl通知に使えるアイコンであることが分かりました(長い闘いだった…)
今回のスクリプトでは最初に /tmp/skype 以下にコンタクト全員のアイコンを保存し,Growlで使える用にメモリ内に保持しています.


ちなみに自分はpepiを使っているので*2,pepiからnotify設定できる用に修正しておきました.チャット名もしくはメンバー名上にフォーカスがあるときに n を押すと通知するかどうか切り替えます.通知するチャット/ユーザーの左側にはマーク(/)が付きます.

*1:前から動かないとこもありますが^^;

*2:使っている人とかいるのかな?w