web-dev-qa-db-ja.com

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

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

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

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

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

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

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

this SO question (およびすべてのリンク)も確認しました。Facebookで_auth_token_が必要になったため、一部は関連しなくなりました。

これを複製するには、Facebook Webアプリをセットアップし、appIdと、xmpp_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;
}
_

すべての応答は_""_です。 ReadSendWithSslメソッドを見ると、0バイトです。メッセージを送信しようとしても、0バイトがFacebookからデータを読み取ります。理由がわかりません。

41
Magnus Karlsson

このコードを使用してコードを実行するのは非常に難しいと思います。このライブラリを使用することをお勧めします。これは非常に強力だと思います: Library

1
Marble Son