c-如何使用libstrophe获取Jabber中用户的头像



如何获取用户XMPP/Jabber名册中所有联系人的头像?

我以前问过这个问题,在实现<presence>处理程序时,我注意到我的应用程序接收到的呈现项的形式是:

<presence to="me" from="contact">
...some other stuff here...
<x xmlns="vcard-temp:x:update"><photo>3FB991AA97D7701C21EAFE65FB866E4BFF1B927C</photo></x>
</presence>

3FB991AA97D7701C21EAFE65FB866E4BFF1B927C部分对我来说就像一个SHA散列,但我如何才能获得问题用户的实际化身?

XEP-0153中指定了基于vCard的化身。photo元素包含SHA1哈希,这一点是正确的。请求发送哈希的人的vCard:
<iq to='juliet@capulet.com'
    type='get' 
    id='vc2'>
  <vCard xmlns='vcard-temp'/>
</iq>

并从回应中找出照片:

<iq to='romeo@montague.net/orchard' 
    type='result'
    id='vc2'>
  <vCard xmlns='vcard-temp'>
    <PHOTO>
      <TYPE>image/jpeg</TYPE>
      <BINVAL>
        Base64-encoded-avatar-file-here!
      </BINVAL>
    </PHOTO>
  </vCard>
</iq>

如果要使用此协议,您必须基于此进行缓存,并且您真的希望在启动时(尤其是用户第一次登录时)限制请求化身的频率。在短时间内抓取成千上万的头像可能会让你的服务器限制你的费率。

此外,在计算SHA1哈希时要非常小心。我见过几个不太小心的客户,他们最终陷入了无休止的循环,一遍又一遍地重新请求同一个化身。

如果你请求一个头像,但它与你期望的哈希不匹配,我建议使用负缓存;记住你不会得到这个散列的答案,下次不要再问了。发送者的SHA1逻辑可能在某些有趣的方面是错误的,下次你问的时候它不会变得更好。

最后,一些客户端被编写为尝试首先使用XEP-0054向发送者的服务器询问vCard数据,如XEP-0153所说,然后通过向发送者的完整JID发送vCard的IQ get来直接询问发送者的客户端(user@domain/资源)。做好准备,以发件人的身份处理这些请求。

相关内容

  • 没有找到相关文章

最新更新