基于 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(用户@域/资源)。准备好在发件人方面处理这些请求。