java调用腾讯会议api,开会录制问题

最近公司项目要求,需要调用腾讯会议api进行开会,并且要查看录制文件,会议记录等功能。研究了好一番,总算是搞定了,期间由于网上的实例太少,并且讲的不清楚,还特地询问了腾讯客服!不得不说,大公司的客服就是到位,解决问题的效率还是相当高的,甚至会加你微信,将你单独拉倒一个微信群中讨论这个问题。话不多说,下面上代码:

第一、你需要申请一个商业版或者企业版的腾讯会议账号,当然这是要花钱的。申请地址:申请地址,申请好了以后,会邮件发给你APPID,SecretId,SecretKey三个参数。

然后你就可以登录你的管理后台页面:https://meeting.tencent.com/msgcode-login.html?
创建一个管理用户(即主持人,初级商业版的应该只能够激活一个主持人),注意主持人的userid ,这里可以自定义,后面创建会议要用的。
在这里插入图片描述

第二、打开腾讯会议官方api文档
下面我们先调用接口创建一个会议,然后会生成对应的会议url,点击加入后,主持人再进行录制操作,然后查询录制就可以了。

所有的接口调用,都需要分两步,第一要获取企业鉴权签名,第二步才是调用接口
在这里插入图片描述
获取鉴权签名,具体可以看api文档,这里直接上代码:

 private static  String SecretKey="自己的SecretKey";
 private static  String appId="自己的appId";
 private static  String SdkId="自己的SdkId";  //这个参数是非必填的 但是有就需要填
 private static  String MEETINGURL="https://api.meeting.qq.com/v1/meetings";  
 private static  String URI="/v1/meetings";
  private static  String YLZURI="/v1/addresses";
  private static  String RECORDSURI="/v1/records";

public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, IOException {
        Date today=  new  Date();
        int createTime = getSecondTimestamp(today);
        //1小时后
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) + 1);
        Date endtime=calendar.getTime();
        int endTime = getSecondTimestamp(endtime);
        //创建会议
        String result=doCreateMeetings("admin","admintest3",1,0,createTime,endTime);
        
        //查询会议录制地址列表
       //String result= getYlzPageList(10,1,"11566804716889678952","","admin",1621933200,1621935000);
       //查询会议录制地址
       String result=  GetYlzdz("1397122561082425344","admin");

       System.out.println("----------------"+result);
    }


