极光IM是用于 iOS / Android / web / PC 等多端在线即时聊天的第三方接口,目前在一定额度内可以免费实现其一部分功能。来减少服务端自己开发的成本,提高开发效率。基本功能包含用户注册登录,个人信息设置,单聊,群聊等。本篇内容主要说下java作为服务端来实现的一些基础功能的demo,内容大部分都是复制和修改了官方文档里的例子。

 

极光IM官方简介:

极光 IM(英文名 JMessage)致力于帮助 App 解决应用内聊天和跨应用聊天问题,开发者可集成SDK,快速实现稳定可靠的聊天功能。目前提供 iOS / Android / web / PC(Windows、macOS) 的 SDK,以及 Rest API 和后台管理系统,满足开发者不同场景下的需求,大大减少开发成本,提高效率。

极光开发者服务SDK采用了模块化的使用模式,即一个核心模块 (JCore)+N 种服务(IM,JPush,JAnalytics)的使用方式,方便开发者同时集成多项极光开发者服务,极大的优化了多模块同时使用时功能模块重复的问题。如下图: 

 

极光IM 官方文档地址:

https://docs.jiguang.cn/jmessage/server/rest_api_im/

http://jpush.github.io/jmessage-api-java-client/apidocs/

https://github.com/jpush/jmessage-api-java-client

 

 

引入依赖Maven

  1. <!-- 极光 -->
  2. <dependency>
  3.     <groupId>cn.jpush.api</groupId>
  4.     <artifactId>jpush-client</artifactId>
  5.     <version>3.2.15</version>
  6. </dependency>
  7. <dependency>
  8.     <groupId>cn.jpush.api</groupId>
  9.     <artifactId>jmessage-client</artifactId>
  10.     <version>1.1.8</version>
  11. </dependency>
  12. <dependency>
  13.     <groupId>cn.jpush.api</groupId>
  14.     <artifactId>jiguang-common</artifactId>
  15.     <version>1.1.3</version>
  16. </dependency>
  17. <!--<dependency>-->
  18.     <!--<groupId>com.google.code.gson</groupId>-->
  19.     <!--<artifactId>gson</artifactId>-->
  20.     <!--<version>2.3</version>-->
  21. <!--</dependency>-->
  22. <dependency>
  23.     <groupId>org.slf4j</groupId>
  24.     <artifactId>slf4j-api</artifactId>
  25.     <version>1.7.7</version>
  26. </dependency>

 

 

