2012-05-22 46 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實例。 –