ส่งข้อความผ่าน Facebook Chat API (XMPP) C #


88

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โดยมีรหัสด้านหลังและวางรหัสนี้ตามนั้น และแทนที่ผู้ใช้ฮาร์ดโค้ดเพื่อโต้ตอบด้วย

ฉันมีปัญหาสอง (อาจจะสาม) ซึ่งฉันเชื่อว่าทำให้ฉันไม่สามารถส่งข้อความแชทได้สำเร็จ

  1. กระบวนการที่ระบุไว้// finishes auth processในเอกสารไม่ตรงกับคำอธิบายเอกสาร (ฉันไม่ได้รับการตอบสนองใด ๆ หลังจากได้รับข้อความความสำเร็จที่ใช้ SSL / TLS จาก Facebook)
  2. ฉันไม่รู้ว่าควรตั้งค่าส่วน 'ส่งข้อความแชท' อย่างไรและเนื่องจากฉันไม่ได้รับข้อความใด ๆ จาก 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 ไบต์ ฉันไม่รู้ว่าทำไม?


6
@DanielHilgarth Hehe เอาละ .. ส่วนแรกของ Connect อาจไม่จำเป็น แต่ไม่มีตัวอย่างการทำงานของวิธีการทำใน C # ดังนั้นฉันคิดว่าฉันต้องแน่ใจว่ามีสำหรับทุกคนที่พยายามแชทบน Facebook เข้าใจแล้ว#. ฉันยังสามารถเขียนทุกอย่างในฐานรหัสเดียว แต่มันจะไม่สามารถตรวจสอบได้มากนัก
Magnus Karlsson

6
หากคุณต้องการคำตอบฉันขอแนะนำให้คุณตัดโค้ดในโพสต์นี้ให้เหลือเพียงขั้นต่ำสุดที่จำเป็นเพื่อทำความเข้าใจปัญหา ส่วนที่เหลือของโค้ด (เช่นให้คนอื่นสามารถทำซ้ำได้) คุณสามารถวางpastebinแล้วเชื่อมโยงจากโพสต์ของคุณ
Daniel AA Pelsmaeker

4
รหัสของคุณยังไม่สมบูรณ์ดังนั้นฉันจึงไม่สามารถทำตามขั้นตอนการควบคุมได้ โปรดแนบ Xml การดีบักสิ่งที่คุณส่งไปยังเซิร์ฟเวอร์และสิ่งที่คุณได้รับกลับมา เหตุใดคุณจึงไม่ใช้ไลบรารี XMPP ที่มีอยู่จากที่นี่ซึ่งทั้งหมดทำงานหนักเพื่อคุณ xmpp.org/xmpp-software/libraries
Alex

4
@MatiCicero เซิฟเวอร์ chat.facebook.com xmpp กำลังจะปิดตัวลงใน 6 เดือนตาม facebook
Magnus Karlsson

11
@cari คุณไม่ควรใช้วิธีแก้ปัญหานี้ ใช้ไลบรารีเช่น agsXMPP แทน อย่างไรก็ตามโซลูชันทั้งหมดเหล่านี้จะหยุดทำงานภายในหกเดือนนับตั้งแต่ Facebook ปิดเซิร์ฟเวอร์แชท
Magnus Karlsson

คำตอบ:


1

ตอนนี้มี api ใหม่ Messenger Platform ทำงานอย่างไร? เมื่อมีคนส่งข้อความถึงธุรกิจบน Messenger และตราบใดที่เพจนี้ใช้แอพเพื่อสนทนาบางส่วนหรืออัตโนมัติทั้งหมดสิ่งต่อไปนี้จะเกิดขึ้น เซิร์ฟเวอร์ Facebook ส่งเว็บฮุกไปยัง URL ของเซิร์ฟเวอร์ธุรกิจที่โฮสต์แอพส่งข้อความ เมื่อใช้ Send API แอปสามารถตอบกลับบุคคลใน Messenger ได้ ด้วยวิธีนี้นักพัฒนาสามารถสร้างการสนทนาที่มีคำแนะนำเพื่อนำผู้คนผ่านขั้นตอนอัตโนมัติหรือสร้างแอปเพื่อใช้เป็นสะพานเชื่อมระหว่างตัวแทนและสถานะทางธุรกิจของคุณบน Messenger

แพลตฟอร์ม Messenger ไม่ต้องการการชำระเงินใด ๆ ในการใช้งาน มีไว้สำหรับธุรกิจในการจัดการข้อซักถามจากลูกค้า เมื่อคุณสร้างประสบการณ์สำหรับลูกค้าของคุณในการโต้ตอบแล้วคุณสามารถใช้ประโยชน์จากโฆษณาเพื่อนำผู้คนมาสัมผัสประสบการณ์ของคุณเช่นโฆษณา Click-to-Messenger หรือโฆษณาในกล่องจดหมาย

ประสบการณ์ Messenger for Business มีลักษณะอย่างไร เรามีตัวอย่างธุรกิจอีคอมเมิร์ซที่คุณสามารถแชทด้วย Messenger ชื่อ Original Coast Clothing

พูดคุยกับธุรกิจตัวอย่างที่นี่

ฉันจะเริ่มต้นได้อย่างไร? คุณสามารถเริ่มต้นได้โดยสร้างหน้าทดสอบและแอปทดสอบที่ให้คุณได้ลองใช้งานภายใน Messenger เรามีตัวอย่างบางส่วนที่ช่วยให้คุณเริ่มต้นได้ เมื่อแอปของคุณพร้อมใช้งานแล้วคุณสามารถส่งแอปเพื่อตรวจสอบได้ เมื่อแอปของคุณผ่านกระบวนการตรวจสอบของเราแอปจะพร้อมโต้ตอบกับสาธารณะ

ในการเริ่มต้นคุณจะต้องมี Messenger, หน้า Facebook และ URL ที่จะส่งเว็บฮุกไป

นี่คือคำแนะนำทีละขั้นตอนเพื่อปรับใช้ประสบการณ์ข้างต้นในหน้าทดสอบเพื่อเริ่มต้นใช้งาน

พร้อมที่จะสร้าง? เริ่ม

https://developers.facebook.com/products/messenger/

https://developers.facebook.com/docs/messenger-platform/reference/send-api/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.