使用Jabber.net(C#/ Mono)和SASL连接到Facebook聊天

我正在尝试使用Jabber.net(c#/ Mono)连接到Facebook聊天。 我使用的代码是这样的:

static ManualResetEvent done = new ManualResetEvent(false); const bool VERBOSE = true; const string TARGET = "friends_username@chat.facebook.com"; void Start () { JabberClient j = new JabberClient(); j.User = "my_facebook_alias"; //Later to be removed j.Server = "chat.facebook.com"; j.Port = 5222; j.NetworkHost = "chat.facebook.com"; j.AutoStartCompression = true; j.KeepAlive = 30F; j.AutoStartTLS = false; j.AutoStartCompression = true; j.PlaintextAuth = true; j.Password = "my_facebook_password"; //Later to be removed j.RequiresSASL = true; j.LocalCertificate = null; // don't do extra stuff, please. j.AutoPresence = false; j.AutoRoster = true; j.AutoReconnect = -1; j.OnInvalidCertificate += new System.Net.Security.RemoteCertificateValidationCallback(j_OnInvalidCertificate); // listen for errors. Always do this! j.OnError += new bedrock.ExceptionHandler(j_OnError); // what to do when login completes j.OnAuthenticate += new bedrock.ObjectHandler(j_OnAuthenticate); // listen for XMPP wire protocol if (VERBOSE) { j.OnReadText += new bedrock.TextHandler(j_OnReadText); j.OnWriteText += new bedrock.TextHandler(j_OnWriteText); } // Set everything in motion j.Connect(); // wait until sending a message is complete done.WaitOne(); // logout cleanly j.Close(); } static void j_OnWriteText(object sender, string txt) { if (txt == " ") return; // ignore keep-alive spaces Console.WriteLine("SEND: " + txt); } static void j_OnReadText(object sender, string txt) { if (txt == " ") return; // ignore keep-alive spaces Console.WriteLine("RECV: " + txt); } static void j_OnAuthenticate(object sender) { Debug.Log ("OnAuth..."); // Sender is always the JabberClient. JabberClient j = (JabberClient)sender; j.Message(TARGET, "My test message!!!"); // Finished sending. Shut down. done.Set(); } static void j_OnError(object sender, Exception ex) { // There was an error! Console.WriteLine("Error: " + ex.ToString()); Debug.Log ("Error: "+ex.ToString()); // Shut down. done.Set(); } bool j_OnInvalidCertificate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { Debug.Log("Invalid certificate "+sslPolicyErrors.ToString() +" : "+certificate.ToString(true)); return true; } 

我得到j_OnAuthenticate哪个好。 它使用我的ID /密码,因为将密码更改为其他内容会出现错误。 但是我确实想使用X-FACEBOOK-PLATFORM SASL机制来登录而不保存用户ID /密码。

完整的日志是:

 RECV:  RECV: X-FACEBOOK-PLATFORMDIGEST-MD5 SEND:  RECV: cmVhbG09ImNoYXQuZmFjZWJvb2suY29tIixub25jZT0iMDBENjAwQ0UyNjZBNzgyMEE5MUIzRDhGNjZDODQ1QjMiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M= SEND: dXNlcm5hbWU9ImpvbmFzMiIscmVhbG09ImNoYXQuZmFjZWJvb2suY29tIixub25jZT0iMDBENjAwQ0UyNjZBNzgyMEE5MUIzRDhGNjZDODQ1QjMiLGNub25jZT0iMzUzMzMyM2E2YTZmNmU2MTczMzIzYTUxNGU1ZjQxNjI0YzM4NjYiLG5jPTAwMDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvY2hhdC5mYWNlYm9vay5jb20iLHJlc3BvbnNlPTcxN2ExNjM0MzdjOWU5MDM2NDcwYjViNTBhOTYxODIxLGNoYXJzZXQ9dXRmLTg= RECV: cnNwYXV0aD1hM2ZlZGM1NGRmYzNmMGEzMTU5Y2EyZDVmMmVkMmE2Zg== SEND:  RECV:  SEND:  RECV:  RECV:  SEND: Jabber.Net RECV: jonas2@chat.facebook.com/Jabber.Net_c938c6a2_4C7D6EF9DCFDC SEND:  RECV:  OnAuth... SEND: My test message!!! SEND: offline SEND:  SEND:  

在MatriX XMPP中有一个OnBeforeSasl委托,其中自定义方法可以设置所需的Facebook Sasl属性(如facebook app id,app secret和access token)。 但是在Jabber.net中没有这样的代表!

Jabber.net没有SASL支持吗? 或者你是如何设置它的?

在jabber-net中有SASL支持,但是不支持X-FACEBOOK-PLATFORM SASL机制。 如果要使用此机制,则必须通过添加此SASL机制来扩展jabber-net。

Facebook正在关闭XMPP连接。 这可能与您在Authenticate事件中发送的消息有关。 尝试在jabber-net发送您的初始状态后,或者在您获得名单后发送消息。

亚历克斯