OBSERVE https://developers.facebook.com/docs/chat/
O serviço e a API que este documento cobre foram descontinuados com o lançamento da Platform API v2.0. Assim que a versão 1.0 for descontinuada, chat.facebook.com não estará mais disponível.
Importante! Leia isto e provavelmente você deseja fazer algo completamente diferente do que qualquer coisa que tenha a ver com esta questão.
Estou criando um bate-papo com WebForms C # conectando-se à API de bate-papo do Facebook.
Também examinei esta questão do SO (e todos os links). Algumas partes não são mais relevantes, já que o Facebook exige auth_token
agora.
Para replicar isso, você deve configurar um aplicativo da web do Facebook, usar o appId
e uma conta de usuário com a permissão xmpp_login definida. Em seguida, crie um Chat.aspx
with code behind e cole esse código de acordo. E substitua os usuários codificados para interagir.
Tenho dois (talvez três) problemas que acredito que me impedem de ter sucesso com meu objetivo de enviar uma mensagem de chat.
- O processo indicado
// finishes auth process
na documentação não corresponde à descrição da documentação (não estou recebendo nenhuma resposta depois de receber minha mensagem de sucesso baseada em SSL / TLS do Facebook). - Não tenho ideia de como a parte 'enviar mensagem de bate-papo' deve ser configurada e, como não recebo nenhuma mensagem do Facebook, é difícil dizer o que pode estar errado.
Aqui está meu código inteiro, em PasteBin .
Eu também tenho alguns auxiliares para adicionar permissões xmpp_login e outros. Removidos para maior clareza.
Variáveis globais:
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\"/>";
Então, Page_Load
todas as etapas necessárias são (ou deveriam ser) executadas. Vale a pena notar é o SendMessage("test");
. Eu só tentei colocá-lo lá para ver se ele teria sucesso em enviar uma mensagem de chat ... SetUserNameAndAuthToken
define meu token de autenticação e nome de usuário para variáveis globais. O 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);
}
Recebo uma resposta e a envio ao 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;
}
Isso leva 1 minuto e 40 segundos ... e a resposta é:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Finalmente, faço o 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 as respostas são ""
. Olhando para o Read
método em SendWithSsl
: é 0 bytes. Tentar enviar uma mensagem também me dá 0 bytes de dados de leitura do Facebook. Eu não tenho ideia do porquê?