OBSERVER https://developers.facebook.com/docs/chat/
Le service et l'API couverts par ce document sont devenus obsolètes avec la sortie de Platform API v2.0. Une fois la version 1.0 obsolète, chat.facebook.com ne sera plus disponible.
Important! Lisez ceci et vous voudrez probablement faire quelque chose de complètement différent de tout ce qui a à voir avec cette question.
Je crée un chat avec WebForms C # en me connectant à l'API Facebook Chat.
J'ai également regardé cette question SO (et tous les liens). Certaines parties ne sont plus pertinentes puisque Facebook l'exige auth_token
maintenant.
Pour reproduire cela, vous devez configurer une application Web Facebook, utiliser le appId
et un compte utilisateur avec le jeu d'autorisations xmpp_login. Ensuite, créez un Chat.aspx
avec le code derrière et collez ce code en conséquence. Et remplacez les utilisateurs codés en dur avec lesquels interagir.
J'ai deux (peut-être trois) problèmes qui, selon moi, m'empêchent de réussir dans mon objectif d'envoyer un message de chat.
- Le processus indiqué
// finishes auth process
dans la documentation ne correspond pas à la description de la documentation (je ne reçois aucune réponse après avoir reçu mon message de réussite basé sur SSL / TLS de Facebook.) - Je n'ai aucune idée de la façon dont la partie `` envoyer un message de discussion '' devrait être configurée, et comme je ne reçois aucun message de Facebook, il est difficile de dire ce qui pourrait ne pas fonctionner.
Voici mon code dans son intégralité, sur PasteBin .
J'ai aussi quelques helpers pour ajouter des permissions xmpp_login et autres .. supprimés pour plus de clarté.
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\"/>";
Ensuite, Page_Load
toutes les étapes requises sont (ou sont censées être) effectuées. Il convient de noter le SendMessage("test");
. J'ai juste essayé de le mettre là pour voir s'il réussirait à envoyer un message de chat ... SetUserNameAndAuthToken
définit mon jeton d'authentification et mon nom d'utilisateur sur des variables globales. L'AuthToken fonctionne.
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);
}
Donc j'obtiens une réponse puis j'envoie la réponse au serveur:
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;
}
Cela prend 1 minute 40 secondes ... et la réponse est:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Enfin je fais le 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;
}
Toutes les réponses sont ""
. En regardant la Read
méthode dans SendWithSsl
: c'est 0 octet. Essayer d'envoyer un message me donne également 0 octet Lire les données de Facebook. Je n'ai aucune idée de pourquoi?