ejabberd:连接到服务器时获取用户(版本和操作系统)

Posted

技术标签:

【中文标题】ejabberd:连接到服务器时获取用户(版本和操作系统)【英文标题】:ejabberd: get users (version & os) when connect to the server 【发布时间】:2016-09-22 16:48:00 【问题描述】:

我正在尝试读取用户 os "Windows XP, Windows 7, Linux .... etc" 当他们连接时我正在使用 ejabberd 2.1.x 但没有显示给我。

我正在做的是:

-module(mod_test).

-behaviour(gen_mod).

%% gen_mod callbacks
-export([start/2, stop/1]).

%% hook handlers
-export([user_send_packet/3, filter_packet/1]).

-include("ejabberd.hrl").
-include("jlib.hrl").

-define(PROCNAME, ejabberd_mod_filter).

start(Host, _Opts) ->
    ejabberd_hooks:add(user_send_packet, Host, ?MODULE, user_send_packet, 75),
    ejabberd_hooks:add(filter_packet, global, ?MODULE, filter_packet, 75),
    ok.

stop(Host) ->
    ejabberd_hooks:delete(filter_packet, global, ?MODULE, filter_packet, 75),
    ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, user_send_packet, 75),
    ok.

user_send_packet(_From, _To, _Packet) ->
    ok.

filter_packet(From, To, Packet) ->
    io:format("~p", [Packet]),
filter_packet(Arg) ->
    Arg.

它返回所有用户数据,如(状态、资源、caps ...等)其他(版本、操作系统、客户端名称)有什么方法可以做到这一点吗?

我相信在(muc 聊天)中有很多机器人会这样做,如果我键入:

version some_user

用这个消息返回给我:

name : Psi+
version : 1.1
os : Windows XP

但我不知道他们是怎么做到的。

【问题讨论】:

出于兴趣,您使用 ejabberd 2.1.x 有什么特别的原因吗?从那以后有许多新版本。 看看os erlang 模块。也许它会引导你找到解决方案。 @legoscia 我在 3 年前一直在开发这个版本,我添加了很多东西并修复了一些错误,所以我不想将此版本更改为较新的版本。就我而言:catch (name, os, version) of client 当用户登录到服务器时是否可以获得这些信息? @A.Sarid 不,我不是说 os 模块。 os : 就像用户使用 (Windows, Linux) 一样,它是由 xmpp 协议提供的 【参考方案1】:

您可以通过向客户端发送“软件版本”请求来获取此信息,如 XEP-0092 中所述。这是 ejabberd 通常不会做的事情,因此您可能必须自己编写代码来跟踪响应。 (基本思路是服务器发送带有特定 id 的请求,然后需要检查具有相同 id 的响应,同时考虑超时和错误。)

【讨论】:

感谢您的回答。有什么例子可以帮助我吗?我应该从什么开始?再次感谢。

以上是关于ejabberd:连接到服务器时获取用户(版本和操作系统)的主要内容,如果未能解决你的问题,请参考以下文章

将 iOS 应用程序连接到 Amazon 上托管的 Ejabberd 服务器

无法连接到 ejabberd 本地主机

连接到 ejabberd

使用 xmppFramework 连接到服务器时卡住

如何将 ejabberd 服务器连接到 Logica opensmpp

如何使用 smack-android 连接到禁用安全功能的 ejabberd?