【问题标题】:XMPPHP roster with online status具有在线状态的 XMPPHP 名册
【发布时间】:2009-08-21 10:32:10
【问题描述】:

我正在使用 XMPPHP 检索我的应用程序用户 GMail 帐户的花名册。
XMPPHP 也可以告诉我名册联系人在线状态吗?
我似乎无法找到如何做到这一点...

干杯。

【问题讨论】:

    标签: php xmpp


    【解决方案1】:

    这是一个花名册列表和 GMail 用户在线状态的示例;

    $user_name = 'ENTER_EMAIL_ID';
    $password = 'ENTER_PASSWORD';
    $end_loop = 0;
    
    $conn = new XMPPHP_XMPP('talk.google.com', 5222, $user_name,$password, "xmpphp", 'gmail.com', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
    $conn->autoSubscribe(); 
    
    try {
        $conn->connect();   
        while($end_loop <=0) {
            $payloads = $conn->processUntil(array('end_stream', 'session_start','roster_received'));
            foreach($payloads as $event) {
                $pl = $event[1];
                switch($event[0]) {
    
                    case 'session_start':
                        $conn->getRoster();
                        $conn->presence('I m presence'.time());
                    break;
    
                    case 'roster_received':
                    $array_contact=$pl;
    
                    foreach($array_contact as $user => $friends_name){
                        echo "<li>".$user.'_NAME_'.$friends_name['name'].'</li>';
                    }
                    $end_loop++;
                    break;
                }
            }       
        }
    
        while(1)
        {
            $payloads = $conn->processUntil(array('presence'));
            echo "<li>".$payloads[0][1]['from']."_Show_". $payloads[0][1]['show']."</li>";
    
            $_SESSION[$payloads[0][1]['from']] = "~~";
        }
    
    $conn->disconnect();
    
    } catch(XMPPHP_Exception $e) {
        die($e->getMessage());
    }
    

    【讨论】:

    • 虽然我正在处理这个问题,但 processUntil('roster_received') 从未触发过 'roster_received',最终对我来说是一个无限循环。
    【解决方案2】:

    我没有用 Google Talk 尝试过,但通常你正在寻找

    $roster->getPresence($jid)['status']
    

    【讨论】:

    • 似乎是空的(整个存在数组几乎是空的)
    【解决方案3】:
    $uStatus = $conn->roster->getPresence($jid);
    
    echo "Online status: " . $uStatus['show']; // tells whether available or unavailable or dnd
    echo "Status message: " . $uStatus['status']; // shows the user's status message
    

    【讨论】:

      【解决方案4】:

      我在这里发布了一个类似问题的答案:XMPPHP GTalk Status

      以下是让它发挥作用的关键:

      1. $conn->presence() 不仅将您的状态发送到服务器,还收集您的每个联系人的状态并填充您的名册。它实际上与 $conn->getRoster() 做同样的事情,但也会收集每个联系人的状态信息。
      2. 您必须延迟脚本,以便让服务器有机会发送 iq 块,这似乎是一次一个联系人。我已经在示例代码中看到了 $conn->processUntil('presence') 和 $conn->processUntil('roster_received') ,但是第一个等待的时间不够长,第二个永远不会结束。我最终使用 $conn->processTime(2) 强制它等待 2 秒以确保它获得所有 iq 块。

      对我来说,另一个关键是打开详细日志记录。您在初始对象构造中这样做:

      $conn = new XMPPHP_XMPP('talk.google.com', 5222, $user_name,$password, "xmpphp", 'gmail.com', $printlog=true, $loglevel=XMPPHP_Log::LEVEL_VERBOSE);
      

      这将输出一个详细的日志到你的输出(在我的例子中是浏览器窗口)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        相关资源
        最近更新 更多