Enviar mensagem via Facebook Chat API (XMPP) C #

88

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

O serviço e a API que este documento cobre foram descontinuados com o lançamento da Platform API v2.0. Assim que a versão 1.0 for descontinuada, chat.facebook.com não estará mais disponível.

Importante! Leia isto e provavelmente você deseja fazer algo completamente diferente do que qualquer coisa que tenha a ver com esta questão.

Estou criando um bate-papo com WebForms C # conectando-se à API de bate-papo do Facebook.

Também examinei esta questão do SO (e todos os links). Algumas partes não são mais relevantes, já que o Facebook exige auth_tokenagora.

Para replicar isso, você deve configurar um aplicativo da web do Facebook, usar o appIde uma conta de usuário com a permissão xmpp_login definida. Em seguida, crie um Chat.aspxwith code behind e cole esse código de acordo. E substitua os usuários codificados para interagir.

Tenho dois (talvez três) problemas que acredito que me impedem de ter sucesso com meu objetivo de enviar uma mensagem de chat.

  1. O processo indicado // finishes auth processna documentação não corresponde à descrição da documentação (não estou recebendo nenhuma resposta depois de receber minha mensagem de sucesso baseada em SSL / TLS do Facebook).
  2. Não tenho ideia de como a parte 'enviar mensagem de bate-papo' deve ser configurada e, como não recebo nenhuma mensagem do Facebook, é difícil dizer o que pode estar errado.

Aqui está meu código inteiro, em PasteBin .

Eu também tenho alguns auxiliares para adicionar permissões xmpp_login e outros. Removidos para maior clareza.

Variáveis ​​globais:

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

Então, Page_Loadtodas as etapas necessárias são (ou deveriam ser) executadas. Vale a pena notar é o SendMessage("test");. Eu só tentei colocá-lo lá para ver se ele teria sucesso em enviar uma mensagem de chat ... SetUserNameAndAuthTokendefine meu token de autenticação e nome de usuário para variáveis ​​globais. O 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);

}

Recebo uma resposta e a envio ao 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;
}

Isso leva 1 minuto e 40 segundos ... e a resposta é:

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

Finalmente, faço o 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 as respostas são "". Olhando para o Readmétodo em SendWithSsl: é 0 bytes. Tentar enviar uma mensagem também me dá 0 bytes de dados de leitura do Facebook. Eu não tenho ideia do porquê?

Magnus Karlsson
fonte
6
@DanielHilgarth Hehe, bem .. a primeira parte do Connect pode não ser necessária, mas não há exemplos de trabalho de como fazer isso em C #, então pensei em garantir que haja um para qualquer um que esteja tentando fazer um bate-papo no Facebook i C #. Eu também poderia escrever tudo em uma base de código, mas não será muito verificável.
Magnus Karlsson
6
Se você quiser uma resposta, sugiro que você reduza o código desta postagem ao mínimo necessário para entender o problema. O resto do código (por exemplo, para que outros possam reproduzi-lo) você pode colocar no pastebin e criar um link para ele a partir de sua postagem.
Daniel AA Pelsmaeker
4
seu código não está completo, portanto, não posso seguir o fluxo de controle. Anexe o Xml de depuração, o que você envia ao servidor e o que recebe de volta. Por que você não está usando uma biblioteca XMPP existente daqui que faz todo o trabalho duro para você? xmpp.org/xmpp-software/libraries
Alex
4
@MatiCicero O servidor xmpp chat.facebook.com está prestes a fechar em 6 meses de acordo com o Facebook.
Magnus Karlsson
11
@cari Você não deve ir com essa solução. Use uma biblioteca como agsXMPP. No entanto, todas essas soluções deixarão de funcionar dentro de seis meses, pois o Facebook está fechando o servidor de bate-papo.
Magnus Karlsson

Respostas:

1

Agora há uma nova API. Como funciona a plataforma Messenger? Quando uma pessoa envia uma mensagem para uma empresa no Messenger e enquanto esta Página usa um aplicativo para automatizar parcial ou totalmente as conversas, acontecerá o seguinte. O servidor do Facebook envia webhooks para a URL do servidor de negócios, onde o aplicativo de mensagens está hospedado. Usando a API de envio, o aplicativo pode responder à pessoa no Messenger. Dessa forma, os desenvolvedores podem construir conversas guiadas para conduzir as pessoas por um fluxo automatizado ou construir um aplicativo para servir como uma ponte entre seus agentes e sua presença comercial no Messenger.

A plataforma Messenger não exige nenhum pagamento para ser usada. Destina-se a empresas para lidar com as consultas de seus clientes. Depois de criar sua experiência para os clientes interagirem, você pode aproveitar os anúncios para trazer as pessoas à sua experiência, como, por exemplo, anúncios click-to-Messenger ou anúncios na caixa de entrada.

Qual é a aparência de uma experiência no Messenger for Business? Temos um exemplo de negócio de comércio eletrônico com o qual você pode bater um papo no Messenger, chamado Original Coast Clothing.

Converse com um exemplo de empresa aqui

Como eu começo? Você pode começar criando uma página de teste e um aplicativo de teste que permite que você experimente sua experiência no Messenger. Temos alguns exemplos que podem ajudá-lo a começar. Assim que seu aplicativo estiver pronto para implantação, você pode enviá-lo para revisão. Quando seu aplicativo for aprovado em nosso processo de revisão, ele estará pronto para interagir com o público.

Para começar, você precisará do Messenger, de uma página do Facebook e de um url para onde os webhooks serão enviados.

Aqui está um guia passo a passo para implantar a experiência acima em sua página de teste para você começar.

Pronto para construir? Iniciar

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

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

Jin Thakur
fonte