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

如何从Graph API响应头解析CSV下载URL并获取Teams使用数据?

解决方法

首先纠正你代码里的两个小问题:

  • print(response. Headers)是笔误,应该写成print(response.headers)(注意Headers的大小写和点后的空格)
  • GET请求不需要带data=auth_body参数,这个参数是POST请求专用的,直接删掉即可。

接下来,Graph API的这类报表接口会返回302重定向响应,CSV文件的下载URL就藏在响应头的Location字段里。你可以按以下步骤提取并下载CSV:

  1. 从响应头中获取下载URL
  2. 带上同样的身份令牌请求该URL,获取CSV内容
  3. 将内容写入本地文件

修改后的完整代码如下:

import requests
import json

# 认证部分
client_id = 'XXXX'
client_secret = 'XXXX'
tenant = 'XXXX'
auth_uri = f'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token'
auth_body = {
    'grant_type': 'client_credentials',
    'client_id': client_id,
    'client_secret': client_secret,
    'scope': 'https://graph.microsoft.com/.default'
}
# 用字典传参更清晰,requests会自动处理编码
authorization = requests.post(auth_uri, data=auth_body)
token = json.loads(authorization.content)['access_token']

# 请求报表接口
graph_uri = 'https://graph.microsoft.com/v1.0/reports/getTeamsUserActivityUserDetail(date=2023-01-22)'
# GET请求仅需携带授权头,关闭自动重定向以便获取Location
response = requests.get(graph_uri, headers={'Authorization': f'Bearer {token}'}, allow_redirects=False)

# 提取CSV下载链接
csv_download_url = response.headers.get('Location')
if not csv_download_url:
    print('未找到CSV下载链接')
    exit()

# 下载CSV文件,需携带相同授权令牌
csv_response = requests.get(csv_download_url, headers={'Authorization': f'Bearer {token}'})

# 保存到本地(utf-8-sig编码避免Excel打开乱码)
with open('teams_user_activity.csv', 'w', encoding='utf-8-sig') as f:
    f.write(csv_response.text)

print('CSV文件已成功保存')

关键说明

  • 根据Microsoft Graph文档,getTeamsUserActivityUserDetail接口返回302重定向,Location头包含临时CSV下载链接,该链接有效期较短,需立即使用。
  • 下载CSV时必须携带相同的Authorization头,否则会返回401未授权错误。
  • 设置allow_redirects=False可以阻止requests自动跟随重定向,让我们直接拿到Location头里的URL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:45:34