Samstag, 19. Oktober 2013

Facebook Freundesliste auslesen

Hinweis: Seit der Veröffentlichung der Facebook API 2.0 im April 2014 ist die Chatfunktion deaktiviert, und damit leider dieser Code nicht mehr lauffähig.

Die Freundesliste könnte man auch über die Graph API abfragen, ähnlich zu dem Prinzip in diesem Post. Dafür braucht man allerdings ein Access Token welches öfter mal abläuft und muss JSON Objekte verarbeiten.
Deswegen benutze ich eine fertige Funktion des XMPP Protokoll. Vorrausetzung hierfür ist eine stehende Verbindung zum Facebook Chat, wie ich sie im vorigen Post beschrieben habe.
Wir müssen nun lediglich nur noch die Verabeitung des OnRosterItem Ereignisses hinzufügen, welches für jeden Kontakt in der Kontaktliste einmal aufgerufen wird, und können so alle Kontakte auslesen.
Wir können dies zum Beispiel beim erfolgreichen Login tun:

private void OnLogin(object sender)
{
    xmpp.OnRosterItem += new XmppClientConnection.RosterHandler(xmpp_OnRosterItem);
}

Zur bequemen Speicherung der Freunde bietet sich ein Dictionary an:

Dictionary<string, string> Friends = new Dictionary<string, string>();

In der Verarbeitung von OnRosterItem speichern wir dann alle Kontakte in diesem Dictionary:

private void xmpp_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)
{
    Friends.Add(item.GetAttribute("jid").ToString(), item.GetAttribute("name").ToString());
}

Zum Senden / Empfangen von Nachrichten wird die Jid des Gesprächpartners benötigt, weswegen wir diese speichern, den Namen benutzen wir zur Umsetzung dieser in den bekannten Namen.
Jid und Name können dann folgendermaßen abgefragt werden:

string JidBloggeroliver = Friends.First(x => x.Value == "Olli Michael").Key;
string NameBloggeroliver = Friends["-100006476847029@chat.facebook.com"];

Nun der komplette Code. Ich habe nach dem Öffnen der Verbindung eine Schleife eingeführt, welche wartet, bis alle Kontakte geladen sind.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.IO;

using agsXMPP;
using agsXMPP.protocol.client;
using agsXMPP.protocol.iq.roster;
using agsXMPP.Collections;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        XmppClientConnection xmpp = new XmppClientConnection("chat.facebook.com");
        bool StartCollectingContacts = false;
        bool CollectingContacts = true;
        Dictionary<string, string> Friends = new Dictionary<string, string>();

        private void Form1_Load(object sender, EventArgs e)
        {
            xmpp.OnLogin += new ObjectHandler(OnLogin);
            xmpp.Open("name", "password");

            while (CollectingContacts)
            {
                if (StartCollectingContacts)
                    CollectingContacts = false;
                System.Threading.Thread.Sleep(1000);
            }

            string JidBloggeroliver = Friends.First(x => x.Value == "Olli Michael").Key;
            string NameBloggeroliver = Friends["-100006476847029@chat.facebook.com"];
        }

        private void OnLogin(object sender)
        {
            xmpp.OnRosterItem += new XmppClientConnection.RosterHandler(xmpp_OnRosterItem);
        }

        private void xmpp_OnRosterItem(object sender, agsXMPP.protocol.iq.roster.RosterItem item)
        {
            StartCollectingContacts = true;
            CollectingContacts = true;
            Friends.Add(item.GetAttribute("jid").ToString(), item.GetAttribute("name").ToString());
        }
    }

}

Keine Kommentare:

Kommentar veröffentlichen