/***
     * 生成签名 执行创建会议*/
    public static String doCreateMeetings(String userid,String subject,Integer instanceid,Integer type, int createTime,int endTime) throws InvalidKeyException, NoSuchAlgorithmException, IOException {
        //body参数
        String req_body="{" +
                "\"userid\": \""+userid+"\"," +   /*腾讯会议用户唯一标识 不能为1--9内的数字*/
                "\"instanceid\": "+instanceid+"," +   /*用户的终端设备类型 1:PC*/
                "\"subject\": \""+subject+"\"," +  /*会议主题  不支持中文*/
                "\"type\": "+type+"," +   // 会议类型:0:预约会议 1:快速会议
                "\"hosts\":[{\"userid\": \""+userid+"\"}]," +   //会议指定主持人的用户 ID,如果无指定,主持人将被设定为参数 userid 的用户,即 API 调用者。
                "\"start_time\": \""+createTime+"\"," +  //会议开始时间戳(单位秒)。
                "\"end_time\": \""+endTime+"\"," +    //会议结束时间
                    "\"settings \": {" +   //会议媒体参数配置。
                    "\"mute_enable_join \": true," +   //入会时静音。
                    "\"mute_all \": false" +  //全体静音。
                    "}" +
                "}";

        //生成签名
        String signature = sign(SecretId, SecretKey, "POST", nonce, String.valueOf(createTime), URI, req_body);
        log.info("我是创建会议签名:------------"+signature);
        String  code=createMeetingPost(MEETINGURL,SdkId,SecretId,String.valueOf(createTime),nonce,appId,signature,req_body);
        log.info("创建会议result:------------"+signature);
        return code;
    }

     /**
     * @auther: 创建会议
     * @Description 发送post请求  参数String
     * @date:
     */
    private static String createMeetingPost(String urlPath,String SdkId,String SecretId,
                                     String createTime,String nonce,String appId,
                                     String signature,String jsonParam) throws IOException {
        HttpClient client = HttpClients.createDefault();
        HttpPost request = new HttpPost(urlPath);
        // 设置文件类型:
        request.setHeader("Content-Type", "application/json;charset=UTF-8");
        request.setHeader("X-TC-Key",SecretId);
        request.setHeader("X-TC-Timestamp",createTime);
        request.setHeader("X-TC-Nonce",nonce);
        request.setHeader("AppId",appId);
        request.setHeader("SdkId",SdkId);
        request.setHeader("X-TC-Signature",signature);
        request.setHeader("X-TC-Registered","1"); //必填 否则录制的文件无法生成

        //传参
        StringEntity se = new StringEntity(jsonParam);
        se.setContentType("text/json");
        request.setEntity(se);
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return result;
    }


 /*******************会议云录制******************************************/

    /***查询会议录制地址**/
     public static String getYlzPageList(Integer  page_size ,Integer page,String meeting_id,String meeting_code,String userid,int start_time,int end_time) throws InvalidKeyException, NoSuchAlgorithmException, IOException {
        log.info("查询会议录制地址,page_size:{}",page_size+",page="+page+",meeting_id="+meeting_id);
        //body参数
        Date today=  new  Date();
        int createTime = getSecondTimestamp(today);

        String Vuri= RECORDSURI+"?page_size="+page_size+"&page="+page+"&meeting_id="+meeting_id+"&meeting_code="+meeting_code+"&userid="+userid+"&start_time="+start_time+"&end_time="+end_time;
        //生成签名
        String signature = sign(SecretId, SecretKey, "GET", nonce, String.valueOf(createTime), Vuri, "");

        // 查询会议录制地址
        String requestUri = "https://api.meeting.qq.com/v1/records?page_size="+page_size+"&page="+page+"&meeting_id="+meeting_id+"&meeting_code="+meeting_code+"&userid="+userid+"&start_time="+start_time+"&end_time="+end_time;
        HttpGet request = new HttpGet(requestUri);
        // 设置文件类型:
        request.setHeader("Content-Type", "application/json;charset=UTF-8");
        request.setHeader("X-TC-Key",SecretId);
        request.setHeader("X-TC-Timestamp", String.valueOf(createTime));
        request.setHeader("X-TC-Nonce",nonce);
        request.setHeader("AppId",appId);
        request.setHeader("SdkId",SdkId);
        request.setHeader("X-TC-Signature",signature);
        request.setHeader("X-TC-Registered","1");//注意 必填1  否则查不到信息
        //传参
        HttpClient client = HttpClients.createDefault();
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return result;
    }



    /***查询会议录制地址**/
     public static String GetYlzdz(String  meeting_record_id ,String userid) throws InvalidKeyException, NoSuchAlgorithmException, IOException {
        log.info("查询会议录制地址,userId:{}",userid+",meeting_record_id="+meeting_record_id);
        //body参数
        Date today=  new  Date();
        int createTime = getSecondTimestamp(today);
        //生成签名
        String signature = sign(SecretId, SecretKey, "GET", nonce, String.valueOf(createTime), YLZURI+"?meeting_record_id="+meeting_record_id+"&userid="+userid, "");

        // 查询会议录制地址
        String requestUri = "https://api.meeting.qq.com/v1/addresses?meeting_record_id="+meeting_record_id+"&userid="+userid;
        HttpGet request = new HttpGet(requestUri);
        // 设置文件类型:
        request.setHeader("Content-Type", "application/json;charset=UTF-8");
        request.setHeader("X-TC-Key",SecretId);
        request.setHeader("X-TC-Timestamp", String.valueOf(createTime));
        request.setHeader("X-TC-Nonce",nonce);
        request.setHeader("AppId",appId);
        request.setHeader("SdkId",SdkId);
        request.setHeader("X-TC-Signature",signature);
        request.setHeader("X-TC-Registered","1");//必填
        //传参
        HttpClient client = HttpClients.createDefault();
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.toString(entity, "UTF-8");
        return result;
    }




 /**********************时间戳*******************************************/
    public static int getSecondTimestamp(Date date){
        if (null == date) {
            return 0;
        }
        String timestamp = String.valueOf(date.getTime());
        int length = timestamp.length();
        if (length > 3) {
            return Integer.valueOf(timestamp.substring(0,length-3));
        } else {
            return 0;
        }
    }
    
    /**************************生成签名*************************************/
	private static String HMAC_ALGORITHM = "HmacSHA256";
    private static char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    static String bytesToHex(byte[] bytes) {

        char[] buf = new char[bytes.length * 2];
        int index = 0;
        for (byte b : bytes) {
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
            buf[index++] = HEX_CHAR[b & 0xf];
        }

        return new String(buf);
    }

    /**
     * 生成签名,开发版本oracle jdk 1.8.0_221
     *
     * @param secretId        邮件下发的secret_id
     * @param secretKey       邮件下发的secret_key
     * @param httpMethod      http请求方法 GET/POST/PUT等
     * @param headerNonce     X-TC-Nonce请求头,随机数
     * @param headerTimestamp X-TC-Timestamp请求头,当前时间的秒级时间戳
     * @param requestUri      请求uri,eg:/v1/meetings
     * @param requestBody     请求体,没有的设为空串
     * @return 签名,需要设置在请求头X-TC-Signature中
     * @throws NoSuchAlgorithmException e
     * @throws InvalidKeyException      e
     */
    static String sign(String secretId, String secretKey, String httpMethod, String headerNonce, String headerTimestamp, String requestUri, String requestBody)
            throws NoSuchAlgorithmException, InvalidKeyException {
        String tobeSig =
                httpMethod + "\nX-TC-Key="
                + secretId + "&X-TC-Nonce="
                + headerNonce + "&X-TC-Timestamp="
                + headerTimestamp + "\n" + requestUri + "\n" + requestBody;
        Mac mac = Mac.getInstance(HMAC_ALGORITHM);
        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), mac.getAlgorithm());
        mac.init(secretKeySpec);
        byte[] hash = mac.doFinal(tobeSig.getBytes(StandardCharsets.UTF_8));
        String hexHash = bytesToHex(hash);
        return new String(Base64.getEncoder().encode(hexHash.getBytes(StandardCharsets.UTF_8)));
    }

