Nachricht senden über Facebook Chat API (XMPP) C #

88

BEOBACHTEN SIE https://developers.facebook.com/docs/chat/

Der Service und die API, die in diesem Dokument behandelt werden, sind mit der Veröffentlichung der Platform API v2.0 veraltet. Sobald Version 1.0 veraltet ist, ist chat.facebook.com nicht mehr verfügbar.

Wichtig! Lesen Sie dies und Sie möchten wahrscheinlich etwas völlig anderes tun als alles, was mit dieser Frage zu tun hat.

Ich erstelle einen Chat mit WebForms C #, der eine Verbindung zur Facebook-Chat-API herstellt.

Ich habe mir auch diese SO-Frage (und alle Links) angesehen. Einige Teile sind nicht mehr relevant, da Facebook dies auth_tokenjetzt benötigt .

Um dies zu replizieren, sollten Sie eine Facebook-Webanwendung einrichten appIdund das Benutzerkonto mit dem Berechtigungssatz xmpp_login verwenden. Dann erstellen Sie eineChat.aspx mit Code dahinter und fügen Sie diesen Code entsprechend ein. Und ersetzen Sie die fest codierten Benutzer, mit denen Sie interagieren möchten.

Ich habe zwei (vielleicht drei) Probleme, von denen ich glaube, dass sie mich daran hindern, mein Ziel, eine Chat-Nachricht zu senden, zu erreichen.

  1. Der // finishes auth processin der Dokumentation angegebene Prozess stimmt nicht mit der Dokumentationsbeschreibung überein (ich erhalte keine Antwort, nachdem ich meine SSL / TLS-basierte Erfolgsnachricht von Facebook erhalten habe.)
  2. Ich habe keine Ahnung, wie der Teil "Chat-Nachricht senden" eingerichtet werden soll, und da ich keine Nachrichten von Facebook erhalte, ist es schwer zu sagen, was möglicherweise falsch ist.

Hier ist mein Code in seiner Gesamtheit auf PasteBin .

Ich habe auch einige Helfer zum Hinzufügen von xmpp_login-Berechtigungen und dergleichen. Aus Gründen der Übersichtlichkeit entfernt.

Globale Variablen:

public partial class Chat : Page
{
    public TcpClient client = new TcpClient();
    NetworkStream stream;
    private SslStream ssl;
    private string AppId { get; set; }
    public string AppSecret { get; set; }
    public string AppUrl { get; set; }
    public string UserId { get; set; }
    public string AccessToken { get; set; }
    private string _error = string.Empty;//global error string for watch debugging in VS. 

