XMPPHP GTalk 状态

Posted

技术标签:

【中文标题】XMPPHP GTalk 状态【英文标题】:XMPPHP GTalk Status 【发布时间】:2013-05-02 02:33:13 【问题描述】:

我正在尝试使用 XMPphp 获取我的在线状态,但我似乎无法从 $conn 获取任何具有我状态的内容。这是我的代码的 sn-p:

require_once('XMPPHP/XMPP.php');

$conn = new XMPPHP_XMPP('talk.google.com', 5222, 'xxxx@gmail.com', 'xxxxx', 'xmpphp', 'gmail.com', $printlog = false, $loglevel = XMPPHP_Log::LEVEL_INFO);

$conn->connect();
$conn->processUntil('session_start');
$conn->presence($status='Controller available.');
var_dump($conn); // this gives me a long output but nothing about status. ex: http://pastebin.com/yfs1V5Jb

我也尝试getRoster() 来查看我朋友的信息列表(虽然我只对我的感兴趣)但没有运气。

有什么建议可以让它工作吗?谢谢。

【问题讨论】:

我已经有一段时间没有集成到 XMPP 中了。您能否提高日志记录级别并向我们展示 Google 的原始响应? 地位如何?状态消息或状态离开/在线等?如果您需要状态消息,则 $conn->presence($status='Controller available.');是你的状态。 【参考方案1】:

在过去的 2 天里,我一直在努力解决这个问题,终于想出了一个让事情正常进行的技巧。我在这里记录它,因为这是我在搜索答案时最常出现的堆栈溢出问题。

$conn->presence() 方法不仅将您的状态信息发送到服务器;它还从服务器收集每个联系人的状态信息。根本问题是,当您发送 $conn->presence() 命令时,您必须给脚本时间来接收和处理来自服务器的这些信息。示例脚本都使用 $conn->processUntil('presence') 来执行此操作,但出于某种原因,我没有暂停足够长的时间来获取所有花名册信息。

为了解决这个问题,我最后只使用了 $conn->processTime(2),迫使事情在继续之前等待 2 秒。这对我的目的来说已经足够了,但显然是一个 hack。所以以你的代码为例:

require_once('XMPPHP/XMPP.php');

$conn = new XMPPHP_XMPP('talk.google.com', 5222, 'xxxx@gmail.com', 'xxxxx', 'xmpphp', 'gmail.com', $printlog = true, $loglevel = XMPPHP_Log::LEVEL_VERBOSE);

$conn->connect();
$conn->processUntil('session_start');
$conn->presence($status='Controller available.');
$conn->processTime(2);

// now see the results
$roster = $conn->roster->getRoster();
print_r($roster); // you should now see roster array with presence info for each contact

要更具体地回答您的问题,您可以使用以下代码代替“现在查看结果”下的代码:

$my_jid = 'user@domain.tld'; // put your jid here
$status = $conn->roster->getPresence($my_jid);
echo $status['show'];

这将显示您提供的 jid 的在线状态。

请注意,在此示例中,我还更改了构造函数以显示尽可能详细的日志。这是帮助我解决这个问题的关键。

一个更好的解决方案显然是在框架中添加一个 $conn->processUntil('roster') 命令,或者类似的东西。但由于框架已经 5 年没有更新,这不太可能发生。

希望这可以节省我试图解决问题的时间。干杯。

【讨论】:

获取PHP中特定服务的指定用户的即时通讯状态(在线、离线)。支持的服务有 AIM、Facebook*、GTalk、ICQ、Skype 和 YAHOO:github.com/ialphan/IMStatus 嗨,我添加了类似 $conn->processUntil('session_start'); $conn->存在(); $my_jid = 'test-adipso03@xxx.211.99.162'; // 把你的 jid 放在这里 $status = $conn->roster->getPresence($my_jid);回声 $status['show'];似乎对我不起作用。我无法获取用户的状态。它显示为空白! jayshahagile,您是否打开了尽可能详细日志的连接?日志应该指出您的问题。如果您需要更多帮助,请提出新问题并向我发送消息。【参考方案2】:

您应该能够通过将自己的 jid (username@gmail.com) 传递给 getPresence() 来请求自己的存在;

例如:

$status = $conn->roster->getPresence($jid);
var_dump($status);    // Make sure you are retrieving a populated presence array
echo $status['show']; // available,unavailable,dnd
echo $status['status']; //status message

不久前,我遇到了这个库没有填充名册记录的问题。如果你遇到这个问题,你应该应用这里详述的补丁:https://code.google.com/p/xmpphp/issues/detail?id=44&q=empty

【讨论】:

为什么不呢?你的名单是空的吗?有输出吗?错误?没有反馈..我无能为力。 你说得对,我的评论应该更具描述性。没有错误,只是返回了“NULL”。你有一个有效的测试页面吗? 很遗憾,由于保密协议,我无法透露我的工作页面。这可能是由于我上面提到的错误。您不能查询不在您名册中的用户是否存在。要测试您是否是此错误的受害者,您会发现 $conn->getRoster() 不会填充 roster 数组,但它会返回正确的 XML 响应(打开调试,您应该会看到“

以上是关于XMPPHP GTalk 状态的主要内容,如果未能解决你的问题,请参考以下文章

具有在线状态的 XMPPHP 名册

以编程方式更新 gtalk 状态?

使用 Java 设置 GTalk 状态 - GAE/J

在我的 GAE 应用程序中检查 Google 用户的 gtalk 好友在线状态,当他登录时

使用 Python 在 Google App Engine 上提供 Gtalk 服务

在 XMPP 客户端中更改传出状态节