2013-05-02 52 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