华为云会议接口java查询会议鉴权Token查询会议录制

华为云会议接口:文档 https://support.huaweicloud.com/api-meeting/meeting_21_0014.html

在线调试页面:https://apiexplorer.developer.huaweicloud.com/apiexplorer/sdk?product=Meeting&api=UpdateToken

华为云会议后台管理:https://bmeeting.huaweicloud.com/#/login

<!--华为云-->
        <dependency>
            <groupId>com.huaweicloud.sdk</groupId>
            <artifactId>huaweicloud-sdk-meeting</artifactId>
            <version>3.0.23-beta</version>
        </dependency>
<!-- commons-httpclient -->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.0.1</version>
        </dependency>

此方法项目中@OpenApi可以忽略,其中日期区间华为云很坑的地方是设置完时区之后还是存在相差8小时,PC和APP上显示的不一样相差8个小时,下面方法中已处理

package com.wl.partner.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cre.dmp.osp.common.config.openapi.OpenApi;
import com.huaweicloud.sdk.meeting.v1.model.*;
import com.wl.partner.entity.RecordFileInfo;
import com.wl.partner.entity.ResultVO;
import com.wl.partner.utils.StringUtil;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.DeleteMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.*;
import sun.misc.BASE64Encoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


@RestController
@RequestMapping("/huaWeiMeet")
public class HuaWeiMeeting {
    /**
     * postMan调用参数
     * 请求头设置:Content-Type   application/json;charset=UTF-8
     * body中{"userName":"****","passWord":"***"}
     * @param map
     * @return
     */
    @ApiOperation(value = "创建华为云token", notes = "创建华为云token")
    @OpenApi
    @RequestMapping(value = "/openCreateToken", method = {RequestMethod.POST})
    public ResultVO openCreateToken(@OpenApi Map map) {
        String userName = (String) map.get("hwUserName");
        String passWord = (String) map.get("hwPassWord");
        ResultVO j = new ResultVO();
        String message = null;
        try {
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpPost post = new HttpPost("https://api.meeting.huaweicloud.com/v1/usg/acs/auth/account");
            BASE64Encoder encoder = new BASE64Encoder();
            final byte[] textByte = (userName + ":" + passWord).getBytes(StandardCharsets.UTF_8);
            String encodedText =  "Basic " +encoder.encode(textByte);
            post.addHeader("Authorization",encodedText);
            System.out.println("华为Base验证账号密码加密后的编码:    "+encodedText);
            post.addHeader("Content-Type","application/json;charset=UTF-8");
            HashMap<String, Object> mapParameter = new HashMap<>();
            mapParameter.put("account",userName);
            mapParameter.put("clientType",0);
            /**
             * 登录帐号类型。
             * 0:Web客户端类型
             * 5:cloudlink pc
             * 6:cloudlink mobile
             * 15:硬终端
             * 16:WeLink pc
             * 17:cloudlink 大屏
             * 18:welink mobile
             * 20:welink 大屏
             * 24:cloudlink/welink pad;
             * 26:智慧屏
             */
            net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(mapParameter);
            StringEntity json = new StringEntity(jsonObject.toString());
            //json.setContentEncoding("UTF-8");
            //发送json数据需要设置contentType
            json.setContentType("application/json;charset=UTF-8");
            post.setEntity(json); //设置请求参数
            HttpResponse response = httpClient.execute(post);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                //返回String
                String res = EntityUtils.toString(response.getEntity());
                JSONObject object = JSONObject.parseObject(res);
                String accessToken = (String)object.get("accessToken");
                String userId = (String)JSONObject.parseObject(object.get("user").toString()).get("userId");
                HashMap<String, String> hashMap = new HashMap<>();
                if(StringUtil.isNotEmpty(accessToken)){
                    System.out.println("华为云会议登陆token:"+accessToken);
                    hashMap.put("accessToken",accessToken);
                    hashMap.put("userId",userId);
                    j.setObj(hashMap);
                    message="签名成功";
                }
            }else {
                message="请求异常";
                j.setSuccess(false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }

    /**
     * 刷新token
     * @param map
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openRefreshToken",method = RequestMethod.POST)
    public ResultVO openRefreshToken(@OpenApi Map map) {
        String accessToken = (String) map.get("accessToken");
        ResultVO j = new ResultVO();
        String message = null;
        try {
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpPut put = new HttpPut("https://api.meeting.huaweicloud.com/v1/usg/acs/token");
            put.addHeader("X-Access-Token",accessToken);
            HttpResponse response = httpClient.execute(put);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                //返回String
                String res = EntityUtils.toString(response.getEntity());
                JSONObject object = JSONObject.parseObject(res);
                String newAccessToken = (String)object.get("accessToken");
                Integer refreshValidPeriodSecond = (Integer)object.get("refreshValidPeriod");//失效时间戳
                System.out.println("有效时长:"+ refreshValidPeriodSecond +"秒");
                if(StringUtil.isNotEmpty(newAccessToken)){
                    j.setObj(newAccessToken);
                    message="刷新token成功";
                }
            }else {
                message="刷新失败,请传入刷新之后的token";
                j.setSuccess(false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }
//    public String refreshTokenBd(String accessToken) {
//        try {
//            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
//            HttpPut put = new HttpPut("https://api.meeting.huaweicloud.com/v1/usg/acs/token");
//            put.addHeader("X-Access-Token",accessToken);
//            HttpResponse response = httpClient.execute(put);
//            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
//                //返回String
//                String res = EntityUtils.toString(response.getEntity());
//                JSONObject object = JSONObject.parseObject(res);
//                String newAccessToken = (String)object.get("accessToken");
//                if(StringUtil.isNotEmpty(newAccessToken)){
//                   return newAccessToken;
//                }
//            }else {
//                return "刷新失败重新登陆获取token";
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
    /**
     * 校验token
     * {
     *     "accessToken": "********"
     * }
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openValidateToken",method = RequestMethod.POST)
    public ResultVO openValidateToken(@OpenApi Map map) {
        String accessToken = (String) map.get("accessToken");
        ResultVO j = new ResultVO();
        String message = null;
        try {
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpPost post = new HttpPost("https://api.meeting.huaweicloud.com/v1/usg/acs/token/validate");
            post.addHeader("Content-Type","application/json; charset=UTF-8");
            HashMap<String, Object> mapParameter = new HashMap<>();
            mapParameter.put("token",accessToken);
            mapParameter.put("needGenNewToken",false);//是否生成新的token。 true:生成新的token值。false:不生成新的token值。
            net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(mapParameter);
            StringEntity json = new StringEntity(jsonObject.toString());
            //发送json数据需要设置contentType
            json.setContentType("application/json;charset=UTF-8");
            post.setEntity(json); //设置请求参数
            HttpResponse response = httpClient.execute(post);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                j.setObj(true);
                j.setMsg("校验成功");
            }else if(response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED){
                j.setObj(false);
                j.setMsg("Token失效");;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return j;
    }
    /**
     * 创建会议:http://172.29.53.161:8089/jeecg/huaWeiMeeting.do?createMeeting
     * 参数目前先定一个: accessToken
     * 创建会议
     * {
     *     "X-Access-Token": "*************",
     *     "mediaTypes": "Video",
     *     "length": 15,
     *     "startDate": "2020-12-12",
     *     "endDate": "2020-12-18",
     *     "conferenceType":0,
     *     "cycle": "Day",
     *     "subject":"指定时间会议",
     *     "phone": "15555555555",
     *     "startTime":"2020-12-11 15:00"
     * }
     * @param
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openCreateMeeting",method = RequestMethod.POST)
    public ResultVO openCreateMeeting(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken = (String) map.get("X-Access-Token");
            String mediaTypes = (String) map.get("mediaTypes");
            Integer length = (Integer) map.get("length");
            String startTime = (String) map.get("startTime");
            Integer recordAuthType = (Integer) map.get("recordAuthType");
            Integer recordType = (Integer) map.get("recordType");
            Integer isAutoRecord = (Integer) map.get("isAutoRecord");
            Integer interval = (Integer) map.get("interval");
            String sms = (String) map.get("sms");
            Boolean isSendSms = (Boolean) map.get("isSendSms");
            Integer conferenceType = (Integer) map.get("conferenceType");
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpPost post = new HttpPost("https://api.meeting.huaweicloud.com/v1/mmc/management/conferences");
            post.addHeader("X-Access-Token",accessToken);
            HashMap<String, Object> mapParameter = new HashMap<>();
            mapParameter.put("mediaTypes",mediaTypes);//"Voice”:语音。 Video 标清视频。 "HDVideo”:高清视频
            if(recordAuthType!=null){
                mapParameter.put("recordAuthType",recordAuthType);//0:可通过链接观看/下载。1:企业用户可观看/下载。2:与会者可观看/下载。
            }
            if(recordType!=null){
                mapParameter.put("recordType",recordType);//录播类型。默认为禁用。0: 禁用 。1: 直播 。2: 录播。3: 直播+录播。
            }
            if(isAutoRecord!=null){
                mapParameter.put("isAutoRecord",isAutoRecord);//会议是否自动启动录制,在录播类型为:录播、录播+直播时才生效。默认为不自动启动。1:自动启动录制。 0:不自动启动录制。
            }
            if(interval!=null){
                mapParameter.put("interval",interval);//“cycle”选择了“Day”,表示每几天召开一次,取值范围[1,60]。“cycle”选择了“Week”,表示每几周召开一次,取值范围[1,5]。“cycle”选择了“Month”,Interval表示隔几月,取值范围[1,12]。
            }
            mapParameter.put("timeZoneID","56");//时区
            if(StringUtil.isNotEmpty(startTime)){
                String s = subDayHour(startTime);//会议开始时间(UTC时间)减去8小时,接口正常返回,存在逆向问题 +8 -8
                mapParameter.put("startTime",s);//创建预约会议时,如果没有指定开始时间或填空串,则表示会议马上开始。格式:yyyy-MM-dd HH:mm
            }
            if(conferenceType!=null && conferenceType!=0){
                mapParameter.put("conferenceType",conferenceType);//创建会议类型(默认为普通会议)。0 : 普通会议。 1:周期会议,此时“cycleParams”必须填写。
                CycleParams cycleParams = new CycleParams();
                String startDate = (String) map.get("startDate");
                String endDate = (String) map.get("endDate");
                Object point = map.get("point");
                if(StringUtil.isNotEmpty(startDate) && StringUtil.isNotEmpty(endDate)){
                    cycleParams.setStartDate(startDate);//周期会议的开始日期,格式:YYYY-MM-DD。开始日期不能早于当前日期。
                    cycleParams.setEndDate(endDate);
                    if(StringUtil.isNotEmpty(point)){
                        List<Integer> pointlist = castList(point, Integer.class);
                        cycleParams.setPoint(pointlist);
                    }
                }else {
                    j.setMsg("缺失必填参数开始时间 或者 结束时间");
                    return j;
                }
                String cycle = (String) map.get("cycle");
                if(StringUtil.isNotEmpty(cycle)){
                    cycleParams.setCycle(cycle);//周期类型。“Day”:天。“Week”:星期。“Month”:月。
                }else {
                    j.setMsg("缺失必填参数 周期类型");
                    return j;
                }
                cycleParams.setPreRemindDays(1);
                /**
                 * 支持用户指定提前会议通知的天数N,预订人收到整个周期会议的通知,所有与会人在每个子会议召开时间的前N天收到会议通知(包括日历)。
                 * 天数N的输入根据间隔期进行自动调整,如果按日每隔2天召开,则N自动变为2,如果为按周每2周的周一、周二,则N自动变为14。 约束:暂不考虑夏令时处理。
                 * 取值范围[1,30]。
                 * default: 1
                 */
                mapParameter.put("cycleParams",cycleParams);
            }
            String subject = (String) map.get("subject");//会议主题
            if(StringUtil.isNotEmpty(subject)){
                mapParameter.put("subject",subject);
            }
            if (StringUtil.isNotEmpty(length)) {
                mapParameter.put("length",length);//会议持续时长,单位分钟,最大值为1440,最短15。default: 30。
            }
            /** mediaTypes
             * 会议的媒体类型。
             * 由1个或多个枚举String组成,多个枚举时,每个枚举值之间通过“,”逗号分隔,枚举值如下:
             *
             * "Voice”:语音。
             * "Video”:标清视频。
             * "HDVideo”:高清视频(与Video互斥,如果同时选择Video、HDVideo,则系统默认选择Video)。
             * "Telepresence”:智真(与HDVideo、Video互斥,如果同时选择,系统使用Telepresence)。(预留字段)
             * "Data”:多媒体(系统配置决定是否自动添加Data)。
             */
            /**
             * attendee 与会者列表。该列表可以用于发送会议通知、会议提醒、会议开始时候进行自动邀请
             */
            String phone = (String) map.get("phone");
            if(StringUtil.isNotEmpty(phone)){
                Attendee attendee = new Attendee();
                attendee.setPhone(phone);
                mapParameter.put("attendee",attendee);
                if(StringUtil.isNotEmpty(phone)){
                    attendee.setPhone(phone);
                    mapParameter.put("sms",sms);
                }
            }
            //是否发送短信
            if(StringUtil.isNotEmpty(isSendSms) || true==(isSendSms==null?false:true)){
                RestConfConfigDTO confConfigDTO = new RestConfConfigDTO();
                confConfigDTO.setIsSendSms(true);
                mapParameter.put("ConfConfigInfo",confConfigDTO);
            }
            String jsonObject = JSON.toJSONString(mapParameter);
            StringEntity json = new StringEntity(jsonObject,"UTF-8");
            post.setEntity(json); //设置请求参数
            post.setHeader("Content-Type", "application/json;charset=utf8");
            HttpResponse response = httpClient.execute(post);
            //response.setHeader("Content-Type","application/json;charset=utf8");
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                message = "创建会议成功";
                //返回String
                String res = EntityUtils.toString(response.getEntity(),"UTF-8");
                List<ConferenceInfo> conferenceInfos = JSONObject.parseArray(res, ConferenceInfo.class);
                for (ConferenceInfo conferenceInfo : conferenceInfos) {
                    System.out.println("创建的会议ID "+conferenceInfo.getConferenceID());
                }
                j.setObj(conferenceInfos);
            }else {
                message = "创建异常或者Token失效";
                j.setSuccess(false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }

    /**
     * 查询会议列表
     * @param
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openSearchMeetings",method = RequestMethod.POST)
    public ResultVO  openSearchMeetings(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken =(String )map.get("X-Access-Token");
            String queryConfMode =(String )map.get("queryConfMode");
            Integer offset =(Integer )map.get("offset");
            Integer limit =(Integer )map.get("limit");
            String searchKey =(String )map.get("searchKey");
            HttpClient httpClient = new HttpClient();
            httpClient.setConnectionTimeout(1000 * 60);
            //处理乱码
            httpClient.getParams().setContentCharset("UTF-8");
            httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            GetMethod getMethod = null;
            String url="";
            if(StringUtil.isNotEmpty(queryConfMode)){
                //ADAY:一天。AWEEK:一周。AMONTH:一个月。ALL:查询所有。
                //创建post请求
                url="https://api.meeting.huaweicloud.com/v1/mmc/management/conferences?queryConfMode="+queryConfMode+"&offset="+(offset==null?0:offset)+"&limit="+(limit==null?20:limit);
            }else {
                //创建post请求
                url="https://api.meeting.huaweicloud.com/v1/mmc/management/conferences?offset="+(offset==null?0:offset)+"&limit="+(limit==null?20:limit);
            }
            if(StringUtil.isNotEmpty(searchKey)){
                url=url+"&searchKey="+ URLEncoder.encode(searchKey, "utf-8");
            }
            getMethod = new GetMethod(url);
            //创建post请求
            //组装参数
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            getMethod.addRequestHeader("X-Access-Token",accessToken);
            getMethod.addRequestHeader("Content-Type","application/json;charset=UTF-8");
            try {
                //执行请求 返回状态码
                int statusCode = httpClient.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) { // 200
                   j.setMsg("查询会议异常或者Token过期");
                   j.setSuccess(false);
                   return j;
                }else {
                //获取responsebody
                byte[] responseBody = getMethod.getResponseBody();
                String result = new String(responseBody, "UTF-8");
                JSONObject jsonBody = JSONObject.parseObject(result);
                j.setObj(jsonBody);
//                Object data = JSONObject.parseObject(jsonBody.toJSONString()).get("data");
//                List<ConferenceInfo> conferenceInfos = JSONObject.parseArray(data.toString(), ConferenceInfo.class);
//                for (ConferenceInfo conferenceInfo : conferenceInfos) {
//                    System.out.println("查询已创建的会议ID "+conferenceInfo.getConferenceID()+ " " +conferenceInfo.getSubject());
//                }
//                message = "查询会议列表成功";
//                j.setObj(conferenceInfos);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }
    /**
     * 查询在线会议列表
     * @param
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openSearchOnLineMeetings",method = RequestMethod.POST)
    public ResultVO  openSearchOnLineMeetings(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken =(String )map.get("X-Access-Token");
            Boolean queryAll =(Boolean )map.get("queryAll");
            Integer offset =(Integer )map.get("offset");
            Integer limit =(Integer )map.get("limit");
            String searchKey =(String )map.get("searchKey");
            HttpClient httpClient = new HttpClient();
            httpClient.setConnectionTimeout(1000 * 60);
            //处理乱码
            httpClient.getParams().setContentCharset("UTF-8");
            httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            GetMethod getMethod = null;
            String url="";
            if(StringUtil.isNotEmpty(queryAll)){
                //ADAY:一天。AWEEK:一周。AMONTH:一个月。ALL:查询所有。
                //创建post请求
                url="https://api.meeting.huaweicloud.com/v1/mmc/management/conferences/online?queryAll="+queryAll+"&offset="+(offset==null?0:offset)+"&limit="+(limit==null?20:limit);
            }else {
                //创建post请求
                url="https://api.meeting.huaweicloud.com/v1/mmc/management/conferences/online?offset="+(offset==null?0:offset)+"&limit="+(limit==null?20:limit);
            }
            if(StringUtil.isNotEmpty(searchKey)){
                url=url+"&searchKey="+ URLEncoder.encode(searchKey, "utf-8");
            }
            getMethod = new GetMethod(url);
            //创建post请求
            //组装参数
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            getMethod.addRequestHeader("X-Access-Token",accessToken);
            getMethod.addRequestHeader("Content-Type","application/json;charset=UTF-8");
            try {
                //执行请求 返回状态码
                int statusCode = httpClient.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) { // 200
                    j.setMsg("查询会议异常或者Token过期");
                    j.setSuccess(false);
                    return j;
                }else {
                    //获取responsebody
                    byte[] responseBody = getMethod.getResponseBody();
                    String result = new String(responseBody, "UTF-8");
                    JSONObject jsonBody = JSONObject.parseObject(result);
                    j.setObj(jsonBody);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }
    /**
     * 取消预约会议
     * @param
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openCancelMeeting",method = RequestMethod.POST)
    public ResultVO  openCancelMeeting(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken =(String )map.get("X-Access-Token");
            String conferenceID =(String )map.get("conferenceID");
            HttpClient httpClient = new HttpClient();
            httpClient.setConnectionTimeout(1000 * 60);
            //处理乱码
            httpClient.getParams().setContentCharset("UTF-8");
            httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            //创建delete请求
            DeleteMethod deleteMethod = new DeleteMethod("https://api.meeting.huaweicloud.com/v1/mmc/management/conferences?conferenceID="+conferenceID);
            //组装参数
            deleteMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            deleteMethod.addRequestHeader("X-Access-Token",accessToken);
            deleteMethod.addRequestHeader("Content-Type","application/json;charset=UTF-8");
            try {
                //执行请求 返回状态码
                int statusCode = httpClient.executeMethod(deleteMethod);
                if (statusCode != HttpStatus.SC_OK) {
                    JSONObject jsonBody = JSONObject.parseObject(new String(deleteMethod.getResponseBody(), "UTF-8"));
                    String error_code = (String)jsonBody.get("error_code");
                    if("MMC.111071067".equalsIgnoreCase(error_code)){
                        j.setMsg("会议正在召开无法取消");
                        j.setSuccess(false);
                        return j;
                    }if("MMC.111070005".equalsIgnoreCase(error_code)){
                        j.setMsg("请检查会议ID是否正确,或会议是否已召开");
                        j.setSuccess(false);
                        return j;
                    }else {
                        System.out.println( new String(deleteMethod.getResponseBody(), "UTF-8"));
                        j.setMsg("查询取消异常或者Token过期");
                        j.setSuccess(false);
                        return j;
                    }
                }else {
                    message = "取消会议成功";
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }
    /**
     * 查询华为云企业通讯录
     * @param
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openQueryMeetingAddressList",method = RequestMethod.POST)
    public ResultVO  openQueryMeetingAddressList(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken =(String )map.get("X-Access-Token");
            String searchKey =(String )map.get("searchKey");//搜索条件。支持账号、姓名、手机、邮箱模糊搜索
            String deptCode =(String )map.get("deptCode");//部门编码。maxLength: 32   minLength:0
            HttpClient httpClient = new HttpClient();
            //处理乱码
            httpClient.getParams().setContentCharset("UTF-8");
            httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            //创建get请求
            GetMethod getMethod =null;
            if(StringUtil.isNotEmpty(searchKey)){
                 getMethod = new GetMethod("https://api.meeting.huaweicloud.com/v1/usg/abs/users?searchKey="+searchKey);
            }else if(StringUtil.isNotEmpty(deptCode)){
                getMethod = new GetMethod("https://api.meeting.huaweicloud.com/v1/usg/abs/users?deptCode="+deptCode);

            } else{
                 getMethod = new GetMethod("https://api.meeting.huaweicloud.com/v1/usg/abs/users");
            }
            //组装参数
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            getMethod.addRequestHeader("X-Access-Token",accessToken);
            getMethod.addRequestHeader("Content-Type","application/json;charset=UTF-8");
            try {
                //执行请求 返回状态码
                int statusCode = httpClient.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) {
                    JSONObject jsonBody = JSONObject.parseObject(new String(getMethod.getResponseBody(), "UTF-8"));
                    String error_code = (String)jsonBody.get("error_code");
                    String error_msg = (String)jsonBody.get("error_msg");
                    if("USG.000000004".equalsIgnoreCase(error_code)){
                        j.setMsg("请检查请求头域X-Auth-Token或X-Access-Token的值是否过期");
                    }else {
                        j.setMsg("查询取消异常或者Token过期");
                    }
                    j.setSuccess(false);
                    return j;
                }else {
                    byte[] responseBody = getMethod.getResponseBody();
                    String result = new String(responseBody, "UTF-8");
                    JSONObject jsonBody = JSONObject.parseObject(result);
                    Object data = JSONObject.parseObject(jsonBody.toJSONString()).get("data");
                    List<UserDTO > userDTOList = JSONObject.parseArray(data.toString(), UserDTO.class);
                    j.setObj(userDTOList);
                    message = "查询通讯录成功";
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }
    /**
     * 查询会议录制列表
     * @param
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openSearchMeetingsRecordList",method = RequestMethod.POST)
    public ResultVO  openSearchMeetingsRecordList(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken =(String )map.get("X-Access-Token");
            System.out.printf("startDate:  "+(String) map.get("startDate"));
            long startDate= Long.parseLong((String) map.get("startDate"));
            long endDate = Long.parseLong((String) map.get("endDate"));
            Boolean queryAll =(Boolean )map.get("queryAll");
            HttpClient httpClient = new HttpClient();
            httpClient.setConnectionTimeout(1000 * 60);
            //处理乱码
            httpClient.getParams().setContentCharset("UTF-8");
            httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            //创建post请求
            GetMethod getMethod = new GetMethod("https://api.meeting.huaweicloud.com/v1/mmc/management/record/files?startDate="+startDate+"&endDate="+endDate+"&queryAll="+queryAll);
            //组装参数
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            getMethod.addRequestHeader("X-Access-Token",accessToken);
            getMethod.addRequestHeader("Content-Type","application/json;charset=UTF-8");
            try {
                //执行请求 返回状态码
                int statusCode = httpClient.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) { // 200
                    j.setMsg("查询会议录制异常或者Token过期");
                    j.setSuccess(false);
                    return j;
                }else {
                    //获取responsebody
                    byte[] responseBody = getMethod.getResponseBody();
                    String result = new String(responseBody, "UTF-8");
                    JSONObject jsonBody = JSONObject.parseObject(result);
                    Object data = JSONObject.parseObject(jsonBody.toJSONString()).get("data");
//                    List<RecordFileInfo> recordFileInfo = JSONObject.parseArray(data.toString(), RecordFileInfo.class);
//                    message = "查询会议录制列表成功";
//                    j.setObj(recordFileInfo);
                    message = "查询会议录制列表成功";
                    j.setObj(data);
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }

    /**
     * 批量删除录制视频
     * @param map
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/openDeleteMeetingsRecordByIds",method = RequestMethod.POST)
    public ResultVO  openDeleteMeetingsRecordByIds(@OpenApi Map map) {
        ResultVO j = new ResultVO();
        String message = null;
        try {
            String accessToken =(String )map.get("X-Access-Token");
            String confUUIDs =(String )map.get("confUUIDs");
            HttpClient httpClient = new HttpClient();
            //处理乱码
            httpClient.getParams().setContentCharset("UTF-8");
            httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
            //创建delete请求
            DeleteMethod deleteMethod = new DeleteMethod("https://api.meeting.huaweicloud.com/v1/mmc/management/record/files?confUUIDs="+confUUIDs);
            //组装参数
            deleteMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            deleteMethod.addRequestHeader("X-Access-Token",accessToken);
            deleteMethod.addRequestHeader("Content-Type","application/json;charset=UTF-8");
            try {
                //执行请求 返回状态码
                int statusCode = httpClient.executeMethod(deleteMethod);
                if (statusCode != HttpStatus.SC_OK) {
                    JSONObject jsonBody = JSONObject.parseObject(new String(deleteMethod.getResponseBody(), "UTF-8"));
                    String error_code = (String)jsonBody.get("error_code");
                    String error_msg = (String)jsonBody.get("error_msg");
                    System.out.printf(error_msg + error_code);
                }else {
                    message = "删除录制成功";
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }

    /**
     * 华为云修改密码
     * @param map
     * @return
     */
    @OpenApi
    @RequestMapping(value = "/updatePassWord",method = RequestMethod.POST)
    public ResultVO updatePassWord(@OpenApi Map map) {
        String accessToken = (String) map.get("accessToken");
        String account = (String) map.get("account");//帐号,必须是携带域名的帐号
        String newPwd = (String) map.get("newPwd");
        String oldPwd = (String) map.get("oldPwd");
        ResultVO j = new ResultVO();
        String message = null;
        try {
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpPut put = new HttpPut("https://api.meeting.huaweicloud.com/v1/usg/acs/password");
            put.addHeader("X-Access-Token",accessToken);
            put.addHeader("Content-Type","application/json; charset=UTF-8");
            HashMap<String, Object> mapParameter = new HashMap<>();
            mapParameter.put("account",account);
            mapParameter.put("oldPwd",oldPwd);
            mapParameter.put("newPwd",newPwd);//用户新的登录密码。密码要求:长度要求8~32个字符
            //至少包含两种字符类型:小写字母、大写字母、数字、特殊字符(` ~ ! @ # $ % ^ & * ( ) - _ = + \ | [ { } ] ; : " ,' < . > / ?)
            //旧密码和新密码不能相同 上次修改密码后5分钟内不能更新密码 不能与最近使用的旧密码相同 不能包含3个以上重复字符
            //密码不能包含与其对应的用户名(不区分大小写)以及逆序的用户名(不区分大小写)
            //新密码与旧密码之间允许的最少不相同字符数为2个
            net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(mapParameter);
            StringEntity json = new StringEntity(jsonObject.toString());
            //发送json数据需要设置contentType
            json.setContentType("application/json;charset=UTF-8");
            put.setEntity(json); //设置请求参数
            HttpResponse response = httpClient.execute(put);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                //返回String
                String res = EntityUtils.toString(response.getEntity());
                JSONObject object = JSONObject.parseObject(res);
//                String newAccessToken = (String)object.get("accessToken");
//                Integer refreshValidPeriodSecond = (Integer)object.get("refreshValidPeriod");//失效时间戳
//                System.out.println("有效时长:"+ refreshValidPeriodSecond +"秒");
//                if(StringUtil.isNotEmpty(newAccessToken)){
//                    j.setObj(newAccessToken);
//                    message="刷新token成功";
//                }
            }else {
                message="修改失败";
                j.setSuccess(false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        j.setMsg(message);
        return j;
    }
    /**
     * 当前时间减去8天
     * @param date
     * @return
     * @throws ParseException
     */
    private String subDayHour(String date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dt = sdf.parse(date);
        Calendar rightNow = Calendar.getInstance();
        rightNow.setTime(dt);
        rightNow.add(Calendar.HOUR_OF_DAY, -8);
        Date dt1 = rightNow.getTime();
        String reStr = sdf.format(dt1);
        return reStr;
    }
    public static <T> List<T> castList(Object obj, Class<T> clazz)
    {
        List<T> result = new ArrayList<T>();
        if(obj instanceof List<?>)
        {
            for (Object o : (List<?>) obj)
            {
                result.add(clazz.cast(o));
            }
            return result;
        }
        return null;
    }
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
基于Java的视频会议系统(软件程序+WORD论文文档) 2.1.1 技术可行性 网络视频会议是顺应市场的需求而设计的。采用JAVA 编程语言,用eclipse开发平台实现。用到多媒体技术(JAVA 多媒体框架JMF),视频和音频用TRP协议传输,用到Socket编程技术,多播技术。网络视频会议首先是基于网络传输的,那么就必然要依托于JAVA网络编程的相关知识。在这基础上,由于相关音频、视频,所以还要涉及到JAVA的多媒体技术的相关知识,即JMF (Java Media Framework)。利用JAVA的这个组件,我们可以方便的处理多媒体文件,并基于RTP协议进行实时传输。 2.1.2 操作可行性 系统运行于Windows环境,其用户操作界面友好,便于操作,适合视频会议流程。 系统的基本操作如下: 1.启动服务器; 2.用户连接到服务器; 3.进行视频连接; 4.举行会议; 5.会议完毕,退出系统。 2.2 采用的关键技术介绍 2.2.1 JAVA多媒体技术 JAVA多媒体技术的核心是Java媒体框架 JMF(Java Media Framework)。JMF中包含了许多用于处理多媒体的API,它是一个很好的多媒体编程工具,同时也是一个相当复杂的系统。JMF的主要应用功能之一是多媒体数据流在网络中的实时传输,其RTP包中提供的RTP包中提供的RTPManager(RTP管理器)、TrackContol(轨道控制器)、SendStream(发送数据流)、ReceiveStream(接收数据流)、InetAddress(IP地址)和SessionAddress(会话地址)等类使得编写网络实时数据传输变得容易,基于RTP协议的RTP应用程序框架为实现流媒体在网络中实时传输提供了Java程序框架,应用它可方便的实现多媒体数据流在网络中的实时传输。实时传输协议RTP是在Internet网上针对多媒体数据流的一种传输协议,RTP被定义为在一对一获一对多的传输情况下工作的,其目的是提供时间信息和实现多媒体数据流的同步。RTP由RTP和RTCP(实时控制协议)两个部分组成。RTP本身并不能为按顺序传送数据包提供可靠的传送机制,可不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。 2.2.2 JAVA 网络编程技术 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。   目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 数据在Internet中是以有限大小的包形式传输的,这些包称为数据报(datagram).但是,由于数据报长度有限,通常必须将数据分解为多个包,在目的地再重新组合。有可能一包或多个包在传输中丢失或遭到破坏。由于网络视频会议的实时性要求,不可能让视频传输的每一贞都准确无误。而TCP协议正是为数据可靠传输而设计的。那么选择UDP协议,即用户数据报协议(User Datagram Protocol,UDP),就成为一种必然。 Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通讯。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。 多播通信是一类特殊的IP地址(D类IP地址)这些IP地址并不和任何主机关联,而是专门为多播通信保留下来的,地址

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值