2013-04-24 224 views
0

只是試圖用Facebook Chat API開始我的一個小項目,但我已經失敗了。這主要是來自Facebook開發站點的示例代碼。Facebook聊天API:身份驗證

爲什麼這不連接?我所得到的是「發生錯誤」。

<?php 
// Copyright 2004-present Facebook. All Rights Reserved. 

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


function open_connection($server) { 
    print "[INFO] Opening connection... "; 

    $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 ($xml === "") { 
    return null; 
    } 

    // parses xml 
    $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; 
    } 

    // initiates auth process (using X-FACEBOOK_PLATFORM) 
    send_xml($fp, $STREAM_XML); 
    if (!find_xmpp($fp, 'STREAM:STREAM')) { 
    return false; 
    } 
    if (!find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')) { 
    return false; 
    } 

    // starting tls - MANDATORY TO USE OAUTH TOKEN!!!! 
    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; 
    } 

    // gets challenge from server and decode it 
    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); 

    // creates the response 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', 
); 
    // creates signature 
    $response = http_build_query($resp_array); 

    // sends the response and waits for success 
    $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; 
    } 

    // finishes auth process 
    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; 
    } 

    // we made it! 
    send_xml($fp, $CLOSE_XML); 
    print ("Authentication complete<br>"); 
    fclose($fp); 

    return true; 
} 



//Gets access_token with xmpp_login permission 
function get_access_token($app_id, $app_secret, $my_url){ 

    $code = $_REQUEST["code"]; 

    if(empty($code)) { 
    $dialog_url = "https://www.facebook.com/dialog/oauth?scope=xmpp_login". 
    "&client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) ; 
    echo("<script>top.location.href='" . $dialog_url . "'</script>"); 
    } 
    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=" 
    . $app_id . "&redirect_uri=" . urlencode($my_url) 
    . "&client_secret=" . $app_secret 
    . "&code=" . $code; 
    $access_token = file_get_contents($token_url); 
    parse_str($access_token, $output); 

    return($output['access_token']); 
} 

function _main() { 
    print "Test platform connect for XMPP<br>"; 
    $app_id='APP ID'; 
    $app_secret='APP SECRET'; 
    $my_url = "URL OF THIS PHP FILE"; 
    $uid = '1496822489'; 
    $access_token = get_access_token($app_id,$app_secret,$my_url); 
    print "access_token: ".$access_token."<br>"; 

    $options = array(
    'uid' => $uid, 
    'app_id' => $app_id, 
    'server' => 'chat.facebook.com', 
    ); 

    // prints options used 
    print "server: ".$options['server']."<br>"; 
    print "uid: ".$options['uid']."<br>"; 
    print "app id: ".$options['app_id']."<br>"; 

    if (xmpp_connect($options, $access_token)) { 
    print "Done<br>"; 
    } else { 
    print "An error ocurred<br>"; 
    } 

} 
// first test 
function goOnline() { 
$message = '<presence />'; 
send_xml($fp, $message); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
<title>test fb api</title> 
</head> 
<body> 
<?php _main(); ?> 
</body> 
</html> 
+0

我希望你正在放置正確的細節來代替'$ app_id ='APP ID';'和'$ app_secret ='APP SECRET';'... – 2013-04-24 12:12:24

+0

是的,我並不那麼愚蠢。它重定向回到php文件,但我回來的是一個「發生錯誤」。 – 2013-04-24 12:21:43

+0

嘿@TobiasTimpe你有解決方案嗎? – Hemc 2014-03-12 09:53:15

回答

1

這似乎與每個人一起工作..可能關閉的某些東西......當我們使用用戶ID爲xmpp。 Facebook要求我們加入 - 在前面。例如..如果我的用戶ID是777,我的jabber ID將是[email protected],另一件事是你可能會傳遞你的應用程序的祕密,而不是app_id在應用程序的關鍵..你顯然有xmpp_login權限這不應該是一個問題..只需要照顧。我不能說任何這些幫助..但只是一些建議。