使用Microsoft Graph API创建Teams在线会议却生成个人日程的问题
问题描述
尝试通过Python调用Microsoft Graph API创建Teams在线会议,但实际生成的是个人日历日程。已在请求payload中设置allowNewTimeProposals为true、isOnlineMeeting为true、onlineMeetingProvider为teamsForBusiness,通过requests.post调用接口,会议信息存储在JSON配置文件中。
相关代码与配置
Python代码
def post_web_meeting( organizer_mail, meeting_args_file): access_token = get_azure_access_token(organizer_mail) logger = get_logger( sys._getframe().f_code.co_name) # change string to lib meeting_args = json.loads( open_json( meeting_args_file)) # initiallzation maillist attendees_mail_list = [] # get a displayname of user all_organization_user_dictionary_list = get_user_list(access_token) if all_organization_user_dictionary_list[ixs.STATUS] == ERROR: logger.error( "getting user list is failed.") sys.exit() all_organization_user_list = all_organization_user_dictionary_list[CONTENTS] # make a mailadress list of all user of groupe organization_mail_list = [ x['mail'] for x in all_organization_user_list] # get a displayname of Attendees user attendees_list = [] for attendees_mail in attendees_mail_list: attendees = {} attendees['emailAddress'] = {} attendees['emailAddress']['address'] = attendees_mail attendees['type'] = 'required' if attendees_mail in organization_mail_list: attendees['emailAddress']['name'] = [ _list['displayName'] for _list in all_organization_user_list if _list['mail'] == attendees_mail][0] else: attendees['emailAddress']['name'] = attendees_mail attendees_list.append( attendees) # WebMeeting organizers organizer_id = get_user_id_by_mail( access_token, organizer_mail) # Setting WebMeeting Properties try: UsersPut_URL = 'https://graph.microsoft.com/v1.0/users/' + organizer_id + '/events' except: func_return_directory = create_ixsfunc_return_dictionary(ixs.ERROR, "The account does not have permission to access.", 800) return create_api_return_dictionary(func_return_directory ) headers = { 'Authorization': 'Bearer %s' % access_token, 'Prefer': 'outlook.timezone="Asia/Tokyo"', 'Content-Type': 'application/json' } payload = {} payload['subject'] = 'Testmeenting' payload['body'] = { 'contentType': 'HTML', 'content': meeting_args['subject']} payload['start'] = { 'dateTime': meeting_args['start'], 'timeZone': 'Asia/Tokyo'} payload['end'] = { 'dateTime': meeting_args['end'], 'timeZone': 'Asia/Tokyo'} payload['location'] = { 'displayName':meeting_args['subject']} payload['attendees'] = attendees_list payload['allowNewTimeProposals'] = 'true' payload['isOnlineMeeting'] = 'true' payload['onlineMeetingProvider'] = 'teamsForBusiness' # post Web Meeting response = requests.post( UsersPut_URL, headers = headers, data = json.dumps( payload) ) #print("json.dumps( payload)") print(json.dumps( payload)) response.close return_response = json.loads( response.text) #print("response.text") print(response.text)
JSON配置文件
{ "subject":" WebMeetingTest", "start": "2024-01-01T01:00:00", "end": "2024-01-01T01:30:00", "attendUsers":[] }
排查要点及修复方案
1. 布尔值参数类型错误
问题:代码中allowNewTimeProposals和isOnlineMeeting被设置为字符串'true',但Microsoft Graph API要求这两个参数为布尔值(不带引号的true)。字符串类型的参数会被API忽略,导致无法触发在线会议配置。
修复:修改payload中的参数类型:
payload['allowNewTimeProposals'] = True payload['isOnlineMeeting'] = True
2. 接口端点选择不当
问题:当前使用的/users/{id}/events端点主要用于创建普通日历事件,虽然通过设置在线会议参数可以生成Teams会议,但存在参数兼容风险。更可靠的方式是使用专门创建Teams在线会议的端点。
修复:将请求URL切换为/users/{id}/onlineMeetings,该端点会直接生成Teams会议并关联到组织者日历,payload结构可简化:
# 修改URL UsersPut_URL = 'https://graph.microsoft.com/v1.0/users/' + organizer_id + '/onlineMeetings' # 调整payload结构(示例) payload = { 'subject': 'Testmeenting', 'startDateTime': meeting_args['start'], 'endDateTime': meeting_args['end'], 'timeZone': 'Asia/Tokyo', 'participants': { 'attendees': attendees_list } }
3. 权限缺失
问题:如果access_token对应的权限仅为Calendars.ReadWrite,虽然能创建日历事件,但可能不足以触发Teams会议的创建。需要确保拥有在线会议相关权限。
修复:在Azure AD应用注册中,添加并授予OnlineMeetings.ReadWrite权限(应用权限或委派权限,根据场景选择),并确保已完成管理员同意(应用权限)或用户授权(委派权限)。
4. 参会者列表读取逻辑错误
问题:代码中attendees_mail_list初始化为空列表,未读取JSON配置中的attendUsers字段,导致参会者列表为空(虽然不影响会议创建,但如果需要邀请参会者则无法生效)。
修复:从JSON配置中读取参会者邮箱:
attendees_mail_list = meeting_args.get('attendUsers', [])
内容的提问来源于stack exchange,提问作者mas

