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

如何用Python读取OneDrive文档文件夹的.txt文件?调用Graph API遇500错误

问题诊断与解决方案

你遇到的Unable to retrieve user's mysite URL错误,核心原因是你使用的客户端凭证(Client Credentials)授权模式没有用户上下文,而/me这个端点必须绑定到具体用户身份才能生效。

为什么会出错?

客户端凭证流是让应用以自身身份访问资源,而非代表某个用户。/me是一个快捷端点,用来指代当前请求关联的用户,但在客户端凭证模式下,请求是应用直接发起的,不存在“当前用户”的概念——Graph API无法识别要访问哪个用户的OneDrive,自然会抛出无法获取用户站点URL的错误。

修复步骤

1. 替换/me为具体用户标识

把GET请求的URL中的/me替换为目标用户的ID或用户主体名称(UPN,比如user@yourdomain.com):

# 替换为实际的用户ID或UPN
target_user = "your-target-user-id-or-upn"
response = requests.get(f'https://graph.microsoft.com/v1.0/users/{target_user}/drive/root:/Documents/WildRydes.txt', headers=header)

2. 确认应用权限配置正确

确保你的应用已经申请了应用权限(不是委托权限)里的Files.Read.All或Files.ReadWrite.All,并且已经获得租户管理员的同意——客户端凭证模式仅支持应用权限,委托权限在这里无法生效。

3. 若需访问当前登录用户的OneDrive(可选)

如果你的场景是要访问某个登录用户自己的OneDrive,客户端凭证流并不适用,应该改用授权码流(Authorization Code Flow)。这种模式需要用户登录授权,之后就能正常使用/me端点访问用户的OneDrive了。

修正后的完整代码示例

import requests, sys, os, json

# 替换为你的实际租户ID、客户端ID、客户端密钥
tenant_id = "your-tenant-id"
clientID = "your-client-id"
clientSecret = "your-client-secret"
target_user = "target-user-id-or-upn"

# 获取令牌
params = {
    'client_id': clientID,
    'scope': 'https://graph.microsoft.com/.default',
    'client_secret': clientSecret,
    'grant_type': 'client_credentials'
}
response = requests.post(f'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token', data=params)
jresp = response.json()
access_token = jresp['access_token']

# 获取文件(使用具体用户标识)
header = {'Authorization': 'Bearer ' + access_token}
response = requests.get(f'https://graph.microsoft.com/v1.0/users/{target_user}/drive/root:/Documents/WildRydes.txt', headers=header)
print(response)
print(response.text)
print(response.content)
sys.exit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:57:50