查询管理员操作日志

最近更新时间:2024-07-08 11:48:53

我的收藏

功能描述

腾讯会议支持企业内管理员和成员行为记录的保存,您可以通过企业管理后台或 API 对管理员和成员行为进行审计,其中管理员日志包括管理员在企业管理 Web 端的操作行为日志,包括:录制管理、账户管理、用户管理、会议管理、会议室管理、会议室连接器等。

接入步骤


1



步骤1:创建企业级应用

企业自建应用的应用类型分为企业级和应用级类型。目前查询管理员操作日志仅支持企业级应用获取。
企业级类型:企业级可以获取到您企业账户下的所有数据,该类型的应用需要由管理员创建。




步骤2:生成公私钥对

通过 openssl 命令生成私钥,私钥需要企业自己维护。
生成私钥:
openssl genrsa -out rsa_private_key.pem 1024
该指令支持1024和2048两种密钥长度。
生成公钥:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
通过此种方式生成的私钥是 pkcs1 格式,公钥是 pkcs8 格式。
私钥转 pkcs8 格式:
openssl pkcs8 -topk8 -in rsa_private_key.pem -nocrypt -out pkcs8.pem

步骤3:上传公钥

接口描述:账户级接口,仅企业超级管理员可以上传公钥,通过接口将公钥上传给腾讯会议,用于对指定日志的加密。覆盖式接口。
请求方式:PUT
接口请求域名:
https://api.meeting.qq.com/v1/encryption/public-key
鉴权方式:JWT
限频:100次/min

输入参数

参数名称
参数类型
是否必须
参数描述
userid
String
操作人 ID。
enc_type
Integer
算法类型(目前仅支持 RSA 算法,填充模式为 RSA_PKCS1_PADDING)。
0:RSA;默认值为0。
public_key
String
公钥内容。
key_len
Integer
密钥长度,单位bit (对于 RSA 算法目前仅支持1024、2048)。
scene_type
Integer
加密场景(不同场景可以上传不同的公钥,来加密不同场景下的数据)。
0:管理员操作日志。

输出参数

{ }

步骤4:获取管理员日志

接口描述:账户级接口,可以查询加密后的企业管理后台管理员操作日志信息。
请求方式:GET
接口请求域名:
https://api.meeting.qq.com/v1/log/admin-log
鉴权方式:JWT
限频:100次/min


输入参数

参数名称
参数类型
是否必须
参数描述
start_time
QUERY
开始时间戳。
end_time
QUERY
结束时间戳。
userid
QUERY
企业成员 ID。
event_code
QUERY
事件 code。
page
QUERY
页码,1-2000。默认为1。
page_size
QUERY
分页大小,50-1000。默认为50。

输出参数

参数名称
参数类型
参数描述
current_page
Integer
当前页码。
current_size
Integer
当前页条数。
total_page
Integer
总页数。
total_count
Integer
总条数。
log_list
Log 对象数组
日志列表。
enc_key
String
加密后的日志密钥。
Log 对象数组
参数名称
参数类型
参数描述
event_code
String
事件 code。
operator_id
String
操作人 ID。
operator_id_type
Integer
操作人类型。
event_time
String
事件时间戳。
event_details
Object
附录 定义。
operator_name
String
操作者名称。
event_status
String
事件状态:success,fail。

步骤5:使用私钥解密日志

通过接口获取到的 log_list 数据为通过对称加密后得到的数据。enc_key 为通过非对称加密后的对称密钥数据。您需要通过私钥解密出对称密钥的明文,再通过对称密钥解密日志列表拿到最终的日志明文。下面为解密数据的流程及代码 demo。



Python
Java
C++
Golang
import base64
from Crypto.Cipher import AES, PKCS1_v1_5
from Crypto.PublicKey import RSA
def decrypt_data(rsa_pri_key: str, enc_data: str, enc_key: str) -> str:
"""
解密数据
:param rsa_pri_key: PKCS#8格式的RSA私钥文件内容
:param enc_data: 加密数据
:param enc_key: 加密对称密钥
:return: 解密后数据
"""
# 解密对称密钥
aes_key = dec_enc_key(rsa_pri_key, enc_key)
# 解密数据
dec_data = dec_enc_data(aes_key, enc_data)
return dec_data
def dec_enc_key(rsa_pri_key: str, enc_key: str) -> str:
"""
解密对称密钥
"""
# base64解码对称密钥
decode_key = base64.b64decode(enc_key)
# 私钥解密对称密钥
rsa_key = RSA.import_key(rsa_pri_key)
cipher = PKCS1_v1_5.new(rsa_key)
aes_key = cipher.decrypt(decode_key, None)
if len(aes_key) != 32:
raise ValueError("非256位对称密钥")
return aes_key.decode()
def pkcs7_unpadding(orig_data: str) -> str:
"""
去除填充
"""
length = len(orig_data)
unpadding = orig_data[-1]
index = length - unpadding
if index < 0 or index >= length:
raise ValueError("index out of range")
return orig_data[:index]

