XMPPHP GTalk 状态

16

我正在尝试使用 XMPPHP 获取我的在线状态,但似乎无法从 $conn 中获取任何与我的状态有关的信息。这是我的代码片段:

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的原始响应? - Kevin
你是指什么意思的状态?是状态消息还是离开/在线等状态?如果你需要状态消息,那么$conn->presence($status='Controller available.');就是你的状态。 - pregmatch
2个回答

5
我在过去的两天一直在处理这个问题,最终找到了一个解决办法。我在此记录下来,因为这是我在搜索答案时最常见的Stack Overflow问题。 $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:https://github.com/ialphan/IMStatus - ialphan
嗨,我添加了类似以下内容: $conn->processUntil('session_start'); $conn->presence(); $my_jid = 'test-adipso03@xxx.211.99.162'; // 在此处输入您的jid $status = $conn->roster->getPresence($my_jid); echo $status['show'];但是对我来说似乎不起作用。我无法获取用户的状态。它显示为空! - Shreejibawa
jayshahagile,你是否以最详细的日志打开了连接?日志应该指向问题所在。如果你需要更多帮助,请开始一个新的问题并私信我。 - lwitzel

-1

你应该能够通过将自己的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


为什么不行?你的名单是空的吗?有任何输出?错误?没有反馈.. 我无法帮助。 - Kevin
你说得对,我在评论中应该更加详细。没有错误,只是返回了“NULL”。你有一个可用的测试页面吗? - ialphan
很遗憾,由于保密协议,我无法透露我的工作页面。这可能是由于我上面提到的错误导致的。您不能查询不在您的花名册中的用户是否存在。要测试是否受此错误影响,您会发现 $conn->getRoster() 不会填充花名册数组,但它会返回正确的 XML 响应(打开调试,您应该会看到 "<iq .. type='result'><queryxmlns='jabber:iq:roster'><item ..")。补丁可能会给您一个警告,但很容易修复。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接