You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建Node.js接口获取Ejabberd服务器所有注册用户

如何用Node.js创建接口获取Ejabberd所有注册用户列表

下面提供两种可靠的实现方式,你可以根据自身Ejabberd的配置情况选择:

方法一:调用ejabberdctl命令(简单快速)

Ejabberd自带的ejabberdctl工具支持直接列出指定域名下的所有注册用户,Node.js可以通过child_process模块执行该命令。

前置准备

  • 确认ejabberdctl的路径,通常为/usr/bin/ejabberdctl,或者ejabberd安装目录的bin文件夹内。
  • 确保运行Node.js的进程有执行该命令的权限(可通过调整文件权限或配置sudo免密实现,注意生产环境的安全风险)。

代码实现(基于Express框架)

  1. 初始化项目并安装依赖:
npm init -y
npm install express
  1. 编写接口代码:
const express = require('express');
const { exec } = require('child_process');
const app = express();
const PORT = 3000;

// 获取所有注册用户的接口
app.get('/ejabberd/users', (req, res) => {
  // 替换为你的ejabberdctl路径和实际域名
  const command = '/usr/bin/ejabberdctl registered_users your-ejabberd-domain.com';
  
  exec(command, (error, stdout, stderr) => {
    if (error) {
      return res.status(500).json({
        success: false,
        message: '执行命令失败',
        error: stderr || error.message
      });
    }
    
    // 解析命令输出,每行对应一个用户
    const users = stdout.trim().split('\n').filter(user => user.length > 0);
    res.json({
      success: true,
      userCount: users.length,
      users: users
    });
  });
});

app.listen(PORT, () => {
  console.log(`服务启动于 http://localhost:${PORT}`);
});

关键注意点

  • 务必替换your-ejabberd-domain.com为你的Ejabberd服务域名。
  • 生产环境必须添加接口身份验证(如API密钥、JWT),防止未授权访问。

方法二:调用Ejabberd REST API(更安全规范)

如果你的Ejabberd已启用REST API,这种方式比直接执行系统命令更安全,适合生产环境。

前置准备:启用Ejabberd REST API

修改Ejabberd的配置文件ejabberd.yml,添加以下配置:

listen:
  - port: 5280
    module: ejabberd_http
    request_handlers:
      "/api": mod_http_api
api_permissions:
  "registered_users_access":
    - who:
        - user: "api-user@your-ejabberd-domain.com" # 专用API账号
      what:
        - "registered_users"

配置完成后重启Ejabberd服务,确保API端口(5280)可被Node.js服务访问。

代码实现

  1. 安装依赖:
npm install express axios
  1. 编写接口代码:
const express = require('express');
const axios = require('axios');
const app = express();
const PORT = 3000;

// Ejabberd REST API配置
const EJABBERD_API_CONFIG = {
  baseUrl: 'http://your-ejabberd-ip:5280/api',
  auth: {
    username: 'api-user@your-ejabberd-domain.com',
    password: 'your-api-user-password'
  },
  domain: 'your-ejabberd-domain.com'
};

app.get('/ejabberd/users', async (req, res) => {
  try {
    const response = await axios.post(
      EJABBERD_API_CONFIG.baseUrl,
      {
        command: 'registered_users',
        args: [EJABBERD_API_CONFIG.domain]
      },
      {
        auth: EJABBERD_API_CONFIG.auth
      }
    );

    res.json({
      success: true,
      userCount: response.data.length,
      users: response.data
    });
  } catch (error) {
    const errMsg = error.response?.data || error.message;
    res.status(500).json({
      success: false,
      message: '调用Ejabberd API失败',
      error: errMsg
    });
  }
});

app.listen(PORT, () => {
  console.log(`服务启动于 http://localhost:${PORT}`);
});

关键注意点

  • 替换配置中的IP、域名、API账号和密码。
  • 生产环境务必启用HTTPS,避免明文传输认证信息。
  • 建议创建专用的API账号,不要使用管理员账号直接调用接口。

内容的提问来源于stack exchange,提问作者Anurag Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:20:27