Надіслати повідомлення через Facebook Chat API (XMPP) C #


88

НАБЛЮДИТИ https://developers.facebook.com/docs/chat/

Послуга та API, які охоплює цей документ, застаріли з випуском Platform API v2.0. Коли версія 1.0 застаріла, chat.facebook.com буде більше недоступний.

Важливо! Прочитайте це, і ви, мабуть, захочете зробити щось зовсім інше, ніж будь-що, що пов’язане з цим питанням.

Я створюю чат за допомогою WebForms C #, що підключається до Facebook Chat API.

Я також розглянув це питання SO (і всі посилання). Деякі частини більше не актуальні, оскільки Facebook вимагає auth_tokenзараз.

Щоб повторити це, слід створити веб-програму Facebook, скористатися appIdобліковим записом користувача та користувачем із встановленим дозволом xmpp_login. Потім створіть Chat.aspxкод ззаду та вставте цей код відповідно. І замінити жорстко закодованих користувачів для взаємодії.

У мене є дві (можливо, три) проблеми, які, на мою думку, заважають мені досягти своєї мети надіслати повідомлення в чаті.

  1. Процес, зазначений // finishes auth processу документації, не відповідає опису документації (я не отримую відповіді після отримання повідомлення про успіх на основі SSL / TLS від Facebook.)
  2. Я не уявляю, як слід налаштувати частину "відправити повідомлення чату", і оскільки я не отримую жодних повідомлень від Facebook, важко сказати, що може бути не так.

Ось мій код у цілому, на PasteBin .

У мене також є деякі помічники для додавання дозволів xmpp_login і такі .. видалені для ясності.

Глобальні змінні:

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

Потім Page_Loadвиконуються (або передбачається) виконати всі необхідні кроки. Варто зазначити SendMessage("test");. Я просто спробував помістити його туди, щоб побачити, чи вдасться йому надіслати повідомлення чату ... SetUserNameAndAuthTokenвстановлює мій маркер автентифікації та ім'я користувача на глобальні змінні. AuthToken працює.

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

}

Тож я отримую відповідь, тоді я надсилаю відповідь на сервер:

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

Це займає 1 хвилину 40 секунд ... і відповідь така:

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

Нарешті я роблю 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;
}

Усі відповіді є "". Дивлячись на Readметод у SendWithSsl: це 0 байт. Спроба надіслати повідомлення також дає мені 0 байт Читати дані з Facebook. Я не знаю, чому?


6
@DanielHilgarth Hehe, ну .. перша частина Connect може бути не потрібна, але немає робочих прикладів того, як це зробити в C #, тому я подумав, що переконуюсь, що є хтось із тих, хто намагається завести фейсбук-чат i C #. Я також міг би написати все в одній основі коду, але тоді це не було б дуже підданим обстеженню.
Магнус Карлссон,

6
Якщо ви хочете отримати відповідь, я пропоную вам зняти код у цій публікації лише до мінімуму, необхідного для розуміння проблеми. Решту коду (наприклад, щоб інші могли його відтворити) ви могли б поставити на пастебін і зробити посилання на нього зі свого допису.
Даніель А.А. Пельсмакер

4
ваш код не є повним, тому я не можу стежити за контролем. Будь ласка, приєднайте налагоджувальний файл Xml, те, що ви надсилаєте на сервер і що отримуєте назад. Чому ви не використовуєте існуючу бібліотеку XMPP звідси, яка робить усе важке для вас? xmpp.org/xmpp-software/libraries
Олексій

4
@MatiCicero Сервер chat.facebook.com xmpp збирається вимкнути через 6 місяців згідно з facebook.
Магнус Карлссон,

11
@cari Вам не слід погоджуватися з цим рішенням. Замість цього використовуйте бібліотеку, як agsXMPP. Однак усі ці рішення перестануть працювати протягом шести місяців, оскільки Facebook вимикає сервер чату.
Магнус Карлссон,

Відповіді:


1

Зараз є новий api. Як працює платформа Messenger? Коли людина надсилає повідомлення компанії в Месенджері, і поки ця Сторінка використовує додаток для часткової або повної автоматизації розмов, відбудеться наступне. Сервер Facebook надсилає веб-хуки на URL-адресу бізнес-сервера, де розміщена програма обміну повідомленнями. За допомогою API надсилання програма може відповісти людині в Messenger. Таким чином, розробники можуть будувати керовані розмови, щоб вести людей через автоматизований потік, або створювати додаток, який служитиме мостом між вашими агентами та вашим бізнесом у Месенджері.

Платформа Messenger не вимагає оплати. Він призначений для підприємств, щоб обробляти запити своїх клієнтів. Після того, як ви створили свій досвід для взаємодії з вашими клієнтами, ви можете використовувати рекламу, щоб залучити людей до вашого досвіду, як, наприклад, оголошення "Натисніть для обміну повідомленнями" або "Вхідні".

Як виглядає досвід роботи з Messenger для бізнесу? У нас є зразок електронної комерції, з яким ви можете поспілкуватися в Messenger під назвою Original Coast Clothing.

Спілкуйтеся з Sample Business тут

Як розпочати? Ви можете розпочати роботу зі створення тестової сторінки та тестової програми, яка дозволяє вам спробувати свій досвід роботи в Messenger. Ми маємо кілька прикладів, які можуть допомогти вам розпочати. Коли ваш додаток буде готовий до розгортання, ви можете надіслати його на перевірку. Коли ваш додаток пройде процес розгляду, він буде готовий до взаємодії з громадськістю.

Для того, щоб розпочати роботу, вам знадобиться Messenger, сторінка у Facebook та URL-адреса, куди слід надсилати веб-хуки.

Ось покроковий посібник із впровадження вищезазначеного досвіду на тестовій сторінці для початку.

Готові до побудови? Розпочати

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.