Enviar mensaje a través de la API de chat de Facebook (XMPP) C #

88

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

El servicio y la API que cubre este documento han quedado obsoletos con el lanzamiento de Platform API v2.0. Una vez que la versión 1.0 esté obsoleta, chat.facebook.com ya no estará disponible.

¡Importante! Lea esto y probablemente quiera hacer algo completamente diferente a cualquier cosa que tenga que ver con esta pregunta.

Estoy creando un chat con WebForms C # que se conecta a la API de chat de Facebook.

También he mirado esta pregunta SO (y todos los enlaces). Algunas partes ya no son relevantes ya que Facebook requiere auth_tokenahora.

Para replicar esto, debe configurar una aplicación web de Facebook, usar appIdy una cuenta de usuario con el conjunto de permisos xmpp_login. Entonces crea unChat.aspx código con detrás y pegue este código en consecuencia. Y reemplace a los usuarios codificados con los que interactuar.

Tengo dos (quizás tres) problemas que creo que me impiden tener éxito con mi objetivo de enviar un mensaje de chat.

  1. El proceso indicado // finishes auth processen la documentación no coincide con el descripción de documentación (no obtengo ninguna respuesta después de recibir mi mensaje de éxito basado en SSL / TLS de Facebook).
  2. No tengo idea de cómo se debe configurar la parte 'enviar mensaje de chat' y, dado que no recibo ningún mensaje de Facebook, es difícil saber qué podría estar mal.

Aquí está mi código en su totalidad, en PasteBin .

También tengo algunos ayudantes para agregar permisos xmpp_login y demás ... eliminados para mayor claridad.

Variables globales:

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

Luego, en Page_Loadtodos los pasos requeridos se realizan (o se supone que se deben realizar). Cabe destacar el SendMessage("test");. Intenté ponerlo allí para ver si podía enviar un mensaje de chat ... SetUserNameAndAuthTokenestablece mi token de autenticación y el nombre de usuario en variables globales. AuthToken funciona.

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

}

Entonces recibo una respuesta y luego envío la respuesta al servidor:

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

Esto toma 1 minuto 40 segundos ... y la respuesta es:

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

Finalmente hago el 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;
}

Todas las respuestas son "". Mirando el Readmétodo en SendWithSsl: es 0 bytes. Intentar enviar un mensaje también me da 0 bytes Leer datos de Facebook. ¿No tengo ni idea de por qué?

Magnus Karlsson
fuente
6
@DanielHilgarth Jeje, bueno ... es posible que la primera parte de Connect no sea necesaria, pero no hay ejemplos de cómo hacer esto en C #, así que pensé en asegurarme de que haya uno para cualquiera que intente hacer un chat de Facebook. yo C #. También podría escribir todo en una base de código, pero luego no será muy supervisable.
Magnus Karlsson
6
Si desea una respuesta, le sugiero que reduzca el código en esta publicación a solo el mínimo requerido para comprender el problema. El resto del código (por ejemplo, para que otros puedan reproducirlo) podría ponerlo en pastebin y enlazarlo desde su publicación.
Daniel AA Pelsmaeker
4
su código no está completo, por lo que no puedo seguir el flujo de control. Adjunte el XML de depuración, lo que envía al servidor y lo que recibe. ¿Por qué no está utilizando una biblioteca XMPP existente desde aquí que hace todo el trabajo duro por usted? xmpp.org/xmpp-software/libraries
Alex
4
@MatiCicero El servidor xmpp de chat.facebook.com está a punto de cerrarse en 6 meses según Facebook.
Magnus Karlsson
11
@cari No deberías ir con esta solución. En su lugar, utilice una biblioteca como agsXMPP. Sin embargo, todas estas soluciones dejarán de funcionar dentro de los seis meses desde que Facebook cerró el servidor de chat.
Magnus Karlsson

Respuestas:

1

Ahora hay una nueva API. ¿Cómo funciona la plataforma Messenger? Cuando una persona envía un mensaje a una empresa en Messenger y siempre que esta página utilice una aplicación para automatizar total o parcialmente las conversaciones, sucederá lo siguiente. El servidor de Facebook envía webhooks a la URL del servidor empresarial, donde se aloja la aplicación de mensajería. Con la API de envío, la aplicación puede responder a la persona en Messenger. De esta forma, los desarrolladores pueden crear conversaciones guiadas para guiar a las personas a través de un flujo automatizado o crear una aplicación que sirva de puente entre sus agentes y su presencia comercial en Messenger.

La Plataforma Messenger no requiere ningún pago para su uso. Está destinado a que las empresas gestionen las consultas de sus clientes. Una vez que desarrolle su experiencia para que sus clientes interactúen, puede aprovechar los anuncios para atraer a las personas a su experiencia, como por ejemplo, anuncios de clic para mensajería o anuncios en la bandeja de entrada.

¿Cómo es una experiencia de Messenger for Business? Tenemos un ejemplo de negocio de comercio electrónico con el que puede chatear en Messenger llamado Original Coast Clothing.

Chatear con negocios de muestra aquí

¿Cómo empiezo? Puede comenzar creando una página de prueba y una aplicación de prueba que le permita probar su experiencia en Messenger. Tenemos algunos ejemplos que pueden ayudarlo a comenzar. Una vez que su aplicación esté lista para implementarse, puede enviarla para revisión. Cuando su aplicación pase nuestro proceso de revisión, estará lista para interactuar con el público.

Para comenzar, necesitará Messenger, una página de Facebook y una URL a la que se enviarán los webhooks.

Aquí hay una guía paso a paso para implementar la experiencia anterior en su página de prueba para comenzar.

¿Listo para construir? Empezar

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

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

Jin Thakur
fuente