BEOBACHTEN SIE https://developers.facebook.com/docs/chat/
Der Service und die API, die in diesem Dokument behandelt werden, sind mit der Veröffentlichung der Platform API v2.0 veraltet. Sobald Version 1.0 veraltet ist, ist chat.facebook.com nicht mehr verfügbar.
Wichtig! Lesen Sie dies und Sie möchten wahrscheinlich etwas völlig anderes tun als alles, was mit dieser Frage zu tun hat.
Ich erstelle einen Chat mit WebForms C #, der eine Verbindung zur Facebook-Chat-API herstellt.
Ich habe mir auch diese SO-Frage (und alle Links) angesehen. Einige Teile sind nicht mehr relevant, da Facebook dies auth_token
jetzt benötigt .
Um dies zu replizieren, sollten Sie eine Facebook-Webanwendung einrichten appId
und das Benutzerkonto mit dem Berechtigungssatz xmpp_login verwenden. Dann erstellen Sie eineChat.aspx
mit Code dahinter und fügen Sie diesen Code entsprechend ein. Und ersetzen Sie die fest codierten Benutzer, mit denen Sie interagieren möchten.
Ich habe zwei (vielleicht drei) Probleme, von denen ich glaube, dass sie mich daran hindern, mein Ziel, eine Chat-Nachricht zu senden, zu erreichen.
- Der
// finishes auth process
in der Dokumentation angegebene Prozess stimmt nicht mit der Dokumentationsbeschreibung überein (ich erhalte keine Antwort, nachdem ich meine SSL / TLS-basierte Erfolgsnachricht von Facebook erhalten habe.) - Ich habe keine Ahnung, wie der Teil "Chat-Nachricht senden" eingerichtet werden soll, und da ich keine Nachrichten von Facebook erhalte, ist es schwer zu sagen, was möglicherweise falsch ist.
Hier ist mein Code in seiner Gesamtheit auf PasteBin .
Ich habe auch einige Helfer zum Hinzufügen von xmpp_login-Berechtigungen und dergleichen. Aus Gründen der Übersichtlichkeit entfernt.
Globale Variablen:
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\"/>";
Dann Page_Load
werden (oder sollen) in allen erforderlichen Schritten ausgeführt. Bemerkenswert ist die SendMessage("test");
. Ich habe nur versucht, es dort abzulegen, um zu sehen, ob es erfolgreich ist, eine Chat-Nachricht zu senden ... SetUserNameAndAuthToken
setzt mein Authentifizierungstoken und meinen Benutzernamen auf globale Variablen. Das AuthToken funktioniert.
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);
}
Ich erhalte eine Antwort und sende die Antwort an den 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;
}
Dies dauert 1 Minute 40 Sekunden ... und die Antwort lautet:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Schließlich mache ich den 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;
}
Alle Antworten sind ""
. Betrachtet man die Read
Methode in SendWithSsl
: Es sind 0 Bytes. Der Versuch, eine Nachricht zu senden, gibt mir auch 0 Bytes. Lesen Sie Daten von Facebook. Ich habe keine Ahnung warum?