MSN メッセンジャの状態表示

現在は MSN のプロトコルが変わっているので、このページの内容が使えるかどうかわかりません。試していないのでわかりません。(2003-11-09 追記)

Perl で作られた MSN Messenger Service のクライアントを利用し、自宅サーバ上のウェブページに普段使っている自分のアカウントの状態を表示してみることにしました。

状態表示とは

「状態表示」と呼んでよいのかはわかりませんが、ICQ や Yahoo! メッセンジャなどのインスタントメッセージサービスには自分の状態 (オフラインまたはオンライン) といったアイコンをウェブページにはり付けることができます。これにより、訪問者はそのサイトの運営者がオンラインかどうか、つまりインスタントメッセージサービスで会話できるかどうかが一目でわかることになります。

しかし、私が普段使っている MSN Messenger Service には、このようなアイコンがありません。自分で用意するしかないようなのです。思いついた方法は、私が普段使っているアカウントとは別に、私の状態表示を取得するための専用アカウントを動かすことでした。

Perl 版 クライアントを使ってみる

下準備

Perl で書かれたクライアントがあることを知り、早速使ってみました。

上のサイトからソースコード、msn-perl.tar をダウンロードします。解凍して出てきた Perl モジュール、MSN.pm を少し修正します。修正したのは以下の点です。

  1. 132 行目あたりにあるサーバのアドレス、 msgr-ns14.msgr.hotmail.com の部分を messenger.hotmail.com に変更。
  2. 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 で作り、画像をそのまま呼び出しています。

問題点

また気が向いたときにでもなんとかしてみようと思います。


Updated: 2003-01-11
Copyright © 2003 Kendomo.net.