XMPP IQであそんでみる
さっきでかい地震が宮城県北部で発生しました.被害が大きくないといいけど.
XMPPベースのbotを作ろうとおもってます.普通にメッセージをユーザとやりとりするだけだとつまらないので,IQを使ってみようと思いました.IQというのは,言ってしまえばRPC用の基本メッセージのようなもので,GET/SET/RESULT/ERRORのタイプがあります.XEP-0049: Private XML Storageを見ると簡単だったので,PsiのXML Consoleを使って試してみたら動きました.まず,データをsetすると,
<iq type="set" to="hoge@mikaka.asia" id="1003"> <query xmlns="jabber:iq:private"> <exodus xmlns="exodus:prefs"> <defaultnick>Macbeth</defaultnick> </exodus> </query> </iq>
こんなメッセージが返ってきて,
<iq from="hoge@mikaka.asia" type="result" id="1003" to="fuga@mikaka.asia/mac" />
どうやら格納できたらしいことがわかります.次にgetしてみると
<iq type="get" to="hoge@mikaka.asia" id="1004"> <query xmlns="jabber:iq:private"> <exodus xmlns="exodus:prefs"> </exodus> </query> </iq>
こんなメッセージが返ってくるので,
<iq from="hoge@mikaka.asia" type="result" id="1004" to="fuga@mikaka.asia/mac" > <query xmlns="jabber:iq:private"> <exodus xmlns="exodus:prefs"> <defaultnick>Macbeth</defaultnick> </exodus> </query> </iq>
ちゃんと取得もできているようです.不思議なのはXEP-0004をサポートしてるとDisco infoででてこないことです.例えばPsiだとサーバからのDisco#infoの問合せに関して
<iq type="result" to="mikaka.asia" id="416-987" > <query xmlns="http://jabber.org/protocol/disco#info"> <identity category="client" type="pc" name="Psi" /> <feature var="http://jabber.org/protocol/bytestreams" /> <feature var="http://jabber.org/protocol/si" /> <feature var="http://jabber.org/protocol/si/profile/file-transfer" /> <feature var="http://jabber.org/protocol/disco#info" /> <feature var="http://jabber.org/protocol/commands" /> <feature var="http://jabber.org/protocol/rosterx" /> <feature var="http://jabber.org/protocol/muc" /> <feature var="jabber:x:data" /> <feature var="http://jabber.org/protocol/chatstates" /> <feature var="http://jabber.org/protocol/mood+notify" /> <feature var="http://jabber.org/protocol/tune+notify" /> <feature var="http://jabber.org/protocol/physloc+notify" /> <feature var="http://jabber.org/protocol/geoloc+notify" /> <feature var="http://www.xmpp.org/extensions/xep-0084.html#ns-metadata+notify" /> <feature var="http://jabber.org/protocol/xhtml-im" /> </query> </iq>
こんな返事を返すんですが,XEP-0004に該当する項目が見当たりません.この記述間違い.jabber:x:dataが該当する名前空間です.次におもしろそうなのは,http://jabber.org/protocol/commandsという名前空間で,たぶんXEP-0050: Ad-Hoc Commandsで規定されているはずだから,これを利用すると色々遊べるんじゃないかと思っています.いや,これだめなんじゃないか?他のユーザの端末に勝手に情報書き込んだり読んだりしてじゃん.XEP-0004だと禁止してるのに.えっと,バグ?