OBSERVE https://developers.facebook.com/docs/chat/
El servicio y la API que cubre este documento han quedado obsoletos con el lanzamiento de Platform API v2.0. Una vez que la versión 1.0 esté obsoleta, chat.facebook.com ya no estará disponible.
¡Importante! Lea esto y probablemente quiera hacer algo completamente diferente a cualquier cosa que tenga que ver con esta pregunta.
Estoy creando un chat con WebForms C # que se conecta a la API de chat de Facebook.
También he mirado esta pregunta SO (y todos los enlaces). Algunas partes ya no son relevantes ya que Facebook requiere auth_token
ahora.
Para replicar esto, debe configurar una aplicación web de Facebook, usar appId
y una cuenta de usuario con el conjunto de permisos xmpp_login. Entonces crea unChat.aspx
código con detrás y pegue este código en consecuencia. Y reemplace a los usuarios codificados con los que interactuar.
Tengo dos (quizás tres) problemas que creo que me impiden tener éxito con mi objetivo de enviar un mensaje de chat.
- El proceso indicado
// finishes auth process
en la documentación no coincide con el descripción de documentación (no obtengo ninguna respuesta después de recibir mi mensaje de éxito basado en SSL / TLS de Facebook). - No tengo idea de cómo se debe configurar la parte 'enviar mensaje de chat' y, dado que no recibo ningún mensaje de Facebook, es difícil saber qué podría estar mal.
Aquí está mi código en su totalidad, en PasteBin .
También tengo algunos ayudantes para agregar permisos xmpp_login y demás ... eliminados para mayor claridad.
Variables globales:
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\"/>";
Luego, en Page_Load
todos los pasos requeridos se realizan (o se supone que se deben realizar). Cabe destacar el SendMessage("test");
. Intenté ponerlo allí para ver si podía enviar un mensaje de chat ... SetUserNameAndAuthToken
establece mi token de autenticación y el nombre de usuario en variables globales. AuthToken funciona.
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);
}
Entonces recibo una respuesta y luego envío la respuesta al servidor:
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;
}
Esto toma 1 minuto 40 segundos ... y la respuesta es:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Finalmente hago el 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;
}
Todas las respuestas son ""
. Mirando el Read
método en SendWithSsl
: es 0 bytes. Intentar enviar un mensaje también me da 0 bytes Leer datos de Facebook. ¿No tengo ni idea de por qué?