2013-11-27 165 views
1

我想高效地檢查所有本地通訊錄聯繫人是否有jabber帳戶。用戶使用手機號碼在XMPP服務器上註冊。 我目前將以下XEP-0055節發送到ejabberd服務器並評估結果。高效的XMPP用戶搜索

<iq type="set" id="searchByUserName" to="vjud.ecoimac1.local" from="[email protected]"> 
    <query xmlns="jabber:iq:search"> 
    <x xmlns="jabber:x:data" type="submit"> 
     <field type="hidden" var="FORM_TYPE"> 
     <value>jabber:iq:search</value> 
     </field> 
     <field var="user"> 
     <value>+123456789</value> 
     </field> 
    </x> 
    </query> 
</iq> 

這個工作但效率不高。對於每個號碼都必須發送查詢。像WhatsApp的其他應用程序也可以完成同樣的工作。有沒有更高效的方法?

回答

1

我現在已經下有效的解決方案:

在服務器端我沒設置MySQL數據庫後端的eJabberd和Web服務器上的PHP接口提供了客戶端應用程序的用戶查找。 該應用程序發送一個HTTP POST請求與一組jabber用戶名進行檢查。 PHP腳本查找哪些用戶已註冊,並返回包含註冊用戶索引的響應。

<?php 

// HTTP POST sent from client app 
// Do authentication here... 

// Read all parameters 
$users = array(); 
$user = $_POST["username0"]; 
for ($i = 1; !empty($user); $i++) 
{ 
    // Add user 
    $users[] = $user; 

    // Next parameter 
    $user = $_POST["username".$i]; 
} 
if (empty($users)) 
{ 
    echo "Success"; // nothing to do 
    exit; 
} 

// Create mySQL connection 
$db = mysqli_connect("localhost", "user", "password", "database"); 
if (!$db) 
{ 
    $descr = mysqli_connect_error(); 
    echo "Error: ".$descr; 
    exit; 
} 

// Prepare query 
// SELECT username FROM users WHERE username IN ('+41796548345','+41786547544',...) 
$query = "SELECT username FROM users WHERE username IN("; 
foreach ($users as $user) 
{ 
    $query .= "'".$user."',"; 
} 
$query = rtrim($query, ","); 
$query .= ")"; 

// Execute query and generate result 
$result = "Success"; 
$recset = mysqli_query($db, $query); // [+41786547544,+41763428566,...] 
while ($rec = mysqli_fetch_object($recset)) 
{ 
    $index = find_user($rec->username, $users); 
    if ($index >= 0) 
    { 
     $result .= "\t".$index; 
    } 
} 

echo $result; 

function find_user($username, $users) 
{ 
    for ($idx = 0; $idx < count($users); $idx++) 
    { 
     if ($users[$idx] == $username) 
     { 
      return $idx; // found at index 
     } 
    } 
    return -1; // not found 
} 

?>