如何获取用户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散列,但我如何才能获得问题用户的实际化身?
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/资源)。做好准备,以发件人的身份处理这些请求。