php 调用facebook Api 发送chat消息 $fp = fsockopen("chat.facebook.com", 5222, $errno, $errstr);// 建立了链接;链接建立成功后,fwrite($fp, $xml); 却收不到信息;怎么发送chat消息,有做过Facebook Api 相关的大牛吗,官方Api 太操蛋了,木有找到相关文章。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?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"/>';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); print "send-->". htmlspecialchars($xml).'<br/>';}function recv_xml($fp, $size=4096) { $xml = fread($fp, $size); echo 'recv-->'.htmlspecialchars($xml).'<br/>'; 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; $fromTo = null; $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; }else{ $rJid = null; find_xmpp($fp,'JID',null,&$rJid); $fromTo = $rJid; echo '----JID------'.$fromTo; } send_xml($fp, $SESSION_XML); if (!find_xmpp($fp, 'SESSION')) { return false; } $xmlS = '<message from="'.$fromTo.'" to="[email protected]" type="chat"><body>test new message!</body></message>'; send_xml($fp, $xmlS); // we made it! send_xml($fp, $CLOSE_XML); print ("Authentication complete<br>"); fclose($fp); return true;}//Gets access_token with xmpp_login permissionfunction get_access_token($app_id, $app_secret, $my_url){ if(isset($_REQUEST["code"])){ $code = $_REQUEST["code"]; } else{ $code = null; } if(empty($code)) { $dialog_url = "http://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='184689651662288'; $app_secret='365e89aa8d143fcdefd2655c9e057a2b'; $my_url = "http://cn.nq.com/facebook/facebookchat.php"; $uid = '100004048670723'; $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>"; } //$xml = "<message from='[email protected]' to='[email protected]' ><body>测试发送消息</body></message>"; //send_xml($fp,$xml); //$rt = fgets($fp); //echo '<br/>';}_main();?> 请教用asp判断discuz论坛用户是否登录的问题 【分享】从零开始,开发一个五子棋棋谱记录系统(一) joomla修改组件源码无法显示修改效果 thinkphp html:list 谁能推荐几个纯php的中文聊天室程序 动态控制disabled 的属性 mstsc远程链接有问题,高手指点下! 安装配置Apache2.0.59+PHP5.1.6出现问题winXP php脚本没有运行! 关于ecshop中,只有脑残患者才能想出来的办法 关于HTML登陆界面的问题。。求助!!! Mediawiki如何删除页面上方的标题?
<?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"/>';
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);
print "send-->". htmlspecialchars($xml).'<br/>';
}function recv_xml($fp, $size=4096) {
$xml = fread($fp, $size);
echo 'recv-->'.htmlspecialchars($xml).'<br/>';
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;
$fromTo = null; $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;
}else{
$rJid = null;
find_xmpp($fp,'JID',null,&$rJid);
$fromTo = $rJid;
echo '----JID------'.$fromTo;
}
send_xml($fp, $SESSION_XML);
if (!find_xmpp($fp, 'SESSION')) {
return false;
}
$xmlS = '<message from="'.$fromTo.'" to="[email protected]" type="chat"><body>test new message!</body></message>';
send_xml($fp, $xmlS);
// 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){
if(isset($_REQUEST["code"])){
$code = $_REQUEST["code"];
} else{
$code = null;
} if(empty($code)) {
$dialog_url = "http://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='184689651662288';
$app_secret='365e89aa8d143fcdefd2655c9e057a2b';
$my_url = "http://cn.nq.com/facebook/facebookchat.php";
$uid = '100004048670723';
$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>";
}
//$xml = "<message from='[email protected]' to='[email protected]' ><body>测试发送消息</body></message>";
//send_xml($fp,$xml);
//$rt = fgets($fp);
//echo '<br/>';}_main();?>