Facebook XMPP聊天室C#

Facebook XMPP聊天室C#,c#,facebook,xmpp,chat,C#,Facebook,Xmpp,Chat,我正在尝试使用C#连接到Facebook聊天 我能够获得访问代码和访问令牌,但是当我们尝试对聊天进行身份验证时,它最终失败了,它会给出一个错误,说它没有经过身份验证 我想我在composersponse方面犯了一个错误。请帮帮我。:) 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Web; 使用System.Web.UI; 使用System.Web.UI.WebControl; 使用系统文本; 使用System.Net.S

我正在尝试使用C#连接到Facebook聊天

我能够获得访问代码和访问令牌,但是当我们尝试对聊天进行身份验证时,它最终失败了,它会给出一个错误,说它没有经过身份验证

我想我在
composersponse
方面犯了一个错误。请帮帮我。:)

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用系统文本;
使用System.Net.Sockets;
使用System.IO;
使用System.Security.Cryptography;
Net系统;
公共部分类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
字符串url=Request.url.AbsoluteUri;
if(Request.QueryString[“code”]==null)
{
重定向(getFaceBookOAuthull());
}
var Demo=GetMAccessToken(Request.QueryString[“code]”);
TcpClient FacebookClient=新TcpClient();
FacebookClient.Connect(“chat.facebook.com”,5222);
NetworkStream myns=FacebookClient.GetStream();
字符串xml=“”+
"";
StreamWriter mySw=新的StreamWriter(myns);
mySw.WriteLine(xml);//发送初始请求
mySw.Flush();
字节[]服务器响应字节=新字节[1024];
int myBytesRead=0;
StringBuilder MyResponseASB=新建StringBuilder();
//正在从服务器读取响应以查看支持的身份验证方法
做
{
myBytesRead=myns.Read(serverResponseByte,0,serverResponseByte.Length);
myresponseasb.Append(System.Text.Encoding.UTF8.GetString(serverResponseByte,0,myBytesRead));
}while(myns.DataAvailable);
我的回答很清楚;
xml=”“;
mySw.WriteLine(xml);
mySw.Flush();//向服务器发送响应以使用X-FACEBOOK-PLATFORM
//读取服务器发送的挑战
做
{
myBytesRead=myns.Read(serverResponseByte,0,serverResponseByte.Length);
myresponseasb.Append(System.Text.Encoding.UTF8.GetString(serverResponseByte,0,myBytesRead));
}while(myns.DataAvailable);
MyResponseasb.替换(“,”);
MyResponseasb.替换(“,”);
//将质询字符串转换为普通字符串
byte[]myregularstrigbytes=Convert.FromBase64String(MyResponseAsb.ToString());
字符串myregularstring=System.Text.Encoding.UTF8.GetString(MyRegularTrigbytes);
字符串响应=Composer响应(myregularstring,演示);
byte[]myResponseByte=Encoding.UTF8.GetBytes(response.ToString());
字符串myEncodedResponseToSend=Convert.ToBase64String(myResponseByte);
xml=String.Format(“{0}”,MyEncodeResponseToSend);
mySw.WriteLine(xml);
mySw.Flush();//使用我的参数将响应发送到服务器
我的回答很清楚;
//检查身份验证是否成功
做
{
myBytesRead=myns.Read(serverResponseByte,0,serverResponseByte.Length);
myresponseasb.Append(System.Text.Encoding.UTF8.GetString(serverResponseByte,0,myBytesRead));
}while(myns.DataAvailable);
//这里不行。。
字符串结果=MyResponseAsb.ToString();
}
私有字符串编写器响应(字符串服务器响应、字符串访问令牌)
{
字符串版本=serverresponse.Split('&')[0]。Split('=')[1];
string方法=serverresponse.Split('&')[1]。Split('=')[1];
字符串nonce=serverresponse.Split('&')[2]。Split('=')[1];
字符串appId=“421025367912155”;
string Response=“api_key=“+appId
+“&call_id=“+0”
+“&method=“+方法”
+“&nonce=“+nonce
+“&access_token=“+AccessToken”
+“&v='1.0';
返回响应;
}
公共字符串GetMAccessToken(字符串代码)
{
字符串访问令牌;
字符串RequestToken=”https://graph.facebook.com/oauth/access_token?" +
“客户id=421025367912155”+
“&重定向\u uri”=http://localhost:2155/FBintegration/" +
“&client_secret=10d4cfc72892a8c291ff0a8f6fc0003f”+
“&code=“+code;
WebRequest req=WebRequest.Create(RequestToken);
WebResponse=req.GetResponse();
Stream dataStream=Response.GetResponseStream();
//使用StreamReader打开流以便于访问。
StreamReader=新的StreamReader(数据流);
//阅读内容。
字符串responseFromServer=reader.ReadToEnd();
string[]Res=responseFromServer.Split(新字符[]{'&},StringSplitOptions.RemoveEmptyEntries);
AccessToken=Res[0];
AccessToken=AccessToken.Replace(“access_token=”,“”);
返回AccessToken;
}
公共字符串getFaceBookOAuthull()
{
字符串重定向URL=”https://www.facebook.com/dialog/oauth?scope=xmpp_login" +
“&client_id=421025367912155”+
“&redirect_uri=“+new System.uri(”http://localhost:2155/FBintegration/");
返回重定向URL;
}
}

您找到解决方案了吗?我有山姆的问题。。。提前谢谢
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;
    }
}