-Jabberサーバーに接続する
-ログイン
-ステータスの変更
-メッセージを送信する
-切断
そして、これらすべてを純粋なXMLで
原則として、記事「Introduction to XMPP」またはそのようなものを呼び出すことができます...しかし、本質は変わりません
さあ始めましょう!
単純なJabberセッションは、次の一連の操作です。
- サーバー接続
- ストリーム作成
- 暗号化を有効にし、暗号化されたチャネルで新しいストリームを作成します(オプション)
- 認証
- ストリームをリソースにバインドする(name @ server / resource)
- セッション作成
- 「利用可能」ステータスメーリングリスト
- メッセージ、ステータス、名簿、「名刺」の送信/受信、サービスやトランスポートの使用など。
- 無効なステータスメーリング
- ストリームの閉鎖
- サーバーから切断する
このスキームを実装してみましょう。 私の実験では、jabber.ruサーバーが使用されていますが、既にアカウントを持っていると仮定しています。
以下のリストでは、XMLブロック内にあるすべてのコメントはXMLコメントタグ内にあり、残りのXMLは変更なしで表示されます(読みやすくするために改行が追加されていない限り)。 これをすべてコンソールに入力する予定がある場合(これは非常に現実的です、私は自分でやった)、最初にすべてのコードをテキストエディターにコピーし、承認を置き換えることをお勧めします。 データ、コメントおよび改行を削除します。
クライアントによって送信されたXMLブロックは、-C:によって送信されます--S:によって送信されます
サーバー接続
ポート5222でjabber.ruサーバーに接続します
telnet jabber.ru 5222
Trying 213.180.203.19...
Connected to pluton.relax.ru.
Escape character is '^]'.
ストリーム作成
XMLストリームの先頭をサーバーに送信します。サーバーにはサーバーアドレスが示されます(jabber.ru)
--C:
<stream:stream xmlns="jabber:client" to="jabber.ru" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" >
それに応じて、サーバーXMLストリームの始まりが来ます。
--S:
<? xml version ='1.0' ? >
< stream:stream xmlns ='jabber:client' xmlns:stream ='http://etherx.jabber.org/streams' id ='2689330648' from ='jabber.ru' version ='1.0' xml:lang ='en' >
<!-- -->
< stream:features >
<!-- TLS ( Jabber , , ) TLS , Gajim -->
< starttls xmlns ='urn:ietf:params:xml:ns:xmpp-tls' />
<!-- -->
< compression xmlns ='http://jabber.org/features/compress' >
<!-- gz -->
< method > zlib </ method >
</ compression >
<!-- SASL -->
< mechanisms xmlns ='urn:ietf:params:xml:ns:xmpp-sasl' >
<!-- DIGEST-MD5 -->
< mechanism > DIGEST-MD5 </ mechanism >
<!-- PLAIN -->
< mechanism > PLAIN </ mechanism >
</ mechanisms >
<!-- -->
< register xmlns ='http://jabber.org/features/iq-register' />
</ stream:features >
* This source code was highlighted with Source Code Highlighter .
認証
TLS暗号化には含まれず、まだ成熟していません))
Jabber認証はSASL(Simple Authentication and Security Layer)を使用して実装されます。 提案されたメカニズムのうち、DIGEST-MD5メカニズムを使用することをお勧めしますが、実装が非常に難しいため、最初にPLAINメカニズムを検討します。
ブロックは、属性mechanism =“ PLAIN”で送信され、 base64エンコードされた文字列を含みます。
{承認ID。例: user1@jabber.ru(オプション)} ASCII文字\ x00 {ユーザー名、例: user1} ASCII文字\ x00 {パスワードをクリア、たとえば123456}
ASCII文字\ x00は、16進コード00のASCII NUL文字です
このような文字列は、たとえばPHPで取得できます: base64_encode($ id。 "\ x00"。$ login。 "\ x00" $ pass);
ここで試すことができます: SASL認証用のデータの準備
--C:
<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="PLAIN">dXNlcjFAamFiYmVyLnJ1AHVzZXIxADEyMzQ=</auth>
サーバーからの応答で、許可の成功(成功)に関するメッセージ
--S:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
注意! 実際のネットワークプログラムでは、この認証方法(暗号化されていないチャネルを介したクリアテキストのパスワードとログイン)を使用しないでください。 これにより、クライアント(ボット)とJabberサーバーが同じ安全なネットワーク上または同じサーバー上にある場合、パフォーマンスをわずかに向上させることができます。 実際のJabberネットワークアプリケーションでは、ストリーム全体のTLS暗号化、またはDIGEST-MD5認証方式のいずれかを使用しますが、多くの場合、両方を同時に使用します。
認証に成功したら、新しいXMLストリームを開始する必要があります
--C:
<stream:stream xmlns="jabber:client" to="jabber.ru" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" >
サーバーからの新しいストリーム:
--S:
<? xml version ='1.0' ? >
<!-- -->
< stream:features >
<!-- (bind) -->
< bind xmlns ='urn:ietf:params:xml:ns:xmpp-bind' />
<!-- XMPP- -->
< session xmlns ='urn:ietf:params:xml:ns:xmpp-session' />
</ stream:features >
ストリームをリソースにバインドする
iq-サーバーへの要求。 これらは、情報(名簿、「名刺」など)を要求/送信するために使用されます。type属性とid属性があります
type-リストの1つ:get(データを要求)、set(データを送信|値を設定/置換)、result(正常なgetまたはsetへの応答、要求されたデータを含む)、error(エラーへの応答getまたはセット)
id-後続のiqリクエストごとに、idを1ずつ増やします(増分)。 iqリクエストに応答するサーバーは、そのIDを繰り返します。 これは、いくつかの異なるiq要求が一度に送信されることがあるためです。
取得または設定への応答で、リクエストは結果タイプの応答を返す必要があります(何か問題がある場合はエラー)
このスレッドをtelnetリソースに割り当てます
--C:
<iq type="set" id="9746"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<resource>telnet</resource>
</bind>
</iq>
答えはiqであり、type result
--S:
<iq id='9746' type='result'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
<!-- JID @/ -->
<jid>user1@jabber.ru/telnet</jid>
</bind>
</iq>
セッション作成
次に、セッションを作成するために必要なサーバー...これは、ステータス、メッセージ、そして実際に送信するために必要です。 私たちは拒否しません:
--C:
<iq type="set" id="9747">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session" />
</iq>
セッションが正常に作成されました:
--S:
<iq type='result' id='9747'>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</iq>
「利用可能」ステータスメーリングリスト
プレゼンス -ブロードキャスト情報(ステータス情報など)とサブスクリプション情報(連絡先リストへのユーザーの追加など)を送受信します。 特定のユーザーにのみデータを送信するためのtoポインターを含めることができます(たとえば、特定の名簿の連絡先に「邪魔しない」ステータスを設定します:))
属性があります
from -JID名@存在するサーバー/リソース。 原則として、それをインストールすることはできません-サーバーを停止します。
to-このプレゼンスが対象とするJID(リソースの有無にかかわらず)。 指定されていない場合、サインアップしているすべての人(連絡先リストなど)に送信されます
type-存在しない場合はプレゼンスタイプ-単純なステータスメッセージ、それ以外の場合はリスト:使用不可(無効)、プローブ(サーバーからクライアントステータスを要求)、サブスクライブ(サブスクリプションの要求/名簿への追加要求)、サブスクライブ解除(サブスクライブ解除/削除)名簿から)、購読済み(購読を承認/名簿に追加)
ステータスの変更に関するメッセージを送信しています。
--C:
< presence >
<!-- ( , ) -->
< priority > 50 </ priority >
<!-- , — «» xa (eXtended Away ), away (), chat ( ), dnd ( — ) -->
< show > chat </ show >
<!-- , - -->
< c xmlns =" http : //jabber . org / protocol / caps " node =" http : //gajim . org / caps " ext =" xhtml cstates " ver =" 0 . 11 . 4 " />
<!-- -->
< status > </ status >
<!-- x- ( sha1-) -->
< x xmlns =" vcard-temp:x:update " >
< photo > b2730e40aba4f7225456d0b4789bf2d5af34c3e3 </ photo >
</ x >
</ presence >
ネストされたパラメーターはいずれも必須ではないことに注意してください。 1つの<priority> </ priority>または<status> </ status>のみを送信できます...変更するのは送信することです。
応答として、サーバーは連絡先リストの全員にメッセージを送信します(より正確には、prescence type = "subscribe"コマンドを使用してサインアップしたユーザーに送信します。
--S:
<presence from='seriy.pr@jabber.ru/telnet' to='seriy.pr@jabber.ru/telnet'>
<priority>50</priority>
<show>chat</show>
<c xmlns="http://jabber.org/protocol/caps" node="http://gajim.org/caps" ext="xhtml cstates" ver="0.11.4" />
<status> </status>
<x xmlns="vcard-temp:x:update">
<photo>b2730e40aba4f7225456d0b4789bf2d5af34c3e3</photo>
</x>
</presence>
メッセージの送信/受信
メッセージ-メッセージの送受信用。 属性があります
宛先へ -JID(リソースの有無にかかわらず)
送信者から -リソースを持つJID(別のものを置き換えることはできません:P)
メッセージのタイプはリストのいずれかです:chat-プライベートチャットメッセージ(ICQなど、デフォルトで通常使用されます)、normal-単一のメッセージ、別のウィンドウで開き、同じメッセージ、groupchat(メッセージ会議中)、ヘッドライン(自動通知、RSSボットなどによって送信されたメッセージは別のウィンドウで開きますが、答えることはできません)、エラー-エラーメッセージはチャットウィンドウに特別な形式で表示されます
記事の著者にチャットメッセージを送信します。
--C:
(友達を怖がらせる-エラータイプのメッセージを送信する)< message to =" seriy . pr @ jabber . ru " from =" user1 @ jabber . ru / telnet " type =" chat " >
<!-- , -->
< body > -! </ body >
<!-- , « »/« »/« » .., -->
</ message >
無効なステータスメーリング
セッションを正しく終了するために、通常、ステータスメッセージ「disconnected」(type =「unavailable」)が送信されます
--C:
<presence xmlns="jabber:client" type="unavailable" />
ストリームの閉鎖
このコマンドでストリームを閉じます
--C:
</stream:stream>
また、サーバーはストリームを閉じます
--S:
</stream:stream>
サーバーから切断する
接続は、サーバーのイニシアチブでストリームが閉じられた直後に閉じられます。
基本的には以上です。
続けて、私は考慮したいと思います:
- DIGEST-MD5を使用した認証(自分で判断した場合)
- チャネルの暗号化を有効にします(ここでは変更はわずかです)
- 名簿で作業する
- 会議で作業する
- 「名刺」で作業する
- サービス概要
- トランスポートを使用する(m / b)
参照:
私のブログからのクロスポスト
http://tools.ietf.org/html/rfc3920 rfc3920 XMPPプロトコルコア
http://tools.ietf.org/html/rfc3921 rfc3921 XMPPステータス、セッションなど
http://tools.ietf.org/html/rfc2831 rfc2831 SASL認証
http://www.bog.pp.ru/work/SASL.htmlロシア語のSASLについて少し
http://en.wikipedia.org/wiki/XMPP wikiのXMPP
Wikiのhttp://en.wikipedia.org/wiki/Jabber Jabber