НАБЛЮДИТИ https://developers.facebook.com/docs/chat/
Послуга та API, які охоплює цей документ, застаріли з випуском Platform API v2.0. Коли версія 1.0 застаріла, chat.facebook.com буде більше недоступний.
Важливо! Прочитайте це, і ви, мабуть, захочете зробити щось зовсім інше, ніж будь-що, що пов’язане з цим питанням.
Я створюю чат за допомогою WebForms C #, що підключається до Facebook Chat API.
Я також розглянув це питання SO (і всі посилання). Деякі частини більше не актуальні, оскільки Facebook вимагає auth_token
зараз.
Щоб повторити це, слід створити веб-програму Facebook, скористатися appId
обліковим записом користувача та користувачем із встановленим дозволом xmpp_login. Потім створіть Chat.aspx
код ззаду та вставте цей код відповідно. І замінити жорстко закодованих користувачів для взаємодії.
У мене є дві (можливо, три) проблеми, які, на мою думку, заважають мені досягти своєї мети надіслати повідомлення в чаті.
- Процес, зазначений
// finishes auth process
у документації, не відповідає опису документації (я не отримую відповіді після отримання повідомлення про успіх на основі SSL / TLS від Facebook.) - Я не уявляю, як слід налаштувати частину "відправити повідомлення чату", і оскільки я не отримую жодних повідомлень від Facebook, важко сказати, що може бути не так.
Ось мій код у цілому, на PasteBin .
У мене також є деякі помічники для додавання дозволів xmpp_login і такі .. видалені для ясності.
Глобальні змінні:
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\"/>";
Потім Page_Load
виконуються (або передбачається) виконати всі необхідні кроки. Варто зазначити SendMessage("test");
. Я просто спробував помістити його туди, щоб побачити, чи вдасться йому надіслати повідомлення чату ... SetUserNameAndAuthToken
встановлює мій маркер автентифікації та ім'я користувача на глобальні змінні. AuthToken працює.
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);
}
Тож я отримую відповідь, тоді я надсилаю відповідь на сервер:
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;
}
Це займає 1 хвилину 40 секунд ... і відповідь така:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Нарешті я роблю 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;
}
Усі відповіді є ""
. Дивлячись на Read
метод у SendWithSsl
: це 0 байт. Спроба надіслати повідомлення також дає мені 0 байт Читати дані з Facebook. Я не знаю, чому?