如何获取用户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散列,但是我如何才能得到所讨论用户的实际化身呢?

最佳答案

基于vCard的化身在XEP-0153中指定photo元素包含SHA1散列是正确的请求发送哈希的人的vCard:

<iq to='[email protected]'
    type='get'
    id='vc2'>
  <vCard xmlns='vcard-temp'/>
</iq>

把照片从回应中剔除:
<iq to='[email protected]/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-0153所说,一些客户机试图首先使用XEP-0054向发送者的服务器请求vCard数据,然后通过向发送者的完整JID(user@domain/resource)发送vCard的IQ get来直接请求发送者的客户机准备好处理发送方的那些请求。

10-08 06:00