Wyślij wiadomość przez Facebook Chat API (XMPP) C #

88

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

Usługa i interfejs API, których dotyczy ten dokument, zostały wycofane wraz z wydaniem Platform API w wersji 2.0. Po wycofaniu wersji 1.0 chat.facebook.com nie będzie już dostępny.

Ważny! Przeczytaj to i prawdopodobnie zechcesz zrobić coś zupełnie innego niż cokolwiek, co ma związek z tym pytaniem.

Tworzę czat z WebForms C # łącząc się z Facebook Chat API.

Spojrzałem również na to pytanie SO (i wszystkie linki). Niektóre części nie są już istotne, ponieważ Facebook wymaga auth_tokenteraz.

Aby to powielić, należy skonfigurować aplikację internetową na Facebooku, użyć appIdkonta użytkownika i z ustawieniem uprawnień xmpp_login. Następnie utwórz Chat.aspxkod z kodem i wklej go odpowiednio. I zastąp zakodowanych na stałe użytkowników, z którymi chcesz się komunikować.

Mam dwa (może trzy) problemy, które moim zdaniem uniemożliwiają mi osiągnięcie celu, jakim jest wysłanie wiadomości na czacie.

  1. Proces odnotowany // finishes auth processw dokumentacji nie jest zgodny z opisem dokumentacji (nie otrzymuję żadnych odpowiedzi po otrzymaniu wiadomości o powodzeniu opartej na protokole SSL / TLS z Facebooka).
  2. Nie mam pojęcia, jak należy skonfigurować część „wyślij wiadomość na czacie”, a ponieważ nie otrzymuję żadnych wiadomości z Facebooka, trudno powiedzieć, co może być nie tak.

Oto cały mój kod w PasteBin .

Mam też pomocników do dodawania uprawnień xmpp_login i tym podobnych… usuniętych dla przejrzystości.

Zmienne globalne:

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

Następnie Page_Loadwszystkie wymagane kroki są (lub mają być) wykonywane. Warto zauważyć, że SendMessage("test");. Po prostu próbowałem go tam umieścić, aby sprawdzić, czy uda się wysłać wiadomość na czacie ... SetUserNameAndAuthTokenustawia mój token uwierzytelniania i nazwę użytkownika na zmienne globalne. AuthToken działa.

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

}

Otrzymuję więc odpowiedź, a następnie wysyłam odpowiedź na serwer:

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

Trwa to 1 minutę i 40 sekund ... a odpowiedź to:

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

Wreszcie wykonuję 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;
}

Wszystkie odpowiedzi są "". Patrząc na Readmetodę w SendWithSsl: to 0 bajtów. Próba wysłania wiadomości daje mi również 0 bajtów Odczytanych danych z Facebooka. Nie mam pojęcia, dlaczego?

Magnus Karlsson
źródło
6
@DanielHilgarth Hehe, no cóż ... pierwsza część Connect może nie być konieczna, ale nie ma żadnych działających przykładów, jak to zrobić w C #, więc pomyślałem, że upewnię się, że jest jeden dla każdego, kto próbuje porozmawiać na Facebooku ja C #. Mógłbym też napisać wszystko w jednej bazie kodu, ale wtedy nie będzie to zbytnio nadzorowalne.
Magnus Karlsson
6
Jeśli chcesz uzyskać odpowiedź, proponuję zredukować kod w tym poście do minimum niezbędnego do zrozumienia problemu. Resztę kodu (np. Aby inni mogli go odtworzyć) możesz założyć na pastebin i połączyć z nim w swoim poście.
Daniel AA Pelsmaeker
4
Twój kod nie jest kompletny, więc nie mogę śledzić przepływu sterowania. Dołącz plik XML debugowania, informacje, które wysyłasz na serwer i co otrzymujesz. Dlaczego nie używasz istniejącej biblioteki XMPP z tego miejsca, która ciężko pracuje dla Ciebie? xmpp.org/xmpp-software/libraries
Alex
4
@MatiCicero Według Facebooka, serwer xmpp chat.facebook.com niedługo zostanie zamknięty za 6 miesięcy.
Magnus Karlsson
11
@cari Nie powinieneś iść z tym rozwiązaniem. Zamiast tego użyj biblioteki takiej jak agsXMPP. Jednak wszystkie te rozwiązania przestaną działać w ciągu sześciu miesięcy, ponieważ Facebook wyłącza serwer czatu.
Magnus Karlsson,

Odpowiedzi:

1

Jest teraz nowy interfejs API. Jak działa platforma Messenger? Gdy dana osoba wyśle ​​wiadomość do firmy na Messengerze i jeśli ta strona będzie używać aplikacji do częściowego lub całkowitego zautomatyzowania rozmów, nastąpi co następuje. Serwer Facebooka wysyła elementy webhook na adres URL serwera biznesowego, na którym hostowana jest aplikacja do obsługi wiadomości. Korzystając z Send API, aplikacja może odpowiedzieć osobie na Messengerze. W ten sposób programiści mogą budować rozmowy kierowane, aby prowadzić ludzi przez automatyczny przepływ lub stworzyć aplikację, która będzie służyć jako pomost między agentami a obecnością Twojej firmy w Messengerze.

Korzystanie z platformy Messenger nie wymaga żadnej opłaty. Jest przeznaczony dla firm do obsługi zapytań od swoich klientów. Po zbudowaniu wrażeń, z którymi Twoi klienci będą mogli wchodzić w interakcje, możesz wykorzystać Reklamy, aby przyciągnąć ludzi do swoich doświadczeń, na przykład reklamy typu kliknij, aby wysłać wiadomość lub reklamy w skrzynce odbiorczej.

Jak wygląda Messenger for Business? Mamy przykładową firmę eCommerce, z którą możesz rozmawiać na Messengerze o nazwie Original Coast Clothing.

Porozmawiaj tutaj z Przykładową Firmą

Jak mam zacząć? Możesz rozpocząć od utworzenia strony testowej i aplikacji testowej, która pozwoli Ci wypróbować swoje doświadczenie w programie Messenger. Mamy kilka przykładów, od których możesz zacząć. Gdy aplikacja będzie gotowa do wdrożenia, możesz przesłać ją do sprawdzenia. Gdy Twoja aplikacja przejdzie nasz proces sprawdzania, będzie gotowa do interakcji z opinią publiczną.

Aby rozpocząć, potrzebujesz Messengera, strony na Facebooku i adresu URL, na który mają być wysyłane webhooki.

Oto przewodnik krok po kroku, jak wdrożyć powyższe doświadczenie na stronie testowej, aby rozpocząć.

Gotowy do budowania? Zaczynaj

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

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

Jin Thakur
źródło