2012-05-22 122 views
2

我是新的python,我试图创建一个测试python脚本来测试我的XMPP服务器上的不同动作。我已经能够测试我的用户的登录信息,现在我想获取服务器发送的信息(节)并设置新的信息。设置/从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> 

我想要得到的信息,还可以设置的参数之一(可以说名字),但我不知道怎么办。

class user_info(sleekxmpp.stanza.Iq): 

    self.get_query() 

我必须在python中做到这一点。任何帮助赞赏

回答

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 set是本节提供的用于提取信息的键名集,就像处理字典一样。例如,一个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帮助[email protected]聊天室如果你需要它。

+0

首先,tnx兰斯为这个详细的答案。这真的帮助我从我阅读的所有信息中获得想法。 我试着用你的信息+我在网上找到的东西,我得到这个: 'class OO(ElementBase): name ='aa' namespace ='http:// myweb。COM/' plugin_attrib = 'AA' 接口=组([ '名称', '郎', '邮件']) sub_interfaces =接口 DEF getMail(个体): 存在= self.xml.find(' {%s} mail'%self.namespace) return present' 它什么都不做 – BarbSchael

+0

我想知道是否必须以某种方式在我的__main__上“调用”AA类。如果是这样,如何...因为然后我试过这个: aa = AA() iq.enable('aa') 尝试: resp = iq.send() print(resp ['aa'] ['name ] 除了XMPPError: 打印(“有错误”) 并没有任何反应,以及再次 感谢 问候, – BarbSchael

+0

首先,不要忘了register_stanza_plugin(IQ,AA)调用从上面的最后一个例子。!。在发送初始状态并请求名单之后,它将运行在session_start事件的事件处理程序中,echo_client.py示例是一个很好的起点,只需要进行一次小的更正,而不是iq = Iq(),它需要是iq = self.Iq(),其中self是ClientXMPP实例。 –