Sleekxmpp:使用多个自定义节

Posted

技术标签:

【中文标题】Sleekxmpp:使用多个自定义节【英文标题】:Sleekxmpp: Working with more than one custom stanza 【发布时间】:2012-06-26 15:17:30 【问题描述】:

我正在为 xmpp 客户端创建一个测试,并且在此过程中我需要使用不同的自定义节。我有两个问题想知道你们是否可以帮助我:

    正如我所提到的,我将使用多个名称相同但名称空间不同的节。此节也可以是两级或更多,这里是一个例子:

第 1 节

<iq type='result' to= 'chat.com'  id='id1'>
       <aa xmlns='http://mysite.com/profile' >
          <name>My name as included in sent mails<name>
          <lang>en</lang>
          <mail>My mail as included in sent mails</mail>
          <fbuserid>46736473231<fbuserid>
          <fbaccesstoken>AAAAA84257YTRRIXTEQITXXTCMTVBTTBXU<fbaccesstoken>
          <photo_url>http://pic.facebook.com/photo.jpg</photo_url>
      </aa>
</iq>

我创建自定义节如下:

name = 'aa'
namespace = 'http://mysite.com/profile'
plugin_attrib = 'aa'
interfaces = set(('name', 'lang', 'mail', 'fbuserid', 'fbaccesstoken', 'photo_url'))
sub_interfaces = interfaces

第 2 节

<iq type='set' to= 'roomname@conference.chat.come'  id='id1'>
 <aa xmlns='http://mysite.com/muc#share'>
   <item name='Falda tubo' thumbnail='http://webpage.info/falda_tn.jpg' id='itemid1' action='add' url='http://webpage.info/falda.html’>
      <metadata  path=' ' />
   </item>
 </aa>
</iq>

问题 1:如何创建两个以上级别的节?

    如您所见,我的节具有相同的名称但更改了命名空间,这给我带来了一些麻烦,因为我创建了诸如 get_* 和 set_* 之类的方法来处理信息,但它的执行方式如下:

    register_stanza_plugin(Iq, stanza_profile)
    register_stanza_plugin(Iq, stanza_rooms)
    
    def start(self, event):
        self.send_presence()
        self.get_parameters()
        self.set_parameters()
    

这会注册两个节,但只在最后一个(stanza_rooms)中执行操作

问题2:如何分开处理?

在 python 上工作。任何帮助表示赞赏!

最好的问候,

【问题讨论】:

【参考方案1】:

对于您关于具有相同名称的多个节的问题,plugin_attrib 值很重要,因为它将区分您的两个节。现在看起来你已经为两个节的plugin_attrib 使用了'aa',这会导致冲突并且最后注册的节获胜。

通常,我们在这些情况下使用命名空间的一部分。例如,对于迪斯科,有两个 query 元素的命名空间为 http://jabber.org/protocol/disco#infohttp://jabber.org/protocol/disco#items。所以这两个节具有相同的name,不同的namespace 值,并且分别具有'disco_info''disco_items'plugin_attrib 值。

您似乎可以使用名称 aa_profileaa_muc_share 或类似名称来解决问题。

对于您的另一个问题,看起来您想要的是更多的节对象。一个提供外层容器节,另一个管理单个子项。您可以使用:

class InnerStanza(ElementBase):
    name = 'inner'
    namespace = 'example'
    plugin_attrib = 'inner'
    plugin_multi_attrib = 'inner_items'
    ...

register_stanza_plugin(OuterStanza, InnerStanza, iterable=True)

通过以上内容,您可以访问 outer['inner_items'] 以获取与 InnerStanza 类匹配的内部子节列表(因为 plugin_multi_attrib 值)。

-- 兰斯

【讨论】:

您好 Lance,首先,感谢您提供的所有帮助。如您所见,我已经加入了slickxmpp会议室,但我们似乎处于不同的时区,因此很难沟通。在您提供的帮助以及您和 Nathanial 创建的一些示例 (github.com/fritzy/SleekXMPP/wiki/Stanza-Objects) 下,我已经能够创建一个节,但是我们的自定义节变得越来越棘手,我不太明白. 这是帖子的续篇:在这里,我给你留下一个我创建的自定义节,我不知道我是否做得对。这是我在您的帮助下所理解的。如果看起来一团糟,我提前道歉:friendpaste.com/3C3JbrHvNfHDdRUZ38aMZG 再次感谢。 是的,我注意到时区差异是一个问题。我已经用 cmets 修改了你的示例,说明了我所做的更改以及更改的原因:friendpaste.com/5OGWZfDN96mjkqrhzAOnLK 简而言之,主要问题只是接口解析中的冲突,以及节注册调用的语法。

以上是关于Sleekxmpp:使用多个自定义节的主要内容,如果未能解决你的问题,请参考以下文章

自定义日历

四大组件之ContentProvider-轻轻松松自定义ContentProvider

SpringBoot2 @validated 自定义效验类型

.net测试篇之测试神器Autofixture Generator使用与自定义builder

通过 SleekXMPP 发送 facebook 消息

Sleekxmpp 管理节