官方API文档: https://developers.facebook.com/docs/chat/

下面是根据文档修改的类:

<?php

class Invite_Chat{
protected static $_instance = array();
private $server = 'chat.facebook.com'; // fb xmpp 服务器
private $access_token = ''; // FB chat XMPP 标准
private $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">'; private $AUTH_XML = '<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl"
mechanism="X-FACEBOOK-PLATFORM"></auth>'; private $CLOSE_XML = '</stream:stream>'; private $RESOURCE_XML = '<iq type="set" id="3">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
<resource>fb_xmpp_script</resource></bind></iq>'; private $SESSION_XML = '<iq type="set" id="4" to="chat.facebook.com">
<session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>'; private $START_TLS = '<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>'; /**
*
* @return Invite_Chat
*/
public static function factory(){
if( !is_object( self::$_instance['invite_chat'])){
self::$_instance['invite_chat'] = new Invite_Chat();
}
return self::$_instance['invite_chat'];
} /**
*
* 获取用户access_token
* @param unknown_type $from
*/
public function getAccessToken($from){
// 根据FB API 获取access token 这里需要自己处理
return $this->access_token;
}
/**
*
* 连接xmpp server
* @param unknown_type $server
*/
public function open_connection($server){
$fp = fsockopen($server, 5222, $errno, $errstr);
if(!$fp){
// print "$errstr ($errno)<br>";
}else{
// print "connnection open<br>";
}
return $fp;
}
/**
*
* 发送xmpp文件流
* @param unknown_type $fp
* @param unknown_type $xml
*/
public function send_xml($fp, $xml){
fwrite($fp, $xml);
}
/**
*
* 接收xmpp文件流
* @param unknown_type $fp
* @param unknown_type $size
*/
public 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);
}
/**
*
* 解析xmpp文件流
* @param unknown_type $fp
* @param unknown_type $tag
* @param unknown_type $value
* @param unknown_type $ret
*/
public function find_xmpp($fp, $tag, $value=null, &$ret=null) {
static $val = null, $index = null;
do {
if ($val === null && $index === null) {
list($val, $index) = $this->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;
}
/**
*
* xmpp 通信
* @param unknown_type $options
* @param unknown_type $access_token
* @param unknown_type $message
*/
public function xmpp_connect($options, $access_token, $message){
$fp = $this->open_connection($options['server']);
if(!$fp){
return -1;
}
// initiates auth process (using X-FACEBOOK_PLATFORM)
$this->send_xml($fp, $this->STREAM_XML);
if(!$this->find_xmpp($fp, 'STREAM:STREAM')){
return -2;
}
if(!$this->find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')){
return -3;
} // starting tls - MANDATORY TO USE OAUTH TOKEN!!!!
$this->send_xml($fp, $this->START_TLS);
if(!$this->find_xmpp($fp, 'PROCEED', null, $proceed)){
return -4;
}
stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); $this->send_xml($fp, $this->STREAM_XML);
if(!$this->find_xmpp($fp, 'STREAM:STREAM')){
return -5;
}
if(!$this->find_xmpp($fp, 'MECHANISM', 'X-FACEBOOK-PLATFORM')){
return -6;
} // gets challenge from server and decode it
$this->send_xml($fp, $this->AUTH_XML);
if(!$this->find_xmpp($fp, 'CHALLENGE', null, $challenge)){
return -7;
}
$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>';
$this->send_xml($fp, $xml);
if (!$this->find_xmpp($fp, 'SUCCESS')) {
return -8;
} // finishes auth process
$this->send_xml($fp, $this->STREAM_XML);
if(!$this->find_xmpp($fp,'STREAM:STREAM')) {
return -9;
}
if(!$this->find_xmpp($fp, 'STREAM:FEATURES')){
return -10;
} $this->send_xml($fp, $this->RESOURCE_XML);
if(!$this->find_xmpp($fp, 'JID')){
return -11;
}
$this->send_xml($fp, $this->SESSION_XML);
if(!$this->find_xmpp($fp, 'SESSION')){
return -12;
} // send messages
$this->send_xml($fp, $message); // we made it!
$this->send_xml($fp, $this->CLOSE_XML);
// print ("Authentication complete<br>");
fclose($fp);
return true;
}
/**
*
* 发送chat 信息
* @param $from 发送者id
* @param $to_puid 接收者id
* @param $message 消息。 例: http://www.google.com 直接输入连接即可
*/
function chat($from, $to_puid, $message){
$app_id= '应用appid';
$app_secret= '应用secret';
$my_url = '应用app_url'; $message_xml = '<message to="-'.$to_puid.'@chat.facebook.com" from="-'.$from.'@chat.facebook.com" >'.
'<body>'.$message.'</body>'.
'</message>'; $options = array(
'uid' => $from,
'app_id' => $app_id,
'server' => $this->server
);
$access_token = $this->getAccessToken($from);
if(empty($access_token)){
return false;
}
if($this->xmpp_connect($options, $access_token, $message_xml) > 0){
return true;
}else{
return false;
}
} } // end class

