Envoyer un message via Facebook Chat API (XMPP) C #

88

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

Le service et l'API couverts par ce document sont devenus obsolètes avec la sortie de Platform API v2.0. Une fois la version 1.0 obsolète, chat.facebook.com ne sera plus disponible.

Important! Lisez ceci et vous voudrez probablement faire quelque chose de complètement différent de tout ce qui a à voir avec cette question.

Je crée un chat avec WebForms C # en me connectant à l'API Facebook Chat.

J'ai également regardé cette question SO (et tous les liens). Certaines parties ne sont plus pertinentes puisque Facebook l'exige auth_tokenmaintenant.

Pour reproduire cela, vous devez configurer une application Web Facebook, utiliser le appIdet un compte utilisateur avec le jeu d'autorisations xmpp_login. Ensuite, créez un Chat.aspxavec le code derrière et collez ce code en conséquence. Et remplacez les utilisateurs codés en dur avec lesquels interagir.

J'ai deux (peut-être trois) problèmes qui, selon moi, m'empêchent de réussir dans mon objectif d'envoyer un message de chat.

  1. Le processus indiqué // finishes auth processdans la documentation ne correspond pas à la description de la documentation (je ne reçois aucune réponse après avoir reçu mon message de réussite basé sur SSL / TLS de Facebook.)
  2. Je n'ai aucune idée de la façon dont la partie `` envoyer un message de discussion '' devrait être configurée, et comme je ne reçois aucun message de Facebook, il est difficile de dire ce qui pourrait ne pas fonctionner.

Voici mon code dans son intégralité, sur PasteBin .

J'ai aussi quelques helpers pour ajouter des permissions xmpp_login et autres .. supprimés pour plus de clarté.

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

Ensuite, Page_Loadtoutes les étapes requises sont (ou sont censées être) effectuées. Il convient de noter le SendMessage("test");. J'ai juste essayé de le mettre là pour voir s'il réussirait à envoyer un message de chat ... SetUserNameAndAuthTokendéfinit mon jeton d'authentification et mon nom d'utilisateur sur des variables globales. L'AuthToken fonctionne.

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

}

Donc j'obtiens une réponse puis j'envoie la réponse au serveur:

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

Cela prend 1 minute 40 secondes ... et la réponse est:

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

Enfin je fais le 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;
}

Toutes les réponses sont "". En regardant la Readméthode dans SendWithSsl: c'est 0 octet. Essayer d'envoyer un message me donne également 0 octet Lire les données de Facebook. Je n'ai aucune idée de pourquoi?

Magnus Karlsson
la source
6
@DanielHilgarth Hehe, eh bien ... la première partie de Connect n'est peut-être pas nécessaire, mais il n'y a pas d'exemples pratiques de la façon de le faire en C #, alors j'ai pensé que je m'assurerais qu'il y en ait un pour tous ceux qui essaient de faire un chat Facebook i C #. Je pourrais aussi tout écrire dans une seule base de code, mais cela ne sera pas très surveillé.
Magnus Karlsson
6
Si vous voulez une réponse, je vous suggère de réduire le code de cet article à son strict minimum requis pour comprendre le problème. Le reste du code (par exemple pour que d'autres puissent le reproduire) pourriez-vous mettre sur pastebin et créer un lien vers celui-ci à partir de votre message.
Daniel AA Pelsmaeker
4
votre code n'est pas complet, donc je ne peux pas suivre le flux de contrôle. Veuillez joindre le fichier XML de débogage, ce que vous envoyez au serveur et ce que vous récupérez. Pourquoi n'utilisez-vous pas une bibliothèque XMPP existante à partir d'ici qui fait tout le travail dur pour vous? xmpp.org/xmpp-software/libraries
Alex
4
@MatiCicero Le serveur xmpp de chat.facebook.com est sur le point de fermer dans 6 mois selon Facebook.
Magnus Karlsson
11
@cari Vous ne devriez pas opter pour cette solution. Utilisez plutôt une bibliothèque comme agsXMPP. Cependant, toutes ces solutions cesseront de fonctionner dans les six mois suivant la fermeture du serveur de chat par Facebook.
Magnus Karlsson

Réponses:

1

Il y a maintenant une nouvelle API. Comment fonctionne la plateforme Messenger? Lorsqu'une personne envoie un message à une entreprise sur Messenger et tant que cette page utilise une application pour automatiser partiellement ou entièrement les conversations, ce qui suit se produit. Le serveur Facebook envoie des webhooks à l'URL du serveur d'entreprise, où l'application de messagerie est hébergée. À l'aide de l'API d'envoi, l'application peut répondre à la personne sur Messenger. De cette manière, les développeurs peuvent créer des conversations guidées pour guider les gens à travers un flux automatisé ou créer une application pour servir de pont entre vos agents et votre présence commerciale sur Messenger.

L'utilisation de la plate-forme Messenger ne nécessite aucun paiement. Il est destiné aux entreprises pour traiter les demandes de leurs clients. Une fois que vous avez construit votre expérience pour que vos clients interagissent, vous pouvez ensuite tirer parti des publicités pour amener les gens à votre expérience, comme par exemple les publicités Click-to-Messenger ou les publicités Inbox.

À quoi ressemble une expérience Messenger for Business? Nous avons un exemple d'entreprise de commerce électronique avec lequel vous pouvez discuter sur Messenger appelé Original Coast Clothing.

Discutez avec un exemple d'entreprise ici

Comment commencer? Vous pouvez commencer en créant une page de test et une application de test qui vous permettent de tester votre expérience dans Messenger. Nous avons quelques exemples qui peuvent vous aider à démarrer. Une fois que votre application est prête à être déployée, vous pouvez la soumettre pour examen. Lorsque votre application aura réussi notre processus d'examen, elle sera prête à interagir avec le public.

Pour commencer, vous aurez besoin de Messenger, d'une page Facebook et d'une URL vers laquelle les webhooks doivent être envoyés.

Voici un guide étape par étape pour déployer l'expérience ci-dessus dans votre page de test pour vous aider à démarrer.

Prêt à construire? Commencer

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

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

Jin Thakur
la source