我是python中的新手,我正在尝试创建一个测试python脚本来测试我的XMPP服务器上的不同操作。我已经能够测试用户的登录,现在我想获取服务器发送的信息(节)并设置新信息。
我已阅读了几个网站,我对所有这些信息都不是很清楚。主要来源是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>
我想获取信息并设置其中一个参数(比如名字),但我不知道如何。
class user_info(sleekxmpp.stanza.Iq):
self.get_query()
我必须在python中完成它。任何帮助表示赞赏
答案 0 :(得分: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['type']
或iq['from']
从Iq节中提取数据。将plugin_attrib
设置为"aa"
后,您就可以使用iq['aa']
来获取对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聊天室。