通过Facebook Chat API(XMPP)使用C#发送消息

88

注意:https://developers.facebook.com/docs/chat/中所述的服务和API已经随着Platform API v2.0的发布而被弃用。一旦版本1.0被弃用,chat.facebook.com将不再可用。

重要提示!请务必阅读此内容,您可能希望执行完全不同于与此问题有关的任何操作。

我正在使用WebForms C#创建一个与Facebook Chat API连接的聊天应用程序。

我还查看了这个SO问题(以及所有链接)。由于Facebook现在需要auth_token,因此某些部分已不再相关。

为了复制这个过程,您应该设置一个Facebook Web应用程序,使用appId和具有xmpp_login权限设置的用户帐户。然后创建一个Chat.aspx和与之相应的代码。并替换要交互的硬编码用户。

我有两个(也许三个)问题,我认为这些问题会妨碍我实现发送聊天消息的目标。

  1. 在文档中标注为// finishes auth process的过程与文档描述不符(在我从Facebook接收到基于SSL/TLS的成功消息之后,我没有收到任何响应)。
  2. 我不知道“发送聊天消息”部分应该如何设置,并且由于我没有接收到来自Facebook的任何消息,因此很难确定可能出了什么问题。

这是我的所有代码,在PasteBin上

我还有一些帮助程序用于添加xmpp_login权限等..已删除以清晰明了为目标。

全局变量:

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将我的授权令牌和用户名设置为全局变量。 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字节。 尝试发送消息也会从Facebook中读取到0字节的数据。我不知道为什么?


6
@DanielHilgarth 嘿嘿,好吧..可能不需要Connect的第一部分,但是没有在C#中如何实现这一点的有效示例,所以我想确保有人可以在尝试使用C#进行Facebook聊天时找到一个。我也可以将所有内容写在一个代码库中,但那样会很难管理。 - Magnus Karlsson
6
如果您想得到答案,我建议您将此帖子中的代码精简到仅包含理解问题所需的最少内容。其余的代码(例如供他人复现)可以放在pastebin上,并从您的帖子中链接到它。 - Daniel A.A. Pelsmaeker
4
你的代码不完整,因此我无法跟随控制流程。请附上调试XML、发送到服务器的内容以及收到的回复。为什么不使用已经存在的XMPP库来完成所有繁重的工作?可以在这里找到:http://xmpp.org/xmpp-software/libraries/ - Alex
4
根据 Facebook 的消息,chat.facebook.com XMPP 服务器将在6个月内关闭。 - Magnus Karlsson
11
@cari,你不应该采用这个解决方案。应该使用类似agsXMPP的库。然而,所有这些解决方案都将在六个月内停止工作,因为Facebook正在关闭聊天服务器。 - Magnus Karlsson
显示剩余13条评论
1个回答

1
现在有新的API了。Messenger平台是如何工作的?当一个人在Messenger上向企业发送消息,只要该页面使用应用程序部分或完全自动化对话,就会发生以下情况。Facebook服务器将Webhook发送到业务服务器的URL,其中托管了消息应用程序。使用Send API,应用程序可以回复Messenger上的个人。通过这种方式,开发人员可以构建引导式对话,引导人们通过自动化流程或构建应用程序作为您的代理和Messenger上的业务存在之间的桥梁。
Messenger平台不需要任何付款即可使用。它旨在供企业处理客户的查询。一旦您为客户互动构建了体验,您就可以利用广告将人们带到您的体验中,例如Click-to-Messenger广告或Inbox广告。
Messenger for Business体验是什么样子的?我们有一个名为Original Coast Clothing的电子商务企业,您可以在Messenger上与之聊天。
在此与示例企业聊天
如何入门?您可以通过创建测试页面和测试应用程序开始,在Messenger内尝试您的体验。我们有一些示例可以让您开始。一旦您的应用程序准备好部署,您可以提交审核。当您的应用程序通过我们的审核流程时,它将准备好与公众进行交互。
为了开始,您需要Messenger、Facebook页面和一个用于发送webhooks的url。
以下是逐步指南,以将上述体验部署到您的测试页面中,帮助您入门。
准备好建立了吗? 开始吧。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接