2013-05-02 127 views
16

我试图让我的在线状态使用XMPPHP,我似乎无法得到任何有我的状态从$conn。这里是我的代码片段:XMPPHP GTalk状态

require_once('XMPPHP/XMPP.php'); 

$conn = new XMPPHP_XMPP('talk.google.com', 5222, '[email protected]', '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()看到我的朋友的信息列表(虽然我只对我的兴趣),但没有运气。

任何建议如何让这个工作?谢谢。

+0

自从我整合到XMPP中已经有一段时间了。你能否增加日志记录级别并向我们展示谷歌的原始响应? – Kevin 2013-05-07 18:45:58

+0

你如何看待地位?状态消息或状态离开/在线等?如果你需要状态消息,那么$ conn-> presence($ status ='Controller available。');是你的状态。 – pregmatch 2013-05-11 12:15:03

回答

5

我在过去的2天里一直在解决这个问题,最后想出了一个破解工具。我在这里记录它,因为这是在寻找答案时出现的最常见的堆栈溢出问题。

$ conn-> presence()方法不仅可以将您的状态信息发送到服务器,它还收集来自服务器的每个联系人的状态信息。根本问题是,当你发送$ conn-> presence()命令时,你必须给脚本时间来接收和处理来自服务器的这些信息。示例脚本都使用$ conn-> processUntil('presence')来做到这一点,但由于某些原因,我没有停下足够长的时间来获取所有的名单信息。

为了解决这个问题,我最终使用了$ conn-> processTime(2),强制要等待2秒才能继续。这对我的目的来说足够了,但显然是一种黑客。因此,使用你的代码为例:

require_once('XMPPHP/XMPP.php'); 

$conn = new XMPPHP_XMPP('talk.google.com', 5222, '[email protected]', '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 = '[email protected]'; // put your jid here 
$status = $conn->roster->getPresence($my_jid); 
echo $status['show']; 

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

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

更好的解决方案显然是向框架添加$ conn-> processUntil('roster')命令或类似的东西。但由于该框架在5年内未更新,因此不太可能发生。

希望这可以节省一些人,我失去了试图解决它的时间。干杯。

+0

就是这样。谢谢! – ialphan 2014-02-19 19:02:41

+0

获取PHP中特定服务的指定用户的即时通讯状态(联机,脱机)。支持的服务是AIM,Facebook *,GTalk,ICQ,Skype和YAHOO:https://github.com/ialphan/IMStatus – ialphan 2014-02-21 21:12:07

+0

嗨,我添加了类似 $ conn-> processUntil('session_start'); $ conn-> presence(); $ my_jid ='[email protected]'; //把你的jid放在这里 $ status = $ conn-> roster-> getPresence($ my_jid); echo $ status ['show']; 似乎不适合我。我无法获取用户的状态。它显示空白! – Shreejibawa 2014-06-24 11:42:35

-1

您应该可以通过将自己的jid([email protected])传递给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

+0

它不起作用。 – ialphan 2013-05-09 22:02:46

+0

为什么不呢?你的名单是空的吗?任何输出?错误?没有反馈..我无法帮助。 – Kevin 2013-05-10 15:02:16

+0

你说得对,我应该在我的评论中更具描述性。没有错误,只是返回“NULL”。你有测试页面吗? – ialphan 2013-05-10 15:49:59