Freitag, 18. Oktober 2013

Mit Facebook Chat verbinden

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.

In den vorigen beiden Posts (Daten von Facebook auslesen und Facebook Posts veröffentlichen) ging es um die Verbindung zu Facebook mittels der Graph API. Diese ist eine einfache HTTP basierte API, über die mit HTTP Abfragen auf die Daten von Facebook zugegriffen werden kann.
Heute möchte ich zeigen, wie man sich mittels C# in den Facebook Chat einloggt, welcher auf dem XMPP (früher Jabber) Protokoll basiert.
XMPP ist ein auf XML basierendes Kommunikationsprotokoll, welches hauptsächlich zum Instant Messaging genutzt wird.
Einige bekannte Programme, wie Google Talk und WhatsApp benutzen dieses Protokoll, viele andere, wie z.B. ICQ, Skype und eben Facebook bieten eine Möglichkeit zur Anbindung an.
Das XMPP Protkoll ist sehr verständlich und strukturiert aufgebaut, sodass wir uns ohne viel Code über C# im Facebook Chat einloggen können und Nachrichten schicken und empfangen können. Da der Chat und die "normale" Nachrichtenfunktion nicht mehr getrennt sind wie früher, können wir mit dem Code auch herkömmliche Nachrichten senden und empfangen.
Ein Auslesen der Kontaktliste ist ebenfalls möglich.
Ich werde den Chat kleinschrittig einführen. Heute werde ich die Einbindung von XMPP zeigen und das Anmelden beim Facebook Service.
In den nächsten Tagen werden dann die folgenden Posts online kommen:

Auslesen der Kontaktliste
Senden von Nachrichten
Empfangen von Nachrichten
Vollständiger Chat Client
Anzeigen des "Schreibt" Status
Verbesserter Facebook Chat

Nun aber zum ersten Teil. Theoretisch könnten wir uns auch selber ein XMPP Framework schreiben, welches dann über Sockets etc. die erforderlichen Daten an den Server schickt und von diesem empfängt. Ich verwende jedoch eine fertige Library, nämlich agsXMPP, welche uns einiges an Arbeit abnimmt.
Diese bitte zuerst einmal herunterladen und installieren.
Möchten wir diese im Projekt benutzen, müssen wir einen Verweis darauf einbinden. Dazu klicken wir auf "Verweis hinzufügen - Durchsuchen" und navigieren zum Installationsverzeichnis \agsxmpp\bin\(passende .Net Version, wahrscheinlich 3.5)\(Debug | Release)\agsXMPP.dll.
In den nächsten Posts brauchen wir dann die folgenden using Direktiven:


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

Dann können wir die Verbindung zum Facebook Chat Server (chat.facebook.com) vorbereiten über:

XmppClientConnection xmpp = new XmppClientConnection("chat.facebook.com");

Vor dem eigentlichen Anmelden hinterlegen wir eine Funktion zur Reaktion auf das OnLogin Ereignis. Die Anmeldung läuft nämlich asynchron ab, sobald sie erfolgreich abgeschlossen wurde, wird das Ereignis aufgerufen:

xmpp.OnLogin += new ObjectHandler(OnLogin);

Die Funktion sieht folgendermaßen aus, im Prinzip sind alle Anweisungen darin optional, die letzten 3 zeigen unseren Anmeldestatus als Online an:

private void OnLogin(object sender)
{
    MessageBox.Show("Login successful.");
    Presence p = new Presence(ShowType.chat, "Online");
    p.Type = PresenceType.available;
    xmpp.Send(p);
}

Danach können wir die eigentliche Verbindung mit unseren Daten herstellen. Hierfür wird der Facebook Name (der Name in der URL des Profils, z.B. für https://www.facebook.com/hans.wurst hans.wurst) sowie das Passwort benötigt:

xmpp.Open("name", "password");

Der vollständige Code könnte z.B. so aussehen:
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 agsXMPP;
using agsXMPP.protocol.client;
using agsXMPP.protocol.iq.roster;
using agsXMPP.Collections;

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

        XmppClientConnection xmpp = new XmppClientConnection("chat.facebook.com");

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

        private void OnLogin(object sender)
        {
            MessageBox.Show("Login successful.");
            Presence p = new Presence(ShowType.chat, "Online");
            p.Type = PresenceType.available;
            xmpp.Send(p);
        }
    }
}

Kommentare:

  1. Danke für die Einführung! Hier noch eine Info, wie man sich per Oauth/Access token authentifiziert:

    http://forum.ag-software.net/thread/1446-Connecting-to-Facebook-Chat-using-X-FACEBOOK-PLAT

    Hinweis: Das agsXMPP-Paket von nuget ist zu alt dafür, den aktuellen Build gibts hier: http://www.ag-software.net/download-directory/

    AntwortenLöschen
    Antworten
    1. Dir auch danke David!
      Ich habe der Einfachheit halber erstmal die herkömmliche XMPP Anmeldung gewählt, aber als Info an alle:
      Facebook empfiehlt obige Variante, da damit u.A. das Passwort nicht übertragen wird.

      Löschen
    2. Oauth wär vielleicht ne Idee für einen der nächsten Beiträge ;) MVC4 z.B nimmt einem da ja schon teilweise was ab.

      Hab den Code noch nicht getestet - ist der Weg über den Chat eigentlich eine Möglichkeit, private Nachrichten auch an offline-kontakte zu senden? Grundsätzlich hat facebook die Möglichkeit zumindest über die graph API wegen spammissbrauch abgeknipst.

      Löschen
    3. Stimmt.
      Und ja, mit dem Code lassen sich auch offline Nachrichten schicken.

      Löschen
  2. Habe es in einer WinForms-Test-Anwendung mittlerweile auch per X-FACEBOOK-PLATFORM-Auth zum laufen bekommen. Der agsXMPP Code war/ist in der Hinsicht allerdings noch ziemlich verbuggt (gewesen). Anscheinend war ich der erste, der versucht hat das damit zum laufen zu kriegen. Jetzt läuft das aber. Meine Diskussion mit dem Entwickler kann man hier nachlesen:

    http://forum.ag-software.net/thread/1625-NullReferenceException-when-connecting-with-X-FAC
    http://forum.ag-software.net/thread/1446-Connecting-to-Facebook-Chat-using-X-FACEBOOK-PLAT

    AntwortenLöschen