0

我已经复制并修改了一些 facebook 给定的聊天 api 代码,现在我想给我的朋友发送消息。我发现我们发送一个xml<message from="" to="">来发送消息。但那并没有发生。也许是因为我不知道穿什么fromto属性?

编码:

<?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="-cyberkiller.nishchal@chat.facebook.com" to="-nootan.ghimire@chat.facebook.com">
    <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 = 'cyberkiller.nishchal@chat.facebook.com';
  $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,但在那里被击中,任何人都可以提出一些建议,当我运行代码时,正在执行套接字启用加密之后它需要大约 20 秒的时间,然后它显示发生错误,我是否必须在我将此调用的第二个参数更改为 falsesend_xml($fp,$STREAM_XML);后第二次删除,stream_socket_enable_crypto($fp, false, STREAM_CRYPTO_METHOD_TLS_CLIENT); 因为我没有 ssl 连接,接下来我该怎么办?

4

1 回答 1

0

使用 Facebook ID 而不是 url 用户名。通过请求http://graph.facebook.com/ {username} 获取它然后在“from”和“to”属性上替换它。同时删除“from”属性上的连字符,或者只需删除所有内容(根据我的经验,它仍然可以工作)。“to”属性上的连字符是强制性的。

于 2013-10-26T23:57:47.193 回答