Facebook XMPP 聊天 API 发送消息 PHP

2023-11-23

我目前正在研究 Facebook Chat API。我想通过应用程序向我的 Facebook 联系人发送聊天消息。

使用 facebook 提供的示例,我能够连接到 facebook 聊天服务器。 但这更多的是一种反复试验的事情。我只能模糊地理解请求和响应是如何发送和接收的。如果有人可以提供进一步的解释或进一步的阅读,那就太好了。

我的实际问题是:连接到聊天服务器后如何发送消息?

<?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;
  }
  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;
  }
  send_xml($fp, $SESSION_XML);
  if (!find_xmpp($fp, 'SESSION')) {
    return false;
  }

  // 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='';
  $app_secret='';
  $my_url = "";
  $uid = '';
  $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>";
  }

}

_main();

?>

我知道这里已经有这样的问题了(Facebook 聊天 API - php)。但这是一个相当古老的话题,也许 Facebook 改变了他们的聊天 API 中的一些内容。


您应该将消息发送到套接字命令。常见的消息格式是

<message from="[email protected]" to="[email protected]">
    <body>message body</body>
</message>

所以在评论“我们做到了!”之前使用消息模板插入函数调用 send_xml

send_xml($fp, $MESSAGE);
if (!find_xmpp($fp, 'BODY')) {
    return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Facebook XMPP 聊天 API 发送消息 PHP 的相关文章

  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • Facebook 通过 API“Boost Post”?

    我一直在浏览文档 发现可以通过 Facebook 广告 API 实现 Boost Post 功能 但是 我在查找 Boost Post 到底有什么作用时遇到了一些困难 即 API 的哪一部分对应 Facebook UI 的 Boost Po
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • ios 用户如何取消 Facebook 登录?

    当用户到达此屏幕时 无法取消 我能做些什么 为了首先获得这个视图 我正在运行 NSMutableDictionary params NSMutableDictionary dictionaryWithObjectsAndKeys vid l
  • 如何使用 Twig 的属性函数访问嵌套对象属性

    我试图使用一个树枝变量来访问另一个树枝变量的属性 直到我找到 属性 函数为止 该变量才起作用 除了需要访问嵌套属性的情况外 效果很好 当包含属性的变量实际上是对象 属性时 它不起作用 例如 attribute object1 variabl
  • 如何解码 eval( gzinflate( base64_decode(

    我已将此代码注入到我的网站中 如何解码尾随字符串 我需要知道发生了什么以及其背后的代码是什么 这应该输出将被执行的代码eval 我希望这就是您正在寻找的
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • 使用php将数据存储到文本文件中?

    我正在尝试将数据存储在文本文件中 例如使用 php 将数组存储到文本文件中 而不是存储到 mysql 数据库中 例如 这里是要存储在文本文件中的数据 name gt john age gt 25 location gt australia
  • fgetcsv 在特定行打开?

    有没有办法使用 fgetcsv 在特定行上打开 我有一个非常大的 csv 想通过 ajax 一次运行大约 100 行 我可以轻松停止 while 循环 但如何在特定行上打开 或者这是不可能的 从第 100 行开始读取没有简单的方法 但您可以
  • 如何使用 ejabberd 进行视频通话?

    如何使用ejabberd进行视频通话 如msn和skype ejabberd 本身不处理音频 视频 音频和视频通过 Jingle XEP 0166 进行处理 这是客户端到客户端的 如果您想发出音频或视频呼叫 您应该确保两个客户端都通过正常的
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV

随机推荐

  • StackNavigator 通过 Component 给出未定义的错误

    我试图使用 StackNavigator 进行导航 当我使用它从一个屏幕转到另一个屏幕时它会起作用 如所解释的那样here 但是 当我尝试让子组件自行导航时 导航似乎不起作用 并且我找不到任何解决方案 正如下面的代码所示 我尝试使用测试组件
  • 从两个不同位置安装 ClickOnce 应用程序

    我有一个在 NET Framework 3 5 Service pack 1 中使用 C 开发的 Windows 窗体应用程序 该应用程序可以基于开发数据库以及生产数据库进行发布 我正在使用 MSBuild 社区任务来发布我的应用程序 将应
  • .NET Winforms 应用程序是否有自动升级的标准方法?

    如果您有一个安装在大量机器上的Winforms应用程序 是否有实现自动升级功能的标准方法 例如每次启动时 它都会检查网站或网络服务 如果有可用的新版本 它就会下载并安装它 我可以弄清楚如何推出我自己的版本 但我想知道是否已经有任何框架可以帮
  • Android - 如何从微调器中获取所选项目值并将其放入字符串中?

    我在这个帖子上读到了很多类似的问题 但没有一个对我有帮助 这是我的代码 Override protected void onCreate Bundle savedInstanceState super onCreate savedInsta
  • 使用 R 中的 dplyr 查找一列字符串位于另一列中的行

    希望拉回其中一列中的值作为字符串存在于另一列 同一行内 中的行 我有一个 df A lt c cat dog boy B lt c cat in the cradle meet the parents boy mmets world df
  • 如何投影字段是否存在

    如果我有类似结构的文档如下 我正在用计算结果更新它们 我想知道结果是否已经插入到文档中 假设我对每个文档运行计算 c 和计算 d 现在我想显示所有文档的表格并显示计算 d 是否已经执行 对于这个表 我不关心计算 c id 1 a 1 res
  • 强制 JSON.NET 在序列化 DateTime 时包含毫秒(即使 ms 分量为零)

    我使用 JSON NET 直接从对象实例序列化 DateTime 值 不使用带有格式化程序的 DateTime ToString 有没有办法强制 JSON NET 在序列化中包含毫秒 即使 DateTime 的毫秒部分为零 背景 我的这个
  • 用常量列向量替换矩阵中的特定列

    对于神经网络 我想表示一个列向量y 1 2 3 在这样的矩阵中 y 1 0 0 0 1 0 0 0 1 我的矢量y非常大 因此不能选择硬编码 另外 我想避免使用for loops 到目前为止我做了什么 y1 y zeros 1 length
  • 如果您递增一个等于 STL 容器的结束迭代器的迭代器,会发生什么

    如果当迭代器指向向量的最后一个元素时将其增加 2 会怎样 在这个问题询问如何通过 2 个元素将迭代器调整为 STL 容器 提供了两种不同的方法 使用算术运算符 2 或 两次 或使用 std advance 我已经使用 VC 7 对它们进行了
  • Android 应用程序锁定相机

    是否可以获取当前在 Android 设备上锁定相机的应用程序 进程的 Android 应用程序 进程 ID 或包名称或其他 使用以下命令很容易查看它是否已锁定Camera open 但我想找出有它的过程 Thanks CameraServi
  • 如何解决 sqlite 和 c# 中的“'”问题?

    我正在使用 Sqlite 使用 Microsoft Visual C 2008 Express 我知道我的文本中的撇号 在查询中存在问题 我的问题是我认为我可以用 替换它 它似乎不起作用 这是我的代码的简化示例 string myStrin
  • 如何安全地访问 Django 模型中的请求对象

    我正在尝试做的事情 我正在尝试访问我的 django 模型中的请求对象 以便我可以使用以下命令获取当前登录的用户request user 我尝试过的 我发现了一个黑客this地点 但评论中有人指出在生产时不要这样做 我还尝试覆盖模型的 in
  • 计算预测值时发出警告

    使用数据框 x Date Val 1 1 2012 7 2 1 2012 9 3 1 2012 20 4 1 2012 24 5 1 2012 50 a lt seq as Date tail x 1 Date by month lengt
  • 序列化 Jackson JSON 树模型时排除 NullNode

    我有一个 pojo 类型 在序列化时需要将特定数值设置为特殊字符串 这些值将始终为空 可能非常深入层次结构 为了实现这一点 我首先将 pojo 转换为带有完整 null 的 JsonNode 以保留属性顺序 然后我沿着结构中的路径设置一些字
  • 验证动态添加的控件

    如何将动态添加的控件添加到验证中 div class editor field Html EditorFor model gt model Middlename div div div
  • 从 Chrome 控制台使用 Tampermonkey API?

    有什么办法使用篡改猴的 API在 Chrome 的 JavaScript 控制台中 我想搞乱像这样的功能GM xmlhttpRequest and GM listValues 创建以下脚本 UserScript name Exports s
  • Polymer:手动提交表单

    在聚合物中 我正在尝试手动提交表单 我的表格如下所示
  • 获取两个多边形相交区域的坐标(Python)

    假设我有两个多边形 它们的名称和坐标是 在 Python 中 p 1 1 2 2 4 2 3 1 q 1 5 2 3 5 5 4 3 5 1 在我们人脑中 很容易知道这两个多边形相交并计算相交区域坐标 但我想让我们的机器知道如何计算相交区域
  • 在 Unity 中显示实时摄像头源

    我有一个关于 Unity 的问题 我希望这个问题之前没有得到回答 我想将相机 如高清摄像头 连接到我的计算机 并且视频源应显示在我的 Unity 场景中 可以将其想象为虚拟电视屏幕 实时显示摄像机所看到的内容 我怎样才能做到这一点 谷歌没有
  • Facebook XMPP 聊天 API 发送消息 PHP

    我目前正在研究 Facebook Chat API 我想通过应用程序向我的 Facebook 联系人发送聊天消息 使用 facebook 提供的示例 我能够连接到 facebook 聊天服务器 但这更多的是一种反复试验的事情 我只能模糊地理