【问题标题】:Efficient XMPP user search高效的 XMPP 用户搜索
【发布时间】:2013-12-13 03:33:15
【问题描述】:

如果他们有 jabber 帐户,我想有效地检查所有本地通讯录联系人。用户使用手机号码在 XMPP 服务器上注册。 我目前将以下 XEP-0055 节发送到 ejabberd 服务器并评估结果。

<iq type="set" id="searchByUserName" to="vjud.ecoimac1.local" from="+1222333444@ecoimac1.local">
  <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 这样的其他应用程序也做同样的工作。有没有更有效的方法?

【问题讨论】:

  • 感谢您提交此确切的 XML 搜索请求。我正在失去理智stackoverflow.com/questions/56173910/… 试图让它发挥作用。简单类型的搜索(没有 &lt;x xmlns="jabber:x:data" type="submit"&gt; 的搜索)以某种方式返回错误。事实证明,对于扩展搜索,我没有发送&lt;field type="hidden" var="FORM_TYPE"&gt;&lt;value&gt;jabber:iq:search&lt;/value&gt;&lt;/field&gt; 子句。这对 Openfire 运行良好,但对 ejabberd 无效。

标签: xmpp ejabberd asmack xmppframework


【解决方案1】:

我现在有以下有效的解决方案:

在服务器端,我确实为 eJabberd 设置了 MySQL 数据库后端,而在 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
}

?>

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2011-10-30
    • 2013-10-06
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多