You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft Graph API创建Teams在线会议却生成个人日程的问题

排查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:17:02