OSSERVA https://developers.facebook.com/docs/chat/
Il servizio e l'API trattati in questo documento sono stati deprecati con il rilascio di Platform API v2.0. Una volta che la versione 1.0 sarà deprecata, chat.facebook.com non sarà più disponibile.
Importante! Leggi questo e probabilmente vorrai fare qualcosa di completamente diverso da tutto ciò che ha a che fare con questa domanda.
Sto creando una chat con WebForms C # collegandomi all'API di chat di Facebook.
Ho anche esaminato questa domanda SO (e tutti i collegamenti). Alcune parti non sono più rilevanti poiché Facebook richiede auth_token
ora.
Per replicare, è necessario configurare un'app Web di Facebook, utilizzare appId
e un account utente con il set di autorizzazioni xmpp_login. Quindi crea un Chat.aspx
con il codice dietro e incolla questo codice di conseguenza. E sostituisci gli utenti hard-coded con cui interagire.
Ho due (forse tre) problemi che credo mi impediscano di riuscire con il mio obiettivo di inviare un messaggio di chat.
- Il processo indicato
// finishes auth process
nella documentazione non corrisponde alla descrizione della documentazione (non ricevo alcuna risposta dopo aver ricevuto il mio messaggio di successo basato su SSL / TLS da Facebook). - Non ho idea di come debba essere impostata la parte "invia messaggio di chat" e poiché non ricevo alcun messaggio da Facebook è difficile dire cosa potrebbe essere sbagliato.
Ecco il mio codice nella sua interezza, su PasteBin .
Ho anche alcuni helper per l'aggiunta di permessi xmpp_login e simili .. rimossi per chiarezza.
Variabili globali:
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\"/>";
Quindi in Page_Load
tutti i passaggi richiesti vengono (o dovrebbero essere) eseguiti. Degno di nota è il SendMessage("test");
. Ho appena provato a metterlo lì per vedere se sarebbe riuscito a inviare un messaggio di chat ... SetUserNameAndAuthToken
imposta il mio token di autenticazione e il nome utente su variabili globali. L'AuthToken funziona.
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);
}
Quindi ottengo una risposta, quindi invio la risposta al 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;
}
Questo richiede 1 minuto e 40 secondi ... e la risposta è:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Finalmente eseguo 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;
}
Tutte le risposte lo sono ""
. Guardando il Read
metodo in SendWithSsl
: è 0 byte. Il tentativo di inviare un messaggio mi dà anche 0 byte di lettura dei dati da Facebook. Non ho idea del perché?