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

无法使用Microsoft Graph API发送Teams频道消息的问题求助

解决Azure应用向Teams频道发送消息的400错误问题

核心问题原因

当使用**应用权限(客户端凭证流)**调用Microsoft Graph发送Teams频道消息时,不需要手动指定from字段。Graph会自动将应用标识为消息发送者,手动设置from反而会触发身份校验冲突:

  • 单独指定from.application时,API会错误判定你需要关联用户身份,因此抛出“Invalid request - User is missing.”
  • 同时添加user和application字段时,违反了identitySet只能指定一种身份类型的规则,因此抛出“Only one of user, application, conversation or tag must be specified”

正确实现步骤

  1. 移除请求体中的from字段
    构造请求JSON时,只保留消息内容相关字段,示例如下:

    {
        "body": {
            "contentType": "html",
            "content": "<h1>测试消息</h1><p>这是Azure应用发送的自动消息</p>"
        }
    }
    
  2. 确认应用权限配置
    确保Azure AD应用已添加应用权限ChannelMessage.Send,并完成管理员同意。

  3. 调整Python代码示例
    结合msal获取令牌,使用requests发送POST请求:

    import requests
    from msal import ConfidentialClientApplication
    
    # 配置参数
    client_id = "你的应用ID"
    client_secret = "你的应用密钥"
    tenant_id = "你的租户ID"
    team_id = "目标团队ID"
    channel_id = "目标频道ID"
    graph_endpoint = f"https://graph.microsoft.com/v1.0/teams/{team_id}/channels/{channel_id}/messages"
    
    # 获取应用令牌
    app = ConfidentialClientApplication(
        client_id,
        authority=f"https://login.microsoftonline.com/{tenant_id}",
        client_credential=client_secret
    )
    result = app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])
    
    if "access_token" in result:
        # 发送消息请求
        headers = {
            "Authorization": f"Bearer {result['access_token']}",
            "Content-Type": "application/json"
        }
        message_body = {
            "body": {
                "contentType": "html",
                "content": "这是Azure应用自动发送的测试消息"
            }
        }
        response = requests.post(graph_endpoint, headers=headers, json=message_body)
        response.raise_for_status()  # 抛出HTTP错误
        print("消息发送成功,ID:", response.json()["id"])
    else:
        print("获取令牌失败:", result.get("error_description"))
    

额外说明

  • 如果需要让消息显示为特定用户身份发送,不能使用应用权限,需要改用委托权限,并通过用户授权流获取令牌(如acquire_token_by_username_password或授权码流),此时可以指定from.user字段,但不能同时指定application。
  • 应用权限下发送的消息,会以Azure应用的名称作为发送者显示在Teams频道中。

内容的提问来源于stack exchange,提问作者user25889027

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:07:12