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

时间:2013-10-25 13:07:33

标签: c# facebook xmpp facebook-chat

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

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

  

本文档涵盖的服务和API已在Platform API v2.0发行版中弃用。不推荐使用版本1.0后,chat.facebook.com将不再可用。

//阅读本文,你可能想做一些与这个问题有关的事情完全不同的事情。

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

我正在创建与WebForms C#连接到Facebook Chat API的聊天。

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

要复制此内容,您应该设置Facebook网络应用,使用appId和具有xmpp_login权限集的用户帐户。然后创建一个带有代码的Chat.aspx并相应地粘贴此代码。并替换硬编码用户进行交互。

我有两个(可能是三个)问题,我认为这些问题阻止我成功发送聊天消息。

  1. 文档中标注为// finishes auth process的流程与documentation description不符 (在我从Facebook收到基于SSL / TLS的成功消息后,我没有收到任何回复。)
  2. 我不知道应该如何设置“发送聊天消息”部分,因为我没有从Facebook收到任何消息,很难说出可能出现的问题。
  3. Here is my code in its entirety, on 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;
    }
    

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

2 个答案:

答案 0 :(得分:1)

我认为使用此代码来运行您的代码非常困难。因此,我建议您使用此库,我认为它非常强大: Library

答案 1 :(得分:1)

现在有新的api。 Messenger平台如何工作? 当某人在Messenger上向企业发送消息时,只要此页面使用应用程序部分或完全自动化对话,就会发生以下情况。 Facebook服务器将webhook发送到托管消息传递应用程序的业务服务器的URL。使用Send API,该应用可以在Messenger上回复该人。通过这种方式,开发人员可以建立引导性的对话,以引导人们通过自动流程,或者构建一个应用程序,以充当您的代理和Messenger上的企业形象之间的桥梁。

Messenger平台不需要任何付款即可使用。它用于企业处理来自客户的查询。建立与客户互动的体验后,您就可以利用广告将人们带入您的体验中,例如,点击信使广告或收件箱广告。

Messenger for Business体验是什么样的? 我们有一个示例电子商务业务,您可以在Messenger上与它聊天,称为“原始海岸服装”。

在此处进行示例业务的聊天

我如何开始? 您可以通过创建一个测试页面和测试应用程序开始使用,该应用程序可以让您尝试在Messenger中体验。我们有一些示例可以帮助您入门。准备好部署您的应用程序后,您可以将其提交以供审核。当您的应用通过我们的审核过程后,即可与公众互动。

要开始使用,您将需要Messenger,Facebook页面和要将Webhook发送到的URL。

这里是将上述经验部署到测试页中的逐步指南,以帮助您入门。

准备好构建吗? 开始使用

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

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