Подтвердить что ты не робот

Отправить сообщение через Facebook Chat API (XMPP) С#

//////////////////////////////////////////////////////////////////////////////////////////////////

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

Обслуживающий и API этот документ охватывает устарел с выпуском Platform API версии 2.0. Когда версия 1.0 устарела, chat.facebook.com больше не будет доступен.

//Прочитайте это, и вы, вероятно, захотите сделать что-то совершенно иное, чем все, что связано с этим вопросом.

////////////////////////////////////////////////////////////////////////////////////////

Я создаю чат с подключением WebForms С# к API Facebook Chat.

Я также рассмотрел этот вопрос SO (и все ссылки). Некоторые части больше не актуальны, поскольку Facebook требует auth_token сейчас.

Чтобы воспроизвести это, вы должны создать веб-приложение Facebook, используйте appId и учетную запись пользователя с набором разрешений xmpp_login. Затем создайте Chat.aspx с кодом и вставьте этот код соответственно. И замените пользователей с жесткой кодировкой, чтобы взаимодействовать с ними.

У меня есть две (возможно, три) проблемы, которые, как мне кажется, мешают мне преуспеть с моей целью отправить чат-сообщение.

Вот мой код целиком, на 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. Я не знаю, почему?

4b9b3361

Ответ 1

Я бы пошел с уже сделанной библиотекой jabber/xmpp и добавлю к ней материал facebook auth. Я написал свой собственный PHP, но не С#. Хотя через несколько месяцев FB Chat API будет мертв (правда, хромой), я нашел много примеров для С# (что я делаю код) при поиске. Вот видео о том, как сделать чат-клиент с источником в комментариях: https://www.youtube.com/watch?v=tHOb80TghDA

Здесь пример приложения приложения с исходным кодом: http://csharp-tricks-en.blogspot.com/2013/10/connect-to-facebook-chat.html

Здесь библиотека nuget пакета xmpp специально для facebook chat api: https://www.nuget.org/packages/Facebook-Chat/

Если вы изучите источник некоторых примеров, скорее всего, вы увидите, где вы поступили неправильно, или вы можете просто начать с одного из примеров. Наконец, поиск, который я выполнил: https://www.google.com/search?q=c%23+chat+api+library&ie=utf-8&oe=utf-8#safe=off&q=c%23+facebook+chat+api+library

Ответ 2

Я думаю, что очень трудно использовать этот код для запуска вашего кода. Поэтому я советую вам использовать эту библиотеку, я думаю, что это довольно мощный: Библиотека