def dec_enc_data(aes_key: str, enc_data: str) -> str:
"""
解密数据
"""
# 获取初始向量IV
iv = aes_key[:16]
# base64解码数据
decode_data = base64.b64decode(enc_data)
# 解密数据
cipher = AES.new(aes_key.encode(), AES.MODE_CBC, iv.encode())
orig_data = cipher.decrypt(decode_data)
# 去除填充
byte_dec_data = pkcs7_unpadding(orig_data)
dec_data = byte_dec_data.decode('utf-8')
return dec_data

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class DecryptDemo {
/**
* decryptData 解密数据
*
* @param rsaPriKey PKCS#8格式的RSA私钥文件内容
* @param encData 加密数据
* @param encKey 加密对称密钥
* @return decData 解密后数据
*/
public static String decryptData(String rsaPriKey, String encData, String encKey) throws Exception {
// 解密对称密钥
String aesKey = decEncKey(rsaPriKey, encKey);
// 解密数据
return decEncData(aesKey, encData);
}
/**
* decEncKey 解密对称密钥
* @param rsaPriKey
* @param encKey
* @return 对称密钥
*/
public static String decEncKey(String rsaPriKey, String encKey) throws Exception {
// base64解码对称密钥
byte[] decodeKey = Base64.getDecoder().decode(encKey);
// 私钥解密对称密钥
Cipher cipher = Cipher.getInstance("RSA");
PrivateKey pk = ReadPemKeyPair.loadPrivateKey(rsaPriKey);
cipher.init(Cipher.DECRYPT_MODE, pk);
String aesKey = new String(cipher.doFinal(decodeKey));
if (aesKey.length() != 32) {
throw new Exception("非256位对称密钥");
}
return aesKey;
}
/**
* decEncData 解密数据
* @param aesKey
* @param encData
* @return 解密后的明文数据
*/
public static String decEncData(String aesKey, String encData) throws Exception {
// 获取初始向量IV
String iv = aesKey.substring(0, 16);
// base64解码数据
byte[] decodeData = Base64.getDecoder().decode(encData);
// 解密数据
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec params = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(aesKey.getBytes(), "AES"), params);

// byte[] originData = pkcs7UnPadding(cipher.doFinal(decodeData));

// return new String(originData, StandardCharsets.UTF_8);
return new String(cipher.doFinal(decodeData));
}
private static byte[] pkcs7UnPadding(byte[] originData) throws Exception {
int length = originData.length;
int unpadding = originData[length - 1];
int index = length - unpadding;
if (index < 0 || index > length) {
throw new Exception("index out of range");
}
byte[] dst = new byte[index];
System.arraycopy(originData, 0, dst, 0, index);
return dst;
}
}
class ReadPemKeyPair {
private static String loadKey(String keyPem) throws IOException {
BufferedReader brKey = new BufferedReader(new StringReader(keyPem));
StringBuilder sb = new StringBuilder();
String line;
while ((line = brKey.readLine())!= null) {
if (!line.startsWith("-")) {
sb.append(line);
}
}
return sb.toString();
}
public static PrivateKey loadPrivateKey(String privateKeyPem) throws GeneralSecurityException, IOException {
// 读取 pem 中的 key
String privateKeyStr = loadKey(privateKeyPem);
byte [] pkcs8EncodedKeySpec = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(pkcs8EncodedKeySpec);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(privSpec);
}
public static PublicKey loadPublicKey(String publicKeyPem) throws GeneralSecurityException, IOException {
// 读取 pem 中的 key
String publicKeyStr = loadKey(publicKeyPem);
X509EncodedKeySpec x509PubKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr));
KeyFactory fact = KeyFactory.getInstance("RSA");
return fact.generatePublic(x509PubKeySpec);
}
}
#include <iostream>
#include <string>
#include <vector>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
// Base64解码
std::string base64Decode(const std::string &input) {
BIO* bio_mem = BIO_new_mem_buf(input.data(), input.length());
BIO* bio64 = BIO_new(BIO_f_base64());
BIO_set_flags(bio64, BIO_FLAGS_BASE64_NO_NL);
BIO_push(bio64, bio_mem);
char buffer[1024];
std::string result;
int decoded_size;
while ((decoded_size = BIO_read(bio64, buffer, 1024)) > 0) {
result.append(buffer, decoded_size);
}
BIO_free_all(bio64);
return result;
}
// 解密对称密钥
std::string decEncKey(const std::string &rsa_pri_key, const std::string &enc_key) {
BIO *bio_mem = BIO_new_mem_buf(rsa_pri_key.data(), rsa_pri_key.size());
RSA *rsa = RSA_new();
rsa = PEM_read_bio_RSAPrivateKey(bio_mem, &rsa, nullptr, nullptr);
if (rsa == nullptr) {
return "";
}
// base64解码对称密钥
std::string decoded_key = base64Decode(enc_key);
// 私钥解密对称密钥
std::vector<unsigned char> decrypted_key(RSA_size(rsa));
int key_size = RSA_private_decrypt(decoded_key.size(), (const unsigned char *)decoded_key.data(), &decrypted_key[0], rsa, RSA_PKCS1_PADDING);
RSA_free(rsa);
BIO_free(bio_mem);
return std::string(decrypted_key.begin(), decrypted_key.begin() + key_size);

}
// 去除填充
std::string pkcs7UnPadding(const std::string& orig_data) {
size_t length = orig_data.size();
unsigned char unpadding = orig_data[length - 1];
size_t index = length - unpadding;
if (index < 0 || index >= length) {
throw std::runtime_error("index out of range");
}
return orig_data.substr(0, index);
}
// 解密数据
std::string decEncData(const std::string &aes_key, const std::string &enc_data) {
// base64解码数据
std::string decoded_data = base64Decode(enc_data);
// 获取初始向量IV
std::string iv = aes_key.substr(0, 16);
// 解密数据
AES_KEY key;
if (AES_set_decrypt_key(reinterpret_cast<const unsigned char*>(aes_key.data()), 256, &key) < 0) {
throw std::runtime_error("failed to set AES decryption key");
}
std::string orig_data(decoded_data.size(), '\\0');
AES_cbc_encrypt(reinterpret_cast<const unsigned char*>(decoded_data.data()),
reinterpret_cast<unsigned char*>(&orig_data[0]),
decoded_data.size(),
&key,
reinterpret_cast<unsigned char*>(&iv[0]),
AES_DECRYPT);
std::string dec_data = pkcs7UnPadding(orig_data);
return dec_data;

}

