XMPPには様々な拡張仕様が存在します。
それらのうち、よく利用されているものを紹介していきます。
ここでは細かいものを紹介していきます。
大きな仕様は専用のページを用意しましたのでそちらを参照するとよいでしょう。
vCardフォーマットを利用し、指定されたユーザーのプロフィール情報を返す仕様です。
ほとんどの場合、ニックネームとプロフィール画像の二つのデータだけが目的で利用されます。
次のように、クライアントはIQスタンザを送信します。
client to server<iq to='jiro@xmpp.example.org' type='get' id='vc2'> <vCard xmlns='vcard-temp'/> </iq>
サーバーはそのユーザーのプロフィールデータを次のように返します。
server to client<iq from='jiro@xmpp.example.org' type='result' id='vc2'> <vCard xmlns='vcard-temp'> <NICKNAME>じろう</NICKNAME> <N><GIVEN>次郎</GIVEN><FAMILY>山田</FAMILY></N> <PHOTO> <TYPE>image/jpeg</TYPE> <BINVAL>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</BINVAL> </PHOTO> </vCard> </iq>
このようなバイナリデータのBase64ではなく、画像データのURLを返せばいいのに、と思ってしまいますが、そうするとWebサービスとの連動が前提になってしまい、XMPPサービス単独ではサービス提供できなくなってしまいます。とはいえ、最近ではWebサービスと連動させたいケースも多いでしょう。実際Facebookでは次のような拡張仕様を提供し、プロフィール画像データのURLを返せるようにしています。facebook xmpp-release-notes
一般的に、ログイン処理でロスターの取得を行った直後に、ロスター内の各ユーザーの詳細情報(というよりプロフィール画像)を取得するために、vCardリクエストを発信します。ログインからログアウトまでのケーススタディを参照してください。
クライアントはこの画像データを取得すると、SHA1でバイナリのハッシュ値を取得しておき、そのハッシュ値とひもづけた上で、ファイルシステムなどのローカルデータベースに保存しておきます。
この拡張をサポートしているサーバーでは、プレゼンスを配信する際に、次のように子要素を追加してプロフィール画像のハッシュ値を添付します。
server to client<presence from='jiro@xmpp.example.org/foo'> <x xmlns='vcard-temp:x:update'> <photo>306db2524fb136d5ad50af243b88fc8c48db5939</photo> </x> </presence>
クライアントは、このようなプレゼンスを受け取ると、「ローカルに保存してあるjiroのプロフィール画像のハッシュ値が、今送られてきたプレゼンス内に含まれているハッシュ値と同じものかどうか」を検証します。これが同じものでなかった場合、jiroのプロフィール画像は変更されたとみなして、新たにvCardリクエストのIQスタンザを送信し、最新の画像を取得するとよいでしょう。
XEP-0085 Chat State Notification
[画像が入る]
メッセンジャーを利用しているとき、上の画像のように、「書き込み中です」というような表示を見たことがないでしょうか。
これは、このChat State Notificationを利用して実現されます。実際は、messageスタンザにエレメントを一つ追加するだけです。
client to server<message from='bernardo@shakespeare.lit/pda' to='francisco@shakespeare.lit/elsinore' type='chat'> <composing xmlns='http://jabber.org/protocol/chatstates'/> </message>
次のようにbodyと一緒に送信することもあります。
client to server<message from='bernardo@shakespeare.lit/pda' to='francisco@shakespeare.lit/elsinore' type='chat'> <active xmlns='http://jabber.org/protocol/chatstates'/> <body>Hi!</body> </message>
この例では、composingを使いましたが、全部で次のようなステートが定義されています。
ユーザーに対してどのように表示して見せるかは、クライアントの実装次第です。
次のようにHTMLバージョンのメッセージを足すことが出来ます。
client to server<message from='bernardo@shakespeare.lit/pda' to='francisco@shakespeare.lit/elsinore' type='chat'> <body>Hi!</body> <html xmlns='http://jabber.org/protocol/xhtml-im'> <body xmlns='http://www.w3.org/1999/xhtml'> <p style='font-weight:bold'>hi!</p> </body> </html> </message>
絵文字を送信したいという要望では、この拡張を利用してimgタグを含められるようにするとよいかもしれません。
小さいバイナリをクライアントtoクライアントで送信するXEP-0231 Bits of Binaryや、XEP-0047 In-Band Byte Streamsのような拡張仕様もあるのですが、Webサービスとの連動であればXHTML-IMでimgにURLを埋めるのが楽かもしれません。
当然ですが、クライアントは受信したHTMLを、検証、フィルタリングすることが推奨されます。