2013-10-20 179 views
0

我已經複製並修改了一些facebook的給定聊天api代碼,現在我想發送消息給我的朋友。我發現我們發送了一個xml <message from="" to="">來發送消息。但是那沒有發生。也許這是因爲我不知道fromto attribs上放什麼?用facebook xmpp api發送消息

驗證碼:

<?php 
$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">'; 

$AUTH_XML = '<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" '. 
    'mechanism="X-FACEBOOK-PLATFORM"></auth>'; 

$CLOSE_XML = '</stream:stream>'; 

$RESOURCE_XML = '<iq type="set" id="3">'. 
    '<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">'. 
    '<resource>fb_xmpp_script</resource></bind></iq>'; 

$SESSION_XML = '<iq type="set" id="4" to="chat.facebook.com">'. 
    '<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>'; 

$START_TLS = '<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>'; 

$MESSAGE = '<message from="[email protected]" to="[email protected]"> 
    <body>This is the test message! Sent from App. by, "Nishchal"</body> 
</message>'; 

function open_connection($server) { 
    $fp = fsockopen($server, 5222, $errno, $errstr); 
    if (!$fp) { 
    print "$errstr ($errno)<br>"; 
    } else { 
    print "connnection open<br>"; 
    } 
    return $fp; 
} 
function send_xml($fp, $xml) { 
    fwrite($fp, $xml); 
} 
function recv_xml($fp, $size=4096) { 
    $xml = fread($fp, $size); 
    if (!preg_match('/^</', $xml)) { 
    $xml = '<' . $xml; 
    } 
    if ($xml === "") { 
    return null; 
    } 

    $xml_parser = xml_parser_create(); 
    xml_parse_into_struct($xml_parser, $xml, $val, $index); 
    xml_parser_free($xml_parser); 
    return array($val, $index); 
} 
function find_xmpp($fp, $tag, $value=null, &$ret=null) { 
    static $val = null, $index = null; 
    do { 
    if ($val === null && $index === null) { 
     list($val, $index) = recv_xml($fp); 
     if ($val === null || $index === null) { 
     return false; 
     } 
    } 

    foreach ($index as $tag_key => $tag_array) { 
     if ($tag_key === $tag) { 
     if ($value === null) { 
      if (isset($val[$tag_array[0]]['value'])) { 
      $ret = $val[$tag_array[0]]['value']; 
      } 
      return true; 
     } 
     foreach ($tag_array as $i => $pos) { 
      if ($val[$pos]['tag'] === $tag && isset($val[$pos]['value']) && 
      $val[$pos]['value'] === $value) { 
       $ret = $val[$pos]['value']; 
       return true; 
      } 
     } 
     } 
    } 
    $val = $index = null; 
    } while (!feof($fp)); 
    return false; 
} 
function xmpp_connect($options, $access_token) { 
    global $STREAM_XML, $AUTH_XML, $RESOURCE_XML, $SESSION_XML, $CLOSE_XML, $START_TLS; 
    $fp = open_connection($options['server']); 
    if (!$fp) { 
    return false; 
    } 
    send_xml($fp, $STREAM_XML); 
    if (!find_xmpp($fp, 'STREAM:STREAM')) { 
    return false; 
    } 
    if (!find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')) { 
    return false; 
    } 
    send_xml($fp, $START_TLS); 
    if (!find_xmpp($fp, 'PROCEED', null, $proceed)) { 
    return false; 
    } 
    stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); 
    send_xml($fp, $STREAM_XML); 
    if (!find_xmpp($fp, 'STREAM:STREAM')) { 
    return false; 
    } 
    if (!find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')) { 
    return false; 
    } 
    send_xml($fp, $AUTH_XML); 
    if (!find_xmpp($fp, 'CHALLENGE', null, $challenge)) { 
    return false; 
    } 
    $challenge = base64_decode($challenge); 
    $challenge = urldecode($challenge); 
    parse_str($challenge, $challenge_array); 
    $resp_array = array(
    'method' => $challenge_array['method'], 
    'nonce' => $challenge_array['nonce'], 
    'access_token' => $access_token, 
    'api_key' => $options['app_id'], 
    'call_id' => 0, 
    'v' => '1.0', 
); 
    $response = http_build_query($resp_array); 
    $xml = '<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">'. 
    base64_encode($response).'</response>'; 
    send_xml($fp, $xml); 
    if (!find_xmpp($fp, 'SUCCESS')) { 
    return false; 
    } 
    send_xml($fp, $STREAM_XML); 
    if (!find_xmpp($fp,'STREAM:STREAM')) { 
    return false; 
    } 
    if (!find_xmpp($fp, 'STREAM:FEATURES')) { 
    return false; 
    } 
send_xml($fp, $RESOURCE_XML); 
    if (!find_xmpp($fp, 'JID')) { 
    return false; 
    } 
    send_xml($fp, $SESSION_XML); 
    if (!find_xmpp($fp, 'SESSION')) { 
    return false; 
    } 
    send_xml($fp, $MESSAGE); 
    if (!find_xmpp($fp, 'BODY')) { 
    return false; 
    } 
    send_xml($fp, $CLOSE_XML); 
    print ("Authentication complete<br>"); 
    fclose($fp); 
    return true; 
} 
function get_access_token(){ 
$token=new Facebook(array("AppId"=>"my app id","AppSecret"=>"my app secret")); 
$token=$facebook->getAccessToken(); 
return $token; 
} 
function _main() { 
    require_once("facebook.php"); 
    $app_id='app id'; 
    $app_secret='app secret'; 
    $my_url = "http://localhost/message.php"; 
    $uid = '[email protected]'; 
    $access_token = get_access_token(); 
    $options = array(
    'uid' => $uid, 
    'app_id' => $app_id, 
    'server' => 'chat.facebook.com', 
    ); 
    if (xmpp_connect($options, $access_token)) { 
    print "Done<br>"; 
    } else { 
    print "An error ocurred<br>"; 
    } 
} 
_main(); 

等什麼,我需要做的將消息發送到通過這個用戶,我試圖創建與該消息的XML,但得到了strucked那裏,任何一個可以請建議東西,當我運行的代碼,套接字啓用加密後,它需要一些時間,如20秒,然後它顯示錯誤發生,我必須刪除send_xml($fp,$STREAM_XML);第二次後stream_socket_enable_crypto($fp, false, STREAM_CRYPTO_METHOD_TLS_CLIENT); 我改變了此調用的第二個參數爲false,因爲我沒有ssl連接,接下來應該做什麼?

回答

1

使用Facebook ID代替URL username.Get它通過請求http://graph.facebook.com/ {用戶名} 然後取代它的「從」和「到」 attributes.Also「從」屬性中刪除連字符,或者只是刪除所有的它(從我的經驗來看,它仍然有效)。關於「to」屬性的說明是強制性的。

+0

此代碼是否可以工作....我看到Facebook棄用他們的聊天API ... – Wazzzy

+0

@Wazzzy我認爲他們已經禁用它,現在看到這個答案:http://stackoverflow.com/questions/23988889/更換換Facebook的聊天API功能於v2-0 –