如何使用 agsXmpp 检索某人的头像/照片

Posted

技术标签:

【中文标题】如何使用 agsXmpp 检索某人的头像/照片【英文标题】:How to retrieve Someone's Avatar/Photo with agsXmpp 【发布时间】:2011-06-19 14:48:07 【问题描述】:

这是我目前所拥有的:

void xmppConnection_OnReadXml(object sender, string xml)
    
        if (xml.Contains(XmlTags.PhotoOpen))
        
            int startIndex = xml.IndexOf(XmlTags.PhotoOpen) + XmlTags.PhotoOpen.Length;
            int length = xml.IndexOf(XmlTags.PhotoClose) - startIndex;
            string photoHash = xml.Substring(startIndex, length);
        
    

我想我无法撤消哈希,但我想获取一个人的头像/照片。我如何做到这一点?

【问题讨论】:

【参考方案1】:

您需要处理来自 XMPP 连接的 VCard 事件和响应:

        private void vcardToolStripMenuItem_Click(object sender, EventArgs e)
    
        RosterNode node = rosterControl.SelectedItem();
        if (node != null)
        
            frmVcard f = new frmVcard(node.RosterItem.Jid, XmppCon);
            f.Show();
        
    

以上内容来自 AGSCMPP 下载的 miniclient 解决方案示例。请注意,当用户为用户请求 VCARD 时会发生这种情况。不过,您可以随时发起该请求。

private void VcardResult(object sender, IQ iq, object data)
    
        if (InvokeRequired)
        
            // Windows Forms are not Thread Safe, we need to invoke this :(
            // We're not in the UI thread, so we need to call BeginInvoke               
            BeginInvoke(new IqCB(VcardResult), new object[]  sender, iq, data );
            return;
        
        if (iq.Type == IqType.result)
        
            Vcard vcard = iq.Vcard;
            if (vcard!=null)
            
                txtFullname.Text    = vcard.Fullname;
                txtNickname.Text    = vcard.Nickname;
                txtBirthday.Text    = vcard.Birthday.ToString();
                txtDescription.Text = vcard.Description;
                Photo photo = vcard.Photo;
                if (photo != null)
                    picPhoto.Image      = vcard.Photo.Image;
            


        
    

当有人从 XMPP 请求 VCARD 信息并且 IQ 类型与正确的数据匹配时,就会发生这种情况。然后你可以从vcard.Photo拉取照片。

你触发拉动:

VcardIq viq = new VcardIq(IqType.get, new Jid(jid.Bare));
con.IqGrabber.SendIq(viq, new IqCB(VcardResult), null);     

第一行是对 XMPP 服务器的请求,VCARD 表单使用它来请求用户信息。

那里的第二行,设置了另一个抓取器(各种回调),表单用来等待信息到达,然后解析出必要的信息。在这种情况下,抓取器采用新形式,因此主应用程序不必担心解析该信息。

您可以通过将 AGSMMP zip 文件解压缩到本地驱动器并查看 Samples\VS2008\miniclient 文件夹来查看整个源代码。

【讨论】:

【参考方案2】:

您可以点击链接:http://forum.ag-software.de/thread/192-How-to-save-vcard-data

【讨论】:

对于窗口窗体使用此代码:照片照片 = vcard.Photo;如果(照片!= null)picPhoto.Image = vcard.Photo.Image;那么,如果我使用 WPF,我该怎么做呢?

以上是关于如何使用 agsXmpp 检索某人的头像/照片的主要内容,如果未能解决你的问题,请参考以下文章

如何使用div拼接头像,生成心形照片墙?

在 Swift 中构建一个圆形头像堆:如何将最后一张照片隐藏在第一张照片下面?

如何使用 agsXMPP 库注销 JID

如何在 C# 中使用 agsXMPP 获取聊天记录

如何使用 agsXMPP c# 创建 jabber 帐户?

带有社交名流头像的 Laravel 8 Jetstream 个人资料照片