Enviar mensaje a través de Facebook Chat API(XMPP) C#
facebook-chat (1)
////////////////////////////////////////////////// ////////////////////////////////////////////////
// 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á en desuso, chat.facebook.com ya no estará disponible.
// Lee esto y probablemente quieras hacer algo completamente diferente a cualquier cosa que tenga que ver con esta pregunta.
////////////////////////////////////////////////// //////////////////////////////////////
Estoy creando un chat con WebForms C # conectando a Facebook Chat API.
También he visto 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 la appId
y una cuenta de usuario con el conjunto de permisos xmpp_login. Luego crea un Chat.aspx
con código detrás y pega este código en consecuencia. Y reemplace a los usuarios codificados para interactuar.
Tengo dos (tal vez tres) problemas que creo que me impiden tener éxito con mi objetivo de enviar un mensaje de chat.
- El proceso indicado como
// finishes auth process
en la documentación no coincide con la https://developers.facebook.com/docs/chat/ la https://developers.facebook.com/docs/chat/ (no recibiré 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 como 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 de xmpp_login y tales ... 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
realizan (o se supone que se deben realizar) todos los pasos requeridos. Digno de mención es SendMessage("test");
. Intenté ponerlo allí para ver si SetUserNameAndAuthToken
enviar un mensaje de chat ... SetUserNameAndAuthToken
establece mi token de autenticación y el nombre de usuario en variables globales. El 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 método Read
en SendWithSsl
: es 0 bytes. Intentar enviar un mensaje también me da 0 bytes Leer datos de Facebook. No tengo idea de por qué?
Me gustaría ir con una biblioteca jabber / xmpp ya creada y agregarle las cosas de autenticación de Facebook. Ya escribí el mío en PHP pero no en C #. Aunque en unos pocos meses FB Chat API estará muerto (Realmente cojo), encontré muchos ejemplos de C # (que código) cuando busco. Aquí hay un video de cómo hacer un cliente de chat con la fuente en los comentarios: https://www.youtube.com/watch?v=tHOb80TghDA
Aquí hay una aplicación de ejemplo de artículo completa con el código fuente: http://csharp-tricks-en.blogspot.com/2013/10/connect-to-facebook-chat.html
Aquí hay una biblioteca xmpp del paquete nuget específicamente para facebook chat api: https://www.nuget.org/packages/Facebook-Chat/
Si examina la fuente de algunos ejemplos, es probable que vea dónde salió mal o simplemente podría comenzar con uno de los ejemplos. Finalmente, la búsqueda que realicé: https://www.google.com/search?q=c%23+chat+api+library&ie=utf-8&oe=utf-8#safe=off&q=c%23+facebook+chat+api+library