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_token
sekarang.
Untuk mereplikasi ini, Anda harus menyiapkan aplikasi web Facebook, menggunakan appId
dan akun pengguna dengan izin xmpp_login. Kemudian buat Chat.aspx
dengan 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.
- Proses yang tercantum
// finishes auth process
dalam dokumentasi tidak sesuai dengan deskripsi dokumentasi (Saya tidak mendapatkan tanggapan apa pun setelah saya menerima pesan sukses berbasis SSL / TLS dari Facebook.) - 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_Load
semua 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 ... SetUserNameAndAuthToken
menyetel 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 Read
metode dalam SendWithSsl
: itu 0 byte. Mencoba mengirim pesan juga memberi saya 0 byte. Baca data dari Facebook. Saya tidak tahu mengapa?