用户头像在 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> |