///////////////// ////////////////////////////////////////////////// ///////////通過Facebook發送信息聊天API(XMPP)C#
// OBSERVE https://developers.facebook.com/docs/chat/
本文檔介紹了已棄用平臺API 2.0版的發佈服務和API。一旦版本1.0被棄用,chat.facebook.com將不再可用。
//閱讀此內容,您可能想完成與此問題完全不同的任何操作。
////////////////////////////////////////////// //////////////////////////////////////////
我創建與WebForms C#聊天連接到Facebook Chat API。
我也看了this SO question(和所有鏈接)。由於Facebook現在需要auth_token
,因此某些部分不再相關。
要複製這個,你應該設置一個Facebook的web應用程序,使用appId
和用戶帳戶與xmpp_login權限設置。然後創建帶有代碼的Chat.aspx
並相應地粘貼此代碼。並替換硬編碼的用戶進行交互。
我有我相信阻止我與我的目標是發送聊天消息,隨後的兩個(也許三)的問題。
- 過程文檔中標註爲
// finishes auth process
不匹配documentation description (我沒有收到任何階躍響應我已收到來自Facebook的我的SSL/TLS基於成功的消息後。) - 我不知道應該如何設置「發送聊天消息」部分,並且由於我沒有收到任何來自Facebook的消息,因此很難說出可能的錯誤。
Here is my code in its entirety, on 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;
}
所有答覆都""
。查看SendWithSsl
中的Read
方法:它是0字節。 試圖發送消息也給我0字節從Facebook讀取數據。我不知道爲什麼?
Holy s ...,這是很多的代碼。你確定這一切都*必要* *展示*你的問題?我很懷疑。無論如何,這很可能會讓你低調,沒有答案。 –
@DanielHilgarth嘿嘿嘿..連接的第一部分可能不是必要的,但沒有工作的例子,如何在C#中這樣做,所以我想我會確保有一個人在那裏試圖做一個Facebook聊天我C#。我也可以在一個代碼庫中編寫所有代碼,但不會非常可監控。 –
如果你想要一個答案,我建議你去掉這篇文章中的代碼,只是爲了理解這個問題。其他代碼(例如,其他人可以重現它),你可以把[pastebin](http://pastebin.com/)並鏈接到您的帖子。 – Virtlink