具体接口的传参,调用方法等,大家可以自行查看api文档。
下面说明一些注意点:

第一、注意:文档中注明SdkId为非必填

在这里插入图片描述
但是如果你在后台管理中添加了子应用就需要填写
在这里插入图片描述

第二、所有调用涉及到的时间 都是时间戳的形式,精确到秒,千万不要毫秒如创建会议时的开始时间,结束时间

第三、注意接口说明中的类型,千万不要错了,否则会报API签名错误

**第四、创建会议时,如果你需要录制功能,调用获取签名的时候,要将请求头中的X-TC-Registered 设置为1,否则你在管理后台看不到录制的文件。查询会议录制的时候也是一样。**这点很坑,问了腾讯客服好久才解决。

第五、注意请求接口的请求方式,是get还是post。如果是get方式,调用获取签名认证的时候,需要将“”字符串带入。
在这里插入图片描述

第六、java代码中,调用腾讯会议api接口请求的时候,不能使用简单的HttpURLConnection 创建连接、要使用 HttpClient方式,否则会一直报400错误,应该是https请求被拦截的缘故。
在这里插入图片描述
在这里插入图片描述

以上就是全部,希望能帮到你!如果还是有问题,可以下载我写的demo,包含了常用功能https://download.csdn.net/download/weixin_43832166/19085203

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
package chat; import org.red5.server.adapter.ApplicationAdapter; import org.red5.server.api.IConnection; import org.red5.server.api.IClient; import org.red5.server.api.IScope; import org.red5.server.api.Red5; import org.red5.server.api.service.IServiceCapableConnection; import org.red5.server.api.so.ISharedObject; import org.red5.server.api.ScopeUtils; import org.red5.server.api.so.ISharedObjectService; import org.red5.server.api.*; import org.red5.server.api.scheduling.*; import org.red5.samples.components.ClientManager; import org.red5.server.api.service.ServiceUtils; import org.red5.server.api.service.*; import org.red5.server.api.service.IPendingServiceCallback; // import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.*; // // public class Application extends ApplicationAdapter{ public Map<String, CClient> clients = new HashMap<String, CClient>(); public class CClient{ String id = null; String pseudo = null; String role = null; String sexe = null; String status = null; String room=null; String world=null; public String getRole(){ return role; } public String getName(){ return pseudo; } public String getId(){ return id; } public String getSexe(){ return sexe; } public String getStatus(){ return status; } public String getRoom(){ return room; } public String getWorld(){ return world; } public void setRole(String _role){ role = _role; } public void setPseudo(String _pseudo){ pseudo = _pseudo; } public void setSexe(String _sexe){ sexe = _sexe; } public void setId(String _id){ id = _id; } public void setStatus(String _status){ status = _status; } public void setRoom(String _room){ room = _room; } public void setWorld(String _world){ world = _world; } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉登的小行星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值