1

私はPythonを初めて使用し、XMPPサーバーでさまざまなアクションをテストするためのテスト用Pythonスクリプトを作成しようとしています。すでにユーザーのログインをテストできたので、サーバーが送信している情報(スタンザ)を取得して、新しい情報を設定したいと思います。

私はいくつかのウェブを読みましたが、これらすべての情報についてはあまり明確ではありません。主な情報源はsleekxmpp.comです。

私は私のスタンザを持っています:

<iq type='get' to= 'chat.net'  id='id1'>
  <aa xmlns='http://myweb.com' />
</iq>

<iq type='result' to= 'chat.net'  id='id1'>
  <aa xmlns='http://myweb.com' >
    <name>My name as included in sent mails<name>
  <lang>en</lang>
    <mail>My mail as included in sent mails</mail>
  </aa>
</iq>

情報を取得し、パラメータの1つ(名前など)を設定したいのですが、方法がわかりません。

class user_info(sleekxmpp.stanza.Iq):

    self.get_query()

私はPythonでそれをしなければなりません。助けていただければ幸いです

4

1 に答える 1

3

実行したいのは、スタンザのカスタムスタンザクラスを作成することです。これがあなたの例でうまくいくものです:

from sleekxmpp import Iq
from sleekxmpp.xmlstream import ElementBase, register_stanza_plugin

class AA(ElementBase):
    name = 'aa'
    namespace = 'http://myweb.com'
    plugin_attrib = 'aa'
    interfaces = set(['name', 'lang', 'mail'])
    sub_interfaces = interfaces

register_stanza_plugin(Iq, AA)

さて、それですべては何をしますか?このnameフィールドは、XMLオブジェクトのルートタグが「aa」であることをnamespace指定し、ルートタグの名前空間を指定します。これまでのところ明らかだと思います。

このplugin_attribフィールドは、親スタンザからこのスタンザにアクセスするために使用できる名前です。たとえば、Iqスタンザからデータを使用iq['type']または抽出する方法をすでに理解している必要があります。iq['from']plugin_attrib設定すると、AAコンテンツへの参照を取得するために"aa"使用できます。iq['aa']

このinterfacesセットは、辞書を操作するのと同じように、このスタンザが情報を抽出するために提供するキー名のセットです。たとえば、Iqスタンザのインターフェースセットには「to」、「from」、「type」などがあります。デフォルトでは、これらのキーにアクセスして変更すると、スタンザのメイン要素の属性が作成または変更されます。したがって、この時点で、スタンザは次のように動作します。

aa = AA()
aa['name'] = 'foo'
print aa
"<aa xmlns='http://myweb.com' name='foo' />"

ここで、代わりにインターフェイスキーを属性ではなくサブ要素にマップするには、それらがsub_interfacesセットに含まれている必要があります。したがってsub_interfaces = interfaces、上記の例を設定すると、次のように機能します。

aa = AA()
aa['name'] = 'foo'
print aa
"<aa xmlns='http://myweb.com'><name>foo</name></aa>"

より高度なものが必要な場合は、get_ * / set_ * / del_ *の形式のメソッドを定義することもできます。ここで、*は、データの抽出または変更に使用されるインターフェイス名です。

したがって、すべて一緒に、次のことができるようになります。

iq = Iq()
# ... set iq parameters
iq.enable('aa')  # Add an initial, empty aa element.
try:
    resp = iq.send()
    print(resp['aa']['name'])
    # ..., etc
except XMPPError:
    print('There was an error')

また、必要に応じて、SleekXMPPヘルプ用のsleek@conference.jabber.orgチャットルームがあることを忘れないでください。

于 2012-05-22T17:54:49.363 に答える