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

时间:2012-07-11 00:52:40

标签: c osx-lion xmpp avatar libstrophe

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

我之前曾问过this question,在实施<presence>处理程序时,我注意到我的应用收到的状态项的格式为:

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

3FB991AA97D7701C21EAFE65FB866E4BFF1B927C部分看起来像是一个SHA哈希,但我如何才能获得相关用户的实际头像?

1 个答案:

答案 0 :(得分:2)

基于vCard的头像在XEP-0153中指定。你是正确的photo元素包含SHA1哈希。请求向您发送哈希的人的电子名片:

<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获取来直接向发送者的客户端询问发件人的完整JID(用户@域/资源)。准备好在发送方一方处理这些请求。