/*
* DecryptData 解密数据
*
* @param rsaPriKey PKCS#8格式的RSA私钥文件内容
* @param encData 加密数据
* @param encKey 加密对称密钥
* @return decData 解密后数据
*/

std::string DecryptData(const std::string &rsaPriKey, const std::string &encData, const std::string &encKey) {
// 解密对称密钥
std::string aesKey = decEncKey(rsaPriKey, encKey);
if (aesKey == "") {
return "";
}
// 解密数据
std::string decData = decEncData(aesKey, encData);
return decData;

}
package util
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
)
/*
* DecryptData 解密数据
*
* @param rsaPriKey PKCS#8格式的RSA私钥文件内容
* @param encData 加密数据
* @param encKey 加密对称密钥
* @return decData 解密后数据
* @return err 错误信息
*/

func DecryptData(rsaPriKey, encData, encKey string) (decData string, err error) {
// 解密对称密钥
aesKey, err := decEncKey(rsaPriKey, encKey)
if err != nil {
return "", err
}
// 解密数据
decData, err = decEncData(aesKey, encData)
if err != nil {
return "", err
}
return decData, nil

}
// decEncKey 解密对称密钥
func decEncKey(rsaPriKey, encKey string) (string, error) {
// base64解码对称密
decodeKey, err := base64.StdEncoding.DecodeString(string(encKey))
if err != nil {
return "", err
}
// 私钥解密对称密钥
pemBlk, _ := pem.Decode([]byte(rsaPriKey))
if pemBlk == nil {
return "", errors.New("非法PEM格式的RSA私钥文件")
}
pkInf, err := x509.ParsePKCS8PrivateKey(pemBlk.Bytes)
if err != nil {
return "", err
}

pk, ok := pkInf.(*rsa.PrivateKey)

if !ok {
return "", errors.New("非PKCS#8格式的RSA私钥文件")
}

byteAESKey, err := rsa.DecryptPKCS1v15(rand.Reader, pk, decodeKey)

if err != nil {
return "", err
}
aesKey := string(byteAESKey)
if len(aesKey) != 32 {
return "", errors.New("非256位对称密钥")
}

return aesKey, nil
}

// pkcs7UnPadding 去除填充

func pkcs7UnPadding(origData []byte) ([]byte, error) {

length := len(origData)
unpadding := int(origData[length-1])
index := length - unpadding

if index < 0 || index >= len(origData) {
return nil, errors.New("index out of range")
}

return origData[:index], nil
}

