Java获取ejabberd在线用户账号Jid

代码逐云鹤
• 阅读 1804

背景

公司需求为导出在线用户信息,其中第一步便是取到在线用户,本文选择去ejabberd网页取爬取在线用户页面,获得返回报文后进行截取获得用户账号。后续方便进行取缓存数据获取必要的数据为导出excel做准备。

主要代码

连接ejabberd,获取返回报文

    /**
     * 请求ejabbered集群管理页面的post请求方法
     * 
     * @param url
     * @param userNameAndPwd
     * @return
     */
    public static String sendPost(String urlAddress, String userNameAndPwd) {
        String reponseStr = "";
        BufferedReader in = null;
        String line = "";
        try {
            URL url = new URL(urlAddress);
            URLConnection connection = url.openConnection();
            logger.debug("与ejabberd建立连接的地址为:"+urlAddress);
            connection.setDoOutput(true);
            connection.setRequestProperty("Pragma:", "no-cache");
            connection.setRequestProperty("Accept",
                    "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
            connection.setRequestProperty("Cache-Control", "no-cache");
            connection.setRequestProperty("Content-Type", "text/xml");
            connection.setRequestProperty("User-Agent",
                    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
            connection.setRequestProperty("Authorization", "Basic " + userNameAndPwd);
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            while ((line = in.readLine()) != null) {
                reponseStr += line;
            }
            logger.info("请求回执:" + reponseStr);
        } catch (Exception e) {
            logger.error(e);
        }
        return reponseStr;
    }

返回报文样例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
    <head>
        <title>ejabberd Web Admin</title>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
        <script src='/admin/server/sihua1.com//additions.js' type='text/javascript'> </script>
        <link href='/admin/server/sihua1.com/favicon.ico' type='image/x-icon' rel='shortcut icon'/>
        <link href='/admin/server/sihua1.com/style.css' type='text/css' rel='stylesheet'/>
    </head>
    <body>
        <div id='container'>
            <div id='header'>
                <h1>
                    <a href='/admin/'>ejabberd Web Admin</a>
                </h1>
            </div>
            <div id='navigation'>
                <ul>
                    <li>
                        <div id='navitem'>
                            <a href='/admin/acls/'>Access Control Lists</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitem'>
                            <a href='/admin/access/'>Access Rules</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitem'>
                            <a href='/admin/vhosts/'>Virtual Hosts</a>
                        </div>
                    </li>
                    <li>
                        <div id='navheadsub'>
                            <a href='/admin/server/sihua1.com/'>sihua1.com</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/acls/'>Access Control Lists</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/access/'>Access Rules</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/users/'>Users</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/online-users/'>Online Users</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/last-activity/'>Last Activity</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/nodes/'>Nodes</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/stats/'>Statistics</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/shared-roster/'>Shared Roster Groups</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitemsub'>
                            <a href='/admin/server/sihua1.com/muc/'>Multi-User Chat</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitem'>
                            <a href='/admin/nodes/'>Nodes</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitem'>
                            <a href='/admin/stats/'>Statistics</a>
                        </div>
                    </li>
                    <li>
                        <div id='navitem'>
                            <a href='/admin/muc/'>Multi-User Chat</a>
                        </div>
                    </li>
                </ul>
            </div>
            <div id='content'>
                <h1>Online Users</h1>
                <a href='../user/wxin/'>wxin@sihua1.com</a>
                <br/>
            </div>
            <div id='clearcopyright'></div>
        </div>
        <div id='copyrightouter'>
            <div id='copyright'>
                <p>
                    <a href='https://www.ejabberd.im/'>ejabberd</a> (c) 2002-2017
                    <a href='https://www.process-one.net/'>ProcessOne, leader in messaging and push solutions</a>
                </p>
            </div>
        </div>
    </body>
</html>

报文为页面html,分为导航栏、内容等部分,我们关注内容部分即可;下面a标签内为我们想要的在线用户账号(多个用户则为多个a标签)

            <div id='content'>
                <h1>Online Users</h1>
                <a href='../user/wxin/'>wxin@sihua1.com</a>
                <br/>
            </div>

截取返回报文,获得在线用户账号Jid

package com.onewaveinc.utils;

//省略了import部分
...
/**
 * 此类原为导出excel表格,其中获取在线用户账号为其中一步;
 * 从ejabberd返回报文进行解析截取用户账号
 * @author wxin
 *
 */
public class ExportXMPPUserInfo {

    private UserManager userManager;
    private UserChannelLoginManager userChannelLoginManager;
    private String path;
//    private final static String CONNECTED_USERS ="connected_users";
    /**
     * 加载ejabbered集群的管理页面账号信息至内存
     */
    private Map<String, String> ejabberedUserMap=new HashMap<String, String>();
    /**
     * 加载ejabbered集群的url
     */
    private Map<String, String> ejabberedUrlMap=new HashMap<String, String>();
    
    private String xmppManageListStr;
    private ChannelManager channelManager;
    private MemcachedFactory memcachedFactory;
    private static Logger logger = Logger.getInstance(ExportXMPPUserInfo.class);
    
    private String zipPath;
    
    /**
     * 定时导出XMPP每个机房(一个集群)的在线用户的信息
     * 导出信息:用户账号,mac地址,登陆的IP,登陆域名,机顶盒的型号,版本,和以及登陆所在节点的ip,
     * 显示 登陆的时间,登陆的时长(现在的时间减去登陆的时间)。
     */
    public  void getEjabberdJid() {
        try {
            List<Channel> channelList = new ArrayList<Channel>();
            try {
                channelList =  channelManager.findChannelIdList();
            } catch (Exception e) {
                e.printStackTrace();
            }
            String serverName = "";
            String serverDomain = "";
            String urlAddress = "";
            String userNameAndPwd = "";
            String respStr = "";
            String usersUrlAddress = "";
            String usersRespStr = "";
            for (Channel channel : channelList) {
                serverName = channel.getName();
                serverDomain = channel.getHost();
                logger.info("此次处理的集群名称为:" + serverName);
                //获取所有在线用户账号
                urlAddress = ejabberedUrlMap.get(serverName)+"server/"+ serverDomain +"/online-users";
                userNameAndPwd = ejabberedUserMap.get(serverName);
                respStr = HttpUtil.sendPost(urlAddress, userNameAndPwd);
                List<String> jidList = new ArrayList<String>();
                jidList = getJidList(respStr);                
            }
        } catch (Exception e) {
            result = "failed";
            e.printStackTrace();
        }
        return result;
        
    }

    /**
     * 截取用户jidList
     * @param respStr
     * @return List<String> jidList
     */
    public List<String> getJidList(String respStr) {
        List<String> jidList = new ArrayList<String>();
        int indexOne = respStr.indexOf("<h1>Online Users</h1>")+"<h1>Online Users</h1>".length();
        int indexTwo = respStr.indexOf("</a><br/></div><div id='clearcopyright'></div>");
        if (-1 != indexOne && -1 != indexTwo && indexTwo > indexOne) {
            
            String usersStr = respStr.substring(indexOne, indexTwo);
            logger.debug("在线用户列表为:"+ usersStr);
            String []infoArr = usersStr.split("</a><br/>");
            logger.debug("按照</a>进行拆分用户列表" + Arrays.toString(infoArr));
            for (String userInfo : infoArr) {
                indexOne = userInfo.indexOf("/'>")+"/'>".length();
                String newUserInfo = userInfo.substring(indexOne);
                logger.debug("正在处理用户JID为"+newUserInfo);
                jidList.add(newUserInfo);
            }
        }
        return jidList;
    }
    

    /**
     * 加载各个Ejabbered集群的Node节点
     * 此方法在初始化时进行(init-method="queryEjabberedNodes")
     * xmppManageListStr数据格式为:xmpp,admin@sihua1.com,1=http://10.223.138.137:5280/admin/;...
     * 单个元素为 imoss系统中的集群名称,管理员账号,管理员密码=ejaader集群管理地址,多个采用英文分号分隔
     */
    public void queryEjabberedNodes(){
        try {
            if(StringUtils.isNotBlank(xmppManageListStr)){
                String[] strArrayOne=xmppManageListStr.split(";");
                for(String strTempOne:strArrayOne){
                    String[] arr=strTempOne.split("=");
                    String[] strArrayTwo=arr[0].split(",");
                    logger.info("strArrayTwo[0]="+strArrayTwo[0]+",strArrayTwo[1]="
                            +strArrayTwo[1]+",strArrayTwo[2]="+strArrayTwo[2]
                                    +",arr[1]="+arr[1]);
                    ejabberedUrlMap.put(strArrayTwo[0], arr[1]);
                    String encodeUserAndPwd=Base64Uitl.encode((strArrayTwo[1]+":"+strArrayTwo[2]).getBytes());
                    ejabberedUserMap.put(strArrayTwo[0], encodeUserAndPwd);
                }
            }
        } catch (Exception e) {
            logger.error("处理配置项xmpp.management.url.list产生异常!",e);
        }
    }

//省略了getter、setter部分
    
}

补充说明

ExportXMPPUserInfo.queryEjabberedNodes()在配置中配置为init-method,在初始化阶段就已经运行:将发送url、账号密码提前写入map中。

配置

<bean id="contbiz.imoss.exportXMPPUserInfo"
        class="com.onewaveinc.utils.ExportXMPPUserInfo" init-method="queryEjabberedNodes">
        ...
</bean>
点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!
大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤。本文将分为以下两个部分进行讲解在虎扑NBA官网球员页面中进行爬虫,获取球员数据。清洗整理爬取的球员数据,对其进行可视化。
Tommy744 Tommy744
4年前
洞察秋毫——JFrog日志分析 协助监视Docker Hub上的拉取操作
一、背景大家已经注意到,DockerHub现在开始对镜像拉取进行限制,无论是免费的匿名用户,还是认证用户。在六个小时内,从一个IP地址镜像拉取的请求次数超过固定阈值(匿名用户100次,认证用户200次)后,DockerHub就会限制其拉取带宽。虽然用户仍然可以拉取到Docker镜像,但是速度要慢得多。您可以阅读我们之前的博客文章《绕开Docker
Wesley13 Wesley13
3年前
oracle expdp导入导出部分表
导出命令:expdpsystem/pwddumpfile导出文件名.dump  tables用户名.表名1,用户名.表名2  system/pwd   为管理员账号 tables             你要导出数据库用户名.你要导出的表       默认会导出到oracle安装目录:/u01/app/or
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
Go实现基于WebSocket的弹幕服务
拉模式和推模式拉模式1、数据更新频率低,则大多数请求是无效的2、在线用户量多,则服务端的查询负载高3、定时轮询拉取,实时性低推模式1、仅在数据更新时才需要推送2、需要维护大量的在线长连接3、数据更新后可以立即推送基于webSocket推送1、浏览器支持的socket编
绣鸾 绣鸾
1年前
Screaming Frog SEO Spider for Mac(SEO工具)
是一款功能强大的SEO工具,可以帮助用户进行网站的SEO优化和分析。以下是ScreamingFrogSEOSpider的主要特点:网站爬取:可以快速扫描整个网站并列出所有内部和外部页面,包括URL,标题,描述和头信息等。数据导出:可以将扫描结果导出为CSV
流浪剑客 流浪剑客
1年前
网络爬虫开发工具:Screaming Frog SEO Spider for Mac 最新中文版 支持M1 附注册码
是一款功能强大的SEO工具,可以帮助用户进行网站的SEO优化和分析。以下是ScreamingFrogSEOSpider的主要特点:网站爬取:可以快速扫描整个网站并列出所有内部和外部页面,包括URL,标题,描述和头信息等。数据导出:可以将扫描结果导出为CSV
为什么有时候始终显示为用户Id?异步获取到用户信息后怎么通知融云去刷新界面?
"问题产生原因:(来源参考:https://www.rongcloud.cn/?utmsourceSEO&utmtermjishitongxun)这种情况是因为在用户信息提供者的getUserInfo()接口存在返回null的情况,原因是请求的用户信息在a
流浪剑客 流浪剑客
1年前
「最新更新」Screaming Frog SEO Spider for Mac 网络爬虫开发工具
是一款功能强大的SEO工具,可以帮助用户进行网站的SEO优化和分析。以下是ScreamingFrogSEOSpider的主要特点:网站爬取:可以快速扫描整个网站并列出所有内部和外部页面,包括URL,标题,描述和头信息等。数据导出:可以将扫描结果导出为CSV
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
代码逐云鹤
代码逐云鹤
Lv1
自卑溢出来就变成了安静和温柔。
文章
3
粉丝
0
获赞
0