如何从Graph API响应头解析CSV下载URL并获取Teams使用数据?
解决方法
首先纠正你代码里的两个小问题:
print(response. Headers)是笔误,应该写成print(response.headers)(注意Headers的大小写和点后的空格)- GET请求不需要带
data=auth_body参数,这个参数是POST请求专用的,直接删掉即可。
接下来,Graph API的这类报表接口会返回302重定向响应,CSV文件的下载URL就藏在响应头的Location字段里。你可以按以下步骤提取并下载CSV:
- 从响应头中获取下载URL
- 带上同样的身份令牌请求该URL,获取CSV内容
- 将内容写入本地文件
修改后的完整代码如下:
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
相关产品推荐
相关产品推荐

