FacebookチャットAPI(XMPP)C#経由でメッセージを送信する


88

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

このドキュメントがカバーするサービスとAPIは、プラットフォームAPI v2.0のリリースで廃止されました。バージョン1.0が非推奨になると、chat.facebook.comは使用できなくなります。

重要!これを読んで、おそらくあなたはこの質問に関係するものとはまったく違うことをしたいと思うでしょう。

FacebookチャットAPIに接続するWebForms C#でチャットを作成しています。

私も見てきました。このSO質問(およびすべてのリンク)。Facebookがauth_token今必要としているため、いくつかの部分はもはや関係ありません。

これを複製するには、Facebook Webアプリを設定し、appIdxmpp_login権限が設定されたユーザーアカウントを使用する必要があります。次に、Chat.aspx背後にコードを含むを作成し、このコードを適宜貼り付けます。対話するハードコードされたユーザーを置き換えます。

チャットメッセージを送信するという目標を達成するのを妨げる2つ(おそらく3つ)の問題があります。

  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のチャットをしようとしている人のために1つはあると思います。 IC#。また、すべてを1つのコードベースで記述することもできますが、それではあまり監視できません。
Magnus Karlsson 2013年

6
回答が必要な場合は、この投稿のコードを、問題を理解するために必要な最小限のものだけに減らすことをお勧めします。残りのコード(たとえば、他の人がそれを再現できるようにするため)は、ペーストビンに入れて、投稿からリンクすることができます。
Daniel AA Pelsmaeker 2013年

4
コードが完全ではないため、制御フローを追跡できません。デバッグXml、サーバーに送信するもの、返されるものを添付してください。ここから、既存のXMPPライブラリを使用しないのはなぜですか?xmpp.org/xmpp-software/libraries
Alex

4
@MatiCiceroフェイスブックによれば、chat.facebook.com xmppサーバーは6か月でシャットダウンされます。
Magnus Karlsson 2014年

11
@cariあなたはこの解決策に行くべきではありません。代わりにagsXMPPのようなライブラリを使用してください。ただし、Facebookがチャットサーバーをシャットダウンしているため、これらのソリューションはすべて6か月以内に機能しなくなります。
Magnus Karlsson 2014年

回答:


1

現在、新しいAPIがあります。メッセンジャープラットフォームはどのように機能しますか?人がメッセンジャーでビジネスにメッセージを送信し、このページがアプリを使用して会話を部分的または完全に自動化している限り、次のことが起こります。Facebookサーバーは、メッセージングアプリがホストされているビジネスサーバーのURLにwebhookを送信します。Send APIを使用して、アプリはメッセンジャーの人に応答できます。このようにして、開発者はガイド付き会話を構築して、自動化されたフローを通じて人々を導くか、またはエージェントとメッセンジャーのビジネスプレゼンスとの間の橋渡しとして機能するアプリを構築できます。

メッセンジャープラットフォームでは、使用に支払いは必要ありません。これは、企業が顧客からの問い合わせに対応するためのものです。顧客とやり取りするエクスペリエンスを構築したら、広告を活用して、Click-to-Messenger広告や受信トレイ広告などの人々をあなたのエクスペリエンスに導くことができます。

ビジネス向けMessengerはどのようなものですか?オリジナルコーストクロージングと呼ばれるメッセンジャーでチャットできるサンプルのeコマースビジネスがあります。

ここでサンプルビジネスとチャット

どうやって始めますか?まず、メッセンジャー内での体験を試すことができるテストページとテストアプリを作成します。あなたが始めることができるいくつかの例があります。アプリをデプロイする準備ができたら、レビューのために送信できます。アプリが我々の審査プロセスに合格すると、一般と対話できるようになります。

開始するには、メッセンジャー、Facebookページ、およびWebhookの送信先のURLが必要です。

以下は、上記のエクスペリエンスをテストページに展開して開始するためのステップバイステップガイドです。

構築する準備はできましたか?始めましょう

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.