JEP-0084: User Avatar Jabber用户头像协议

 
用户头像在 Jabber 中叫做 “Avatar”,JEP-0084 定义了一种符合XMPP协议的方法来传递头像信息,它的协议是构建在 pubsub 的 Personal Eventing via Pubsub [2] subset ("PEP") 基础上。另外头像avatar还可以使用vCard来存储,如psi就是用vCard。
使用 JEP-0084 的客户端目前还比较少。

另外还有一种老的avatar协议 JEP-0008: IQ-Based Avatars,Pandion 目前使用的就是用那个已经淘汰的协议。

JEP-0084 使用了两个节点来保存 avatar 信息,状态(metadata node)和图片内容(data node)。用户再更新了 avatar 数据(data node)之后会同时更新 metadata node 的内容(相当更新内容索引),订阅的用户只需要订阅 metadata node, 只有在 metadata node 发现有更新之后才更新 data node 内容,这样就避免用户每次查询 data node 产生大量数据流量。

Avatar使用流程:
1.  用户创建 metadata 节点
Send: <iq type='set' from='[email protected]/chamber' id='create1'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <create node='http://jabber.org/protocol/avatar#metadata'/>
    <configure>
      <x xmlns='jabber:x:data' type='form'>
        <field var='FORM_TYPE' type='hidden'>
          <value>http://jabber.org/protocol/pubsub#node_config</value>
        </field>
        <field var='pubsub#access_model'>
          <option><value>presence</value></option>
        </field>
      </x>
    </configure>
  </pubsub>
</iq>
NodeID 必须是 "http://jabber.org/protocol/avatar#metadata" 访问方式应为 "presence".
<iq type='result' to='[email protected]/chamber' id='create1'/>
    
2.  创建 data node   
创建 data node, 类型必须是 "image/png"
用户创建数据节点, node 必须是 http://jabber.org/protocol/avatar#data
<iq type='set' from='[email protected]/chamber' id='create2'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <create node='http://jabber.org/protocol/avatar#data'/>
    <configure/>
  </pubsub>
</iq>
<iq type='result' to='[email protected]/chamber' id='create2'/>

3. 发布图片
用户发布 image/png 类型的图片信息到数据节点,同时以HTTP URL形式提交其他格式的图片,如下例中的 qqshow
<iq type='set' from='[email protected]/chamber' id='publish1'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <publish node='http://jabber.org/protocol/avatar#data'>
      <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
        <data xmlns='http://jabber.org/protocol/avatar#data'>
          qANQR1DBwU4DX7jmYZnncm...
        </data>
      </item>
      <item id='222f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
        <data xmlns='http://jabber.org/protocol/avatar#data'>
          http://qqshow.qq.com/12345/my.swf
        </data>
      </item>
    </publish>
  </pubsub>
</iq>
<iq type='result' to='[email protected]/chamber' id='publish1'/>   

4. 发布图片索引
头像索引信息到 meta data 节点, item id 设置为图片文件的 hash 值,便于其他订阅用户用来比较图片是否变化。
用户设置头像可能会轮流使用几个固定的文件,这样另外一个订阅的用户可以对图片进行cache,这样就不用每次更新都重新下载图片。
<iq type='set' from='[email protected]/chamber' id='publish2'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <publish node='http://jabber.org/protocol/avatar#metadata'>
      <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
        <metadata xmlns='http://jabber.org/protocol/avatar#metadata'>
          <info id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'
                type='image/png'
                bytes='12345'
                height='64'
                width='64'/>
        </metadata>
      </item>
    </publish>
  </pubsub>
</iq>
   
5. 订阅者(用户的好友)获取消息
<message to='[email protected]' from='[email protected]'>
  <event xmlns='http://jabber.org/protocol/pubsub#event'>
    <items node='http://jabber.org/protocol/avatar#metadata'>
      <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
        <metadata xmlns='http://jabber.org/protocol/avatar#metadata'>
          <info id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'
                type='image/png'
                bytes='12345'
                height='64'
                width='64'/>
        </metadata>
      </item>
    </items>
  </event>
  <addresses xmlns='http://jabber.org/protocol/address'>
    <address type='replyto' jid='[email protected]/chamber'/>
  </addresses>
</message>


6. 如果需要,订阅者获取图片内容

<iq type='get'
    from='[email protected]/home'
    to='[email protected]'
    id='retrieve1'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <items node='http://jabber.org/protocol/avatar#data'>
      <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
    </items>
  </pubsub>
</iq>
   
服务器返回结果,注意不是由客户端返回,JEP里面P2P的理念还是太少了。

<iq type='result' from='[email protected]' to='[email protected]/home' id='publish1'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <publish node='http://jabber.org/protocol/avatar#data'>
      <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
        <data xmlns='http://jabber.org/protocol/avatar#data'>
          qANQR1DBwU4DX7jmYZnncm...
        </data>
      </item>
    </publish>
  </pubsub>
</iq>
   

7. 可选的,用户也可以在客户端设置不显示用户头像
使用 stop 标签
<iq type='set' from='[email protected]/chamber' id='publish3'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <publish node='avatar/info/[email protected]'>
      <item>
        <metadata xmlns='http://jabber.org/protocol/avatar#metadata'>
          <stop/>
        </metadata>
      </item>
    </publish>
  </pubsub>
</iq>
   

As before, subscribers to the metadata node would then receive the notification:

Example 12. Subscribers receive avatar metadata notification

<message to='[email protected]' from='[email protected]'>
  <event xmlns='http://jabber.org/protocol/pubsub#event'>
    <items node='http://jabber.org/protocol/avatar#metadata'>
      <item>
        <metadata xmlns='http://jabber.org/protocol/avatar#metadata'>
          <stop/>
        </metadata>
      </item>
    </items>
  </event>
  <addresses xmlns='http://jabber.org/protocol/address'>
    <address type='replyto' jid='[email protected]/chamber'/>
  </addresses>
</message>

你可能感兴趣的:(user)