OBSERVE https://developers.facebook.com/docs/chat/
이 문서에서 다루는 서비스 및 API는 Platform API v2.0 릴리스에서 더 이상 사용되지 않습니다. 버전 1.0이 더 이상 사용되지 않으면 chat.facebook.com을 더 이상 사용할 수 없습니다.
중대한! 이것을 읽으면 아마도이 질문과 관련된 어떤 것과는 완전히 다른 것을하고 싶을 것입니다.
Facebook Chat API에 연결하는 WebForms C #으로 채팅을 만들고 있습니다.
나는 또한 이 SO 질문 (및 모든 링크)을 보았습니다 . Facebook이 auth_token
지금 요구 하기 때문에 일부 부분은 더 이상 관련이 없습니다 .
이를 복제하려면 Facebook 웹 앱을 appId
설정하고 xmpp_login 권한이 설정된 및 사용자 계정을 사용해야합니다. 그런 다음 Chat.aspx
with 코드를 생성하고 그에 따라이 코드를 붙여 넣습니다. 그리고 상호 작용할 하드 코딩 된 사용자를 교체합니다.
두 가지 (아마 세 가지) 문제가있어 채팅 메시지를 보내려는 목표를 달성 할 수 없습니다.
// finishes auth process
문서에 명시된 프로세스 가 문서 설명 과 일치하지 않습니다 (Facebook에서 SSL / TLS 기반 성공 메시지를받은 후 응답을받지 못함).- '채팅 메시지 보내기'부분이 어떻게 설정되어야하는지 모르겠고, 페이스 북에서 어떤 메시지도받지 못하기 때문에 무엇이 잘못되었는지 알기가 어렵습니다.
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에서 데이터를 읽습니다. 왜 그런지 모르겠어요?