OBSERVE https://developers.facebook.com/docs/chat/
บริการและ API ครอบคลุมเอกสารนี้เลิกใช้งานแล้วด้วยการเปิดตัว Platform API v2.0 เมื่อเลิกใช้งานเวอร์ชัน 1.0 แล้ว chat.facebook.com จะไม่สามารถใช้งานได้อีกต่อไป
สำคัญ! อ่านสิ่งนี้แล้วคุณอาจต้องการทำบางสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิงกับคำถามนี้
ฉันกำลังสร้างการแชทด้วย WebForms C # ที่เชื่อมต่อกับ Facebook Chat API
ฉันได้ดูคำถาม SO นี้แล้วด้วย (และลิงก์ทั้งหมด) บางส่วนไม่เกี่ยวข้องอีกต่อไปเนื่องจากauth_token
ตอนนี้Facebook ต้องการ
หากต้องการทำซ้ำคุณควรตั้งค่าเว็บแอป 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 ไบต์ การพยายามส่งข้อความยังทำให้ฉันอ่านข้อมูลจาก Facebook ได้ 0 ไบต์ ฉันไม่รู้ว่าทำไม?