    public const string FbServer = "chat.facebook.com";
    private const string STREAM_XML = "<stream:stream xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\" xmlns=\"jabber:client\" to=\"chat.facebook.com\" xml:lang=\"en\" xmlns:xml=\"http://www.w3.org/XML/1998/namespace\">";
    private const string AUTH_XML = "<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='X-FACEBOOK-PLATFORM'></auth>";
    private const string CLOSE_XML = "</stream:stream>";
    private const string RESOURCE_XML = "<iq type=\"set\" id=\"3\"><bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"><resource>fb_xmpp_script</resource></bind></iq>";
    private const string SESSION_XML = "<iq type=\"set\" id=\"4\" to=\"chat.facebook.com\"><session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/></iq>";
    private const string START_TLS = "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>";

Dann Page_Loadwerden (oder sollen) in allen erforderlichen Schritten ausgeführt. Bemerkenswert ist die SendMessage("test");. Ich habe nur versucht, es dort abzulegen, um zu sehen, ob es erfolgreich ist, eine Chat-Nachricht zu senden ... SetUserNameAndAuthTokensetzt mein Authentifizierungstoken und meinen Benutzernamen auf globale Variablen. Das AuthToken funktioniert.

protected void Page_Load(object sender, EventArgs e)
{
    this.AppId = "000000082000090";//TODO get from appsettings.
    //AddAdditionalPermissions("xmpp_login");//TODO handle xmpp_login persmission
    this.AppSecret = "d370c1bfec9be6d9accbdf0117f2c495"; //TODO Get appsecret from appsetting.
    this.AppUrl = "https://fbd.anteckna.nu";

    SetUserNameAndAuthToken();

    Connect(FbServer);

    // initiates auth process (using X-FACEBOOK_PLATFORM)
    InitiateAuthProcess(STREAM_XML);

    // starting tls - MANDATORY TO USE OAUTH TOKEN!!!!
    StartTlsConnection(START_TLS);

    // gets decoded challenge from server
    var decoded = GetDecodedChallenge(AUTH_XML);

    // creates the response and signature
    string response = CreateResponse(decoded);

    //send response to server
    SendResponseToServer(response);

    SendMessage("test");

    // finishes auth process
    FinishAuthProcess();

    // we made it!
    string streamresponseEnd = SendWihSsl(CLOSE_XML);

}

Ich erhalte eine Antwort und sende die Antwort an den Server:

private void SendResponseToServer(string response)
{
    string xml = String.Format("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">{0}</response>", response);
    string response2 = SendWihSsl2(xml);
    if (!response2.ToLower().Contains("success"))
        _error = response2;
}

Dies dauert 1 Minute 40 Sekunden ... und die Antwort lautet:

<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

Schließlich mache ich den FinishAuthPorcess ()

private void FinishAuthProcess()
{
    string streamresponse = SendWithSsl(STREAM_XML);
    if (!streamresponse.Contains("STREAM:STREAM"))
        _error = streamresponse;

    string streamresponse2 = SendWihSsl(RESOURCE_XML);
    if (!streamresponse2.Contains("JID"))
        _error = streamresponse2;

    string streamresponse3 = SendWihSsl(SESSION_XML);
    if (!streamresponse3.Contains("SESSION"))
        _error = streamresponse2;
}

Alle Antworten sind "". Betrachtet man die ReadMethode in SendWithSsl: Es sind 0 Bytes. Der Versuch, eine Nachricht zu senden, gibt mir auch 0 Bytes. Lesen Sie Daten von Facebook. Ich habe keine Ahnung warum?

Magnus Karlsson
quelle
6
@DanielHilgarth Hehe, na ja ... der erste Teil von Connect ist möglicherweise nicht erforderlich, aber es gibt keine funktionierenden Beispiele dafür in C #, also dachte ich, ich würde sicherstellen, dass es eines für jeden gibt, der versucht, einen Facebook-Chat zu führen i C #. Ich könnte auch alles in eine Codebasis schreiben, aber dann wird es nicht sehr übersehbar sein.
Magnus Karlsson
6
Wenn Sie eine Antwort wünschen, schlage ich vor, dass Sie den Code in diesem Beitrag auf das Nötigste reduzieren, um das Problem zu verstehen. Den Rest des Codes (z. B. damit andere ihn reproduzieren können) können Sie auf Pastebin setzen und von Ihrem Beitrag aus darauf verlinken.
Daniel AA Pelsmaeker
4
Ihr Code ist nicht vollständig, daher kann ich dem Kontrollfluss nicht folgen. Bitte hängen Sie die Debug-XML an, was Sie an den Server senden und was Sie zurückbekommen. Warum verwenden Sie von hier aus keine vorhandene XMPP-Bibliothek, die alle harte Arbeit für Sie erledigt? xmpp.org/xmpp-software/libraries
Alex
4
@MatiCicero Der xmpp-Server von chat.facebook.com wird laut Facebook in 6 Monaten heruntergefahren.
Magnus Karlsson
11
@cari Sie sollten nicht mit dieser Lösung gehen. Verwenden Sie stattdessen eine Bibliothek wie agsXMPP. Alle diese Lösungen werden jedoch innerhalb von sechs Monaten nicht mehr funktionieren, da Facebook den Chat-Server herunterfährt.
Magnus Karlsson

Antworten:

1

Es gibt jetzt eine neue API. Wie funktioniert die Messenger-Plattform? Wenn eine Person über Messenger eine Nachricht an ein Unternehmen sendet und diese Seite eine App verwendet, um Konversationen teilweise oder vollständig zu automatisieren, geschieht Folgendes. Der Facebook-Server sendet Webhooks an die URL des Business-Servers, auf dem die Messaging-App gehostet wird. Über die Sende-API kann die App auf die Person in Messenger antworten. Auf diese Weise können Entwickler geführte Konversationen erstellen, um Personen durch einen automatisierten Ablauf zu führen, oder eine App erstellen, die als Brücke zwischen Ihren Agenten und Ihrer Geschäftspräsenz in Messenger dient.

Für die Verwendung der Messenger-Plattform ist keine Zahlung erforderlich. Es ist für Unternehmen gedacht, um Anfragen von ihren Kunden zu bearbeiten. Sobald Sie Ihre Erfahrung für die Interaktion Ihrer Kunden aufgebaut haben, können Sie Anzeigen nutzen, um Menschen zu Ihrer Erfahrung zu bringen, z. B. Click-to-Messenger-Anzeigen oder Posteingangsanzeigen.

Wie sieht eine Messenger for Business-Erfahrung aus? Wir haben ein Beispiel für ein E-Commerce-Geschäft, mit dem Sie über Messenger chatten können: Original Coast Clothing.

Chatten Sie hier mit Sample Business

Wie fange ich an? Sie können beginnen, indem Sie eine Testseite und eine Test-App erstellen, mit denen Sie Ihre Erfahrungen in Messenger testen können. Wir haben einige Beispiele, die Ihnen den Einstieg erleichtern können. Sobald Ihre App bereit zur Bereitstellung ist, können Sie sie zur Überprüfung einreichen. Wenn Ihre App unseren Überprüfungsprozess besteht, ist sie bereit, mit der Öffentlichkeit zu interagieren.

Um loszulegen, benötigen Sie Messenger, eine Facebook-Seite und eine URL, an die die Webhooks gesendet werden sollen.

Hier finden Sie eine schrittweise Anleitung zum Bereitstellen der oben genannten Erfahrung auf Ihrer Testseite, um Ihnen den Einstieg zu erleichtern.

Bereit zu bauen? Loslegen

https://developers.facebook.com/products/messenger/

https://developers.facebook.com/docs/messenger-platform/reference/send-api/

Jin Thakur
quelle