极光IM工具类 , 需要先去极光申请注册极光IM,获取appkey和masterSecret。目前一定额度一下是可以免费使用

  1. package com.gemini.common.utils;
  2.  
  3. import cn.jiguang.common.ServiceHelper;
  4. import cn.jiguang.common.resp.APIConnectionException;
  5. import cn.jiguang.common.resp.APIRequestException;
  6. import cn.jiguang.common.resp.ResponseWrapper;
  7. import cn.jmessage.api.JMessageClient;
  8. import cn.jmessage.api.common.model.RegisterInfo;
  9. import cn.jmessage.api.message.MessageListResult;
  10. import cn.jmessage.api.user.UserListResult;
  11. import org.apache.commons.lang.StringUtils;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14.  
  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19.  
  20. /**
  21.  * 极光im 即时聊天 java服务器端工具类
  22.  * https://docs.jiguang.cn/jmessage/server/rest_api_im/
  23.  * zmh 2018-11-15 14:34:25
  24.  */
  25. public class JimUtils {
  26.  
  27.     protected static final Logger LOG = LoggerFactory.getLogger(JimUtils.class);
  28.  
  29.     // 需要先去极光申请注册极光IM,获取appkey和masterSecret
  30.     private static final String appkey = "";
  31.     private static final String masterSecret = "";
  32.  
  33.     /** 注册用户 */
  34.     public static Map<String,Object> registerUsers(String username,String password,String nickname) {
  35.         Map<String,Object> result = new HashMap<>();
  36.         JMessageClient client = new JMessageClient(appkey, masterSecret);
  37.         try {
  38.             // username和password的长度限制在 4 ~ 128 位
  39.             if(StringUtils.isBlank(username) || StringUtils.isBlank(password)
  40.                     || username.length() < 4 || username.length() > 128
  41.                     || password.length() < 4 || password.length() > 128){
  42.                 result.put("code",500);
  43.                 result.put("message","用户名或密码不合法");
  44.                 return result;
  45.             }
  46.  
  47.             List<RegisterInfo> users = new ArrayList<>();
  48.             RegisterInfo user = RegisterInfo.newBuilder()
  49.                     .setUsername(username)
  50.                     .setPassword(password)
  51.                     .setNickname(nickname)
  52.                     .build();
  53.             users.add(user);
  54.             RegisterInfo[] regUsers = new RegisterInfo[users.size()];
  55.             String res = client.registerUsers(users.toArray(regUsers));
  56.             result.put("code",0);
  57.             result.put("message","success");
  58.             LOG.info(res);
  59.         } catch (APIConnectionException e) {
  60.             result.put("code",500);
  61.             result.put("message",e);
  62.             LOG.error("Connection error. Should retry later. ", e);
  63.         } catch (APIRequestException e) {
  64.             result.put("code",600);
  65.             result.put("message",e.getErrorMessage());
  66.             LOG.error("Error response from JPush server. Should review and fix it. ", e);
  67.             LOG.info("HTTP Status: " + e.getStatus());
  68.             LOG.info("Error Message: " + e.getMessage());
  69.         }
  70.         return result;
  71.     }
  72.  
  73.  
  74.     /** 获取所有用户列表 */
  75.     public static Map<String,Object> getAllUsers(Integer start,Integer end) {
  76.         Map<String,Object> result = new HashMap<>();
  77.         JMessageClient client = new JMessageClient(appkey, masterSecret);
  78.         try {
  79.             UserListResult userList = client.getUserList(start, end);
  80.             result.put("code",0);
  81.             result.put("userList",userList);
  82.             LOG.info("success");
  83.         } catch (APIConnectionException e) {
  84.             result.put("code",500);
  85.             result.put("message",e);
  86.             LOG.error("Connection error. Should retry later. ", e);
  87.         } catch (APIRequestException e) {
  88.             result.put("code",600);
  89.             result.put("message",e.getErrorMessage());
  90.             LOG.error("Error response from JPush server. Should review and fix it. ", e);
  91.             LOG.info("HTTP Status: " + e.getStatus());
  92.             LOG.info("Error Message: " + e.getMessage());
  93.         }
  94.         return result;
  95.     }
  96.  
  97.     /** 更新昵称 */
  98.     public static Map<String,Object> changeNickname(String username,String nickname) {
  99.         Map<String,Object> result = new HashMap<>();
  100.         JMessageClient client = new JMessageClient(appkey, masterSecret);
  101.         try {
  102.             if(StringUtils.isBlank(username)
  103.                     || username.length() < 4 || username.length() > 128){
  104.                 result.put("code",500);
  105.                 result.put("message","用户名不合法");
  106.                 return result;
  107.             }
  108.             client.updateUserInfo(username,nickname,null,null,0,null,null,null);
  109.             result.put("code",0);
  110.             result.put("message","success");
  111.             LOG.info("success");
  112.         } catch (APIConnectionException e) {
  113.             result.put("code",500);
  114.             result.put("message",e);
  115.             LOG.error("Connection error. Should retry later. ", e);
  116.         } catch (APIRequestException e) {
  117.             result.put("code",600);
  118.             result.put("message",e.getErrorMessage());
  119.             LOG.error("Error response from JPush server. Should review and fix it. ", e);
  120.             LOG.info("HTTP Status: " + e.getStatus());
  121.             LOG.info("Error Message: " + e.getMessage());
  122.         }
  123.         return result;
  124.     }
  125.  
  126.  
  127.     /** 删除用户 */
  128.     public static Map<String,Object> deleteUser(String username) {
  129.         Map<String,Object> result = new HashMap<>();
  130.         JMessageClient client = new JMessageClient(appkey, masterSecret);
  131.         try {
  132.             if(StringUtils.isBlank(username)
  133.                     || username.length() < 4 || username.length() > 128){
  134.                 result.put("code",500);
  135.                 result.put("message","用户名不合法");
  136.                 return result;
  137.             }
  138.             client.deleteUser(username);
  139.             result.put("code",0);
  140.             result.put("message","success");
  141.             LOG.info("success");
  142.         } catch (APIConnectionException e) {
  143.             result.put("code",500);
  144.             result.put("message",e);
  145.             LOG.error("Connection error. Should retry later. ", e);
  146.         } catch (APIRequestException e) {
  147.             result.put("code",600);
  148.             result.put("message",e.getErrorMessage());
  149.             LOG.error("Error response from JPush server. Should review and fix it. ", e);
  150.             LOG.info("HTTP Status: " + e.getStatus());
  151.             LOG.info("Error Message: " + e.getMessage());
  152.         }
  153.         return result;
  154.     }
  155.  
  156.     /** 禁用/启用 用户,1启用 0禁用 */
  157.     public static Map<String,Object> forbidUser(String username,Integer disable) {
  158.         Map<String,Object> result = new HashMap<>();
  159.         JMessageClient client = new JMessageClient(appkey, masterSecret);
  160.         try {
  161.             ResponseWrapper res = client.forbidUser(username, disable == 0);
  162.             result.put("code",0);
  163.             result.put("message","success");
  164.             LOG.info("response code: " + res.responseCode);
  165.         } catch (APIConnectionException e) {
  166.             result.put("code",500);
  167.             result.put("message",e);
  168.             LOG.error("Connection error. Should retry later. ", e);
  169.         } catch (APIRequestException e) {
  170.             result.put("code",600);
  171.             result.put("message",e.getErrorMessage());
  172.             LOG.error("Error response from JPush server. Should review and fix it. ", e);
  173.             LOG.info("HTTP Status: " + e.getStatus());
  174.             LOG.info("Error Message: " + e.getMessage());
  175.         }
  176.         return result;
  177.     }
  178.  
  179.  
  180.  
  181.     /** 获取用户聊天记录 时间格式 yyyy-MM-dd HH:mm:ss */
  182.     public static Map<String,Object> getUserMessages(String username,Integer count,String beginTime,String endTime) {
  183.         Map<String,Object> result = new HashMap<>();
  184.         JMessageClient client = new JMessageClient(appkey, masterSecret);
  185.         try {
  186.             MessageListResult userMessages = client.getUserMessages(username, count, beginTime, endTime);
  187.             result.put("code",0);
  188.             result.put("userMessages",userMessages);
  189.             LOG.info("success");
  190.         } catch (APIConnectionException e) {
  191.             result.put("code",500);
  192.             result.put("message",e);
  193.             LOG.error("Connection error. Should retry later. ", e);
  194.         } catch (APIRequestException e) {
  195.             result.put("code",600);
  196.             result.put("message",e.getErrorMessage());
  197.             LOG.error("Error response from JPush server. Should review and fix it. ", e);
  198.             LOG.info("HTTP Status: " + e.getStatus());
  199.             LOG.info("Error Message: " + e.getMessage());
  200.         }
  201.         return result;
  202.     }
  203.  
  204.     public static void main(String[] args) {
  205.         // System.out.println(registerUsers("username","password","nickname"));
  206.         // System.out.println(getAllUsers(0,1000));
  207.         // System.out.println(changeNickname("username","nickname"));
  208.         // System.out.println(deleteUser("username"));
  209.         // System.out.println(forbidUser("username",0));
  210.         // System.out.println(getUserMessages("username",1000,"2018-01-01 00:00:00","2018-12-31 23:59:59"));
  211.     }
  212. }