【问题标题】:How to get avatars of users in Jabber using libstrophe如何使用 libstrophe 在 Jabber 中获取用户的头像
【发布时间】:2012-07-11 00:52:40
【问题描述】:

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

【问题讨论】:

    标签: c osx-lion xmpp avatar libstrophe


    【解决方案1】:

    基于 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 get 直接询问发件人的客户端JID(用户@域/资源)。准备好在发件人方面处理这些请求。

    【讨论】:

    • 感谢您的回答,这听起来不错。但是,当您谈到节流时,您能否提供一个粗略的限制?就像我应该请求最多每秒 10 个、每秒 1 个、每分钟 1 个......?
    • 如果您太快发送太多数据,许多 XMPP 服务器将停止读取。在其中一台早期服务器上,这被称为“业力”。不同的服务器会有不同的默认业力设置,不同的部署可能会修改这些设置。已经讨论过让客户端知道设置是什么的协议,但社区决定这只会允许垃圾邮件发送者和拒绝服务攻击者微调他们的攻击。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2019-07-01
    • 2017-08-06
    • 2013-01-13
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多