2013-10-20 3 views
0

페이스 북의 주어진 채팅 api 코드 중 일부를 복사하여 수정했습니다. 이제 친구에게 메시지를 보내려고합니다. 우리가 메시지를 보내려면 <message from="" to=""> xml을 보내는 것을 발견했습니다. 그러나 그런 일은 일어나지 않았습니다. 어쩌면 그게 내가 fromto attrib를 붙일 지 모르기 때문일까? 나는이를 통해 해당 사용자에게 메시지를 보내려면 어떻게해야합니까, 내가 메시지와 함께 XML을 만들려고하지만,이 strucked있어 그래서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(); 

어느 한 제안하십시오 수 있습니다

코드가

내가 코드를 실행할 때 소켓 인 에이블 암호화가 실행되고있는 중 20 초 후에 오류가 발생하면 변경된 후 send_xml($fp,$STREAM_XML);을 두 번째로 제거해야합니까? 두 번째 매개 변수는이 호출의 false로 SSL 연결이 없기 때문에 다음에해야 할 일은 무엇입니까?

답변

1

URL 사용자 이름 대신 Facebook ID를 사용하십시오. http://graph.facebook.com/ {사용자 이름} 을 요청하여 가져옵니다. "보낸 사람"및 "받는 사람"속성에서 바꿉니다. 또한 "보낸 사람"속성에서 하이픈을 제거하거나 그것은 (내 경험을 통해 여전히 작동 할 것입니다.) "to"속성에 대한 하이픈은 필수 항목입니다.

+0

이 코드는 더 이상 작동하지 않습니까? Facebook에서 채팅 API를 사용 중지했습니다. – Wazzzy

+0

@Wazzzy 나는이 기능을 사용 중지했다고 생각합니다. http://stackoverflow.com/questions/23988889/ replacement-for-facebook-chat-api-in-v2-0 –

관련 문제