如何创建Node.js接口获取Ejabberd服务器所有注册用户
如何用Node.js创建接口获取Ejabberd所有注册用户列表
下面提供两种可靠的实现方式,你可以根据自身Ejabberd的配置情况选择:
方法一:调用ejabberdctl命令(简单快速)
Ejabberd自带的ejabberdctl工具支持直接列出指定域名下的所有注册用户,Node.js可以通过child_process模块执行该命令。
前置准备
- 确认
ejabberdctl的路径,通常为/usr/bin/ejabberdctl,或者ejabberd安装目录的bin文件夹内。 - 确保运行Node.js的进程有执行该命令的权限(可通过调整文件权限或配置sudo免密实现,注意生产环境的安全风险)。
代码实现(基于Express框架)
- 初始化项目并安装依赖:
npm init -y npm install express
- 编写接口代码:
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服务访问。
代码实现
- 安装依赖:
npm install express axios
- 编写接口代码:
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
相关产品推荐
相关产品推荐

