2

如何获取用户 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 哈希,但我怎样才能获得相关用户的实际头像?

4

1 回答 1

2

基于 vCard 的头像在XEP-0153中指定。您是正确的,该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 所说,然后通过将 vCard 的 IQ get 发送到发件人的完整 JID(用户@域/资源)。准备好在发件人方面处理这些请求。

于 2012-07-11T06:53:14.207 回答