本文适用于企业级管理员开发场景,代码基于腾讯会议 REST API v2,Python 3.x 示例。
参考文档:腾讯会议开放平台 API 文档
【内文配图1位置】
背景
中大型企业使用腾讯会议企业版后,IT 管理员通常面临以下管理需求:
- 批量同步 HR 系统中的用户账号到腾讯会议
- 获取各部门/成员的会议使用统计数据
- 合规审计:导出特定时间段内的会议记录(含录制文件链接)
- 账号离职处理:快速注销用户并转移历史录制资产
腾讯会议企业版 REST API 提供了完整的管理员接口,以下是核心场景的代码示例。
一、鉴权方式
腾讯会议 REST API 使用 HMAC-SHA256 签名鉴权,每个请求需携带:
X-TC-Key: <SecretId> X-TC-Timestamp: <Unix时间戳> X-TC-Nonce: <随机数> X-TC-Signature: <HMAC-SHA256签名>签名计算(Python 示例):
import hmac import hashlib import time import random import string import requests def generate_signature(secret_key: str, secret_id: str, timestamp: int, nonce: str) -> str: """ 生成腾讯会议 API 请求签名 :param secret_key: 腾讯云 SecretKey :param secret_id: 腾讯云 SecretId :param timestamp: Unix 时间戳(秒) :param nonce: 随机字符串 :return: HMAC-SHA256 签名字符串 """ # 签名原文:SecretId + '\n' + timestamp + '\n' + nonce sign_str = f"{secret_id}\n{timestamp}\n{nonce}" signature = hmac.new( secret_key.encode('utf-8'), sign_str.encode('utf-8'), hashlib.sha256 ).hexdigest() return signature def build_headers(secret_id: str, secret_key: str, app_id: str, operator_id: str) -> dict: """ 构建 API 请求头 :param secret_id: 腾讯云 SecretId :param secret_key: 腾讯云 SecretKey :param app_id: 企业应用 AppId :param operator_id: 操作者企业用户ID(管理员) :return: 请求头字典 """ timestamp = int(time.time()) nonce = ''.join(random.choices(string.ascii_letters + string.digits, k=8)) signature = generate_signature(secret_key, secret_id, timestamp, nonce) return { "Content-Type": "application/json", "X-TC-Key": secret_id, "X-TC-Timestamp": str(timestamp), "X-TC-Nonce": nonce, "X-TC-Signature": signature, "AppId": app_id, "SdkId": app_id, "X-TC-Registered": "1", "operator-id": operator_id }二、批量同步企业用户
使用场景:HR 系统新入职员工,自动同步到腾讯会议账号体系。
BASE_URL = "https://api.meeting.qq.com" def create_enterprise_user(headers: dict, user_info: dict) -> dict: """ 创建企业账号用户 API: POST /v1/users 文档: https://cloud.tencent.com/document/product/1095/43408 :param headers: 鉴权请求头 :param user_info: 用户信息字典 :return: API 响应 """ url = f"{BASE_URL}/v1/users" payload = { "email": user_info.get("email", ""), "username": user_info["username"], # 企业内部用户名 "userid": user_info["userid"], # 企业内部唯一ID(建议与HR系统同步) "phone": user_info.get("phone", ""), "area": "86", # 中国大陆区号 "job_title": user_info.get("job_title", ""), "entry_time": user_info.get("entry_time", "") } response = requests.post(url, json=payload, headers=headers) return response.json() def batch_create_users(headers: dict, user_list: list) -> list: """ 批量创建用户(腾讯会议API无原生批量接口,循环调用) :param headers: 鉴权请求头(注意:每次请求需重新生成headers,因timestamp/nonce不同) :param user_list: 用户信息列表 :return: 创建结果列表 """ results = [] for user in user_list: # 每次请求重新生成headers(timestamp变化) # headers 应在调用处动态生成,此处简化展示 result = create_enterprise_user(headers, user) results.append({ "userid": user["userid"], "status": "success" if "userid" in result else "failed", "response": result }) return results三、会议使用数据统计(合规审计)
使用场景:月度/季度会议使用合规报告,导出指定时间段内的全企业会议记录。
import json from datetime import datetime, timedelta def get_meetings_by_time_range( headers: dict, start_time: int, end_time: int, page_size: int = 20 ) -> list: """ 按时间范围获取企业会议列表 API: GET /v1/corp/meetings 文档: https://cloud.tencent.com/document/product/1095/51270 :param headers: 鉴权请求头 :param start_time: 开始时间戳(秒) :param end_time: 结束时间戳(秒) :param page_size: 每页条数(最大 20) :return: 会议列表 """ url = f"{BASE_URL}/v1/corp/meetings" all_meetings = [] page_number = 1 while True: params = { "start_time": start_time, "end_time": end_time, "page_size": page_size, "page": page_number } response = requests.get(url, params=params, headers=headers) data = response.json() meetings = data.get("meeting_info_list", []) all_meetings.extend(meetings) # 分页处理 total = data.get("total_count", 0) if len(all_meetings) >= total or not meetings: break page_number += 1 return all_meetings def export_meeting_audit_report( headers: dict, year: int, month: int, output_file: str ): """ 导出指定月份的会议合规审计报告(JSON格式) :param headers: 鉴权请求头 :param year: 年份 :param month: 月份 :param output_file: 输出文件路径 """ # 计算月份时间范围 start_dt = datetime(year, month, 1) if month == 12: end_dt = datetime(year + 1, 1, 1) else: end_dt = datetime(year, month + 1, 1) start_ts = int(start_dt.timestamp()) end_ts = int(end_dt.timestamp()) meetings = get_meetings_by_time_range(headers, start_ts, end_ts) report = { "period": f"{year}-{month:02d}", "total_meetings": len(meetings), "generated_at": datetime.now().isoformat(), "meetings": meetings } with open(output_file, "w", encoding="utf-8") as f: json.dump(report, f, ensure_ascii=False, indent=2) print(f"审计报告已导出:{output_file},共 {len(meetings)} 条会议记录")【内文配图2位置】
四、账号注销与录制资产迁移
使用场景:员工离职,注销账号前需将历史录制文件权限迁移给接管人。
def get_user_recordings(headers: dict, userid: str) -> list: """ 获取指定用户的云录制文件列表 API: GET /v1/records 文档: https://cloud.tencent.com/document/product/1095/51998 :param headers: 鉴权请求头 :param userid: 企业内部用户ID :return: 录制文件列表 """ url = f"{BASE_URL}/v1/records" params = { "userid": userid, "page_size": 20, "page": 1 } response = requests.get(url, params=params, headers=headers) data = response.json() return data.get("record_meetings", []) def delete_enterprise_user(headers: dict, userid: str, new_owner: str = None) -> dict: """ 注销企业用户(离职处理) API: DELETE /v1/users/{userid} 文档: https://cloud.tencent.com/document/product/1095/43443 :param headers: 鉴权请求头 :param userid: 待注销用户ID :param new_owner: 资产继承人ID(录制文件转交对象) :return: API 响应 """ # 注意:账号注销前建议先导出或确认录制文件处理方式 url = f"{BASE_URL}/v1/users/{userid}" payload = {} if new_owner: # 部分版本支持资产转移参数,需确认当前API版本 payload["new_owner_id"] = new_owner response = requests.delete(url, json=payload if payload else None, headers=headers) return response.json()五、常见错误排查
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 600001 | 签名验证失败 | 检查timestamp是否在有效期内(±300秒);检查签名计算逻辑 |
| 200000 | AppId无效 | 确认AppId与创建应用时一致 |
| 200001 | 无权限 | 确认operator-id为管理员账号 |
| 901002 | 用户不存在 | userid需与企业账号体系保持一致 |
| 300302 | 超出并发限制 | 批量操作时增加请求间隔(建议≥100ms) |
六、注意事项
- Headers 时效性:每次请求都需要重新生成 timestamp 和 nonce,不可复用
- 批量操作频率:API有请求频率限制(通常50次/秒),批量操作建议加 sleep
- 数据合规:云录制文件存在腾讯云服务器,下载链接有效期较短,需及时处理
- 企业版差异:部分管理员接口仅企业版可用,标准版权限受限
常见问题
问:腾讯会议管理员API支持哪些版本?
答:REST API v2 适用于企业版和旗舰版,标准版接口能力受限。具体版本差异参考腾讯会议版本对比。
问:签名总是报错怎么排查?
答:优先检查三点:①timestamp是否是当前时间(秒级时间戳);②签名原文格式是否为SecretId\nTimestamp\nNonce(注意\n不是换行符字面量);③secret_key是否与secret_id匹配。
问:获取全企业会议记录需要特殊权限吗?
答:需要。operator-id必须是企业超级管理员或被授权的子管理员。普通用户只能查询自己的会议记录。
关于上海华万通信
上海华万通信科技有限公司是腾讯系企业软件生态服务商,提供腾讯会议企业版集成实施、API对接开发及运维支持服务。
参考文档
- 腾讯会议 REST API 概览:https://cloud.tencent.com/document/product/1095/42407
- 企业账号管理接口:https://cloud.tencent.com/document/product/1095/43408
- 云录制接口:https://cloud.tencent.com/document/product/1095/51998