Facebook XMPP chat C #

I am trying to connect to a Facebook chat using C #.

I can get the access code and access token, but in the end it does not work, when we try to authenticate for the chat, it gives an error saying that it is not authenticated.

I think I'm wrong ComposeResponse. Please help me.:)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Security.Cryptography;
using System.Net;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string url = Request.Url.AbsoluteUri;

        if (Request.QueryString["code"] == null)
        {
            Response.Redirect(GetFacebookOAuthUrl());
        }

        var Demo = GetMAccessToken(Request.QueryString["code"]);

        TcpClient FacebookClient = new TcpClient();
        FacebookClient.Connect("chat.facebook.com", 5222);
        NetworkStream myns = FacebookClient.GetStream();

        string xml = "<?xml version='1.0'?>" +
        "<stream:stream " +
        "id='1' " +
        "to='chat.facebook.com' " +
        "xmlns='jabber:client' " +
        "xmlns:stream='http://etherx.jabber.org/streams' " +
        "version='1.0' >";

        StreamWriter mySw = new StreamWriter(myns);
        mySw.WriteLine(xml);  //sending initial request
        mySw.Flush();

        byte[] serverResponseByte = new byte[1024];
        int myBytesRead = 0;
        StringBuilder myResponseAsSB = new StringBuilder();

        //reading response from the server to see the supported authentication methods 
        do
        {
            myBytesRead = myns.Read(serverResponseByte, 0, serverResponseByte.Length);
            myResponseAsSB.Append(System.Text.Encoding.UTF8.GetString(serverResponseByte, 0, myBytesRead));

        } while (myns.DataAvailable);

        myResponseAsSB.Clear();

        xml = "<auth " +
        "xmlns='urn:ietf:params:xml:ns:xmpp-sasl' " +
        "mechanism='X-FACEBOOK-PLATFORM'  />";

        mySw.WriteLine(xml);
        mySw.Flush();   //sending response to server to use X-FACEBOOK-PLATFORM

        //reading challenge send by the server
        do
        {
            myBytesRead = myns.Read(serverResponseByte, 0, serverResponseByte.Length);
            myResponseAsSB.Append(System.Text.Encoding.UTF8.GetString(serverResponseByte, 0, myBytesRead));

        } while (myns.DataAvailable);

        myResponseAsSB.Replace("<challenge xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">", "");
        myResponseAsSB.Replace("</challenge>", "");

        //converting challenge string to normal string
        byte[] myregularstrigbytes = Convert.FromBase64String(myResponseAsSB.ToString());
        string myregularstring = System.Text.Encoding.UTF8.GetString(myregularstrigbytes);

        string response = ComposeResponse(myregularstring, Demo);

        byte[] myResponseByte = Encoding.UTF8.GetBytes(response.ToString());

        string myEncodedResponseToSend = Convert.ToBase64String(myResponseByte);
        xml = String.Format("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">{0}</response>", myEncodedResponseToSend);
        mySw.WriteLine(xml);
        mySw.Flush();   //sending the response to the server with my parameters

        myResponseAsSB.Clear();

        //checking if authentication succeed 
        do
        {
            myBytesRead = myns.Read(serverResponseByte, 0, serverResponseByte.Length);
            myResponseAsSB.Append(System.Text.Encoding.UTF8.GetString(serverResponseByte, 0, myBytesRead));

        } while (myns.DataAvailable);

        // It fails here..
        string result_ = myResponseAsSB.ToString();
    }

    private string ComposeResponse(string serverresponse, string AccessToken)
    {
        string version = serverresponse.Split('&')[0].Split('=')[1];
        string method = serverresponse.Split('&')[1].Split('=')[1];
        string nonce = serverresponse.Split('&')[2].Split('=')[1];
        string appId = "421025367912155";

        string Response = "api_key=" + appId
        + "&call_id=" + 0
        + "&method=" + method
        + "&nonce=" + nonce
        + "&access_token=" + AccessToken
        + "&v='1.0'";

        return Response;
    }

    public string GetMAccessToken(string Code)
    {
        string AccessToken;

        string RequestToken = "https://graph.facebook.com/oauth/access_token?" +
        "client_id=421025367912155" +
        "&redirect_uri=http://localhost:2155/FBintegration/" +
        "&client_secret=10d4cfc72892a8c291ff0a8f6fc0003f" +
        "&code=" + Code ;

        WebRequest req = WebRequest.Create(RequestToken);

        WebResponse Response = req.GetResponse();

        Stream dataStream = Response.GetResponseStream();

        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();

        string[] Res = responseFromServer.Split(new char[] {'&'},StringSplitOptions.RemoveEmptyEntries);

        AccessToken = Res[0];

        AccessToken = AccessToken.Replace("access_token=", "");

        return AccessToken;
    }

    public string GetFacebookOAuthUrl()
    {
         string RedirectUrl = "https://www.facebook.com/dialog/oauth?scope=xmpp_login" +
            "&client_id=421025367912155" +
            "&redirect_uri=" + new System.Uri("http://localhost:2155/FBintegration/");

         return RedirectUrl;
    }
}
+3
source share

All Articles