Kirim pesan melalui Facebook Chat API (XMPP) C #

88

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

Layanan dan API yang tercakup dalam dokumen ini sudah tidak digunakan lagi dengan rilis API Platform v2.0. Setelah versi 1.0 tidak digunakan lagi, chat.facebook.com tidak akan tersedia lagi.

Penting! Baca ini dan Anda mungkin ingin melakukan sesuatu yang sama sekali berbeda dari apa pun yang berkaitan dengan pertanyaan ini.

Saya membuat obrolan dengan WebForms C # menghubungkan ke API Obrolan Facebook.

Saya juga melihat pertanyaan SO ini (dan semua link). Beberapa bagian tidak lagi relevan karena Facebook membutuhkan auth_tokensekarang.

Untuk mereplikasi ini, Anda harus menyiapkan aplikasi web Facebook, menggunakan appIddan akun pengguna dengan izin xmpp_login. Kemudian buat Chat.aspxdengan kode di belakang dan tempel kode ini sesuai. Dan ganti pengguna hard-code untuk berinteraksi.

Saya memiliki dua (mungkin tiga) masalah yang menurut saya menghalangi saya untuk berhasil dengan tujuan saya untuk mengirim pesan obrolan.

  1. Proses yang tercantum // finishes auth processdalam dokumentasi tidak sesuai dengan deskripsi dokumentasi (Saya tidak mendapatkan tanggapan apa pun setelah saya menerima pesan sukses berbasis SSL / TLS dari Facebook.)
  2. Saya tidak tahu bagaimana bagian 'kirim pesan obrolan' harus diatur, dan karena saya tidak menerima pesan apa pun dari Facebook, sulit untuk mengatakan apa yang mungkin salah.

Ini kode saya secara keseluruhan, di PasteBin .

Saya juga memiliki beberapa pembantu untuk menambahkan izin xmpp_login dan semacamnya .. dihapus untuk kejelasan.

Variabel global:

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\"/>";

Kemudian di Page_Loadsemua langkah yang diperlukan (atau seharusnya) dilakukan. Perlu diperhatikan adalah SendMessage("test");. Saya hanya mencoba meletakkannya di sana untuk melihat apakah itu akan berhasil mengirim pesan obrolan ... SetUserNameAndAuthTokenmenyetel token autentikasi dan nama pengguna saya ke variabel global. AuthToken berfungsi.

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);

}

Jadi saya mendapat tanggapan lalu saya mengirim tanggapan ke server:

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;
}

Ini membutuhkan waktu 1 menit 40 detik ... dan tanggapannya adalah:

<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

Akhirnya saya melakukan 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;
}

Semua tanggapan adalah "". Melihat Readmetode dalam SendWithSsl: itu 0 byte. Mencoba mengirim pesan juga memberi saya 0 byte. Baca data dari Facebook. Saya tidak tahu mengapa?

Magnus Karlsson
sumber
6
@DanielHilgarth Hehe, yah .. bagian pertama dari Connect mungkin tidak diperlukan tetapi tidak ada contoh yang berfungsi tentang bagaimana melakukan ini di C # jadi saya pikir saya akan memastikan ada satu untuk siapa saja di luar sana yang mencoba melakukan obrolan facebook i C #. Saya juga bisa menulis semuanya dalam satu basis kode tetapi kemudian itu tidak akan terlalu diawasi.
Magnus Karlsson
6
Jika Anda menginginkan jawaban, saya sarankan Anda menghapus kode dalam posting ini hanya untuk kebutuhan minimum yang diperlukan untuk memahami masalahnya. Kode lainnya (mis. Agar orang lain dapat mereproduksinya) dapatkah Anda memasang pastebin dan menautkannya dari kiriman Anda.
Daniel AA Pelsmaeker
4
kode Anda tidak lengkap, jadi saya tidak bisa mengikuti alur kendali. Harap lampirkan Xml debug, apa yang Anda kirim ke server dan apa yang Anda dapatkan kembali. Mengapa Anda tidak menggunakan pustaka XMPP yang sudah ada dari sini yang semuanya bekerja keras untuk Anda? xmpp.org/xmpp-software/libraries
Alex
4
@MatiCicero Server xmpp chat.facebook.com akan ditutup dalam 6 bulan menurut facebook.
Magnus Karlsson
11
@cari Anda tidak harus menggunakan solusi ini. Gunakan pustaka seperti agsXMPP sebagai gantinya. Namun, semua solusi ini akan berhenti berfungsi dalam enam bulan sejak Facebook menutup server obrolan.
Magnus Karlsson

Jawaban:

1

Ada api baru sekarang. Bagaimana cara kerja Messenger Platform? Saat seseorang mengirim pesan ke bisnis di Messenger dan selama Halaman ini menggunakan aplikasi untuk mengotomatiskan sebagian atau seluruhnya percakapan, hal berikut akan terjadi. Server Facebook mengirimkan webhook ke URL server bisnis, tempat aplikasi perpesanan dihosting. Menggunakan API Kirim, aplikasi dapat menanggapi orang tersebut di Messenger. Dengan cara ini, pengembang dapat membangun percakapan terpandu untuk mengarahkan orang-orang melalui aliran otomatis atau membangun aplikasi yang berfungsi sebagai jembatan antara agen Anda dan kehadiran bisnis Anda di Messenger.

Platform Messenger tidak memerlukan pembayaran apa pun untuk digunakan. Ini dimaksudkan untuk bisnis untuk menangani pertanyaan dari pelanggan mereka. Setelah Anda membangun pengalaman untuk berinteraksi dengan pelanggan, Anda kemudian dapat memanfaatkan Iklan untuk menghadirkan pengalaman Anda kepada orang-orang, seperti misalnya Iklan Klik-untuk-Messenger atau Iklan Kotak Masuk.

Seperti apa pengalaman Messenger for Business? Kami memiliki contoh bisnis eCommerce yang dapat Anda ajak ngobrol di Messenger bernama Original Coast Clothing.

Ngobrol dengan Contoh Bisnis Di Sini

Bagaimana saya memulai? Anda dapat memulai dengan membuat halaman pengujian dan aplikasi pengujian yang memungkinkan Anda mencoba pengalaman menggunakan Messenger. Kami memiliki beberapa contoh yang dapat membantu Anda memulai. Setelah aplikasi Anda siap untuk diterapkan, Anda dapat mengirimkannya untuk ditinjau. Ketika aplikasi Anda melewati proses peninjauan kami, itu akan siap untuk berinteraksi dengan publik.

Untuk memulai, Anda memerlukan Messenger, Halaman Facebook, dan url tujuan pengiriman webhook.

Berikut adalah panduan langkah demi langkah untuk menerapkan pengalaman di atas ke dalam halaman pengujian untuk Anda mulai.

Siap Membangun? Memulai

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

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

Jin Thakur
sumber