Invia messaggio tramite Facebook Chat API (XMPP) C #


88

OSSERVA https://developers.facebook.com/docs/chat/

Il servizio e l'API trattati in questo documento sono stati deprecati con il rilascio di Platform API v2.0. Una volta che la versione 1.0 sarà deprecata, chat.facebook.com non sarà più disponibile.

Importante! Leggi questo e probabilmente vorrai fare qualcosa di completamente diverso da tutto ciò che ha a che fare con questa domanda.

Sto creando una chat con WebForms C # collegandomi all'API di chat di Facebook.

Ho anche esaminato questa domanda SO (e tutti i collegamenti). Alcune parti non sono più rilevanti poiché Facebook richiede auth_tokenora.

Per replicare, è necessario configurare un'app Web di Facebook, utilizzare appIde un account utente con il set di autorizzazioni xmpp_login. Quindi crea un Chat.aspxcon il codice dietro e incolla questo codice di conseguenza. E sostituisci gli utenti hard-coded con cui interagire.

Ho due (forse tre) problemi che credo mi impediscano di riuscire con il mio obiettivo di inviare un messaggio di chat.

  1. Il processo indicato // finishes auth processnella documentazione non corrisponde alla descrizione della documentazione (non ricevo alcuna risposta dopo aver ricevuto il mio messaggio di successo basato su SSL / TLS da Facebook).
  2. Non ho idea di come debba essere impostata la parte "invia messaggio di chat" e poiché non ricevo alcun messaggio da Facebook è difficile dire cosa potrebbe essere sbagliato.

Ecco il mio codice nella sua interezza, su PasteBin .

Ho anche alcuni helper per l'aggiunta di permessi xmpp_login e simili .. rimossi per chiarezza.

Variabili globali:

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\"/>";

Quindi in Page_Loadtutti i passaggi richiesti vengono (o dovrebbero essere) eseguiti. Degno di nota è il SendMessage("test");. Ho appena provato a metterlo lì per vedere se sarebbe riuscito a inviare un messaggio di chat ... SetUserNameAndAuthTokenimposta il mio token di autenticazione e il nome utente su variabili globali. L'AuthToken funziona.

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);

}

Quindi ottengo una risposta, quindi invio la risposta al 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;
}

Questo richiede 1 minuto e 40 secondi ... e la risposta è:

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

Finalmente eseguo 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;
}

Tutte le risposte lo sono "". Guardando il Readmetodo in SendWithSsl: è 0 byte. Il tentativo di inviare un messaggio mi dà anche 0 byte di lettura dei dati da Facebook. Non ho idea del perché?


6
@DanielHilgarth Hehe, beh .. la prima parte di Connect potrebbe non essere necessaria ma non ci sono esempi funzionanti su come farlo in C # quindi ho pensato di assicurarmi che ce ne fosse una per chiunque provi a fare una chat su Facebook circuito integrato#. Potrei anche scrivere tutto in una base di codice ma poi non sarà molto controllabile.
Magnus Karlsson

6
Se vuoi una risposta, ti suggerisco di ridurre il codice in questo post solo al minimo indispensabile per comprendere il problema. Il resto del codice (ad es. Affinché altri possano riprodurlo) potresti metterlo su pastebin e collegarlo dal tuo post.
Daniel AA Pelsmaeker

4
il tuo codice non è completo, quindi non posso seguire il flusso di controllo. Allega l'Xml di debug, quello che invii al server e quello che riceverai. Perché non stai usando una libreria XMPP esistente da qui che fa tutto il duro lavoro per te? xmpp.org/xmpp-software/libraries
Alex

4
@MatiCicero Il server xmpp di chat.facebook.com sta per chiudere tra 6 mesi secondo facebook.
Magnus Karlsson

11
@cari Non dovresti andare con questa soluzione. Usa invece una libreria come agsXMPP. Tuttavia, tutte queste soluzioni smetteranno di funzionare entro sei mesi da quando Facebook spegnerà il server di chat.
Magnus Karlsson

Risposte:


1

Ora c'è una nuova API. Come funziona la piattaforma Messenger? Quando una persona invia un messaggio a un'azienda su Messenger e finché questa Pagina utilizza un'app per automatizzare parzialmente o completamente le conversazioni, si verificherà quanto segue. Il server Facebook invia webhook all'URL del server aziendale, su cui è ospitata l'app di messaggistica. Utilizzando l'API di invio, l'app può rispondere alla persona su Messenger. In questo modo, gli sviluppatori possono creare conversazioni guidate per guidare le persone attraverso un flusso automatizzato o creare un'app che funga da ponte tra i tuoi agenti e la tua presenza aziendale su Messenger.

La piattaforma Messenger non richiede alcun pagamento per l'utilizzo. È pensato per le aziende per gestire le richieste dei propri clienti. Una volta creata la tua esperienza con cui i tuoi clienti possono interagire, puoi quindi sfruttare gli annunci per portare le persone alla tua esperienza, come ad esempio gli annunci click-to-Messenger o gli annunci nella posta in arrivo.

Che aspetto ha un'esperienza Messenger for Business? Abbiamo un esempio di attività di e-commerce con cui puoi chattare su Messenger chiamato Original Coast Clothing.

Chatta con un'azienda di esempio qui

Come inizio? Puoi iniziare creando una pagina di test e un'app di prova che ti consentano di provare la tua esperienza all'interno di Messenger. Abbiamo alcuni esempi che possono aiutarti a iniziare. Quando l'app è pronta per la distribuzione, puoi inviarla per la revisione. Quando la tua app avrà superato il nostro processo di revisione, sarà pronta per interagire con il pubblico.

Per iniziare, avrai bisogno di Messenger, una pagina Facebook e un URL a cui inviare i webhook.

Ecco una guida passo passo per implementare l'esperienza di cui sopra nella tua pagina di test per iniziare.

Pronto a costruire? Iniziare

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.