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


88

观察 https://developers.facebook.com/docs/chat/

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

重要!阅读此书,您可能想做与该问题完全不同的事情。

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

我还研究了这个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;
}

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


6
@DanielHilgarth Hehe,好吧.. Connect的第一部分可能没有必要,但是没有在C#中执行此操作的可行示例,因此我想我将确保所有尝试进行Facebook聊天的人都可以使用我知道了#。我也可以在一个代码库中编写所有内容,但是那样就不会引起人们的监督。
Magnus Karlsson,

6
如果您想要一个答案,建议您将这篇文章中的代码精简到理解问题所需的最低限度。其余的代码(例如,其他人也可以复制它)是否可以放在pastebin上并从您的文章中链接到它。
Daniel AA Pelsmaeker

4
您的代码不完整,所以我无法遵循控制流程。请附加调试Xml,发送到服务器的内容以及返回的内容。为什么不从这里开始使用现有的XMPP库呢?xmpp.org/xmpp-software/libraries
Alex

4
@ facebook.com表示chat.facebook.com xmpp服务器将在6个月内关闭。
Magnus Karlsson,2014年

11
@cari您不应该使用此解决方案。请改用类似agsXMPP的库。但是,自Facebook关闭聊天服务器以来,所有这些解决方案将在六个月内停止工作。
Magnus Karlsson,2014年

Answers:


1

现在有新的API。Messenger平台如何工作?当某人在Messenger上向企业发送消息时,只要此页面使用应用程序部分或完全自动化对话,就会发生以下情况。Facebook服务器将webhooks发送到托管消息传递应用程序的业务服务器的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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.