admin管理员组文章数量:1530052
最近公司项目要求,需要调用腾讯会议api进行开会,并且要查看录制文件,会议记录等功能。研究了好一番,总算是搞定了,期间由于网上的实例太少,并且讲的不清楚,还特地询问了腾讯客服!不得不说,大公司的客服就是到位,解决问题的效率还是相当高的,甚至会加你微信,将你单独拉倒一个微信群中讨论这个问题。话不多说,下面上代码:
第一、你需要申请一个商业版或者企业版的腾讯会议账号,当然这是要花钱的。申请地址:申请地址,申请好了以后,会邮件发给你APPID,SecretId,SecretKey三个参数。
然后你就可以登录你的管理后台页面:https://meeting.tencent/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/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/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/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/download/weixin_43832166/19085203
版权声明:本文标题:java调用腾讯会议api,开会录制问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1726542972a1074904.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论