通过Facebook发送消息聊天API(XMPP)C#

////////////////////////////////////////////////// ////////////////////////////////////////////////

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

本文档涵盖的服务和API已随Platform API v2.0的发布而被弃用。 一旦版本1.0被弃用,chat.facebook.com将不再可用。

//阅读这篇文章,你可能想做一些与这个问题完全不同的东西。

////////////////////////////////////////////////// //////////////////////////////////////

我正在创build一个与WebForms C#连接到Facebook Chat API的聊天工具。

我也看过这个问题 (和所有的链接)。 由于Facebook现在需要auth_token某些部分不再相关。

要复制这个,你应该build立一个Facebook的networking应用程序,使用appId和用户帐户与xmpp_login权限设置。 然后创build一个带有代码的Chat.aspx ,并相应地粘贴这个代码。 并replace硬编码的用户进行交互。

我有两个(也许是三个)问题,我相信阻止我成功发送聊天消息。

  1. 在文档中logging为// finishes auth process与文档描述不匹配(在收到来自Facebook的基于SSL / TLS的成功消息后,我没有收到任何响应。)
  2. 我不知道如何设置“发送聊天消息”部分,因为我没有收到任何来自Facebook的消息,所以很难说出可能的错误。

这是我的完整的代码,在PasteBin上 。

我也有一些助手添加xmpp_login权限等。删除为清晰起见。

全局variables:

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

然后在Page_Load所有需要的步骤都是(或者应该是)执行。 值得注意的是SendMessage("test"); 。 我只是试图把它放在那里,看看它是否会成功发送聊天消息… SetUserNameAndAuthToken设置我的身份validation令牌和用户名为全局variables。 AuthToken的作品。

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

所以我得到一个响应,然后我发送响应到服务器:

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

这需要1分40秒…和回应是:

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

最后我做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; } 

所有答复都是"" 。 看一下SendWithSsl中的Read方法:它是0字节。 试图发送消息也给我0字节从Facebook读取数据。 我不知道为什么?

我会去一个已经做出的jabber / xmpp库,并添加facebook身份validation的东西。 我已经写了我自己的PHP之前,但不是C#。 虽然在几个月内FB Chat API将会死(真是蹩脚),当我search周围的时候,我发现了很多C#的代码示例。 以下是关于如何在评论中使用源代码的聊天客户端的video: https : //www.youtube.com/watch?v = tHOb80TghDA

这里有一个文章示例应用程序完整的源代码: http : //csharp-tricks-en.blogspot.com/2013/10/connect-to-facebook-chat.html

下面是一个nuget包xmpp库,专门用于Facebook聊天API: https ://www.nuget.org/packages/Facebook-Chat/

如果你检查一些例子的来源,你会看到你错了什么地方,或者你可以从其中一个例子开始。 最后,我进行的search: https : //www.google.com/search?q=c%23+chat+api+library&ie=utf-8&oe=utf-8#safe=off&q=c%23+facebook+chat + API +库