资讯专栏INFORMATION COLUMN

Java获取ejabberd在线用户账号Jid

learn_shifeng / 2159人阅读

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

背景

公司需求为导出在线用户信息,其中第一步便是取到在线用户,本文选择去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;
    }
返回报文样例


    
        ejabberd Web Admin
        
        
        
        
    
    
        
        
    

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

            

Online Users

wxin@sihua1.com
截取返回报文,获得在线用户账号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 ejabberedUserMap=new HashMap();
    /**
     * 加载ejabbered集群的url
     */
    private Map ejabberedUrlMap=new HashMap();
    
    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 channelList = new ArrayList();
            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 jidList = new ArrayList();
                jidList = getJidList(respStr);                
            }
        } catch (Exception e) {
            result = "failed";
            e.printStackTrace();
        }
        return result;
        
    }

    /**
     * 截取用户jidList
     * @param respStr
     * @return List jidList
     */
    public List getJidList(String respStr) {
        List jidList = new ArrayList();
        int indexOne = respStr.indexOf("

Online Users

")+"

Online Users

".length(); int indexTwo = respStr.indexOf("
"); if (-1 != indexOne && -1 != indexTwo && indexTwo > indexOne) { String usersStr = respStr.substring(indexOne, indexTwo); logger.debug("在线用户列表为:"+ usersStr); String []infoArr = usersStr.split("
"); logger.debug("按照进行拆分用户列表" + 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中。

配置

        ...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72686.html

相关文章

  • 团队协作工具 Worktile 技术架构揭秘

    摘要:现在已经成为的官方标准,如,以及的扩展协议。作者简介李会军,联合创始人,关注团队协作领域,致力于用工具解决中小团队的协作问题。 Worktile自上线两年多以来,以良好的用户体验和稳定的服务,获得了用户的认可和喜爱。截止笔者写这篇文章的时候,已经有超过10万家团队在使用Worktile。作为团队协作工具,从技术上分析首先要解决如下几个问题: 基于Web的跨平台设计,让用户在任何地方都...

    heartFollower 评论0 收藏0
  • 即时通讯之客户端篇StropheJs.

    摘要:解析的最终结果是,上下线通知。解析的结果是,同时可以通过和构建父子级别元素。单聊发送查询归档历史记录漫游查询归档之前,首先是要确保归档存库成功,服务端查看传送门,自行处理,参见。栽过的坑转的时候回调函数丢失参考文献高级编程使用和 摘要 小编是个写了几年php的码农, 接触纯Js的项目这也是头一次,另外,IM的服务端是Java(tigase框架) ,为了解决旧版本BOSH(长轮询)即时消...

    ChristmasBoy 评论0 收藏0
  • saltstack-api使用详解

    摘要:本文介绍下的简单使用。介绍本身就提供了一套算完整的,使用来实现的,供外部的程序调用。安装需要安装,然后进行一些配置才可以正常使用,安装方法有两种。命令在中使用方式是客户端方法参数例子。重启再次测试,。 简述 接触了saltstack感觉十分强大,非常适合做自动化运维。本文介绍下salt-api的简单使用。后续打算用django + saltsatck做一个web界面的自动化运维平台。 ...

    A Loity 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<