需要注意的地方:

1. 官方文档没有写明在哪里添加消息发送。如果想了解详情,最好去看看XMPP协议。

2. 使用Chat API 接口,需要先获取Chat 权限。

3. access_token 和官方的获取方式不同,这个可以根据自己的应用的结构进行调整。

获取chat 权限:

js 方法:

function getXmpplogin(){
FB.ui({ method : 'permissions.request',perms : 'xmpp_login'}, function(r){
console.log(r);
});
} getXmpplogin();

url 方法:

<?php

$appid = '';
$secret = '';
$appurl = ''; $url = 'https://www.facebook.com/dialog/oauth?scope=PERMISSIONS_NAME&client_id=APPID&redirect_uri=APPURL';

facebook chat api 使用的更多相关文章

  1. Facebook广告API系列 1

    Facebook广告API系列 1 前言 最近遇到大坑了,居然要去对接facebook的广告API,之前以为是跟鹅厂一样的API体系,看了半天Facebook的文档,冷汗直冒.... 这得一点一点的讲 ...

  2. Facebook广告API系列 2 - Audience Management

    Facebook广告API系列 2 Facebook marketing API有三大组成部分: Audience Management Ads Management Ads Insights 本篇稍 ...

  3. Facebook广告API系列 3 Ads Management

    Facebook广告API系列 3 Facebook marketing API有三大组成部分: Audience Management Ads Management Ads Insights 本篇介 ...

  4. Facebook广告API系列 Business Manager

    Facebook广告API系列 Business Manager Business Manager,是个很牛叉的东西,有多牛叉呢? 因为facebook已经越来越商业化了,上面的每个账号,页面,往往都 ...

  5. facebook graph api 报错SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)')

    使用facebook graph api,报错如下 一开始以为是https证书验证失败,查了一下午源码,没有看到问题,于是把Python27\lib\site-packages\requests\ad ...

  6. facebook chat 【转】

    Facebook Chat, offered a nice set of software engineering challenges: Real-time presence notificatio ...

  7. facebook ads api

    api测试 https://developers.facebook.com/tools/explorer/517735271920003?method=GET&path=act_1107316 ...

  8. FaceBook登陆API -- Login with API calls

    Login with API calls Related Topics Understanding sessions FBSession Error handling FBError FBLoginC ...

  9. facebook javascript api 使用

    官方api文档:http://developers.facebook.com/docs 先简单的介绍下创建一个app(https://developers.facebook.com/apps),

随机推荐

  1. hdu 2845简单dp

    /*递推公式dp[i]=MAX(dp[i-1],dp[i-2]+a[j])*/ #include<stdio.h> #include<string.h> #define N 2 ...

  2. centos下wget时提示unable to resolve host address ...

    网络正常的情况,可以查看/etc/resolv.conf [root@localhost ~]# more /etc/resolv.conf # Generated by NetworkManager ...

  3. Codeforces 848C (cdq分治)

    Codeforces 848C Goodbye Souvenir Problem : 给一个长度为n的序列,有q个询问.一种询问是修改某个位置的数,另一种询问是询问一段区间,对于每一种值出现的最右端点 ...

  4. php之memcache学习

    php之memcache学习 简介: memcache是一个分布式高速缓存系统. 分布式是说可以部署在多台服务器上,实现集群效果: 高速是因为数据都是维护在内存中的: 特点和使用场景: 1.非持久化存 ...

  5. Python()-类命名空间和对象/实例命名空间

    类命名空间和对象/实例命名空间: 创建类, 就会创建一个类的名称空间, 空间:存储类的属性 属性: 静态属性:直接定义在类下面 & 和类名关联 的变量 对象属性:在类内和self关联 & ...

  6. poj - 3254 Corn Fields (状态压缩dp入门)

    http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...

  7. MySQL查询count(*)、count(1)、count(field)的区别收集

    经过查询研究得出这个和MySQL中用什么引擎有关,比如InnoDB和MyISAM在处理这count(*).count(1).count(field)都有不同的方式,还有就是和版本都有关系,不同的版本会 ...

  8. 【Nginx】ngx_event_core_module事件模块

    功能:创建连接池,决定使用哪些事件驱动机制,以及初始化将要使用的事件模块 该模块定义了ngx_event_core_commands数组处理其感兴趣的7个配置项 ngx_event_conf_t为该模 ...

  9. vue 自定义 移动端筛选条件

    1.创建组件 components/FilterBar/FilterBar.vue <template> <div class="filterbar" :styl ...

  10. CALayer与UIView的关系

    CALayer属于Core Animation部分的内容,比较重要而不太好理解.以下是园子中看到的一篇文章的摘录: 1. UIView是iOS系统中界面元素的基础,所有的界面元素都是继承自它.它本身完 ...