从 xmpp 服务器设置/获取用户信息:python
Posted
技术标签:
【中文标题】从 xmpp 服务器设置/获取用户信息:python【英文标题】:Set/Get user information from a xmpp server: python 【发布时间】:2012-05-22 16:41:56 【问题描述】:我是 python 新手,我正在尝试创建一个测试 python 脚本来测试我的 XMPP 服务器上的不同操作。我已经能够测试我的用户的登录,现在我想获取服务器正在发送的信息(节)并设置新信息。
我已经阅读了几个网站,但我对所有这些信息都不是很清楚。主要来源是 slimxmpp.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 中完成。任何帮助表示赞赏
【问题讨论】:
【参考方案1】:您要做的是为您的节创建一个自定义节类。以下是适用于您的示例的示例:
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 帮助的 slim@conference.jabber.org 聊天室。
【讨论】:
首先,请 tnx Lance 提供此详细答案。它真的帮助我将我正在阅读的所有信息中的想法整合在一起。我用你的信息+我在网上找到的东西尝试了一些东西,我得到了这个:'class OO(ElementBase): name = 'aa' namespace = 'myweb.com' plugin_attrib = 'aa' interfaces = set(['name', ' lang', 'mail']) sub_interfaces = interfaces def getMail(self): present = self.xml.find('%smail' %self.namespace) return present ' 它什么都不做 我想知道是否必须以某种方式“调用”我的 main 中的 AA 类。如果是这样,如何... 因为然后我尝试了这个: aa = AA() iq.enable('aa') try: resp = iq.send() print(resp['aa']['name] except XMPPError: print ('有一个错误')也没有任何反应。再次感谢!问候, 首先,不要忘记 register_stanza_plugin(Iq, AA) 调用。上面的最后一个示例将在发送初始状态并请求名册之后,在 session_start 事件的事件处理程序中运行。 echo_client.py 示例是一个很好的起点。只有一个小的修正需要做。不是 iq = Iq(),而是 iq = self.Iq(),其中 self 是 ClientXMPP 实例。 感谢 Lance,您的回答和一些脚本链接(由您编写,呵呵)我已经成功地执行了 Get/Set!现在我正在编写具体的方法,以便为我的测试提供更有条理的脚本。再次感谢!以上是关于从 xmpp 服务器设置/获取用户信息:python的主要内容,如果未能解决你的问题,请参考以下文章
成功登录xmpp服务器后如何获取xmpp用户(iPhone SDK)?
在android中使用xmpp从服务器获取所有注册用户[关闭]