Отправить сообщение через 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 (и все ссылки). Некоторые части больше не актуальны, так как auth_tokenсейчас этого требует Facebook .

Чтобы воспроизвести это, вы должны настроить веб-приложение 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 Хе-хе, ну ... первая часть Connect может и не понадобиться, но нет рабочих примеров того, как это сделать на C #, поэтому я подумал, что обязательно найдется для всех, кто пытается создать чат в facebook IC#. Я также мог бы написать все в одной базе кода, но тогда это не будет очень контролируемым.
Магнус Карлссон
6
Если вы хотите получить ответ, я предлагаю вам сократить код в этом посте до минимума, необходимого для понимания проблемы. Остальную часть кода (например, чтобы другие могли воспроизвести) вы можете поместить на pastebin и указать ссылку в своем сообщении.
Daniel AA Pelsmaeker
4
ваш код не завершен, поэтому я не могу следить за потоком управления. Приложите отладочный XML-код, который вы отправляете на сервер и что получаете обратно. Почему вы не используете существующую библиотеку XMPP отсюда, которая делает всю тяжелую работу за вас? xmpp.org/xmpp-software/libraries
Алекс,
4
@MatiCicero По данным facebook, сервер chat.facebook.com xmpp будет закрыт через 6 месяцев.
Магнус Карлссон
11
@cari Вы не должны использовать это решение. Вместо этого используйте такую ​​библиотеку, как agsXMPP. Однако все эти решения перестанут работать в течение шести месяцев после того, как Facebook отключит чат-сервер.
Магнус Карлссон

Ответы:

1

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

Платформа обмена сообщениями не требует оплаты для использования. Он предназначен для предприятий, которые обрабатывают запросы своих клиентов. Как только вы создадите свой опыт взаимодействия с клиентами, вы сможете использовать рекламу, чтобы привлечь людей к вашему опыту, например, реклама Click-to-Messenger или реклама для входящих сообщений.

Как выглядит программа Messenger для бизнеса? У нас есть образец бизнеса электронной коммерции, с которым вы можете поговорить в Messenger, под названием Original Coast Clothing.

Общайтесь с образцом бизнеса здесь

Как мне начать? Вы можете начать с создания тестовой страницы и тестового приложения, которое позволит вам испытать свой опыт в Messenger. У нас есть несколько примеров, с которых вы можете начать. Когда ваше приложение будет готово к развертыванию, вы можете отправить его на рассмотрение. Когда ваше приложение пройдет нашу проверку, оно будет готово к взаимодействию с общественностью.

Для начала вам понадобится Messenger, страница Facebook и URL-адрес, на который будут отправляться веб-перехватчики.

Вот пошаговое руководство по развертыванию вышеуказанного опыта на тестовой странице, чтобы вы начали.

Готовы строить? Начать

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

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

Джин Такур
источник