Facebook Xmpp 聊天 API 错误

Posted

技术标签:

【中文标题】Facebook Xmpp 聊天 API 错误【英文标题】:Facebook Xmpp Chat API Error 【发布时间】:2013-09-09 09:36:10 【问题描述】:

我正在使用以下代码向我的朋友发送聊天消息。但是这段代码不起作用。如果我做错了什么,请纠正我。 我一直在互联网上搜索这项工作并得到了这个代码。它没有显示任何错误,但我无法发送消息。

<?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;
  
  print("Connection Opened <br />");  


  // initiates auth process (using X-FACEBOOK_PLATFORM)
  send_xml($fp,  $STREAM_XML);
  if (!find_xmpp($fp, 'STREAM:STREAM')) 
    return false;
  
  print_r("XMPP Stream Found <br />");
  if (!find_xmpp($fp,  'MECHANISM', 'X-FACEBOOK-PLATFORM')) 
    return false;
  

  print_r("XMPP Mechanism Found <br />");
  // starting tls - MANDATORY TO USE OAUTH TOKEN!!!!
  send_xml($fp,  $START_TLS);
  if (!find_xmpp($fp, 'PROCEED', null, $proceed)) 
    return false;
  
  print_r("XMPP Proceed Found <br />");  
  stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);


  send_xml($fp, $STREAM_XML);
  if (!find_xmpp($fp, 'STREAM:STREAM')) 
    //return false;
    echo "1";
  
  if (!find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')) 
    //return false;
    echo "2";
  


    send_xml($fp, "<presence />");

     // send a message!
  $xml = "<message xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' xml:lang='en' to='-10000221168976@chat.facebook.com' from='-1000004775675@chat.facebook.com' type='chat'><body>Hello</body></message>";
  send_xml($fp, $xml);

  // 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='-- my app id -- ';
  $app_secret='-- secret of app --';
  $my_url = "http://mywebsite.com/facebook/";
  $uid = '1000004775675';
  $access_token = get_access_token($app_id,$app_secret,$my_url);

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



_main();

?>

有人有它的工作代码示例吗?

【问题讨论】:

我也面临这个......让我们等一下 【参考方案1】:
    function recv_xml($fp,  $size=4096) 
  $xml = fread($fp, $size);
  if (!preg_match('/^</', $xml)) 
    $xml = '<' . $xml;
  
  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);

这可以帮助你。

https://developers.facebook.com/bugs/192933747546649

【讨论】:

以上是关于Facebook Xmpp 聊天 API 错误的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 聊天 API - XMPP 输入暂停通知

xmpp 对 facebook 聊天 api 的身份验证并总是收到失败

使用 ruby​​ gem xmpp 进行 Facebook 聊天

WinRT 中的 Facebook 聊天 API/XMPP X-FACEBOOK-PLATFORM

XMPP 聊天 API 超时

XMPP facebook 聊天权限与 PHP