// decEncData 解密数据
func decEncData(aesKey, encData string) (string, error) {
// 获取初始向量IV
iv := aesKey[:16]
// base64解码数据
decodeData, err := base64.StdEncoding.DecodeString(string(encData))
if err != nil {
return "", err
}
// 解密数据
cipherBlk, err := aes.NewCipher([]byte(aesKey))
if err != nil {
return "", err
}

blockMode := cipher.NewCBCDecrypter(cipherBlk, []byte(iv))

origData := make([]byte, len(decodeData))

blockMode.CryptBlocks(origData, decodeData)

byteDecData, err := pkcs7UnPadding(origData)

if err != nil {
return "", err
}

decData := string(byteDecData)
return decData, nil
}
拿到日志明文为 json 格式,公参为每条日志都会返回的数据包括事件 code、事件时间、事件操作者等信息,私参 event_details 根据不同的事件返回的内容不同,您可以根据业务需要处理 event_details 对象。

附录

event_details 定义。

会议管理

事件名称
事件 code
event_detials 对象定义
搜索会议
search_meeting
{ "start_time":"",//开始时间戳 "end_time":"",//结束时间戳 "department_name":"",//部门名称 "meeting_type":,//int,会议类型 "media_set_type":,//int,0:公网会议,1:专网会议,2:全部会议 "creator_id":"",//创建者id "meeting_code":"",//会议号 "participant_id":"",//参会者id "meeting_subject":""//会议主题 "meeting_status": //int,1:即将召开,2:进行中,3:已结束 }
导出会议列表
download_meeting_list
{ "start_time":"", "end_time":"", "meeting_status": //int,1:即将召开,2:进行中,3:已结束 }
导出会议成员列表
download_meeting_participants
{ "meeting_id":"",//会议ID "meeting_code":"",//会议号 "meeting_subject":""//会议主题 }
查看会议质量
query_meeting_quality
{ "action_type":,//int,1:查看会议质量详情,2:查看参会成员质量 "action_details":{ "meeting_id":"",//会议ID "meeting_code":"",//会议号 "nick_name":""//成员会中昵称 } }

用户管理

事件名称
事件 code
event_details 对象
搜索用户
search_user
{ "userid":"",//搜索的用户ID "user_name":"",//搜索的用户名 "role_name":"",//搜索的角色名 "user_status":"",//搜索的账号状态 "department_name":""//搜索的部门名称 }
邀请用户
invite_user_activate
{ "action_type"://int,1:短信,2:邮件 }
用户操作
modify_user
{ "action_type"://int,1:添加用户,2:编辑用户,3:删除用户,4:启用用户,5:禁用用户 "action_details":{ "userid":"",//被操作者id,行为1,2,3,4,5返回 "user_name":"",//被操作者昵称,行为1,2,3,4,5返回 "old_param":"",//修改前内容,行为2返回 "new_param":""//修改后内容,行为2返回 "user_account_type":"xx",//账号类型, 1-免费账号, 2-高级账号 } }
批量用户操作
batch_update_user
{ "action_type"://int,1:批量导入,2:批量修改, 3-批量修改账号类型 "action_details":{ "status":,//int,0:失败,1:成功,2:部分成功 "user_list":[{ "userid":"", "user_name":"", "status"://int,0:失败,1:成功 "old_param":"",//修改前内容,行为3返回修改前账号类型, 1-免费账号, 2-高级账号 "new_param":""//修改后内容,行为3返回修改后账号类型, 1-免费账号, 2-高级账号 }] } }
修改管理范围
modify_user_manage_range
{ "userid":"",//用户id "user_name":"",//用户昵称 "action_type"://int,1:修改用户特定部门管理范围,2:设置用户全部部门管理,3:设置用户所在部门及以下部门管理,4:设置用户特定会议室管理范围,5:设置用户全部会议室管理范围 }
修改部门设置
modify_department
{ "action_type"://int,1:添加部门,2:添加子部门,3:删除部门,4:修改部门,5:调整部门排序 "action_details":[{ "department_id":,//部门id "department_name":"",//部门名称 "new_department_name":"",//修改后的部门名称,行为4返回 }] //是个list }
修改角色
modify_role
{ "action_type":,//int,1:添加角色,2:修改角色名称,3:修改角色信息,4:授予角色权限,5:取消角色权限,6:删除角色 "action_details":{ "old_param":"", "new_param":"", "auth_type":"",//行为4,5返回,权限操作类型,1-查看, 2-编辑(对会议管理, 1-查看, 2-会控, 3-布局, 4-背景) "auth_name":""//行为4,5返回 } }
敏感权限隔离
modify_super_admin_permission
{ "action_type":,//int,1:隔离,2:恢复 "action_details":{ "permission_name":"xxxx"//敏感权限名称 } }
修改用户角色
modify_role_user
{ "action_type":,//int,1:添加角色成员,2:移除角色成员 "action_details":{ "user_name":"", "role_name":"" } }
修改通讯录规则
modify_directory_rule
{ "action_type":,//int,1:设置隐藏的部门/成员的规则,2:删除隐藏的部门/成员的规则,3:修改隐藏的部门/成员的规则,4:设置限制查看外部门的规则,5:删除限制查看外部门的规则,6:修改限制查看外部门的规则,7:设置限制查看所有人的规则,8:删除限制查看所有人的规则,9:修改限制查看所有人的规则, "action_details":{ "old_rule":"",//行为2,3,5,6,8,9返回 "new_rule":"",//行为1,3,4,6,7,9返回 "department_list"://department_name[], "userid_list"://userid[] } }

账户管理

事件名称
事件 code
event_details 定义
修改账户信息
modify_corp_info
{ "action_type":,//int,1:修改超管邮箱,2:修改超管姓名,3:转移超管,4:修改企业名称,5:修改企业logo,6:修改行业类型,7:修改企业规模,8:修改电话服务,9:新增企业联系人,10:删除企业联系人,11:修改企业联系人 "action_details":{ "old_param":"",//修改前内容,行为1,2,4,6,7返回 "new_param":"",//修改后内容,行为1,2,4,6,7返回 "admin_id":"",//管理员ID,行为3返回 "old_corp_contact":{//行为10,11返回 "contact_name":"",//联系人姓名 "contact_phone":"",//联系电话 "contact_email":""//联系邮箱 }, "new_corp_contact":{//行为9,11返回 "contact_name":"",//联系人姓名 "contact_phone":"",//联系电话 "contact_email":""//联系邮箱 } } }
修改会前设置
modify_corp_before-meeting_setting
{ "action_type":,//int,1:修改会议虚拟背景开关,2:会议文档,3:单人会议超时自动结束,4:企业用户修改昵称,5:企业用户修改头像 "action_details":{ "old_param":"",//修改前内容,行为3返回 "new_param":"",//修改后内容,行为3返回 "action_switch":true/false//行为开关,行为1,2,3,4,5返回 } }
修改会中设置
modify_corp_in-meeting_setting
{ "action_type":,//int,1:修改会议红包开关,2:修改会议聊天,3:修改会议聊天存档开关,4:修改会中投票开关,5:修改会议字幕开关,6:修改实时转写开关,7:修改同声传译指定语言开关,8:更新同声传译指定语言;11:修改添加应用开关,12:修改互动批注开关,13:仅共享用户使用批注开关 "action_details":{ "old_param":"",//修改前内容,行为2,10返回 "new_param":"",//修改后内容,行为2,9返回 "action_switch":true/false,//行为开关,行为1,2,3,4,5,6,7,11,12,13 "action_lock":true/false//true:锁定,false:解锁,行为2返回 "param_list":[ //// 行为8返回 {"param_value":"xxx",} //指定语言列表 ] } }
修改安全设置
modify_corp_security_setting
{ "action_type":,//int,1:修改入会限制,2:修改会议水印,3:修改多因素认证,4:修改远程控制 "action_details":{ "old_param":"",//修改前内容,行为1,2,4返回 "new_param":"",//修改后内容,行为1,2,4返回 "action_switch": true/false,//true:开启,false:关闭,行为2,3,4返回 "action_lock":true/false//true:锁定,false:解锁 ,行为1,2返回 } }
修改账号设置
modify_corp_setting
{ "action_type":,//int,1:修改发送文件能力,2:修改发送图片能力,3:修改上传文档能力, 4-高级账号免费虚拟会议室能力 "action_details":{ "action_switch": true/false//true:开启,false:关闭 } }
修改通讯录设置
modify_corp_directory_setting
{ "action_type":,//int,1:修改企业通讯录开关,2:修改企业组织架构开关,3:修改个人名片开关 "action_details":{ "action_switch": true/false//true:开启,false:关闭 } }

录制管理

事件名称
事件 code
event_details 定义
分享录制文件
share_record
{ "meeting_id":"", //会议号码 "meeting_record_id":"",//录制id "record_subject":"",//录制主题 "storage_type":"xx" //paid_storage-付费空间, free-storage-免费空间,null-无存储空间信息 "action_type":,//int,1:分享录制文件,2:修改录制权限,3:开启/关闭密码保护,4:修改密码,5:开启/关闭分享链接有效期,6:修改分享链接有效期,7:开启/关闭下载开关,8:开启/关闭查看转写开关,9:复制链接,10:生成二维码 "action_details":{ "old_param":"",//修改前内容,行为2,6返回 "new_param":"",//修改后内容,行为2,6返回 "action_switch":true/false,//行为开关,行为3,5,7,8返回 "file_id":""//复制文件链接或生成录制文件二维码返回,行为9,10返回 } }
下载录制文件
download_record
{ "meeting_id":"", //会议号码 "meeting_record_id":"",//录制id "record_subject":"",//录制主题 "file_id_list":""//array,录制文件列表 "storage_type":"xx" //paid_storage-付费空间, free-storage-免费空间,null-无存储空间信息 }
删除录制文件
delete_record
{ "meeting_id":"", //会议号码 "meeting_record_id":"",//录制id "record_subject":"",//录制主题 "file_id_list":""//array,删除的录制文件列表 "storage_type":"xx" //paid_storage-付费空间, free-storage-免费空间,null-无存储空间信息 }
修改录制文件
modify_record
{ "meeting_id":"", //会议号码 "meeting_record_id":"",//录制id "record_subject":"",//录制主题 "action_type":,//int,1:修改主题,2:修改密码 "action_details":{ "old_param":"",//修改前内容,行为1返回 "new_param":""//修改后内容,行为1返回 } "storage_type":"xx" //paid_storage-付费空间, free-storage-免费空间,null-无存储空间信息 }
查看录制文件
view_record
{ "meeting_id":"", //会议号码 "meeting_record_id":"",//录制id "record_subject":"",//录制主题 "action_type":1//int ,1:回放,2:查看,3:查看统计 "storage_type":"xx" //paid_storage-付费空间, free-storage-免费空间,null-无存储空间信息 }
搜索录制文件
search_record
{ "action_type":,//int,1:会议号搜索,2:时间搜索 "action_details":{ "meeting_code":"",//会议号,行为1返回 "start_time":"",//搜索开始时间戳,行为2返回 "end_time":""//搜索结束时间戳,行为2返回 } }
修改录制设置
modify_corp_record_setting
{ "action_type":,//int,1:修改云录制开关,2:录制音频文件开关,3:录制转写开关,4:智能录制开关,5:智能录制纪要功能关闭,6:智能录制发言人关闭,7:跟随主持人布局开关,8:只录制主持人锁定画面开关,9:录制视图随说话人切换开关,10:本地录制开关,11:自动录制开关,12:自动录制云录制开关,13:自动录制本地录制开关,14:自动录制有参会成员入会立即开启云录制开关,15:主持人能暂停停止云录制开关,16:允许分享云录制文件,17:录制文件分享权限设置,18:云录制观看密码开关,19:允许下载云录制开关,20:允许查看会议纪要开关 "action_details":{ "action_switch": true/false,//true:开启,false:关闭 "record_share_setting":""//录制分享权限设置 } }

会议室管理

事件名称
事件 code
event_details 对象定义
查询会议室信息
search_meeting_room
{ "search_info":""//搜索的内容 }
添加会议室
create_meeting_room
{ "meeting_room_id":"", "rooms_id":"", "meeting_room_name":"xxx"//会议室名称 "meeting_room_type":"xxx"//会议室类型, none-无类型, rooms-Rooms类型, h323sip-H.323/SIP类型 "rooms_type_info":{ //meeting_room_type 为rooms包含 "rooms_account_type":"", //basic-基础版账号, professional-专业版 } "h323sip_type_info":{ //meeting_room_type 为h323sip包含 "protocol":"xx", //h323-H.323类型, sip-SIP类型 "address_type":"xxx",//signaling-信令地址, regist-注册地址 "address_detail":"xxx"//地址详情 "invite_cluster":""//邀请入会集群, 仅地址为信令地址时包含 } "location":{ "city":"",//城市 "building":"",//建筑 "floor":"" //楼层 } "member_number":"",//会议室容纳人数 "device":"",//会议室设备 "tag":"xxx",//会议室标签 "description":""//会议室描述 }
修改会议室信息
modify_meeting_room
{ "meeting_room_id":"", "rooms_id":"xxx"//Rooms ID "meeting_room_name":"xxx"//会议室名称 "meeting_room_type":"xxx"//会议室类型, none-无类型, rooms-Rooms类型, h323sip-H.323/SIP类型 "rooms_type_info":{ //room_type 为rooms包含 "rooms_account_type":"", //basic-基础版账号, professional-专业版 } "h323sip_type_info":{ //meeting_room_type 为h323sip包含 "protocol":"xx", //h323-H.323类型, sip-SIP类型 "address_type":"xxx",//signaling-信令地址, regist-注册地址 "address_detail":"xxx"//地址详情 "invite_cluster":""//邀请入会集群, 仅地址为信令地址时包含 } "location":{ "city":"",//城市 "building":"",//建筑 "floor":"" //楼层 } "member_number":"",//会议室容纳人数 "device":"",//会议室设备 "tag":"xxx",//会议室标签 "description":""//会议室描述 } //根据修改内容动态显示对应字段
删除会议室
delete_meeting_room
{ "rooms_id":"xxx"//Rooms ID "meeting_room_id":""//会议室ID }
修改会议室标签
modify_meeting_room_label
{
"action_type":"", //1-添加,2-删除
"meeting_room_label":"xxxx"//会议室标签名称
}
会议室操作
operate_meeting_room_account
{ "action_type":"", //1-登出,2-生成激活码,3-复制激活码,4-升级账号 "action_details": { "meeting_room_id":"",//会议室ID "rooms_id":"xxx",//Rooms ID "meeting_room_name":"xxx"//会议室名称 } }
批量会议室操作
batch_operate_meeting_room
{ "action_type":"xx", //1-添加会议室, 2-导出会议室, 3-删除会议室,4-登出会议室,5-生成激活码,6-升级会议室 "meeting_room_count":"xxxx",//操作会议室个数 "meeting_room_list":[ { "meeting_room_id":"",//会议室ID "rooms_id":"xxx"//Rooms ID } ] }
下载会议室参会信息
download_meeting_room_meetinginfo
{ "meeting_room_name":"", //会议室名称 "meeting_room_id":"",//会议室ID "rooms_id":"" //RoomsID "start_date”:"xx", //开始日期 "end_date":"xx" //结束日期 }
管理会议室设备
modify_meeting_room_device_list
{ "action_type":,//int,1: 搜索,2: 重启应用,3:重启系统 ,4:升级设备 "action_details": { "meeting_room_name":"",//会议室名称,行为1返回 "meeting_room_number": , //int,设备个数,行为4返回 "meeting_room":[ { "meeting_room_id":"",//会议室ID "rooms_id":"", //RoomsID } ] "meeting_room_device_type":"xxx". //host - 主机, controller-控制器 } }
修改会议室设置
modify_meeting_room_settings
{ "rooms_scope":"" //修改的rooms范围:all-全部, partial-部分 "meeting_room_id_list":[ ],//会议室ID list,全部时候不用返回,部分需要返回,设置对哪些会议室生效 "rooms_id_list":[ ],//RoomsID list "action_details": { "mcu_switch":,//true/false,MCU级联开关设置 "admin_password_switch":,//true/false,管理员密码开关设置 "admin_password_status":"",//管理员密码更新-update/nochange "auto_restart_switch":,//true/false,系统自动重启设置 "restart_time":"",//自动重启时间,行为4返回 "back_to_desktop":[ ],//返回桌面的设置项,是个数组 "auto_upgrade_switch":,//自动升级设置-true/false "auto_lock_screen_switch":,//自动息屏设置-true/false "ultrasonic_projection_screen_switch":,//超声波投屏设置-true/false "bluetooth_switch":,//蓝牙发现设置-true/false "device_original_sound_switch":,//设备原声设置-true/false "auto_adjust_volume_switch":,//自动调整麦克风音量设置-true/false "synchronize_mute_switch":,//麦克风静音状态同步-true/false "auto_adjust_brightness_switch",//显示亮度调节-true/false "csapi_switch":,//中控API开关-true/false "csapi_password_status":"",//中控API密码更新-update/nochange "camera_monitor_status":"",//摄像头追踪设置状态- update/nochange "report_to_admin_switch":,//上报管理员开关-true/false "admin_emails"[ ],//管理员邮箱,string数组,修改后的管理员邮箱列表 "secondary_screen_switch":,//副屏展示会议室信息开关-true/false "pre_share_screen_status":"",//共享前屏幕展示内容1-宫格布局, 2-演讲者布局,3-顶部成员列表,4-右侧成员列表,5-上L型布局,6-下L型布局,7-回型布局 "post_share_screen_status":"",//共享后屏幕展示内容1-演讲者共享,2-顶部成员列表共享,3-右侧成员列表共享,4-上L型布局共享,5-下L型布局共享,6-回型布局共享 "background_image_status":"",//背景图设置状态- update/delete "screensaver_status":"",//屏保设置状态-on/off/update "pmi_status":"",//会议室专属ID设置状态-on/off/update "scheduled_switch":,//开放预订开关-true/false "allow_call_switch":,//允许被呼叫开关-true/false "apple_device_cast_swicth":,//苹果设备隔空播放或屏幕镜像开关- true/false "ppt_auto_play_switch":,//ppt自动播放开关- true/false "watermark_swicth":,//水印开关- true/false "watermark_status":"",//水印设置状态- update/onchange "share_local_switch":,//共享本地内容开关-true/false "no_disturb_switch":,//勿扰模式开关- true/false "auto_answer_switch":,//自动接听开关-true/false "mini_program_controller_switch":,//小程序控制器开关- true/false "app_controller_switch":"",//腾讯会议客户端控制器, true/false "caption_switch":,//字幕开关- true/false "message_switch"://Rooms屏幕显示消息通知开关,true/false "record_share_setting":"x",//云录制设置项设置项, 1-全部成员可查看, 2-仅登录成员可查看, 3-仅同企业成员可查看,4-仅参会成员可查看, "qrcode_get_link_switch":,//Rooms端前扫码获取链接用户查看-true/false "allow_download_record_switch"://允许下载云录制开关- true/false } }
注意:一次行为涉及哪部分修改就返回哪部分内容。

会议室连接器

事件名称
事件 code
event_details 对象定义
本地部署设置
mra_deploy_management
{ "action_type":,//1-激活码,2-OVA镜像操作,3-部署文档操作, 4-自动升级操作, 5-手动升级操作, 6-集群删除, 7-检查升级版本 "action_details": { "activation_code_operation":"" , //激活码操作, copy/generate, action_type = 1显示 "download_ova_image":"", //下载OVA镜像, 显示镜像版本,action_type = 2显示 "auto_upgrade_switch": , //自动升级设置, true/false,开启/关闭, action_type = 4可选显示 "auto_upgrade_time":"", //自动升级时间, 01:00, action_type = 4可选显示 "check_upgrade_version":"", //检查新版本, 显示版本号, action_type = 7可选显示 "cluster_upgrade_operation": [ //// 集群手动升级操作, action_type = 5显示 { "cluster_id":"", //集群名称, 全部集群或指定集群, all/集群ID "old_verion":"", //旧版本 "new_version":"", //新版本 } ] "cluster_deletion":"", //集群删除, 包含集群名称, action_type = 6显示 } }
服务配置
mra_service_configration
{ "action_type":,//1-更新MRA服务配置 "action_details": { “default_layout”:"", //默认分屏设置, 1-1+N,2-等分,3-全屏 "default_no_video_member_display":""//默认非视频与会者显示设置, hide - 隐藏, display - 显示 "default_message_display":"", //默认聊天信息显示,hide - 隐藏, display - 显示 "dial_rule_setting": { / / H.323/SIP会议室拨号规则设置 "dial_rule_id":"", // H.323/SIP会议室拨号规则, 1 - 云服务地址, 2- 企业内本地机器IP地址, 3-前缀+会议ID, 4-自定义 "dial_rule_detail": ""// H.323/SIP会议室拨号规则格式定义内容, 前缀内容或自定义内容 } "max_call_rate":"", //最大呼叫速率, 1M/2M/3M/6M "mra_controller_switch":, //手机助手功能设置, true/false "auto_response_video_request":, //自动响应主持人开启视频操作的功能设置,true/false "not_allow_join_personal_meeting":, //不允许参加个人账号创建的会议, true/false "self_on_layout":, //视频布局显示自己, true/false "device_registration_capability":, //H.323/SIP注册的功能, true/false "sip_peer_capability":, //SIP Peer的功能配置, true/false "sip_peer_detail":{ //SIP Peer配置设置详情 "deploy_mode":""//部署模式, local/saas "sip_peer_address":"", //SIP Peer地址 "auth_realm":"", //SIP Peer鉴权域 "auth_username":"", //SIP Peer鉴权用户名 "auth_password":"", //SIP Peer鉴权密码, update/nochange } } }
说明:根据修改内容,动态包含修改项。
注册账号管理
mra_registration_management
{ "action_type":xxx//1-修改H.323注册短号前缀或SIP账号后缀;2-导入账号;3-导出账号;4-添加账号;5-修改账号;6-禁用账号;7-启用账号;8-删除账号 "registration_protocol":xxx, //SIP- SIP注册,H.323-H.323注册 "action_details":{ "account_id":"", //H.323注册前缀或SIP账号后缀, action_type=1 显示 "file_name":"",//导入文件名称, action_type=2 显示 "success_number":"", //导入/导出账号成功个数, action_type=2,3 显示 "fail_number":"", //导入账号失败个数, action_type=2 显示 "registration_id":"" //注册账号, H.323用户E164短号或SIP注册登录地址, 可多个, action_type=4,5,6,7,8 显示 "registration_detail”: { //注册账号详情, action_type=5 显示 "identity_value":"", //H.323/SIP deive ID "user_name":"", //用户名 "password”:"", //update/nochange.更新/未更新 "display_name":"" //显示名称 } } }
说明:根据修改内容,动态包含修改项。