現在は MSN のプロトコルが変わっているので、このページの内容が使えるかどうかわかりません。試していないのでわかりません。(2003-11-09 追記)
Perl で作られた MSN Messenger Service のクライアントを利用し、自宅サーバ上のウェブページに普段使っている自分のアカウントの状態を表示してみることにしました。
状態表示とは
「状態表示」と呼んでよいのかはわかりませんが、ICQ や Yahoo! メッセンジャなどのインスタントメッセージサービスには自分の状態 (オフラインまたはオンライン) といったアイコンをウェブページにはり付けることができます。これにより、訪問者はそのサイトの運営者がオンラインかどうか、つまりインスタントメッセージサービスで会話できるかどうかが一目でわかることになります。
しかし、私が普段使っている MSN Messenger Service には、このようなアイコンがありません。自分で用意するしかないようなのです。思いついた方法は、私が普段使っているアカウントとは別に、私の状態表示を取得するための専用アカウントを動かすことでした。
Perl 版 クライアントを使ってみる
下準備
Perl で書かれたクライアントがあることを知り、早速使ってみました。
- http://www.adamswann.com/library/2002/msn-perl/
上のサイトからソースコード、msn-perl.tar をダウンロードします。解凍して出てきた Perl モジュール、MSN.pm を少し修正します。修正したのは以下の点です。
- 132 行目あたりにあるサーバのアドレス、 msgr-ns14.msgr.hotmail.com の部分を messenger.hotmail.com に変更。
- 74 行目、117 行目あたりにある /tmp/msn.log 、/tmp/msn.status の部分をそれぞれ $ENV{'HOME'}/msn.log 、$ENV{'HOME'}/msn.status に変更。
2 番目の修正により、クライアントを実行したユーザのホームディレクトリにログファイルが保存されるようになります。そして、MSN.pm は /usr/lib/perl5/site_perl/5.6.1/ に置くことにしました。
.NET Passport をもうひとつ用意
Perl 版クライアントには普段使っている .NET Passport (Hotmail のアドレス) とは別の .NET Passport を登録することにします。あらかじめお互いをメンバリストに登録しておきます。
クライアントの実行
続いて、上記のモジュールと一緒に入っていた client.pl の設定です。これは 6 行目に .NET Passport とそのパスワードを記入すれば OK です。このクライアントに使う .NET Passport は状態を取得するために使うアカウントです。
自分が普段使っている .NET Passport を登録したクライアントを立ち上げ、 client.pl も実行します。すると、普段使っているクライアントの方に、 client.pl で立ち上げたアカウント (メンバ) がオンラインになっているのが確認できると思います。
ログを利用してアイコンを表示
ログを確かめる
ホームディレクトリの msn.status に今オンラインになっているメンバが次のような形式で書き出されています。
1042264057 kendomo@livedoor.com NLN 1042264057
1 行目は時間、1 行目は .NET Passport 状態 時間 になっています。※Perl で使うアカウントには目的のアカウント (メンバ) のみを追加しているものとします。
状態とアイコン
3 文字の状態の意味は以下のようになっています。アイコンもそれぞれ用意しました。
- NLN
- 通常 (オンライン)
- BSY
- 取り込み中 (オンライン)
- BRB
- 一時退席中 (オンライン)
- AWY
- 退席中 (オンライン)
- PHN
- 電話中 (オンライン)
- LUN
- 昼休み (オンライン)
- IDL
- アイドル (オンライン)
- FLN
- オフライン
アイコン書き出しスクリプト
こうなればあとはログファイルを読み込んで、その情報を元に画像を書き出すスクリプトを作ってやればよいのです。 Perl で作ってみました。
#!/usr/bin/perl my $status_file = "/home/ユーザ名/msn.status"; open(OPEN, "$status_file"); flock(OPEN, 2); my @line = <OPEN>; close(OPEN); my ($mail, $status, $time) = split(/ /, $line[1]); my %status_array = ( "AWY" => "awy.png", "BRB" => "brb.png", "BSY" => "bsy.png", "FLN" => "fln.png", "IDL" => "idl.png", "LUN" => "lun.png", "NLN" => "nln.png", "PHN" => "phn.png" ); my $image = "./images/$status_array{$status}"; print "Content-Type: image/png\n"; print "Cache-Control: no-cache\n"; print "\n"; open(IMAGE, "$image"); print <IMAGE>; close(IMAGE); exit;
これを state.cgi などといったファイル名にして CGI として実行すれば、自宅サーバ上に現在の状態が表示できます。もちろん画像として扱いますので、img 要素で呼び出します。
※当サイトでは CGI で画像を書き出すのではなく、アイコンを掲載するページを PHP で作り、画像をそのまま呼び出しています。
問題点
- Perl クライアントを先に終了した場合は、そのときに取得していた状態がそのままログファイルに残ってしまう。
- MSN のサーバから切断されてももちろん同じ問題が生じる。
また気が向いたときにでもなんとかしてみようと思います。